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:
@@ -41,17 +41,21 @@ public:
|
||||
|
||||
// WebView Events tokens
|
||||
EventRegistrationToken m_navigationStartingToken = { };
|
||||
EventRegistrationToken m_sourceChangedToken = { };
|
||||
EventRegistrationToken m_navigationCompletedToken = { };
|
||||
EventRegistrationToken m_newWindowRequestedToken = { };
|
||||
EventRegistrationToken m_documentTitleChangedToken = { };
|
||||
EventRegistrationToken m_contentLoadingToken = { };
|
||||
EventRegistrationToken m_containsFullScreenElementChangedToken = { };
|
||||
|
||||
// WebView Event handlers
|
||||
HRESULT OnNavigationStarting(ICoreWebView2* sender, ICoreWebView2NavigationStartingEventArgs* args);
|
||||
HRESULT OnSourceChanged(ICoreWebView2* sender, ICoreWebView2SourceChangedEventArgs* args);
|
||||
HRESULT OnNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args);
|
||||
HRESULT OnNewWindowRequested(ICoreWebView2* sender, ICoreWebView2NewWindowRequestedEventArgs* args);
|
||||
HRESULT OnDocumentTitleChanged(ICoreWebView2* sender, IUnknown* args);
|
||||
HRESULT OnContentLoading(ICoreWebView2* sender, ICoreWebView2ContentLoadingEventArgs* args);
|
||||
HRESULT OnContainsFullScreenElementChanged(ICoreWebView2* sender, IUnknown* args);
|
||||
|
||||
HRESULT OnEnvironmentCreated(HRESULT result, ICoreWebView2Environment* environment);
|
||||
HRESULT OnWebViewCreated(HRESULT result, ICoreWebView2Controller* webViewController);
|
||||
|
@@ -257,6 +257,7 @@ private:
|
||||
static wxStringWebViewFactoryMap::iterator FindFactory(const wxString &backend);
|
||||
|
||||
bool m_showMenu;
|
||||
wxString m_findText;
|
||||
static wxStringWebViewFactoryMap m_factoryMap;
|
||||
|
||||
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_NEWWINDOW, 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)
|
||||
(wxWebViewEvent&);
|
||||
|
@@ -317,7 +317,7 @@ public:
|
||||
<a href="https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2">Edge WebView2</a>.
|
||||
It is available for Windows 7 and newer.
|
||||
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:
|
||||
- Visual Studio 2015, or newer, is required
|
||||
@@ -428,6 +428,11 @@ public:
|
||||
@event{EVT_WEBVIEW_TITLE_CHANGED(id, func)}
|
||||
Process a @c wxEVT_WEBVIEW_TITLE_CHANGED event, generated when
|
||||
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
|
||||
|
||||
@since 2.9.3
|
||||
|
@@ -120,6 +120,7 @@ public:
|
||||
void OnDocumentLoaded(wxWebViewEvent& evt);
|
||||
void OnNewWindow(wxWebViewEvent& evt);
|
||||
void OnTitleChanged(wxWebViewEvent& evt);
|
||||
void OnFullScreenChanged(wxWebViewEvent& evt);
|
||||
void OnSetPage(wxCommandEvent& evt);
|
||||
void OnViewSourceRequest(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_stop = m_toolbar->AddTool(wxID_ANY, _("Stop"), stop);
|
||||
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_tools = m_toolbar->AddTool(wxID_ANY, _("Menu"), wxBitmap(wxlogo_xpm));
|
||||
|
||||
@@ -409,7 +410,7 @@ WebFrame::WebFrame(const wxString& url) :
|
||||
SetSizer(topsizer);
|
||||
|
||||
//Set a more sensible size for web browsing
|
||||
SetSize(wxSize(800, 600));
|
||||
SetSize(FromDIP(wxSize(800, 600)));
|
||||
|
||||
// Create the Tools menu
|
||||
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_NEWWINDOW, &WebFrame::OnNewWindow, 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
|
||||
Bind(wxEVT_MENU, &WebFrame::OnSetPage, this, setPage->GetId());
|
||||
@@ -897,6 +899,12 @@ void WebFrame::OnTitleChanged(wxWebViewEvent& evt)
|
||||
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))
|
||||
{
|
||||
m_browser->SetPage
|
||||
|
@@ -48,6 +48,7 @@ wxDEFINE_EVENT( wxEVT_WEBVIEW_LOADED, wxWebViewEvent );
|
||||
wxDEFINE_EVENT( wxEVT_WEBVIEW_ERROR, wxWebViewEvent );
|
||||
wxDEFINE_EVENT( wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent );
|
||||
wxDEFINE_EVENT( wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent );
|
||||
wxDEFINE_EVENT( wxEVT_WEBVIEW_FULLSCREEN_CHANGED, wxWebViewEvent);
|
||||
|
||||
wxStringWebViewFactoryMap wxWebView::m_factoryMap;
|
||||
|
||||
@@ -202,10 +203,23 @@ void wxWebView::SelectAll()
|
||||
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
|
||||
return -1;
|
||||
if (text != m_findText)
|
||||
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
|
||||
|
@@ -253,6 +253,34 @@ wxgtk_webview_webkit_new_window(WebKitPolicyDecision *decision,
|
||||
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
|
||||
wxgtk_webview_webkit_decide_policy(WebKitWebView *web_view,
|
||||
WebKitPolicyDecision *decision,
|
||||
@@ -583,6 +611,12 @@ bool wxWebViewWebKit::Create(wxWindow *parent,
|
||||
g_signal_connect(m_web_view, "create",
|
||||
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);
|
||||
g_signal_connect(findctrl, "counted-matches",
|
||||
G_CALLBACK(wxgtk_webview_webkit_counted_matches),
|
||||
|
@@ -67,10 +67,12 @@ wxWebViewEdgeImpl::~wxWebViewEdgeImpl()
|
||||
if (m_webView)
|
||||
{
|
||||
m_webView->remove_NavigationCompleted(m_navigationCompletedToken);
|
||||
m_webView->remove_SourceChanged(m_sourceChangedToken);
|
||||
m_webView->remove_NavigationStarting(m_navigationStartingToken);
|
||||
m_webView->remove_NewWindowRequested(m_newWindowRequestedToken);
|
||||
m_webView->remove_DocumentTitleChanged(m_documentTitleChangedToken);
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
BOOL isSuccess;
|
||||
if (FAILED(args->get_IsSuccess(&isSuccess)))
|
||||
if (!args)
|
||||
isSuccess = true;
|
||||
else if (FAILED(args->get_IsSuccess(&isSuccess)))
|
||||
isSuccess = false;
|
||||
m_isBusy = false;
|
||||
wxString uri = m_ctrl->GetCurrentURL();
|
||||
@@ -186,6 +205,7 @@ HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(ICoreWebView2* WXUNUSED(sender)
|
||||
if (!isSuccess)
|
||||
{
|
||||
COREWEBVIEW2_WEB_ERROR_STATUS status;
|
||||
bool ignoreStatus = false;
|
||||
|
||||
wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, m_ctrl->GetId(), uri, wxString());
|
||||
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_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_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_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
|
||||
{
|
||||
@@ -278,6 +302,22 @@ HRESULT wxWebViewEdgeImpl::OnContentLoading(ICoreWebView2* WXUNUSED(sender), ICo
|
||||
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)
|
||||
{
|
||||
if (FAILED(result))
|
||||
@@ -303,6 +343,10 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
|
||||
Callback<ICoreWebView2NavigationStartingEventHandler>(
|
||||
this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(),
|
||||
&m_navigationStartingToken);
|
||||
m_webView->add_SourceChanged(
|
||||
Callback<ICoreWebView2SourceChangedEventHandler>(
|
||||
this, &wxWebViewEdgeImpl::OnSourceChanged).Get(),
|
||||
&m_sourceChangedToken);
|
||||
m_webView->add_NavigationCompleted(
|
||||
Callback<ICoreWebView2NavigationCompletedEventHandler>(
|
||||
this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(),
|
||||
@@ -319,6 +363,10 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
|
||||
Callback<ICoreWebView2ContentLoadingEventHandler>(
|
||||
this, &wxWebViewEdgeImpl::OnContentLoading).Get(),
|
||||
&m_contentLoadingToken);
|
||||
m_webView->add_ContainsFullScreenElementChanged(
|
||||
Callback<ICoreWebView2ContainsFullScreenElementChangedEventHandler>(
|
||||
this, &wxWebViewEdgeImpl::OnContainsFullScreenElementChanged).Get(),
|
||||
&m_containsFullScreenElementChangedToken);
|
||||
|
||||
if (m_pendingContextMenuEnabled != -1)
|
||||
{
|
||||
|
Reference in New Issue
Block a user