diff --git a/include/wx/webview_chromium.h b/include/wx/webview_chromium.h index 2387f2ed28..da0edbce57 100644 --- a/include/wx/webview_chromium.h +++ b/include/wx/webview_chromium.h @@ -11,158 +11,12 @@ #if wxUSE_WEBVIEW && wxUSE_WEBVIEW_CHROMIUM -#include "wx/control.h" #include "wx/webview.h" -#include "wx/sharedptr.h" -#include "wx/vector.h" - -#ifdef __VISUALC__ -#pragma warning(push) -#pragma warning(disable:4100) -#endif - -#include "include/cef_browser.h" -#include "include/cef_client.h" -#include "include/cef_scheme.h" -#include "include/cef_version.h" -#include "include/base/cef_lock.h" - -#ifdef __VISUALC__ -#pragma warning(pop) -#endif extern WXDLLIMPEXP_DATA_WEBVIEW_CHROMIUM(const char) wxWebViewBackendChromium[]; class wxWebViewChromium; - -// ClientHandler implementation. -class ClientHandler : public CefClient, - public CefContextMenuHandler, - public CefDisplayHandler, - public CefLifeSpanHandler, - public CefLoadHandler -{ -public: - ClientHandler() : m_loadErrorCode(-1) {} - virtual ~ClientHandler() {} - - virtual CefRefPtr GetContextMenuHandler() { return this; } - virtual CefRefPtr GetLifeSpanHandler() { return this; } - virtual CefRefPtr GetLoadHandler() { return this; } - virtual CefRefPtr GetDisplayHandler() { return this; } - - // CefDisplayHandler methods - virtual void OnLoadingStateChange(CefRefPtr browser, - bool isLoading, bool canGoBack, - bool canGoForward); - virtual void OnAddressChange(CefRefPtr browser, - CefRefPtr frame, - const CefString& url); - virtual void OnTitleChange(CefRefPtr browser, - const CefString& title); - virtual bool OnConsoleMessage(CefRefPtr browser, - const CefString& message, - const CefString& source, - int line); - - // CefContextMenuHandler methods - virtual void OnBeforeContextMenu(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr params, - CefRefPtr model); - virtual bool OnContextMenuCommand(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr params, - int command_id, - CefContextMenuHandler::EventFlags event_flags); - virtual void OnContextMenuDismissed(CefRefPtr browser, - CefRefPtr frame); - - // CefLifeSpanHandler methods - virtual bool OnBeforePopup(CefRefPtr browser, - CefRefPtr frame, - const CefString& target_url, - const CefString& target_frame_name, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - CefRefPtr& client, - CefBrowserSettings& settings, - bool* no_javascript_access); - virtual void OnAfterCreated(CefRefPtr browser); - virtual bool DoClose(CefRefPtr browser); - virtual void OnBeforeClose(CefRefPtr browser); - - // CefLoadHandler methods - virtual void OnLoadStart(CefRefPtr browser, - CefRefPtr frame); - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode); - virtual void OnLoadError(CefRefPtr browser, - CefRefPtr frame, - ErrorCode errorCode, - const CefString& errorText, - const CefString& failedUrl); - - CefRefPtr GetBrowser() { return m_browser; } - - void SetWebView(wxWebViewChromium *webview) { m_webview = webview; } - -private: - CefRefPtr m_browser; - wxWebViewChromium *m_webview; - int m_browserId; - // Record the load error code: enum wxWebViewNavigationError - // -1 means no error. - int m_loadErrorCode; - IMPLEMENT_REFCOUNTING(ClientHandler); -}; - -class SchemeHandler : public CefResourceHandler -{ -public: - SchemeHandler(const wxSharedPtr& handler) : m_handler(handler), m_offset(0) {} - - // CefResourceHandler methods - virtual bool ProcessRequest(CefRefPtr request, - CefRefPtr callback); - virtual void GetResponseHeaders(CefRefPtr response, - int64& response_length, - CefString& redirectUrl); - virtual bool ReadResponse(void* data_out, - int bytes_to_read, - int& bytes_read, - CefRefPtr callback); - virtual void Cancel() {} - -private: - wxSharedPtr m_handler; - std::string m_data; - std::string m_mime_type; - size_t m_offset; - - IMPLEMENT_REFCOUNTING(SchemeHandler); - base::Lock m_lock; -}; - -class SchemeHandlerFactory : public CefSchemeHandlerFactory -{ -public: - SchemeHandlerFactory(wxSharedPtr handler): m_handler(handler) {} - - // Return a new scheme handler instance to handle the request. - virtual CefRefPtr Create(CefRefPtr WXUNUSED(browser), - CefRefPtr WXUNUSED(frame), - const CefString& WXUNUSED(scheme_name), - CefRefPtr WXUNUSED(request)) - { - return new SchemeHandler( m_handler ); - } - - IMPLEMENT_REFCOUNTING(SchemeHandlerFactory); -private: - wxSharedPtr m_handler; -}; +class ClientHandler; class WXDLLIMPEXP_WEBVIEW_CHROMIUM wxWebViewChromium : public wxWebView { @@ -293,7 +147,7 @@ private: //We also friend ClientHandler so it can access the history friend class ClientHandler; - CefRefPtr m_clientHandler; + ClientHandler* m_clientHandler; wxDECLARE_DYNAMIC_CLASS(wxWebViewChromium); }; diff --git a/src/common/webview_chromium.cpp b/src/common/webview_chromium.cpp index 5443575611..b67da71bab 100644 --- a/src/common/webview_chromium.cpp +++ b/src/common/webview_chromium.cpp @@ -24,7 +24,11 @@ #include "include/cef_app.h" #include "include/cef_browser.h" +#include "include/cef_client.h" +#include "include/cef_scheme.h" #include "include/cef_string_visitor.h" +#include "include/cef_version.h" +#include "include/base/cef_lock.h" #ifdef __VISUALC__ #pragma warning(pop) @@ -38,6 +42,135 @@ extern WXDLLIMPEXP_DATA_WEBVIEW_CHROMIUM(const char) wxWebViewBackendChromium[] wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewChromium, wxWebView); +// ClientHandler implementation. +class ClientHandler : public CefClient, + public CefContextMenuHandler, + public CefDisplayHandler, + public CefLifeSpanHandler, + public CefLoadHandler +{ +public: + ClientHandler() : m_loadErrorCode(-1) {} + virtual ~ClientHandler() {} + + virtual CefRefPtr GetContextMenuHandler() { return this; } + virtual CefRefPtr GetLifeSpanHandler() { return this; } + virtual CefRefPtr GetLoadHandler() { return this; } + virtual CefRefPtr GetDisplayHandler() { return this; } + + // CefDisplayHandler methods + virtual void OnLoadingStateChange(CefRefPtr browser, + bool isLoading, bool canGoBack, + bool canGoForward); + virtual void OnAddressChange(CefRefPtr browser, + CefRefPtr frame, + const CefString& url); + virtual void OnTitleChange(CefRefPtr browser, + const CefString& title); + virtual bool OnConsoleMessage(CefRefPtr browser, + const CefString& message, + const CefString& source, + int line); + + // CefContextMenuHandler methods + virtual void OnBeforeContextMenu(CefRefPtr browser, + CefRefPtr frame, + CefRefPtr params, + CefRefPtr model); + virtual bool OnContextMenuCommand(CefRefPtr browser, + CefRefPtr frame, + CefRefPtr params, + int command_id, + CefContextMenuHandler::EventFlags event_flags); + virtual void OnContextMenuDismissed(CefRefPtr browser, + CefRefPtr frame); + + // CefLifeSpanHandler methods + virtual bool OnBeforePopup(CefRefPtr browser, + CefRefPtr frame, + const CefString& target_url, + const CefString& target_frame_name, + const CefPopupFeatures& popupFeatures, + CefWindowInfo& windowInfo, + CefRefPtr& client, + CefBrowserSettings& settings, + bool* no_javascript_access); + virtual void OnAfterCreated(CefRefPtr browser); + virtual bool DoClose(CefRefPtr browser); + virtual void OnBeforeClose(CefRefPtr browser); + + // CefLoadHandler methods + virtual void OnLoadStart(CefRefPtr browser, + CefRefPtr frame); + virtual void OnLoadEnd(CefRefPtr browser, + CefRefPtr frame, + int httpStatusCode); + virtual void OnLoadError(CefRefPtr browser, + CefRefPtr frame, + ErrorCode errorCode, + const CefString& errorText, + const CefString& failedUrl); + + CefRefPtr GetBrowser() { return m_browser; } + + void SetWebView(wxWebViewChromium *webview) { m_webview = webview; } + +private: + CefRefPtr m_browser; + wxWebViewChromium *m_webview; + int m_browserId; + // Record the load error code: enum wxWebViewNavigationError + // -1 means no error. + int m_loadErrorCode; + IMPLEMENT_REFCOUNTING(ClientHandler); +}; + +class SchemeHandler : public CefResourceHandler +{ +public: + SchemeHandler(const wxSharedPtr& handler) : m_handler(handler), m_offset(0) {} + + // CefResourceHandler methods + virtual bool ProcessRequest(CefRefPtr request, + CefRefPtr callback); + virtual void GetResponseHeaders(CefRefPtr response, + int64& response_length, + CefString& redirectUrl); + virtual bool ReadResponse(void* data_out, + int bytes_to_read, + int& bytes_read, + CefRefPtr callback); + virtual void Cancel() {} + +private: + wxSharedPtr m_handler; + std::string m_data; + std::string m_mime_type; + size_t m_offset; + + IMPLEMENT_REFCOUNTING(SchemeHandler); + base::Lock m_lock; +}; + +class SchemeHandlerFactory : public CefSchemeHandlerFactory +{ +public: + SchemeHandlerFactory(wxSharedPtr handler) : m_handler(handler) {} + + // Return a new scheme handler instance to handle the request. + virtual CefRefPtr Create(CefRefPtr WXUNUSED(browser), + CefRefPtr WXUNUSED(frame), + const CefString& WXUNUSED(scheme_name), + CefRefPtr WXUNUSED(request)) + { + return new SchemeHandler(m_handler); + } + + IMPLEMENT_REFCOUNTING(SchemeHandlerFactory); +private: + wxSharedPtr m_handler; +}; + class wxStringVisitor : public CefStringVisitor { public: @@ -99,6 +232,7 @@ bool wxWebViewChromium::Create(wxWindow* parent, CefWindowInfo info; m_clientHandler = new ClientHandler(); + m_clientHandler->AddRef(); m_clientHandler->SetWebView(this); #ifdef __WXMSW__ @@ -135,6 +269,11 @@ bool wxWebViewChromium::Create(wxWindow* parent, wxWebViewChromium::~wxWebViewChromium() { + if (m_clientHandler) + { + m_clientHandler->Release(); + m_clientHandler = NULL; + } } void wxWebViewChromium::OnSize(wxSizeEvent& event)