CoreWebView2.NavigateToString(String) method fails to load an HTML page

AdiGeo 20 Reputation points
2024-10-31T17:08:20.23+00:00

I am using an instance of WebView2 class to display some HTML content in a UI panel for a VS 2022 extension. I can retrieve the HTML content that I want to display in the WebView2 control as a string, and then I am trying to use myWebView2.CoreWebView2.NavigateToString(myHTMLPage) method to have the retrieved page displayed. The HTML content has a lot of JavaScript code in it, and while loading I am getting the following exception:

Uncaught DOMException: Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.

The JavaScript code needs to access the Window.sessionStorage, but I found that the value is undefined.

As a workaround, I save the HTML content in a temporary HTML file in the file system, and I use myWebView2.CoreWebView2.Navigate(myHTMLfile). This time the page loads and displays successfully. I delete the file once the page has loaded.

I wonder if when using the NavigateToString() method is there any solution to successfully display the page? I want to avoid creating a temporary file.

Thank you

Windows development | Windows App SDK
Windows development | Windows API - Win32
Developer technologies | Visual Studio | Other
Developer technologies | C#
0 comments No comments
{count} votes

Accepted answer
  1. Viorel 122.8K Reputation points
    2024-10-31T20:25:37.1366667+00:00

    If the WebView is initialized, the next experimental button handler shows the usage of WebResourceRequested event, which allows to deliver the local contents:

    private void button1_Click( object sender, EventArgs e )
    {
        webView.CoreWebView2.AddWebResourceRequestedFilter( "file://demo/*", CoreWebView2WebResourceContext.All );
    
        webView.CoreWebView2.WebResourceRequested += ( s, a ) =>
        {
            if( a.Request.Uri == "file://demo/test1.html" )
            {
                string html = @"<html>
    <head>
    <script>
    function OnLoad()
    {
       try 
       {                        
          alert( window.sessionStorage);
          alert( window.sessionStorage.getItem('myKey') );
          window.sessionStorage.setItem('myKey', Date.now() );
       } 
       catch(error) 
       {
          alert(error);
       }
    }
    </script>
    </head>
    <body onload=""OnLoad()"">
    <h1>TEST</h1>
    <p>
    Hello!
    </p>
    </body>
    </html>";
    
                var ms = new MemoryStream( Encoding.UTF8.GetBytes( html ) );
                a.Response = webView.CoreWebView2.Environment.CreateWebResourceResponse( ms, 200, "OK", "Content-Type: text/html" );
            }
        };
    
        webView.CoreWebView2.Navigate( "file://demo/test1.html" );
    }
    

    Accessing the window.sessionStorage object in this sample should not fail. Maybe it will work in your tests too.

    For specific details and optimizations, see:

    1 person found this answer helpful.

1 additional answer

Sort by: Most helpful
  1. AdiGeo 20 Reputation points
    2024-10-31T21:01:02.0833333+00:00

    I just tried the solution you proposed, and works perfect.

    Many thanks,


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.