-1

I use WebView2 to create an integrated browser compatible with Edge. To construct my webview, I added four listeners who are called when we call the function 'navigate2'.

m_controlsWebView->add_SourceChanged(Microsoft::WRL::Callback<ICoreWebView2SourceChangedEventHandler>(
    this, &EdgeBrowser::OnWebViewSourceChanged)
    .Get(), &m_sourceChangedToken);

m_controlsWebView->add_ContentLoading(Microsoft::WRL::Callback<ICoreWebView2ContentLoadingEventHandler>(
    this, &EdgeBrowser::OnWebViewContentLoading)
    .Get(), &m_contentLoadingToken);

m_controlsWebView->add_HistoryChanged(Microsoft::WRL::Callback<ICoreWebView2HistoryChangedEventHandler>(
    this, &EdgeBrowser::OnWebViewHistoryChanged)
    .Get(), &m_historyChangedToken);

m_controlsWebView->add_NavigationCompleted(Microsoft::WRL::Callback<ICoreWebView2NavigationCompletedEventHandler>(
    this, &EdgeBrowser::OnWebViewNavigationCompleted)
    .Get(), &m_navigationCompletedToken);

Code of OnWebViewHistoryChanged :

HRESULT EdgeBrowser::OnWebViewHistoryChanged(ICoreWebView2* sender, IUnknown* args) {
     GEMLOG(InfoLevel, "HRESULT IntegratedBrowser2::OnWebViewHistoryChanged(ICoreWebView2* sender, IUnknown* args)", "OK")
     return S_OK;
}

Code of OnWebViewNavigationCompleted :

HRESULT EdgeBrowser::OnWebViewNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args) {

if (args)
{
    BOOL succeedeed;
    args->get_IsSuccess(&succeedeed);

    if (succeedeed == FALSE)
    {
        COREWEBVIEW2_WEB_ERROR_STATUS error_stats;
        args->get_WebErrorStatus(&error_stats);
        std::wstring error = this->WebErrorStatusToString(error_stats);
        std::string str_error = utils::wStringToString(error, CP_UTF8);

        GEMLOG(ErrorLevel, "HRESULT EdgeBrowser::OnWebViewNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args)", str_error.c_str())
    }
    else
    {
        GEMLOG(InfoLevel, "HRESULT EdgeBrowser::OnWebViewNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args)", "OK")
    }
}
return S_OK;
}

Once I call the Microsoft function 'navigate2', I notice that the delay between the call of my function OnWebViewHistoryChanged and OnWebViewNavigationCompleted is MORE THAN one minute.

Why ?? What are the different possible reason of this slowdown ?

 04-10-2021 15:56:01 0x00002428     (InfoLevel,HRESULT EdgeBrowser::OnWebViewSourceChanged(ICoreWebView2* sender, ICoreWebView2SourceChangedEventArgs* args),) OK
 04-10-2021 15:56:01 0x00002428     (InfoLevel,HRESULT EdgeBrowser::OnWebViewContentLoading(ICoreWebView2* sender, ICoreWebView2ContentLoadingEventArgs* args),) The operation completed successfully.
 04-10-2021 15:56:01 0x00002428     (InfoLevel,HRESULT EdgeBrowser::OnWebViewHistoryChanged(ICoreWebView2* sender, IUnknown* args),) OK
 04-10-2021 15:57:04 0x00002428     (InfoLevel,HRESULT EdgeBrowser::OnWebViewNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args),) OK
user2274060
  • 896
  • 5
  • 18
  • 35

1 Answers1

1

The CoreWebView2.NavigationCompleted event is raised after the DOM body.onload event is raised. This can happen much later since this event waits for all subdownloads in the HTML document to complete including all images, child frames, and so on.

Alternatively you can consider the CoreWebView2.DOMContentLoaded event which is raised with the DOM document.DOMContentLoaded event which is raised once the DOM is parsed and does not wait for subdownloads to complete.

David Risney
  • 3,886
  • 15
  • 16