X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/205defae8958486bc400e5b146147733a5ae3e57..b404a8f3b072129c107c6d9a5e0f6f53cd34807b:/src/msw/webview_ie.cpp diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index d2f66d434a..868877c9ef 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -3,7 +3,7 @@ // Purpose: wxMSW wxWebViewIE class implementation for web view component // Author: Marianne Gagnon // Id: $Id$ -// Copyright: (c) 2010 Marianne Gagnon, Steven Lamerton +// Copyright: (c) 2010 Marianne Gagnon, 2011 Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -27,30 +27,10 @@ #include "wx/msw/missing.h" #include "wx/filesys.h" -//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); - } - } +wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewIE, wxWebView); - return s; -} +//We link to urlmon as it is required for CoInternetGetSession +#pragma comment(lib, "urlmon") BEGIN_EVENT_TABLE(wxWebViewIE, wxControl) EVT_ACTIVEX(wxID_ANY, wxWebViewIE::onActiveXEvent) @@ -90,17 +70,6 @@ bool wxWebViewIE::Create(wxWindow* parent, m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE); m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE); - //m_webBrowser->put_Silent(VARIANT_FALSE); - - //We register a custom handler for the file protocol so we can handle - //Virtual file systems - ClassFactory* cf = new ClassFactory; - IInternetSession* session; - if(CoInternetGetSession(0, &session, 0) != S_OK) - return false; - HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, L"file", 0, NULL, 0); - if(FAILED(hr)) - return false; m_container = new wxActiveXContainer(this, IID_IWebBrowser2, m_webBrowser); @@ -696,6 +665,22 @@ void wxWebViewIE::RunScript(const wxString& javascript) document->Release(); } +void wxWebViewIE::RegisterHandler(wxSharedPtr handler) +{ + ClassFactory* cf = new ClassFactory(handler); + IInternetSession* session; + if(FAILED(CoInternetGetSession(0, &session, 0))) + { + wxFAIL_MSG("Could not retrive internet session"); + } + + HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, handler->GetName(), 0, NULL, 0); + if(FAILED(hr)) + { + wxFAIL_MSG("Could not register protocol"); + } +} + bool wxWebViewIE::CanExecCommand(wxString command) { IHTMLDocument2* document = GetDocument(); @@ -820,6 +805,13 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) case DISPID_TITLECHANGE: { + wxString title = evt[0].GetString(); + + wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, + GetId(), GetCurrentURL(), wxEmptyString, true); + event.SetString(title); + event.SetEventObject(this); + HandleWindowEvent(event); break; } @@ -956,12 +948,10 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) event.SetEventObject(this); HandleWindowEvent(event); - //If we veto the event then we cancel the new window - if (event.IsVetoed()) - { - wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters(); - *V_BOOLREF(&nativeParams->pDispParams->rgvarg[3]) = VARIANT_TRUE; - } + //We always cancel this event otherwise an Internet Exporer window + //is opened for the url + wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters(); + *V_BOOLREF(&nativeParams->pDispParams->rgvarg[3]) = VARIANT_TRUE; break; } } @@ -969,16 +959,15 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) evt.Skip(); } -VirtualProtocol::VirtualProtocol() +VirtualProtocol::VirtualProtocol(wxSharedPtr handler) { m_refCount = 0; m_file = NULL; - m_fileSys = new wxFileSystem; + m_handler = handler; } VirtualProtocol::~VirtualProtocol() { - wxDELETE(m_fileSys); } ULONG VirtualProtocol::AddRef() @@ -989,10 +978,10 @@ ULONG VirtualProtocol::AddRef() HRESULT VirtualProtocol::QueryInterface(REFIID riid, void **ppvObject) { - if ((riid == IID_IUnknown) || (riid == IID_IInternetProtocol) - || (riid == IID_IInternetProtocolRoot)) + if(riid == IID_IUnknown || riid == IID_IInternetProtocolRoot || + riid == IID_IInternetProtocol) { - *ppvObject = this; + *ppvObject = (IInternetProtocol*)this; AddRef(); return S_OK; } @@ -1018,27 +1007,29 @@ ULONG VirtualProtocol::Release() } HRESULT VirtualProtocol::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, - IInternetBindInfo *pOIBindInfo, DWORD grfPI, - HANDLE_PTR dwReserved) + IInternetBindInfo *pOIBindInfo, DWORD grfPI, + HANDLE_PTR dwReserved) { + wxUnusedVar(szUrl); + wxUnusedVar(pOIBindInfo); + wxUnusedVar(grfPI); + wxUnusedVar(dwReserved); m_protocolSink = pOIProtSink; - //We have to clean up incoming paths from the webview control as they are - //not properly escaped, see also the comment in filesys.cpp line 668 - wxString path = wxString(szUrl).BeforeFirst(':') + ":" + - EscapeFileNameCharsInURL(wxString(szUrl).AfterFirst(':')); - path.Replace("///", "/"); - m_file = m_fileSys->OpenFile(path); + + //We get the file itself from the protocol handler + m_file = m_handler->GetFile(szUrl); + if(!m_file) return INET_E_RESOURCE_NOT_FOUND; //We return the stream length for current and total size as we can always //read the whole file from the stream + wxFileOffset length = m_file->GetStream()->GetLength(); m_protocolSink->ReportData(BSCF_FIRSTDATANOTIFICATION | BSCF_DATAFULLYAVAILABLE | BSCF_LASTDATANOTIFICATION, - m_file->GetStream()->GetLength(), - m_file->GetStream()->GetLength()); + length, length); return S_OK; } @@ -1073,6 +1064,12 @@ HRESULT VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead) wxDELETE(m_file); return INET_E_DOWNLOAD_FAILURE; } + else + { + //Dummy return to surpress a compiler warning + wxFAIL; + return INET_E_DOWNLOAD_FAILURE; + } } HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, @@ -1080,7 +1077,7 @@ HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, { if (pUnkOuter) return CLASS_E_NOAGGREGATION; - VirtualProtocol* vp = new VirtualProtocol; + VirtualProtocol* vp = new VirtualProtocol(m_handler); vp->AddRef(); HRESULT hr = vp->QueryInterface(riid, ppvObject); vp->Release(); @@ -1090,8 +1087,8 @@ HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, STDMETHODIMP ClassFactory::LockServer(BOOL fLock) { - return S_OK; - + wxUnusedVar(fLock); + return S_OK; } ULONG ClassFactory::AddRef(void)