Merge branch 'msw_webview_edge4' of https://github.com/TcT2k/wxWidgets

Fix missing events for in-document navigation with wxWebViewEdge,
implement Find() for it and add wxEVT_WEBVIEW_FULLSCREEN_CHANGED for it
and wxGTK.

See https://github.com/wxWidgets/wxWidgets/pull/2227
This commit is contained in:
Vadim Zeitlin
2021-02-14 19:37:44 +01:00
7 changed files with 124 additions and 9 deletions

View File

@@ -41,17 +41,21 @@ public:
// WebView Events tokens // WebView Events tokens
EventRegistrationToken m_navigationStartingToken = { }; EventRegistrationToken m_navigationStartingToken = { };
EventRegistrationToken m_sourceChangedToken = { };
EventRegistrationToken m_navigationCompletedToken = { }; EventRegistrationToken m_navigationCompletedToken = { };
EventRegistrationToken m_newWindowRequestedToken = { }; EventRegistrationToken m_newWindowRequestedToken = { };
EventRegistrationToken m_documentTitleChangedToken = { }; EventRegistrationToken m_documentTitleChangedToken = { };
EventRegistrationToken m_contentLoadingToken = { }; EventRegistrationToken m_contentLoadingToken = { };
EventRegistrationToken m_containsFullScreenElementChangedToken = { };
// WebView Event handlers // WebView Event handlers
HRESULT OnNavigationStarting(ICoreWebView2* sender, ICoreWebView2NavigationStartingEventArgs* args); HRESULT OnNavigationStarting(ICoreWebView2* sender, ICoreWebView2NavigationStartingEventArgs* args);
HRESULT OnSourceChanged(ICoreWebView2* sender, ICoreWebView2SourceChangedEventArgs* args);
HRESULT OnNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args); HRESULT OnNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args);
HRESULT OnNewWindowRequested(ICoreWebView2* sender, ICoreWebView2NewWindowRequestedEventArgs* args); HRESULT OnNewWindowRequested(ICoreWebView2* sender, ICoreWebView2NewWindowRequestedEventArgs* args);
HRESULT OnDocumentTitleChanged(ICoreWebView2* sender, IUnknown* args); HRESULT OnDocumentTitleChanged(ICoreWebView2* sender, IUnknown* args);
HRESULT OnContentLoading(ICoreWebView2* sender, ICoreWebView2ContentLoadingEventArgs* args); HRESULT OnContentLoading(ICoreWebView2* sender, ICoreWebView2ContentLoadingEventArgs* args);
HRESULT OnContainsFullScreenElementChanged(ICoreWebView2* sender, IUnknown* args);
HRESULT OnEnvironmentCreated(HRESULT result, ICoreWebView2Environment* environment); HRESULT OnEnvironmentCreated(HRESULT result, ICoreWebView2Environment* environment);
HRESULT OnWebViewCreated(HRESULT result, ICoreWebView2Controller* webViewController); HRESULT OnWebViewCreated(HRESULT result, ICoreWebView2Controller* webViewController);

View File

@@ -257,6 +257,7 @@ private:
static wxStringWebViewFactoryMap::iterator FindFactory(const wxString &backend); static wxStringWebViewFactoryMap::iterator FindFactory(const wxString &backend);
bool m_showMenu; bool m_showMenu;
wxString m_findText;
static wxStringWebViewFactoryMap m_factoryMap; static wxStringWebViewFactoryMap m_factoryMap;
wxDECLARE_ABSTRACT_CLASS(wxWebView); wxDECLARE_ABSTRACT_CLASS(wxWebView);
@@ -294,6 +295,7 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_LOADED, wxWebViewEv
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_ERROR, wxWebViewEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_ERROR, wxWebViewEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_FULLSCREEN_CHANGED, wxWebViewEvent);
typedef void (wxEvtHandler::*wxWebViewEventFunction) typedef void (wxEvtHandler::*wxWebViewEventFunction)
(wxWebViewEvent&); (wxWebViewEvent&);

View File

