From eff8f7952ed2ecc85b48dd01a047658d7f4eafcb Mon Sep 17 00:00:00 2001 From: Steve Lamerton Date: Thu, 28 Jul 2011 16:49:48 +0000 Subject: [PATCH] Move the wxWebFileProtocolHandler from the IE backend to the common source, add the RegisterProtocol method to all classes (as a stub in GTK and OSX). Register the file protocol handler in the sample for testing purposes. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68446 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/webview_webkit.h | 3 ++ include/wx/msw/webview_ie.h | 16 ------ include/wx/osx/webview_webkit.h | 3 ++ include/wx/webview.h | 19 +++++++ samples/web/web.cpp | 8 +++ src/common/webview.cpp | 92 ++++++++++++++++++++++++++++++++ src/msw/webview_ie.cpp | 94 --------------------------------- 7 files changed, 125 insertions(+), 110 deletions(-) diff --git a/include/wx/gtk/webview_webkit.h b/include/wx/gtk/webview_webkit.h index 3dc9acc282..7bc2d268cd 100644 --- a/include/wx/gtk/webview_webkit.h +++ b/include/wx/gtk/webview_webkit.h @@ -150,6 +150,9 @@ public: virtual void ClearSelection(); virtual void RunScript(const wxString& javascript); + + //Virtual Filesystem Support + virtual void RegisterProtocol(wxWebProtocolHandler* hanlder); /** FIXME: hack to work around signals being received too early */ bool m_ready; diff --git a/include/wx/msw/webview_ie.h b/include/wx/msw/webview_ie.h index 68dd4d7121..ff0500cb23 100644 --- a/include/wx/msw/webview_ie.h +++ b/include/wx/msw/webview_ie.h @@ -22,23 +22,7 @@ #include "wx/vector.h" struct IHTMLDocument2; - class wxFSFile; -class wxFileSystem; - -//Loads from uris such as file:///C:/example/example.html or archives such as -//file:///C:/example/example.zip?protocol=zip;path=example.html -class WXDLLIMPEXP_WEB wxWebFileProtocolHandler : public wxWebProtocolHandler -{ -public: - wxWebFileProtocolHandler(); - virtual wxString GetProtocol() { return m_protocol; } - virtual wxFSFile* GetFile(const wxString &uri); - virtual wxString CombineURIs(const wxString &baseuri, const wxString &newuri); -private: - wxString m_protocol; - wxFileSystem* m_fileSystem; -}; class WXDLLIMPEXP_WEB wxWebViewIE : public wxWebView { diff --git a/include/wx/osx/webview_webkit.h b/include/wx/osx/webview_webkit.h index 5f49b43706..8744668dfe 100644 --- a/include/wx/osx/webview_webkit.h +++ b/include/wx/osx/webview_webkit.h @@ -115,6 +115,9 @@ public: virtual void ClearSelection() {} void RunScript(const wxString& javascript); + + //Virtual Filesystem Support + virtual void RegisterProtocol(wxWebProtocolHandler* hanlder) {}; // ---- methods not from the parent (common) interface bool CanGetPageSource(); diff --git a/include/wx/webview.h b/include/wx/webview.h index 2218a2aee8..43bb52bab8 100644 --- a/include/wx/webview.h +++ b/include/wx/webview.h @@ -21,6 +21,7 @@ #include "wx/vector.h" class wxFSFile; +class wxFileSystem; class WXDLLIMPEXP_WEB wxWebHistoryItem { @@ -106,6 +107,7 @@ enum wxWebViewBackend wxWEB_VIEW_BACKEND_IE }; +//Base class for custom protocol handlers class WXDLLIMPEXP_WEB wxWebProtocolHandler { public: @@ -114,6 +116,20 @@ public: virtual wxString CombineURIs(const wxString &baseuri, const wxString &newuri) = 0; }; +//Loads from uris such as file:///C:/example/example.html or archives such as +//file:///C:/example/example.zip?protocol=zip;path=example.html +class WXDLLIMPEXP_WEB wxWebFileProtocolHandler : public wxWebProtocolHandler +{ +public: + wxWebFileProtocolHandler(); + virtual wxString GetProtocol() { return m_protocol; } + virtual wxFSFile* GetFile(const wxString &uri); + virtual wxString CombineURIs(const wxString &baseuri, const wxString &newuri); +private: + wxString m_protocol; + wxFileSystem* m_fileSystem; +}; + extern WXDLLIMPEXP_DATA_WEB(const char) wxWebViewNameStr[]; extern WXDLLIMPEXP_DATA_WEB(const char) wxWebViewDefaultURLStr[]; @@ -343,6 +359,9 @@ public: virtual bool CanRedo() = 0; virtual void Undo() = 0; virtual void Redo() = 0; + + //Virtual Filesystem Support + virtual void RegisterProtocol(wxWebProtocolHandler* handler) = 0; }; class WXDLLIMPEXP_WEB wxWebNavigationEvent : public wxCommandEvent diff --git a/samples/web/web.cpp b/samples/web/web.cpp index b65cc81099..48d1859c4a 100644 --- a/samples/web/web.cpp +++ b/samples/web/web.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include #if !defined(__WXMSW__) && !defined(__WXPM__) #include "../sample.xpm" @@ -139,6 +141,9 @@ bool WebApp::OnInit() WebFrame::WebFrame() : wxFrame(NULL, wxID_ANY, "wxWebView Sample") { + //Required from virtual file system archive support + wxFileSystem::AddHandler(new wxArchiveFSHandler); + // set the frame icon SetIcon(wxICON(sample)); SetTitle("wxWebView Sample"); @@ -184,6 +189,9 @@ WebFrame::WebFrame() : wxFrame(NULL, wxID_ANY, "wxWebView Sample") m_browser = wxWebView::New(this, wxID_ANY, "http://www.wxwidgets.org"); topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1)); + //We register the test:// protocol for testing purposes + m_browser->RegisterProtocol(new wxWebFileProtocolHandler()); + SetSizer(topsizer); //Set a more sensible size for web browsing diff --git a/src/common/webview.cpp b/src/common/webview.cpp index 8c69bb9275..6fa131c2f2 100644 --- a/src/common/webview.cpp +++ b/src/common/webview.cpp @@ -21,6 +21,8 @@ #include "wx/osx/webview_webkit.h" #include "wx/gtk/webview_webkit.h" #include "wx/msw/webview_ie.h" +#include "wx/filesys.h" +#include "wx/tokenzr.h" // DLL options compatibility check: #include "wx/app.h" @@ -37,6 +39,96 @@ wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_LOADED, wxWebNavigationEvent ); wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_ERROR, wxWebNavigationEvent ); wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, wxWebNavigationEvent ); +//Taken from wx/filesys.cpp +static wxString EscapeFileNameCharsInURL(const char *in) +{ + wxString s; + + for ( const unsigned char *p = (const unsigned char*)in; *p; ++p ) + { + const unsigned char c = *p; + + if ( c == '/' || c == '-' || c == '.' || c == '_' || c == '~' || + (c >= '0' && c <= '9') || + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') ) + { + s << c; + } + else + { + s << wxString::Format("%%%02x", c); + } + } + + return s; +} + +wxWebFileProtocolHandler::wxWebFileProtocolHandler() +{ + m_protocol = "test"; + m_fileSystem = new wxFileSystem(); +} + +wxFSFile* wxWebFileProtocolHandler::GetFile(const wxString &uri) +{ + size_t pos = uri.find('?'); + //There is no query string so we can load the file directly + if(pos == wxString::npos) + { + size_t doubleslash = uri.find("//"); + //The path is incorrectly formed without // after the first protocol + if(doubleslash == wxString::npos) + return NULL; + + wxString fspath = "file:" + + EscapeFileNameCharsInURL(uri.substr(doubleslash + 2)); + return m_fileSystem->OpenFile(fspath); + } + //Otherwise we have a query string of some kind that we need to extract + else{ + //First we extract the query string, this should have two parameters, + //protocol=type and path=path + wxString query = uri.substr(pos + 1), protocol, path; + //We also trim the query off the end as we handle it alone + wxString lefturi = uri.substr(0, pos); + wxStringTokenizer tokenizer(query, ";"); + while(tokenizer.HasMoreTokens() && (protocol == "" || path == "")) + { + wxString token = tokenizer.GetNextToken(); + if(token.substr(0, 9) == "protocol=") + { + protocol = token.substr(9); + } + else if(token.substr(0, 5) == "path=") + { + path = token.substr(5); + } + } + if(protocol == "" || path == "") + return NULL; + + //We now have the path and the protocol and so can format a correct uri + //to pass to wxFileSystem to get a wxFSFile + size_t doubleslash = uri.find("//"); + //The path is incorrectly formed without // after the first protocol + if(doubleslash == wxString::npos) + return NULL; + + wxString fspath = "file:" + + EscapeFileNameCharsInURL(lefturi.substr(doubleslash + 2)) + + "#" + protocol +":" + path; + return m_fileSystem->OpenFile(fspath); + } +} + +wxString wxWebFileProtocolHandler::CombineURIs(const wxString &baseuri, + const wxString &newuri) +{ + //Still need to be implemented correctly + return newuri; +} + // static wxWebView* wxWebView::New(wxWebViewBackend backend) { diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index 8d9c8f974f..a3ddf37155 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -26,101 +26,10 @@ #include "wx/msw/registry.h" #include "wx/msw/missing.h" #include "wx/filesys.h" -#include "wx/tokenzr.h" //We link to urlmon as it is required for CoInternetGetSession #pragma comment(lib, "urlmon") -//Taken from wx/filesys.cpp -static wxString EscapeFileNameCharsInURL(const char *in) -{ - wxString s; - - for ( const unsigned char *p = (const unsigned char*)in; *p; ++p ) - { - const unsigned char c = *p; - - if ( c == '/' || c == '-' || c == '.' || c == '_' || c == '~' || - (c >= '0' && c <= '9') || - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') ) - { - s << c; - } - else - { - s << wxString::Format("%%%02x", c); - } - } - - return s; -} - -wxWebFileProtocolHandler::wxWebFileProtocolHandler() -{ - m_protocol = "test"; - m_fileSystem = new wxFileSystem(); -} - -wxFSFile* wxWebFileProtocolHandler::GetFile(const wxString &uri) -{ - size_t pos = uri.find('?'); - //There is no query string so we can load the file directly - if(pos == wxString::npos) - { - size_t doubleslash = uri.find("//"); - //The path is incorrectly formed without // after the first protocol - if(doubleslash == wxString::npos) - return NULL; - - wxString fspath = "file:" + - EscapeFileNameCharsInURL(uri.substr(doubleslash + 2)); - return m_fileSystem->OpenFile(fspath); - } - //Otherwise we have a query string of some kind that we need to extract - else{ - //First we extract the query string, this should have two parameters, - //protocol=type and path=path - wxString query = uri.substr(pos + 1), protocol, path; - //We also trim the query off the end as we handle it alone - wxString lefturi = uri.substr(0, pos); - wxStringTokenizer tokenizer(query, ";"); - while(tokenizer.HasMoreTokens() && (protocol == "" || path == "")) - { - wxString token = tokenizer.GetNextToken(); - if(token.substr(0, 9) == "protocol=") - { - protocol = token.substr(9); - } - else if(token.substr(0, 5) == "path=") - { - path = token.substr(5); - } - } - if(protocol == "" || path == "") - return NULL; - - //We now have the path and the protocol and so can format a correct uri - //to pass to wxFileSystem to get a wxFSFile - size_t doubleslash = uri.find("//"); - //The path is incorrectly formed without // after the first protocol - if(doubleslash == wxString::npos) - return NULL; - - wxString fspath = "file:" + - EscapeFileNameCharsInURL(lefturi.substr(doubleslash + 2)) - + "#" + protocol +":" + path; - return m_fileSystem->OpenFile(fspath); - } -} - -wxString wxWebFileProtocolHandler::CombineURIs(const wxString &baseuri, - const wxString &newuri) -{ - //Still need to be implemented correctly - return newuri; -} - BEGIN_EVENT_TABLE(wxWebViewIE, wxControl) EVT_ACTIVEX(wxID_ANY, wxWebViewIE::onActiveXEvent) EVT_ERASE_BACKGROUND(wxWebViewIE::onEraseBg) @@ -160,9 +69,6 @@ bool wxWebViewIE::Create(wxWindow* parent, m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE); m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE); - //For testing purposes - RegisterProtocol(new wxWebFileProtocolHandler()); - m_container = new wxActiveXContainer(this, IID_IWebBrowser2, m_webBrowser); SetBackgroundStyle(wxBG_STYLE_PAINT); -- 2.45.2