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
This commit is contained in:
Steve Lamerton
2011-07-28 16:49:48 +00:00
parent 293656292f
commit eff8f7952e
7 changed files with 125 additions and 110 deletions

View 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)
{