@@ -317,7 +317,7 @@ public:
<a href="https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2">Edge WebView2</a>. <a href="https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2">Edge WebView2</a>.
It is available for Windows 7 and newer. It is available for Windows 7 and newer.
The following features are currently unsupported with this backend: The following features are currently unsupported with this backend:
virtual filesystems, custom urls, find. virtual filesystems, custom urls.
This backend is not enabled by default, to build it follow these steps: This backend is not enabled by default, to build it follow these steps:
- Visual Studio 2015, or newer, is required - Visual Studio 2015, or newer, is required
@@ -428,6 +428,11 @@ public:
@event{EVT_WEBVIEW_TITLE_CHANGED(id, func)} @event{EVT_WEBVIEW_TITLE_CHANGED(id, func)}
Process a @c wxEVT_WEBVIEW_TITLE_CHANGED event, generated when Process a @c wxEVT_WEBVIEW_TITLE_CHANGED event, generated when
the page title changes. Use GetString to get the title. the page title changes. Use GetString to get the title.
@event{EVT_WEBVIEW_FULL_SCREEN_CHANGED(id, func)}
Process a @c EVT_WEBVIEW_FULL_SCREEN_CHANGED event, generated when
the page wants to enter or leave fullscreen. Use GetInt to get the status.
Currently only implemented for the edge and WebKit2GTK+ backend
and is only available in wxWidgets 3.1.5 or later.
@endEventTable @endEventTable
@since 2.9.3 @since 2.9.3

View File

