Marc
Marc

Reputation: 352

Download WebView content in WInRT application

I'm trying to build a universal rss application for Windows 10 that could be able to download the content of the full article's page for offline consultation.

So after spending a lot of time on stackoverflow I've found some code:

HttpClientHandler handler = new HttpClientHandler { UseDefaultCredentials = true, AllowAutoRedirect = true };
HttpClient client = new HttpClient(handler);
HttpResponseMessage response = await client.GetAsync(ni.Url);
response.EnsureSuccessStatusCode();
string html = await response.Content.ReadAsStringAsync();

However this solution doesn't work on some web page where the content is dynamically called.

So the alternative that remains seems to be that one: load the web page into the Webview control of WinRT and somehow copy and paste the rendered text. BUT, the Webview doesn't implement any copy/paste method or similar so there is no way to do it easily.

And finally I found this post on stackoverflow (Copying the content from a WebView under WinRT) that seems to be dealing with the same exact problematic as mine with the following solution;

Use the InvokeScript method from the webview to copy and paste the content through a javascript function.

It says: "First, this javascript function must exist in the HTML loaded in the webview."

function select_body() {
var range = document.body.createTextRange(); 
range.select();
}

and then "use the following code:"

// call the select_body function to select the body of our document
MyWebView.InvokeScript("select_body", null);

// capture a DataPackage object
DataPackage p = await MyWebView.CaptureSelectedContentToDataPackageAsync();

// extract the RTF content from the DataPackage
string RTF = await p.GetView().GetRtfAsync();

// SetText of the RichEditBox to our RTF string
MyRichEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.FormatRtf, RTF);

But what it doesn't say is how to inject the javascript function if it doesn't exist in the page I'm loading ?

Upvotes: 0

Views: 220

Answers (1)

kiewic
kiewic

Reputation: 16420

If you have a WebView like this:

<WebView Source="http://kiewic.com" LoadCompleted="WebView_LoadCompleted"></WebView>

Use InvokeScriptAsync in combination with eval() to get the document content:

private async void WebView_LoadCompleted(object sender, NavigationEventArgs e)
{
    WebView webView = sender as WebView;
    string html = await webView.InvokeScriptAsync(
        "eval",
        new string[] { "document.documentElement.outerHTML;" });

    // TODO: Do something with the html ...
    System.Diagnostics.Debug.WriteLine(html);
}

Upvotes: 1

Related Questions