Add support for loading resources in custom schemes for the WebKitGTK+ backend.
authorSteve Lamerton <steve.lamerton@gmail.com>
Fri, 5 Aug 2011 09:06:45 +0000 (09:06 +0000)
committerSteve Lamerton <steve.lamerton@gmail.com>
Fri, 5 Aug 2011 09:06:45 +0000 (09:06 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68554 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/webview_webkit.h
src/gtk/webview_webkit.cpp

index 14c7651be8adea903213c467dda160e323243875..9d3c500c0a94993249b4934cf31365d745527237 100644 (file)
@@ -136,6 +136,9 @@ public:
      * user)
      */
     bool m_busy;
+    
+    bool m_guard;
+    wxString m_vfsurl;
 
     //We use this flag to stop recursion when we load a page from the navigation
     //callback, mainly when loading a VFS page
index dd478fe387135412b08e3021c493e26cc37fe062..ea424c8b163afe7a8c27b76a79fb3822a6b17af8 100644 (file)
@@ -73,6 +73,10 @@ wxgtk_webview_webkit_navigation(WebKitWebView *,
     if(webKitCtrl->m_guard)
     {
         webKitCtrl->m_guard = false;
+        //We set this to make sure that we don't try to load the page again from 
+        //the resource request callback
+        webKitCtrl->m_vfsurl = webkit_network_request_get_uri(request);
+        webkit_web_policy_decision_use(policy_decision);
         return FALSE;
     }
 
@@ -314,6 +318,58 @@ wxgtk_webview_webkit_title_changed(WebKitWebView*,
 
 }
 
+static void
+wxgtk_webview_webkit_resource_req(WebKitWebView *,
+                                  WebKitWebFrame *,
+                                  WebKitWebResource *,
+                                  WebKitNetworkRequest *request,
+                                  WebKitNetworkResponse *,
+                                  wxWebViewWebKit *webKitCtrl)
+{
+    wxString uri = webkit_network_request_get_uri(request);
+    
+    wxWebHandler *handler = NULL;
+    wxVector<wxWebHandler*> hanlders = webKitCtrl->GetHandlers();
+    
+    //We are not vetoed so see if we match one of the additional handlers
+    for(wxVector<wxWebHandler*>::iterator it = hanlders.begin();
+        it != hanlders.end(); ++it)
+    {
+        if(uri.substr(0, (*it)->GetName().length()) == (*it)->GetName())
+        {
+            handler = (*it);
+        }
+    }
+    //If we found a handler we can then use it to load the file directly 
+    //ourselves
+    if(handler)
+    {
+        //If it is requsting the page itself then return as we have already
+        //loaded it from the archive
+        if(webKitCtrl->m_vfsurl == uri)
+            return;
+
+        wxFSFile* file = handler->GetFile(uri);
+        if(file)
+        {
+            //We redirect to a temp file for now, small things could be loaded
+            //using the data scheme
+            size_t size = file->GetStream()->GetLength();
+            char *buffer = new char[size];
+            wxFile tempfile;
+            wxString path = wxFileName::CreateTempFileName("wxwebview_", &tempfile);
+            //We can then stream from the archive to the temp file
+            file->GetStream()->Read(buffer, size);
+            tempfile.Write(buffer, size);
+            tempfile.Close();
+            delete[] buffer;
+            //Then we can redirect the call
+            webkit_network_request_set_uri(request, "file://" + path);
+        }
+        
+    }
+}
+
 } // extern "C"
 
 //-----------------------------------------------------------------------------
@@ -369,6 +425,9 @@ bool wxWebViewWebKit::Create(wxWindow *parent,
     g_signal_connect_after(web_view, "title-changed",
                            G_CALLBACK(wxgtk_webview_webkit_title_changed), this);
 
+    g_signal_connect_after(web_view, "resource-request-starting",
+                           G_CALLBACK(wxgtk_webview_webkit_resource_req), this);
+
     m_parent->DoAddChild( this );
 
     PostCreation(size);