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:
parent
293656292f
commit
eff8f7952e
@ -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;
|
||||
|
@ -22,23 +22,7 @@
|
||||
#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
|
||||
{
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -26,101 +26,10 @@
|
||||
#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);
|
||||
|
Loading…
Reference in New Issue
Block a user