From 4c687fff5e15748fbe69ba13fbae6bb706e5e23e Mon Sep 17 00:00:00 2001 From: Steve Lamerton Date: Sun, 13 Jan 2013 19:22:24 +0000 Subject: [PATCH] Allow registering of custom wxWebView backends. Add wxWebViewFactory as an abstract factory to provide backend creation. Remove old factory methods using wxWebViewBackend enum in favour of the new wxString based method. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73369 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 4 ++ include/wx/gtk/webview_webkit.h | 15 ++++ include/wx/msw/webview_ie.h | 14 ++++ include/wx/osx/webview_webkit.h | 14 ++++ include/wx/webview.h | 55 +++++++++----- interface/wx/webview.h | 100 ++++++++++++++++++++------ src/common/webview.cpp | 122 +++++++++++++++----------------- 7 files changed, 219 insertions(+), 105 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 3d55d295db..f851eebc05 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -533,6 +533,8 @@ INCOMPATIBLE CHANGES SINCE 2.9.4: previous 2.9 versions (but like in 2.8). Use wxLocale (preferred) or call wxApp::SetCLocale() from your overridden wxApp::Initialize() to restore the old behaviour. +- wxWebView::New now takes a string identifier for the backend to be used + rather than a wxWebViewBackend enum value. All: @@ -564,6 +566,8 @@ All (GUI): - Add generic wxFileSystem support to wxWebView with wxWebViewFSHandler (Nick Matthews). - Add possibility to disable context menu in wxWebView. +- Add ability to register custom wxWebView backends using + wxWebView::RegisterFactory and a wxWebViewFactory derived class. - Add possibility to hide and show again wxRibbonBar pages (wxBen). - Add wxRibbonBar pages highlighting (wxBen). - Add expand/collapse button to wxRibbonBar (rakeshthp). diff --git a/include/wx/gtk/webview_webkit.h b/include/wx/gtk/webview_webkit.h index c42f0ad564..b89fa9f106 100644 --- a/include/wx/gtk/webview_webkit.h +++ b/include/wx/gtk/webview_webkit.h @@ -164,6 +164,21 @@ private: wxDECLARE_DYNAMIC_CLASS(wxWebViewWebKit); }; +class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryWebKit : public wxWebViewFactory +{ +public: + virtual wxWebView* Create() { return new wxWebViewWebKit; } + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) + { return new wxWebViewWebKit(parent, id, url, pos, size, style, name); } +}; + + #endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__) #endif diff --git a/include/wx/msw/webview_ie.h b/include/wx/msw/webview_ie.h index 0d66b0fa30..0f613d1200 100644 --- a/include/wx/msw/webview_ie.h +++ b/include/wx/msw/webview_ie.h @@ -195,6 +195,20 @@ private: wxDECLARE_DYNAMIC_CLASS(wxWebViewIE); }; +class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryIE : public wxWebViewFactory +{ +public: + virtual wxWebView* Create() { return new wxWebViewIE; } + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) + { return new wxWebViewIE(parent, id, url, pos, size, style, name); } +}; + class VirtualProtocol : public wxIInternetProtocol { protected: diff --git a/include/wx/osx/webview_webkit.h b/include/wx/osx/webview_webkit.h index 94f99c1d58..a21bf6551e 100644 --- a/include/wx/osx/webview_webkit.h +++ b/include/wx/osx/webview_webkit.h @@ -168,6 +168,20 @@ private: //TODO: look into using DECLARE_WXCOCOA_OBJC_CLASS rather than this. }; +class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryWebKit : public wxWebViewFactory +{ +public: + virtual wxWebView* Create() { return new wxWebViewWebKit; } + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) + { return new wxWebViewWebKit(parent, id, url, pos, size, style, name); } +}; + #endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT #endif // _WX_WEBKIT_H_ diff --git a/include/wx/webview.h b/include/wx/webview.h index 0e319d7e97..2ff23c6a76 100644 --- a/include/wx/webview.h +++ b/include/wx/webview.h @@ -32,6 +32,7 @@ class wxFSFile; class wxFileSystem; +class wxWebView; enum wxWebViewZoom { @@ -78,13 +79,6 @@ enum wxWebViewFindFlags wxWEB_VIEW_FIND_DEFAULT = 0 }; -enum wxWebViewBackend -{ - wxWEB_VIEW_BACKEND_DEFAULT, - wxWEB_VIEW_BACKEND_WEBKIT, - wxWEB_VIEW_BACKEND_IE -}; - //Base class for custom scheme handlers class WXDLLIMPEXP_WEBVIEW wxWebViewHandler { @@ -99,6 +93,24 @@ private: extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[]; extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendDefault[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendIE[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendWebKit[]; + +class WXDLLIMPEXP_WEBVIEW wxWebViewFactory : public wxObject +{ +public: + virtual wxWebView* Create() = 0; + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) = 0; +}; + +WX_DECLARE_STRING_HASH_MAP(wxSharedPtr, wxStringWebViewFactoryMap); class WXDLLIMPEXP_WEBVIEW wxWebView : public wxControl { @@ -118,17 +130,22 @@ public: long style = 0, const wxString& name = wxWebViewNameStr) = 0; - static wxWebView* New(wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT); + // Factory methods allowing the use of custom factories registered with + // RegisterFactory + static wxWebView* New(const wxString& backend = wxWebViewBackendDefault); static wxWebView* New(wxWindow* parent, - wxWindowID id, - const wxString& url = wxWebViewDefaultURLStr, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT, - long style = 0, - const wxString& name = wxWebViewNameStr); - - //General methods + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& backend = wxWebViewBackendDefault, + long style = 0, + const wxString& name = wxWebViewNameStr); + + static void RegisterFactory(const wxString& backend, + wxSharedPtr factory); + + // General methods virtual void EnableContextMenu(bool enable = true) { m_showMenu = enable; @@ -208,7 +225,11 @@ protected: virtual void DoSetPage(const wxString& html, const wxString& baseUrl) = 0; private: + static void InitFactoryMap(); + static wxStringWebViewFactoryMap::iterator FindFactory(const wxString &backend); + bool m_showMenu; + static wxStringWebViewFactoryMap m_factoryMap; wxDECLARE_ABSTRACT_CLASS(wxWebView); }; diff --git a/interface/wx/webview.h b/interface/wx/webview.h index 55ff6e77b9..88b21496b2 100644 --- a/interface/wx/webview.h +++ b/interface/wx/webview.h @@ -140,6 +140,46 @@ public: wxString GetTitle(); }; +/** + @class wxWebViewFactory + + An abstract factory class for creating wxWebView backends. Each + implementation of wxWebView should have its own factory. + + @since 2.9.5 + @library{wxwebview} + @category{webview} + + @see wxWebView + */ +class wxWebViewFactory : public wxObject +{ +public: + /** + Function to create a new wxWebView with two-step creation, + wxWebView::Create should be called on the returned object. + @return the created wxWebView + */ + virtual wxWebView* Create() = 0; + + /** + Function to create a new wxWebView with parameters. + @param parent Parent window for the control + @param id ID of this control + @param url Initial URL to load + @param pos Position of the control + @param size Size of the control + @return the created wxWebView + */ + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) = 0; +}; + /** @class wxWebViewHandler @@ -290,35 +330,49 @@ public: const wxString& name = wxWebViewNameStr) = 0; /** - Factory function to create a new wxWebView for two-step creation - (you need to call wxWebView::Create on the returned object) - @param backend which web engine to use as backend for wxWebView - @return the created wxWebView, or NULL if the requested backend is - not available + Factory function to create a new wxWebView with two-step creation, + wxWebView::Create should be called on the returned object. + @param backend The backend web rendering engine to use. + @c wxWebViewBackendDefault, @c wxWebViewBackendIE and + @c wxWebViewBackendWebKit are predefined where appropriate. + @return The created wxWebView + @since 2.9.5 */ - static wxWebView* New(wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT); - + static wxWebView* New(const wxString& backend = wxWebViewBackendDefault); + /** - Factory function to create a new wxWebView - @param parent parent window to create this view in + Factory function to create a new wxWebView using a wxWebViewFactory. + @param parent Parent window for the control @param id ID of this control - @param url URL to load by default in the web view - @param pos position to create this control at - (you may use wxDefaultPosition if you use sizers) - @param size size to create this control with - (you may use wxDefaultSize if you use sizers) - @param backend which web engine to use as backend for wxWebView - @return the created wxWebView, or NULL if the requested backend + @param url Initial URL to load + @param pos Position of the control + @param size Size of the control + @param backend The backend web rendering engine to use. + @c wxWebViewBackendDefault, @c wxWebViewBackendIE and + @c wxWebViewBackendWebKit are predefined where appropriate. + @return The created wxWebView, or @c NULL if the requested backend is not available + @since 2.9.5 */ static wxWebView* New(wxWindow* parent, - wxWindowID id, - const wxString& url = wxWebViewDefaultURLStr, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT, - long style = 0, - const wxString& name = wxWebViewNameStr); + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& backend = wxWebViewBackendDefault, + long style = 0, + const wxString& name = wxWebViewNameStr); + + /** + Allows the registering of new backend for wxWebView. @a backend can be + used as an argument to New(). + @param backend The name for the new backend to be registered under + @param factory A shared pointer to the factory which creates the + appropriate backend. + @since 2.9.5 + */ + static void RegisterFactory(const wxString& backend, + wxSharedPtr factory); /** Get the title of the current web page, or its URL/path if title is not diff --git a/src/common/webview.cpp b/src/common/webview.cpp index bbd6f3168f..81d042e94f 100644 --- a/src/common/webview.cpp +++ b/src/common/webview.cpp @@ -32,6 +32,14 @@ WX_CHECK_BUILD_OPTIONS("wxWEBVIEW") extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[] = "wxWebView"; extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[] = "about:blank"; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendIE[] = "wxWebViewIE"; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendWebKit[] = "wxWebViewWebKit"; + +#ifdef __WXMSW__ +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendDefault[] = "wxWebViewIE"; +#else +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendDefault[] = "wxWebViewWebKit"; +#endif wxIMPLEMENT_ABSTRACT_CLASS(wxWebView, wxControl); wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewEvent, wxCommandEvent); @@ -43,77 +51,61 @@ wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_ERROR, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, wxWebViewEvent ); +wxStringWebViewFactoryMap wxWebView::m_factoryMap; + +// static +wxWebView* wxWebView::New(const wxString& backend) +{ + wxStringWebViewFactoryMap::iterator iter = FindFactory(backend); + + if(iter == m_factoryMap.end()) + return NULL; + else + return (*iter).second->Create(); +} + +// static +wxWebView* wxWebView::New(wxWindow* parent, wxWindowID id, const wxString& url, + const wxPoint& pos, const wxSize& size, + const wxString& backend, long style, + const wxString& name) +{ + wxStringWebViewFactoryMap::iterator iter = FindFactory(backend); + + if(iter == m_factoryMap.end()) + return NULL; + else + return (*iter).second->Create(parent, id, url, pos, size, style, name); + +} + // static -wxWebView* wxWebView::New(wxWebViewBackend backend) +void wxWebView::RegisterFactory(const wxString& backend, + wxSharedPtr factory) { - switch (backend) - { - #if defined(wxUSE_WEBVIEW_WEBKIT) && \ - (defined(__WXGTK__) || defined(__WXOSX__)) - case wxWEB_VIEW_BACKEND_WEBKIT: - return new wxWebViewWebKit(); - #endif - - #if wxUSE_WEBVIEW_IE - case wxWEB_VIEW_BACKEND_IE: - return new wxWebViewIE(); - #endif - - case wxWEB_VIEW_BACKEND_DEFAULT: - - #if defined(wxUSE_WEBVIEW_WEBKIT) && \ - (defined(__WXGTK__) || defined(__WXOSX__)) - return new wxWebViewWebKit(); - #endif - - #if wxUSE_WEBVIEW_IE - return new wxWebViewIE(); - #endif - - // fall-through intended - default: - return NULL; - } + m_factoryMap[backend] = factory; } +// static +wxStringWebViewFactoryMap::iterator wxWebView::FindFactory(const wxString &backend) +{ + // Initialise the map if needed + if(m_factoryMap.empty()) + InitFactoryMap(); + + return m_factoryMap.find(backend); +} + // static -wxWebView* wxWebView::New(wxWindow* parent, - wxWindowID id, - const wxString& url, - const wxPoint& pos, - const wxSize& size, - wxWebViewBackend backend, - long style, - const wxString& name) +void wxWebView::InitFactoryMap() { - switch (backend) - { - #if defined(wxUSE_WEBVIEW_WEBKIT) && \ - (defined(__WXGTK__) || defined(__WXOSX__)) - case wxWEB_VIEW_BACKEND_WEBKIT: - return new wxWebViewWebKit(parent, id, url, pos, size, style, name); - #endif - - #if wxUSE_WEBVIEW_IE - case wxWEB_VIEW_BACKEND_IE: - return new wxWebViewIE(parent, id, url, pos, size, style, name); - #endif - - case wxWEB_VIEW_BACKEND_DEFAULT: - - #if defined(wxUSE_WEBVIEW_WEBKIT) && \ - (defined(__WXGTK__) || defined(__WXOSX__)) - return new wxWebViewWebKit(parent, id, url, pos, size, style, name); - #endif - - #if wxUSE_WEBVIEW_IE - return new wxWebViewIE(parent, id, url, pos, size, style, name); - #endif - - // fall-through intended - default: - return NULL; - } +#ifdef __WXMSW__ + RegisterFactory(wxWebViewBackendIE, wxSharedPtr + (new wxWebViewFactoryIE)); +#else + RegisterFactory(wxWebViewBackendWebKit, wxSharedPtr + (new wxWebViewFactoryWebKit)); +#endif } #endif // wxUSE_WEBVIEW -- 2.45.2