X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/263e3a8327f544990c7ba7edb8cd34994c908049..fea281f428a5c24465f2052ae3176850f8f01958:/src/gtk/webview_webkit.cpp?ds=sidebyside diff --git a/src/gtk/webview_webkit.cpp b/src/gtk/webview_webkit.cpp index fcdd060b2e..ea424c8b16 100644 --- a/src/gtk/webview_webkit.cpp +++ b/src/gtk/webview_webkit.cpp @@ -16,6 +16,7 @@ #include "wx/gtk/webview_webkit.h" #include "wx/gtk/control.h" #include "wx/gtk/private.h" +#include "wx/filesys.h" #include "webkit/webkit.h" // ---------------------------------------------------------------------------- @@ -62,13 +63,23 @@ wxgtk_webview_webkit_load_status(GtkWidget* widget, } static gboolean -wxgtk_webview_webkit_navigation(WebKitWebView*, +wxgtk_webview_webkit_navigation(WebKitWebView *, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *, WebKitWebPolicyDecision *policy_decision, wxWebViewWebKit *webKitCtrl) { + 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; + } + webKitCtrl->m_busy = true; const gchar* uri = webkit_network_request_get_uri(request); @@ -91,6 +102,32 @@ wxgtk_webview_webkit_navigation(WebKitWebView*, } else { + wxString wxuri = uri; + 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(wxuri.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) + { + webKitCtrl->m_guard = true; + wxFSFile* file = handler->GetFile(wxuri); + if(file) + { + webKitCtrl->SetPage(*file->GetStream(), wxuri); + } + //We need to throw some sort of error here if file is NULL + webkit_web_policy_decision_ignore(policy_decision); + return TRUE; + } return FALSE; } } @@ -264,8 +301,8 @@ wxgtk_webview_webkit_new_window(WebKitWebView*, } static void -wxgtk_webview_webkit_title_changed(WebKitWebView *webView, - WebKitWebFrame *frame, +wxgtk_webview_webkit_title_changed(WebKitWebView*, + WebKitWebFrame*, gchar *title, wxWebViewWebKit *webKitCtrl) { @@ -281,13 +318,65 @@ wxgtk_webview_webkit_title_changed(WebKitWebView *webView, } +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" //----------------------------------------------------------------------------- // wxWebViewWebKit //----------------------------------------------------------------------------- -//IMPLEMENT_DYNAMIC_CLASS(wxWebViewWebKit, wxControl) +wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewWebKit, wxWebView); bool wxWebViewWebKit::Create(wxWindow *parent, wxWindowID id, @@ -299,6 +388,7 @@ bool wxWebViewWebKit::Create(wxWindow *parent, { m_ready = false; m_busy = false; + m_guard = false; if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) @@ -335,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); @@ -820,6 +913,11 @@ void wxWebViewWebKit::RunScript(const wxString& javascript) javascript.mb_str(wxConvUTF8)); } +void wxWebViewWebKit::RegisterHandler(wxWebHandler* handler) +{ + m_handlerList.push_back(handler); +} + // static wxVisualAttributes wxWebViewWebKit::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))