]> git.saurik.com Git - wxWidgets.git/commitdiff
Move the wxWebFileProtocolHandler from the IE backend to the common source, add the...
authorSteve Lamerton <steve.lamerton@gmail.com>
Thu, 28 Jul 2011 16:49:48 +0000 (16:49 +0000)
committerSteve Lamerton <steve.lamerton@gmail.com>
Thu, 28 Jul 2011 16:49:48 +0000 (16:49 +0000)
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
include/wx/msw/webview_ie.h
include/wx/osx/webview_webkit.h
include/wx/webview.h
samples/web/web.cpp
src/common/webview.cpp
src/msw/webview_ie.cpp

index 3dc9acc282416dda3ded036c375322e9aa835b05..7bc2d268cd20725c70f31ec90203ee4eda0bbaeb 100644 (file)
@@ -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;
index 68dd4d712164c017bb38fa483f4d21a21b0a063f..ff0500cb231f41e68e51ab90e6ca14a9bf7e8c63 100644 (file)
 #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
 {
index 5f49b437062d312a2fce4d54f5f79bd5367c4d57..8744668dfefe219fe447addb3af871c6b10f027c 100644 (file)
@@ -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();
index 2218a2aee8dd65b4419834a2bab305ac73f37e12..43bb52bab8b3094d22987eb0284de38e6b9cddb3 100644 (file)
@@ -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
index b65cc810995af10b4ebe030ba71dc9717542e036..48d1859c4a3f8718ecc6170c73f5572eed66717b 100644 (file)
@@ -27,6 +27,8 @@
 #include <wx/settings.h>
 #include <wx/webview.h>
 #include <wx/infobar.h>
+#include <wx/filesys.h>
+#include <wx/fs_arc.h>
 
 #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
index 8c69bb92756821002ebe1c777958d66e67db45b3..6fa131c2f23c4f871d9b9cb0d2f6c6e6bc303cb7 100644 (file)
@@ -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)
 {
index 8d9c8f974f7fdda3f1d5d19d6caec9ef9eadddd2..a3ddf371552a3495710d0a70d3b521fa8820d469 100644 (file)
 #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);