@@ -120,6 +120,7 @@ public:
void OnDocumentLoaded(wxWebViewEvent& evt); void OnDocumentLoaded(wxWebViewEvent& evt);
void OnNewWindow(wxWebViewEvent& evt); void OnNewWindow(wxWebViewEvent& evt);
void OnTitleChanged(wxWebViewEvent& evt); void OnTitleChanged(wxWebViewEvent& evt);
void OnFullScreenChanged(wxWebViewEvent& evt);
void OnSetPage(wxCommandEvent& evt); void OnSetPage(wxCommandEvent& evt);
void OnViewSourceRequest(wxCommandEvent& evt); void OnViewSourceRequest(wxCommandEvent& evt);
void OnViewTextRequest(wxCommandEvent& evt); void OnViewTextRequest(wxCommandEvent& evt);
@@ -321,7 +322,7 @@ WebFrame::WebFrame(const wxString& url) :
m_toolbar_forward = m_toolbar->AddTool(wxID_ANY, _("Forward"), forward); m_toolbar_forward = m_toolbar->AddTool(wxID_ANY, _("Forward"), forward);
m_toolbar_stop = m_toolbar->AddTool(wxID_ANY, _("Stop"), stop); m_toolbar_stop = m_toolbar->AddTool(wxID_ANY, _("Stop"), stop);
m_toolbar_reload = m_toolbar->AddTool(wxID_ANY, _("Reload"), refresh); m_toolbar_reload = m_toolbar->AddTool(wxID_ANY, _("Reload"), refresh);
m_url = new wxTextCtrl(m_toolbar, wxID_ANY, "", wxDefaultPosition, wxSize(400, -1), wxTE_PROCESS_ENTER ); m_url = new wxTextCtrl(m_toolbar, wxID_ANY, "", wxDefaultPosition, FromDIP(wxSize(400, -1)), wxTE_PROCESS_ENTER );
m_toolbar->AddControl(m_url, _("URL")); m_toolbar->AddControl(m_url, _("URL"));
m_toolbar_tools = m_toolbar->AddTool(wxID_ANY, _("Menu"), wxBitmap(wxlogo_xpm)); m_toolbar_tools = m_toolbar->AddTool(wxID_ANY, _("Menu"), wxBitmap(wxlogo_xpm));
@@ -409,7 +410,7 @@ WebFrame::WebFrame(const wxString& url) :
SetSizer(topsizer); SetSizer(topsizer);
//Set a more sensible size for web browsing //Set a more sensible size for web browsing
SetSize(wxSize(800, 600)); SetSize(FromDIP(wxSize(800, 600)));
// Create the Tools menu // Create the Tools menu
m_tools_menu = new wxMenu(); m_tools_menu = new wxMenu();
@@ -536,6 +537,7 @@ WebFrame::WebFrame(const wxString& url) :
Bind(wxEVT_WEBVIEW_ERROR, &WebFrame::OnError, this, m_browser->GetId()); Bind(wxEVT_WEBVIEW_ERROR, &WebFrame::OnError, this, m_browser->GetId());
Bind(wxEVT_WEBVIEW_NEWWINDOW, &WebFrame::OnNewWindow, this, m_browser->GetId()); Bind(wxEVT_WEBVIEW_NEWWINDOW, &WebFrame::OnNewWindow, this, m_browser->GetId());
Bind(wxEVT_WEBVIEW_TITLE_CHANGED, &WebFrame::OnTitleChanged, this, m_browser->GetId()); Bind(wxEVT_WEBVIEW_TITLE_CHANGED, &WebFrame::OnTitleChanged, this, m_browser->GetId());
Bind(wxEVT_WEBVIEW_FULLSCREEN_CHANGED, &WebFrame::OnFullScreenChanged, this, m_browser->GetId());
// Connect the menu events // Connect the menu events
Bind(wxEVT_MENU, &WebFrame::OnSetPage, this, setPage->GetId()); Bind(wxEVT_MENU, &WebFrame::OnSetPage, this, setPage->GetId());
@@ -897,6 +899,12 @@ void WebFrame::OnTitleChanged(wxWebViewEvent& evt)
wxLogMessage("%s", "Title changed; title='" + evt.GetString() + "'"); wxLogMessage("%s", "Title changed; title='" + evt.GetString() + "'");
} }
void WebFrame::OnFullScreenChanged(wxWebViewEvent & evt)
{
wxLogMessage("Full screen changed; status = %d", evt.GetInt());
ShowFullScreen(evt.GetInt() != 0);
}
void WebFrame::OnSetPage(wxCommandEvent& WXUNUSED(evt)) void WebFrame::OnSetPage(wxCommandEvent& WXUNUSED(evt))
{ {
m_browser->SetPage m_browser->SetPage

View File

@@ -48,6 +48,7 @@ wxDEFINE_EVENT( wxEVT_WEBVIEW_LOADED, wxWebViewEvent );
wxDEFINE_EVENT( wxEVT_WEBVIEW_ERROR, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_WEBVIEW_ERROR, wxWebViewEvent );
wxDEFINE_EVENT( wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent );
wxDEFINE_EVENT( wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent );
wxDEFINE_EVENT( wxEVT_WEBVIEW_FULLSCREEN_CHANGED, wxWebViewEvent);
wxStringWebViewFactoryMap wxWebView::m_factoryMap; wxStringWebViewFactoryMap wxWebView::m_factoryMap;
@@ -202,10 +203,23 @@ void wxWebView::SelectAll()
RunScript("window.getSelection().selectAllChildren(document.body);"); RunScript("window.getSelection().selectAllChildren(document.body);");
} }
long wxWebView::Find(const wxString& WXUNUSED(text), int WXUNUSED(flags)) long wxWebView::Find(const wxString& text, int flags)
{ {
// TODO: could probably be implemented by script if (text != m_findText)
return -1; ClearSelection();
m_findText = text;
wxString output;
RunScript(wxString::Format("window.find('%s', %s, %s, %s, %s)",
text,
(flags & wxWEBVIEW_FIND_MATCH_CASE) ? "true" : "false",
(flags & wxWEBVIEW_FIND_BACKWARDS) ? "true" : "false",
(flags & wxWEBVIEW_FIND_WRAP) ? "true" : "false",
(flags & wxWEBVIEW_FIND_ENTIRE_WORD) ? "true" : "false"
), &output);
if (output.IsSameAs("false", false))
return wxNOT_FOUND;
else
return 1;
} }
// static // static

View File

