From: Steve Lamerton Date: Fri, 5 Aug 2011 09:06:45 +0000 (+0000) Subject: Add support for loading resources in custom schemes for the WebKitGTK+ backend. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/211da8a57d923da0fda6402dc6d5417124497171 Add support for loading resources in custom schemes for the WebKitGTK+ backend. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68554 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/gtk/webview_webkit.h b/include/wx/gtk/webview_webkit.h index 14c7651be8..9d3c500c0a 100644 --- a/include/wx/gtk/webview_webkit.h +++ b/include/wx/gtk/webview_webkit.h @@ -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 diff --git a/src/gtk/webview_webkit.cpp b/src/gtk/webview_webkit.cpp index dd478fe387..ea424c8b16 100644 --- a/src/gtk/webview_webkit.cpp +++ b/src/gtk/webview_webkit.cpp @@ -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 hanlders = webKitCtrl->GetHandlers(); + + //We are not vetoed so see if we match one of the additional handlers + for(wxVector::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);