@@ -253,6 +253,34 @@ wxgtk_webview_webkit_new_window(WebKitPolicyDecision *decision,
return TRUE; return TRUE;
} }
static gboolean
wxgtk_webview_webkit_enter_fullscreen(WebKitWebView *WXUNUSED(web_view),
wxWebViewWebKit *webKitCtrl)
{
wxWebViewEvent event(wxEVT_WEBVIEW_FULLSCREEN_CHANGED,
webKitCtrl->GetId(),
wxString(),
wxString());
event.SetInt(1);
webKitCtrl->HandleWindowEvent(event);
return FALSE;
}
static gboolean
wxgtk_webview_webkit_leave_fullscreen(WebKitWebView *WXUNUSED(web_view),
wxWebViewWebKit *webKitCtrl)
{
wxWebViewEvent event(wxEVT_WEBVIEW_FULLSCREEN_CHANGED,
webKitCtrl->GetId(),
wxString(),
wxString());
event.SetInt(0);
webKitCtrl->HandleWindowEvent(event);
return FALSE;
}
static gboolean static gboolean
wxgtk_webview_webkit_decide_policy(WebKitWebView *web_view, wxgtk_webview_webkit_decide_policy(WebKitWebView *web_view,
WebKitPolicyDecision *decision, WebKitPolicyDecision *decision,
@@ -583,6 +611,12 @@ bool wxWebViewWebKit::Create(wxWindow *parent,
g_signal_connect(m_web_view, "create", g_signal_connect(m_web_view, "create",
G_CALLBACK(wxgtk_webview_webkit_create_webview), this); G_CALLBACK(wxgtk_webview_webkit_create_webview), this);
g_signal_connect(m_web_view, "enter-fullscreen",
G_CALLBACK(wxgtk_webview_webkit_enter_fullscreen), this);
g_signal_connect(m_web_view, "leave-fullscreen",
G_CALLBACK(wxgtk_webview_webkit_leave_fullscreen), this);
WebKitFindController* findctrl = webkit_web_view_get_find_controller(m_web_view); WebKitFindController* findctrl = webkit_web_view_get_find_controller(m_web_view);
g_signal_connect(findctrl, "counted-matches", g_signal_connect(findctrl, "counted-matches",
G_CALLBACK(wxgtk_webview_webkit_counted_matches), G_CALLBACK(wxgtk_webview_webkit_counted_matches),

View File

@@ -67,10 +67,12 @@ wxWebViewEdgeImpl::~wxWebViewEdgeImpl()
if (m_webView) if (m_webView)
{ {
m_webView->remove_NavigationCompleted(m_navigationCompletedToken); m_webView->remove_NavigationCompleted(m_navigationCompletedToken);
m_webView->remove_SourceChanged(m_sourceChangedToken);
m_webView->remove_NavigationStarting(m_navigationStartingToken); m_webView->remove_NavigationStarting(m_navigationStartingToken);
m_webView->remove_NewWindowRequested(m_newWindowRequestedToken); m_webView->remove_NewWindowRequested(m_newWindowRequestedToken);
m_webView->remove_DocumentTitleChanged(m_documentTitleChangedToken); m_webView->remove_DocumentTitleChanged(m_documentTitleChangedToken);
m_webView->remove_ContentLoading(m_contentLoadingToken); m_webView->remove_ContentLoading(m_contentLoadingToken);
m_webView->remove_ContainsFullScreenElementChanged(m_containsFullScreenElementChangedToken);
} }
} }
@@ -175,10 +177,27 @@ HRESULT wxWebViewEdgeImpl::OnNavigationStarting(ICoreWebView2* WXUNUSED(sender),
return S_OK; return S_OK;
} }
HRESULT wxWebViewEdgeImpl::OnSourceChanged(ICoreWebView2 * WXUNUSED(sender), ICoreWebView2SourceChangedEventArgs * args)
{
BOOL isNewDocument;
if (SUCCEEDED(args->get_IsNewDocument(&isNewDocument)) && !isNewDocument)
{
// navigation within the current document, send apropriate events
wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING, m_ctrl->GetId(), m_ctrl->GetCurrentURL(), wxString());
event.SetEventObject(m_ctrl);
m_ctrl->HandleWindowEvent(event);
OnNavigationCompleted(NULL, NULL);
OnContentLoading(NULL, NULL);
}
return S_OK;
}
HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(ICoreWebView2* WXUNUSED(sender), ICoreWebView2NavigationCompletedEventArgs* args) HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(ICoreWebView2* WXUNUSED(sender), ICoreWebView2NavigationCompletedEventArgs* args)
{ {
BOOL isSuccess; BOOL isSuccess;
if (FAILED(args->get_IsSuccess(&isSuccess))) if (!args)
isSuccess = true;
else if (FAILED(args->get_IsSuccess(&isSuccess)))
isSuccess = false; isSuccess = false;
m_isBusy = false; m_isBusy = false;
wxString uri = m_ctrl->GetCurrentURL(); wxString uri = m_ctrl->GetCurrentURL();
@@ -186,6 +205,7 @@ HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(ICoreWebView2* WXUNUSED(sender)
if (!isSuccess) if (!isSuccess)
{ {
COREWEBVIEW2_WEB_ERROR_STATUS status; COREWEBVIEW2_WEB_ERROR_STATUS status;
bool ignoreStatus = false;
wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, m_ctrl->GetId(), uri, wxString()); wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, m_ctrl->GetId(), uri, wxString());
event.SetEventObject(m_ctrl); event.SetEventObject(m_ctrl);
@@ -208,12 +228,16 @@ HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(ICoreWebView2* WXUNUSED(sender)
WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_DISCONNECTED, wxWEBVIEW_NAV_ERR_CONNECTION) WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_DISCONNECTED, wxWEBVIEW_NAV_ERR_CONNECTION)
WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_CANNOT_CONNECT, wxWEBVIEW_NAV_ERR_CONNECTION) WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_CANNOT_CONNECT, wxWEBVIEW_NAV_ERR_CONNECTION)
WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_HOST_NAME_NOT_RESOLVED, wxWEBVIEW_NAV_ERR_CONNECTION) WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_HOST_NAME_NOT_RESOLVED, wxWEBVIEW_NAV_ERR_CONNECTION)
WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_OPERATION_CANCELED, wxWEBVIEW_NAV_ERR_USER_CANCELLED)
WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_REDIRECT_FAILED, wxWEBVIEW_NAV_ERR_OTHER) WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_REDIRECT_FAILED, wxWEBVIEW_NAV_ERR_OTHER)
WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_UNEXPECTED_ERROR, wxWEBVIEW_NAV_ERR_OTHER) WX_ERROR2_CASE(COREWEBVIEW2_WEB_ERROR_STATUS_UNEXPECTED_ERROR, wxWEBVIEW_NAV_ERR_OTHER)
case COREWEBVIEW2_WEB_ERROR_STATUS_OPERATION_CANCELED:
// This status is triggered by vetoing a wxEVT_WEBVIEW_NAVIGATING event
ignoreStatus = true;
break;
} }
} }
m_ctrl->HandleWindowEvent(event); if (!ignoreStatus)
m_ctrl->HandleWindowEvent(event);
} }
else else
{ {
@@ -278,6 +302,22 @@ HRESULT wxWebViewEdgeImpl::OnContentLoading(ICoreWebView2* WXUNUSED(sender), ICo
return S_OK; return S_OK;
} }
HRESULT wxWebViewEdgeImpl::OnContainsFullScreenElementChanged(ICoreWebView2* WXUNUSED(sender), IUnknown* WXUNUSED(args))
{
BOOL containsFullscreenEvent;
HRESULT hr = m_webView->get_ContainsFullScreenElement(&containsFullscreenEvent);
if (FAILED(hr))
return hr;
wxWebViewEvent event(wxEVT_WEBVIEW_FULLSCREEN_CHANGED, m_ctrl->GetId(),
m_ctrl->GetCurrentURL(), wxString());
event.SetEventObject(m_ctrl);
event.SetInt(containsFullscreenEvent);
m_ctrl->HandleWindowEvent(event);
return S_OK;
}
HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Controller* webViewController) HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Controller* webViewController)
{ {
if (FAILED(result)) if (FAILED(result))
@@ -303,6 +343,10 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
Callback<ICoreWebView2NavigationStartingEventHandler>( Callback<ICoreWebView2NavigationStartingEventHandler>(
this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(), this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(),
&m_navigationStartingToken); &m_navigationStartingToken);
m_webView->add_SourceChanged(
Callback<ICoreWebView2SourceChangedEventHandler>(
this, &wxWebViewEdgeImpl::OnSourceChanged).Get(),
&m_sourceChangedToken);
m_webView->add_NavigationCompleted( m_webView->add_NavigationCompleted(
Callback<ICoreWebView2NavigationCompletedEventHandler>( Callback<ICoreWebView2NavigationCompletedEventHandler>(
this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(), this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(),
@@ -319,6 +363,10 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
Callback<ICoreWebView2ContentLoadingEventHandler>( Callback<ICoreWebView2ContentLoadingEventHandler>(
this, &wxWebViewEdgeImpl::OnContentLoading).Get(), this, &wxWebViewEdgeImpl::OnContentLoading).Get(),
&m_contentLoadingToken); &m_contentLoadingToken);
m_webView->add_ContainsFullScreenElementChanged(
Callback<ICoreWebView2ContainsFullScreenElementChangedEventHandler>(
this, &wxWebViewEdgeImpl::OnContainsFullScreenElementChanged).Get(),
&m_containsFullScreenElementChangedToken);
if (m_pendingContextMenuEnabled != -1) if (m_pendingContextMenuEnabled != -1)
{ {