X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e669ddde233a87d1e80ce2b102d0a18ce9daedfe..ebefc86eae4e1f8f9c6efa04234bee363aa58b69:/src/msw/webview_ie.cpp diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index 06d57d9a05..5797f01c78 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -16,7 +16,7 @@ #include "wx/msw/webview_ie.h" -#if wxUSE_WEBVIEW_IE +#if wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE #include #include @@ -26,11 +26,22 @@ #include "wx/msw/registry.h" #include "wx/msw/missing.h" #include "wx/filesys.h" +#include "wx/dynlib.h" +#include -wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewIE, wxWebView); +/* These GUID definitions are our own implementation to support interfaces + * normally in urlmon.h. See include/wx/msw/webview_ie.h + */ + +namespace { + +DEFINE_GUID(wxIID_IInternetProtocolRoot,0x79eac9e3,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb); +DEFINE_GUID(wxIID_IInternetProtocol,0x79eac9e4,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb); +DEFINE_GUID(wxIID_IDocHostUIHandler, 0xbd3f23c0, 0xd43e, 0x11cf, 0x89, 0x3b, 0x00, 0xaa, 0x00, 0xbd, 0xce, 0x1a); + +} -//We link to urlmon as it is required for CoInternetGetSession -#pragma comment(lib, "urlmon") +wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewIE, wxWebView); BEGIN_EVENT_TABLE(wxWebViewIE, wxControl) EVT_ACTIVEX(wxID_ANY, wxWebViewIE::onActiveXEvent) @@ -71,93 +82,135 @@ bool wxWebViewIE::Create(wxWindow* parent, m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE); m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE); - m_container = new wxActiveXContainer(this, IID_IWebBrowser2, m_webBrowser); + m_uiHandler = new DocHostUIHandler; + + m_container = new wxIEContainer(this, IID_IWebBrowser2, m_webBrowser, m_uiHandler); + + EnableControlFeature(21 /* FEATURE_DISABLE_NAVIGATION_SOUNDS */); - SetBackgroundStyle(wxBG_STYLE_PAINT); - SetDoubleBuffered(true); - LoadUrl(url); + LoadURL(url); return true; } - -void wxWebViewIE::LoadUrl(const wxString& url) +wxWebViewIE::~wxWebViewIE() { - m_ie.CallMethod("Navigate", (BSTR) url.wc_str(), NULL, NULL, NULL, NULL); + for(unsigned int i = 0; i < m_factories.size(); i++) + { + m_factories[i]->Release(); + } } -void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) +void wxWebViewIE::LoadURL(const wxString& url) { - BSTR bstr = SysAllocString(html.wc_str()); + m_ie.CallMethod("Navigate", wxConvertStringToOle(url)); +} - // Creates a new one-dimensional array +void wxWebViewIE::DoSetPage(const wxString& html, const wxString& baseUrl) +{ + BSTR bstr = SysAllocString(OLESTR("")); SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1); if (psaStrings != NULL) { VARIANT *param; - HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m); param->vt = VT_BSTR; param->bstrVal = bstr; + hr = SafeArrayUnaccessData(psaStrings); - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); + + if(!document) + return; + document->write(psaStrings); - document->Release(); + document->close(); - // SafeArrayDestroy calls SysFreeString for each BSTR SafeArrayDestroy(psaStrings); - //We send the events when we are done to mimic webkit - //Navigated event - wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, - GetId(), baseUrl, "", false); - event.SetEventObject(this); - HandleWindowEvent(event); - - //Document complete event - event.SetEventType(wxEVT_COMMAND_WEB_VIEW_LOADED); - event.SetEventObject(this); - HandleWindowEvent(event); + bstr = SysAllocString(html.wc_str()); + + // Creates a new one-dimensional array + psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1); + if (psaStrings != NULL) + { + hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m); + param->vt = VT_BSTR; + param->bstrVal = bstr; + hr = SafeArrayUnaccessData(psaStrings); + + document = GetDocument(); + + if(!document) + return; + + document->write(psaStrings); + + // SafeArrayDestroy calls SysFreeString for each BSTR + SafeArrayDestroy(psaStrings); + + //We send the events when we are done to mimic webkit + //Navigated event + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, + GetId(), baseUrl, ""); + event.SetEventObject(this); + HandleWindowEvent(event); + + //Document complete event + event.SetEventType(wxEVT_COMMAND_WEB_VIEW_LOADED); + event.SetEventObject(this); + HandleWindowEvent(event); + } + else + { + wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL"); + } } else { - wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL"); + wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL during clear"); } - } wxString wxWebViewIE::GetPageSource() const { - IHTMLDocument2* document = GetDocument(); - IHTMLElement *bodyTag = NULL; - IHTMLElement *htmlTag = NULL; - wxString source; - HRESULT hr = document->get_body(&bodyTag); - if(SUCCEEDED(hr)) + wxCOMPtr document(GetDocument()); + + if(document) { - hr = bodyTag->get_parentElement(&htmlTag); + wxCOMPtr bodyTag; + wxCOMPtr htmlTag; + wxString source; + HRESULT hr = document->get_body(&bodyTag); if(SUCCEEDED(hr)) { - BSTR bstr; - htmlTag->get_outerHTML(&bstr); - source = wxString(bstr); - htmlTag->Release(); + hr = bodyTag->get_parentElement(&htmlTag); + if(SUCCEEDED(hr)) + { + BSTR bstr; + htmlTag->get_outerHTML(&bstr); + source = wxString(bstr); + } } - bodyTag->Release(); + return source; + } + else + { + return ""; } - - document->Release(); - return source; } wxWebViewZoom wxWebViewIE::GetZoom() const { - if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_LAYOUT) - return GetIEOpticalZoom(); - else if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_TEXT) - return GetIETextZoom(); - else - wxFAIL; + switch( m_zoomType ) + { + case wxWEB_VIEW_ZOOM_TYPE_LAYOUT: + return GetIEOpticalZoom(); + case wxWEB_VIEW_ZOOM_TYPE_TEXT: + return GetIETextZoom(); + default: + wxFAIL; + } //Dummy return to stop compiler warnings return wxWEB_VIEW_ZOOM_MEDIUM; @@ -166,12 +219,17 @@ wxWebViewZoom wxWebViewIE::GetZoom() const void wxWebViewIE::SetZoom(wxWebViewZoom zoom) { - if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_LAYOUT) - SetIEOpticalZoom(zoom); - else if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_TEXT) - SetIETextZoom(zoom); - else - wxFAIL; + switch( m_zoomType ) + { + case wxWEB_VIEW_ZOOM_TYPE_LAYOUT: + SetIEOpticalZoom(zoom); + break; + case wxWEB_VIEW_ZOOM_TYPE_TEXT: + SetIETextZoom(zoom); + break; + default: + wxFAIL; + } } void wxWebViewIE::SetIETextZoom(wxWebViewZoom level) @@ -184,9 +242,12 @@ void wxWebViewIE::SetIETextZoom(wxWebViewZoom level) V_VT(&zoomVariant) = VT_I4; V_I4(&zoomVariant) = level; - HRESULT result = m_webBrowser->ExecWB(OLECMDID_ZOOM, - OLECMDEXECOPT_DONTPROMPTUSER, - &zoomVariant, NULL); +#if wxDEBUG_LEVEL + HRESULT result = +#endif + m_webBrowser->ExecWB(OLECMDID_ZOOM, + OLECMDEXECOPT_DONTPROMPTUSER, + &zoomVariant, NULL); wxASSERT(result == S_OK); } @@ -196,9 +257,12 @@ wxWebViewZoom wxWebViewIE::GetIETextZoom() const VariantInit (&zoomVariant); V_VT(&zoomVariant) = VT_I4; - HRESULT result = m_webBrowser->ExecWB(OLECMDID_ZOOM, - OLECMDEXECOPT_DONTPROMPTUSER, - NULL, &zoomVariant); +#if wxDEBUG_LEVEL + HRESULT result = +#endif + m_webBrowser->ExecWB(OLECMDID_ZOOM, + OLECMDEXECOPT_DONTPROMPTUSER, + NULL, &zoomVariant); wxASSERT(result == S_OK); //We can safely cast here as we know that the range matches our enum @@ -235,10 +299,13 @@ void wxWebViewIE::SetIEOpticalZoom(wxWebViewZoom level) wxFAIL; } - HRESULT result = m_webBrowser->ExecWB((OLECMDID)OLECMDID_OPTICAL_ZOOM, - OLECMDEXECOPT_DODEFAULT, - &zoomVariant, - NULL); +#if wxDEBUG_LEVEL + HRESULT result = +#endif + m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/, + OLECMDEXECOPT_DODEFAULT, + &zoomVariant, + NULL); wxASSERT(result == S_OK); } @@ -248,9 +315,12 @@ wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() const VariantInit (&zoomVariant); V_VT(&zoomVariant) = VT_I4; - HRESULT result = m_webBrowser->ExecWB((OLECMDID)OLECMDID_OPTICAL_ZOOM, - OLECMDEXECOPT_DODEFAULT, NULL, - &zoomVariant); +#if wxDEBUG_LEVEL + HRESULT result = +#endif + m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/, + OLECMDEXECOPT_DODEFAULT, NULL, + &zoomVariant); wxASSERT(result == S_OK); const int zoom = V_I4(&zoomVariant); @@ -337,7 +407,7 @@ void wxWebViewIE::LoadHistoryItem(wxSharedPtr item) wxASSERT_MSG(pos != static_cast(m_historyList.size()), "invalid history item"); m_historyLoadingFromList = true; - LoadUrl(item->GetUrl()); + LoadURL(item->GetUrl()); m_historyPosition = pos; } @@ -427,14 +497,17 @@ void wxWebViewIE::SetOfflineMode(bool offline) { // FIXME: the wxWidgets docs do not really document what the return // parameter of PutProperty is - const bool success = m_ie.PutProperty("Offline", (offline ? - VARIANT_TRUE : - VARIANT_FALSE)); +#if wxDEBUG_LEVEL + const bool success = +#endif + m_ie.PutProperty("Offline", (offline ? + VARIANT_TRUE : + VARIANT_FALSE)); wxASSERT(success); } bool wxWebViewIE::IsBusy() const -{ +{ if (m_isBusy) return true; wxVariant out = m_ie.GetProperty("Busy"); @@ -454,12 +527,18 @@ wxString wxWebViewIE::GetCurrentURL() const wxString wxWebViewIE::GetCurrentTitle() const { - IHTMLDocument2* document = GetDocument(); - BSTR title; + wxCOMPtr document(GetDocument()); - document->get_nameProp(&title); - document->Release(); - return wxString(title); + if(document) + { + BSTR title; + document->get_nameProp(&title); + return wxString(title); + } + else + { + return ""; + } } bool wxWebViewIE::CanCut() const @@ -471,6 +550,7 @@ bool wxWebViewIE::CanCopy() const { return CanExecCommand("Copy"); } + bool wxWebViewIE::CanPaste() const { return CanExecCommand("Paste"); @@ -495,6 +575,7 @@ bool wxWebViewIE::CanUndo() const { return CanExecCommand("Undo"); } + bool wxWebViewIE::CanRedo() const { return CanExecCommand("Redo"); @@ -512,25 +593,35 @@ void wxWebViewIE::Redo() void wxWebViewIE::SetEditable(bool enable) { - IHTMLDocument2* document = GetDocument(); - if( enable ) - document->put_designMode(SysAllocString(L"On")); - else - document->put_designMode(SysAllocString(L"Off")); + wxCOMPtr document(GetDocument()); + + if(document) + { + if( enable ) + document->put_designMode(SysAllocString(L"On")); + else + document->put_designMode(SysAllocString(L"Off")); - document->Release(); + } } bool wxWebViewIE::IsEditable() const { - IHTMLDocument2* document = GetDocument(); - BSTR mode; - document->get_designMode(&mode); - document->Release(); - if(wxString(mode) == "On") - return true; + wxCOMPtr document(GetDocument()); + + if(document) + { + BSTR mode; + document->get_designMode(&mode); + if(wxString(mode) == "On") + return true; + else + return false; + } else + { return false; + } } void wxWebViewIE::SelectAll() @@ -540,19 +631,25 @@ void wxWebViewIE::SelectAll() bool wxWebViewIE::HasSelection() const { - IHTMLDocument2* document = GetDocument(); - IHTMLSelectionObject* selection; - wxString sel; - HRESULT hr = document->get_selection(&selection); - if(SUCCEEDED(hr)) + wxCOMPtr document(GetDocument()); + + if(document) { - BSTR type; - selection->get_type(&type); - sel = wxString(type); - selection->Release(); + wxCOMPtr selection; + wxString sel; + HRESULT hr = document->get_selection(&selection); + if(SUCCEEDED(hr)) + { + BSTR type; + selection->get_type(&type); + sel = wxString(type); + } + return sel != "None"; + } + else + { + return false; } - document->Release(); - return sel != "None"; } void wxWebViewIE::DeleteSelection() @@ -562,151 +659,239 @@ void wxWebViewIE::DeleteSelection() wxString wxWebViewIE::GetSelectedText() const { - IHTMLDocument2* document = GetDocument(); - IHTMLSelectionObject* selection; - wxString selected; - HRESULT hr = document->get_selection(&selection); - if(SUCCEEDED(hr)) + wxCOMPtr document(GetDocument()); + + if(document) { - IDispatch* disrange; - hr = selection->createRange(&disrange); + wxCOMPtr selection; + wxString selected; + HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) { - IHTMLTxtRange* range; - hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + wxCOMPtr disrange; + hr = selection->createRange(&disrange); if(SUCCEEDED(hr)) { - BSTR text; - range->get_text(&text); - selected = wxString(text); - range->Release(); + wxCOMPtr range; + hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + if(SUCCEEDED(hr)) + { + BSTR text; + range->get_text(&text); + selected = wxString(text); + } } - disrange->Release(); } - selection->Release(); + return selected; + } + else + { + return ""; } - document->Release(); - return selected; } wxString wxWebViewIE::GetSelectedSource() const { - IHTMLDocument2* document = GetDocument(); - IHTMLSelectionObject* selection; - wxString selected; - HRESULT hr = document->get_selection(&selection); - if(SUCCEEDED(hr)) + wxCOMPtr document(GetDocument()); + + if(document) { - IDispatch* disrange; - hr = selection->createRange(&disrange); + wxCOMPtr selection; + wxString selected; + HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) { - IHTMLTxtRange* range; - hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + wxCOMPtr disrange; + hr = selection->createRange(&disrange); if(SUCCEEDED(hr)) { - BSTR text; - range->get_htmlText(&text); - selected = wxString(text); - range->Release(); + wxCOMPtr range; + hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + if(SUCCEEDED(hr)) + { + BSTR text; + range->get_htmlText(&text); + selected = wxString(text); + } } - disrange->Release(); } - selection->Release(); + return selected; + } + else + { + return ""; } - document->Release(); - return selected; } void wxWebViewIE::ClearSelection() { - IHTMLDocument2* document = GetDocument(); - IHTMLSelectionObject* selection; - wxString selected; - HRESULT hr = document->get_selection(&selection); - if(SUCCEEDED(hr)) + wxCOMPtr document(GetDocument()); + + if(document) { - selection->empty(); - selection->Release(); + wxCOMPtr selection; + wxString selected; + HRESULT hr = document->get_selection(&selection); + if(SUCCEEDED(hr)) + { + selection->empty(); + } } - document->Release(); } wxString wxWebViewIE::GetPageText() const { - IHTMLDocument2* document = GetDocument(); - wxString text; - IHTMLElement* body; - HRESULT hr = document->get_body(&body); - if(SUCCEEDED(hr)) + wxCOMPtr document(GetDocument()); + + if(document) + { + wxString text; + wxCOMPtr body; + HRESULT hr = document->get_body(&body); + if(SUCCEEDED(hr)) + { + BSTR out; + body->get_innerText(&out); + text = wxString(out); + } + return text; + } + else { - BSTR out; - body->get_innerText(&out); - text = wxString(out); - body->Release(); + return ""; } - document->Release(); - return text; } void wxWebViewIE::RunScript(const wxString& javascript) { - IHTMLDocument2* document = GetDocument(); - IHTMLWindow2* window; - wxString language = "javascript"; - HRESULT hr = document->get_parentWindow(&window); - if(SUCCEEDED(hr)) + wxCOMPtr document(GetDocument()); + + if(document) { - VARIANT level; - VariantInit(&level); - V_VT(&level) = VT_EMPTY; - window->execScript(SysAllocString(javascript), SysAllocString(language), &level); + wxCOMPtr window; + wxString language = "javascript"; + HRESULT hr = document->get_parentWindow(&window); + if(SUCCEEDED(hr)) + { + VARIANT level; + VariantInit(&level); + V_VT(&level) = VT_EMPTY; + window->execScript(SysAllocString(javascript.wc_str()), + SysAllocString(language.wc_str()), + &level); + } } - document->Release(); } void wxWebViewIE::RegisterHandler(wxSharedPtr handler) { - ClassFactory* cf = new ClassFactory(handler); - IInternetSession* session; - if(FAILED(CoInternetGetSession(0, &session, 0))) + wxDynamicLibrary urlMon(wxT("urlmon.dll")); + if(urlMon.HasSymbol(wxT("CoInternetGetSession"))) { - wxFAIL_MSG("Could not retrive internet session"); - } + typedef HRESULT (WINAPI *CoInternetGetSession_t)(DWORD, wxIInternetSession**, DWORD); + wxDYNLIB_FUNCTION(CoInternetGetSession_t, CoInternetGetSession, urlMon); - HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, handler->GetName(), 0, NULL, 0); - if(FAILED(hr)) + ClassFactory* cf = new ClassFactory(handler); + wxIInternetSession* session; + HRESULT res = (*pfnCoInternetGetSession)(0, &session, 0); + if(FAILED(res)) + { + wxFAIL_MSG("Could not retrive internet session"); + } + + HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, + handler->GetName().wc_str(), + 0, NULL, 0); + if(FAILED(hr)) + { + wxFAIL_MSG("Could not register protocol"); + } + m_factories.push_back(cf); + } + else { - wxFAIL_MSG("Could not register protocol"); + wxFAIL_MSG("urlmon does not contain CoInternetGetSession"); } } bool wxWebViewIE::CanExecCommand(wxString command) const { - IHTMLDocument2* document = GetDocument(); - VARIANT_BOOL enabled; + wxCOMPtr document(GetDocument()); - document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled); - document->Release(); + if(document) + { + VARIANT_BOOL enabled; + + document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled); + + return (enabled == VARIANT_TRUE); + } + else + { + return false; + } - return (enabled == VARIANT_TRUE); } void wxWebViewIE::ExecCommand(wxString command) { - IHTMLDocument2* document = GetDocument(); - document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL); - document->Release(); + wxCOMPtr document(GetDocument()); + + if(document) + { + document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL); + } } -IHTMLDocument2* wxWebViewIE::GetDocument() const +wxCOMPtr wxWebViewIE::GetDocument() const { - wxVariant variant = m_ie.GetProperty("Document"); - IHTMLDocument2* document = (IHTMLDocument2*)variant.GetVoidPtr(); + wxCOMPtr dispatch; + wxCOMPtr document; + HRESULT result = m_webBrowser->get_Document(&dispatch); + if(dispatch && SUCCEEDED(result)) + { + //document is set to null automatically if the interface isn't supported + dispatch->QueryInterface(IID_IHTMLDocument2, (void**)&document); + } + return document; +} - wxASSERT(document); +bool wxWebViewIE::EnableControlFeature(long flag, bool enable) +{ +#if wxUSE_DYNLIB_CLASS - return document; + wxDynamicLibrary urlMon(wxT("urlmon.dll")); + if( urlMon.IsLoaded() && + urlMon.HasSymbol("CoInternetSetFeatureEnabled") && + urlMon.HasSymbol("CoInternetIsFeatureEnabled")) + { + typedef HRESULT (WINAPI *CoInternetSetFeatureEnabled_t)(DWORD, DWORD, BOOL); + typedef HRESULT (WINAPI *CoInternetIsFeatureEnabled_t)(DWORD, DWORD); + + wxDYNLIB_FUNCTION(CoInternetSetFeatureEnabled_t, CoInternetSetFeatureEnabled, urlMon); + wxDYNLIB_FUNCTION(CoInternetIsFeatureEnabled_t, CoInternetIsFeatureEnabled, urlMon); + + HRESULT hr = (*pfnCoInternetIsFeatureEnabled)(flag, + 0x2 /* SET_FEATURE_ON_PROCESS */); + if((hr == S_OK && enable) || (hr == S_FALSE && !enable)) + return true; + + hr = (*pfnCoInternetSetFeatureEnabled)(flag, + 0x2/* SET_FEATURE_ON_PROCESS */, + (enable ? TRUE : FALSE)); + if ( FAILED(hr) ) + { + wxLogApiError(wxT("CoInternetSetFeatureEnabled"), hr); + return false; + } + return true; + } + return false; +#else + wxUnusedVar(flag); + wxUnusedVar(enable); + return false; +#endif // wxUSE_DYNLIB_CLASS/!wxUSE_DYNLIB_CLASS } void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) @@ -723,11 +908,20 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString target = evt[3].GetString(); wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, - GetId(), url, target, true); - event.SetEventObject(this); - HandleWindowEvent(event); + GetId(), url, target); - if (event.IsVetoed()) + //skip empty javascript events. + if(url == "javascript:\"\"" && target.IsEmpty()) + { + event.Veto(); + } + else + { + event.SetEventObject(this); + HandleWindowEvent(event); + } + + if (!event.IsAllowed()) { wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters(); @@ -749,7 +943,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) // TODO: set target parameter if possible wxString target = wxEmptyString; wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, - GetId(), url, target, false); + GetId(), url, target); event.SetEventObject(this); HandleWindowEvent(event); break; @@ -774,12 +968,12 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) //As we are complete we also add to the history list, but not if the //page is not the main page, ie it is a subframe - //We also have to check if we are loading a file:// url, if so we + //We also have to check if we are loading a file:// url, if so we //need to change the comparison as ie passes back a different style //of url - if(m_historyEnabled && !m_historyLoadingFromList && - (url == GetCurrentURL() || - (GetCurrentURL().substr(0, 4) == "file" && + if(m_historyEnabled && !m_historyLoadingFromList && + (url == GetCurrentURL() || + (GetCurrentURL().substr(0, 4) == "file" && wxFileSystem::URLToFileName(GetCurrentURL()).GetFullPath() == url))) { //If we are not at the end of the list, then erase everything @@ -798,7 +992,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) // TODO: set target parameter if possible wxString target = wxEmptyString; wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, GetId(), - url, target, false); + url, target); event.SetEventObject(this); HandleWindowEvent(event); break; @@ -814,7 +1008,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString title = evt[0].GetString(); wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, - GetId(), GetCurrentURL(), wxEmptyString, true); + GetId(), GetCurrentURL(), ""); event.SetString(title); event.SetEventObject(this); HandleWindowEvent(event); @@ -938,7 +1132,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString url = evt[1].GetString(); wxString target = evt[2].GetString(); wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, GetId(), - url, target, false); + url, target); event.SetEventObject(this); event.SetInt(errorType); event.SetString(errorCode); @@ -950,7 +1144,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString url = evt[4].GetString(); wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, - GetId(), url, wxEmptyString, true); + GetId(), url, wxEmptyString); event.SetEventObject(this); HandleWindowEvent(event); @@ -967,53 +1161,20 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) VirtualProtocol::VirtualProtocol(wxSharedPtr handler) { - m_refCount = 0; m_file = NULL; m_handler = handler; } -VirtualProtocol::~VirtualProtocol() -{ -} - -ULONG VirtualProtocol::AddRef() -{ - m_refCount++; - return m_refCount; -} - -HRESULT VirtualProtocol::QueryInterface(REFIID riid, void **ppvObject) -{ - if(riid == IID_IUnknown || riid == IID_IInternetProtocolRoot || - riid == IID_IInternetProtocol) - { - *ppvObject = (IInternetProtocol*)this; - AddRef(); - return S_OK; - } - else - { - *ppvObject = NULL; - return E_POINTER; - } -} +BEGIN_IID_TABLE(VirtualProtocol) + ADD_IID(Unknown) + ADD_RAW_IID(wxIID_IInternetProtocolRoot) + ADD_RAW_IID(wxIID_IInternetProtocol) +END_IID_TABLE; -ULONG VirtualProtocol::Release() -{ - m_refCount--; - if (m_refCount > 0) - { - return m_refCount; - } - else - { - delete this; - return 0; - } -} +IMPLEMENT_IUNKNOWN_METHODS(VirtualProtocol) -HRESULT VirtualProtocol::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, - IInternetBindInfo *pOIBindInfo, DWORD grfPI, +HRESULT STDMETHODCALLTYPE VirtualProtocol::Start(LPCWSTR szUrl, wxIInternetProtocolSink *pOIProtSink, + wxIInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) { wxUnusedVar(szUrl); @@ -1021,7 +1182,7 @@ HRESULT VirtualProtocol::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink wxUnusedVar(grfPI); wxUnusedVar(dwReserved); m_protocolSink = pOIProtSink; - + //We get the file itself from the protocol handler m_file = m_handler->GetFile(szUrl); @@ -1032,17 +1193,17 @@ HRESULT VirtualProtocol::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink //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_protocolSink->ReportData(wxBSCF_FIRSTDATANOTIFICATION | + wxBSCF_DATAFULLYAVAILABLE | + wxBSCF_LASTDATANOTIFICATION, length, length); - return S_OK; + return S_OK; } -HRESULT VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead) +HRESULT STDMETHODCALLTYPE VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead) { //If the file is null we return false to indicte it is finished - if(!m_file) + if(!m_file) return S_FALSE; wxStreamError err = m_file->GetStream()->Read(pv, cb).GetLastError(); @@ -1078,10 +1239,17 @@ HRESULT VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead) } } -HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, +BEGIN_IID_TABLE(ClassFactory) + ADD_IID(Unknown) + ADD_IID(ClassFactory) +END_IID_TABLE; + +IMPLEMENT_IUNKNOWN_METHODS(ClassFactory) + +HRESULT STDMETHODCALLTYPE ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void ** ppvObject) { - if (pUnkOuter) + if (pUnkOuter) return CLASS_E_NOAGGREGATION; VirtualProtocol* vp = new VirtualProtocol(m_handler); vp->AddRef(); @@ -1089,7 +1257,7 @@ HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, vp->Release(); return hr; -} +} STDMETHODIMP ClassFactory::LockServer(BOOL fLock) { @@ -1097,41 +1265,174 @@ STDMETHODIMP ClassFactory::LockServer(BOOL fLock) return S_OK; } -ULONG ClassFactory::AddRef(void) +wxIEContainer::wxIEContainer(wxWindow *parent, REFIID iid, IUnknown *pUnk, + DocHostUIHandler* uiHandler) : + wxActiveXContainer(parent,iid,pUnk) { - m_refCount++; - return m_refCount; + m_uiHandler = uiHandler; } -HRESULT ClassFactory::QueryInterface(REFIID riid, void **ppvObject) +wxIEContainer::~wxIEContainer() { - if ((riid == IID_IUnknown) || (riid == IID_IClassFactory)) - { - *ppvObject = this; - AddRef(); - return S_OK; - } - else +} + +bool wxIEContainer::QueryClientSiteInterface(REFIID iid, void **_interface, + const char *&desc) +{ + if (m_uiHandler && IsEqualIID(iid, wxIID_IDocHostUIHandler)) { - *ppvObject = NULL; - return E_POINTER; + *_interface = (IUnknown *) (wxIDocHostUIHandler *) m_uiHandler; + desc = "IDocHostUIHandler"; + return true; } + return false; +} + +HRESULT wxSTDCALL DocHostUIHandler::ShowContextMenu(DWORD dwID, POINT *ppt, + IUnknown *pcmdtReserved, + IDispatch *pdispReserved) +{ + wxUnusedVar(dwID); + wxUnusedVar(ppt); + wxUnusedVar(pcmdtReserved); + wxUnusedVar(pdispReserved); + return E_NOTIMPL; +} +HRESULT wxSTDCALL DocHostUIHandler::GetHostInfo(DOCHOSTUIINFO *pInfo) +{ + //don't show 3d border and enable themes. + pInfo->dwFlags = pInfo->dwFlags | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME; + return S_OK; } -ULONG ClassFactory::Release(void) +HRESULT wxSTDCALL DocHostUIHandler::ShowUI(DWORD dwID, + IOleInPlaceActiveObject *pActiveObject, + IOleCommandTarget *pCommandTarget, + IOleInPlaceFrame *pFrame, + IOleInPlaceUIWindow *pDoc) { - m_refCount--; - if (m_refCount > 0) - { - return m_refCount; - } - else + wxUnusedVar(dwID); + wxUnusedVar(pActiveObject); + wxUnusedVar(pCommandTarget); + wxUnusedVar(pFrame); + wxUnusedVar(pDoc); + return S_FALSE; +} + +HRESULT wxSTDCALL DocHostUIHandler::HideUI(void) +{ + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::UpdateUI(void) +{ + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::EnableModeless(BOOL fEnable) +{ + wxUnusedVar(fEnable); + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::OnDocWindowActivate(BOOL fActivate) +{ + wxUnusedVar(fActivate); + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::OnFrameWindowActivate(BOOL fActivate) +{ + wxUnusedVar(fActivate); + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::ResizeBorder(LPCRECT prcBorder, + IOleInPlaceUIWindow *pUIWindow, + BOOL fFrameWindow) +{ + wxUnusedVar(prcBorder); + wxUnusedVar(pUIWindow); + wxUnusedVar(fFrameWindow); + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::TranslateAccelerator(LPMSG lpMsg, + const GUID *pguidCmdGroup, + DWORD nCmdID) +{ + if(lpMsg && lpMsg->message == WM_KEYDOWN) { - delete this; - return 0; + //control is down? + if((GetKeyState(VK_CONTROL) & 0x8000 )) + { + //skip the accelerators used by the control + switch(lpMsg->wParam) + { + case 'F': + case 'L': + case 'N': + case 'O': + case 'P': + return S_OK; + } + } + //skip F5 + if(lpMsg->wParam == VK_F5) + { + return S_OK; + } } -} + wxUnusedVar(pguidCmdGroup); + wxUnusedVar(nCmdID); + return E_NOTIMPL; +} -#endif +HRESULT wxSTDCALL DocHostUIHandler::GetOptionKeyPath(LPOLESTR *pchKey,DWORD dw) +{ + wxUnusedVar(pchKey); + wxUnusedVar(dw); + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::GetDropTarget(IDropTarget *pDropTarget, + IDropTarget **ppDropTarget) +{ + wxUnusedVar(pDropTarget); + wxUnusedVar(ppDropTarget); + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::GetExternal(IDispatch **ppDispatch) +{ + wxUnusedVar(ppDispatch); + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::TranslateUrl(DWORD dwTranslate, + OLECHAR *pchURLIn, + OLECHAR **ppchURLOut) +{ + wxUnusedVar(dwTranslate); + wxUnusedVar(pchURLIn); + wxUnusedVar(ppchURLOut); + return E_NOTIMPL; +} + +HRESULT wxSTDCALL DocHostUIHandler::FilterDataObject(IDataObject *pDO, IDataObject **ppDORet) +{ + wxUnusedVar(pDO); + wxUnusedVar(ppDORet); + return E_NOTIMPL; +} + +BEGIN_IID_TABLE(DocHostUIHandler) + ADD_IID(Unknown) + ADD_RAW_IID(wxIID_IDocHostUIHandler) +END_IID_TABLE; + +IMPLEMENT_IUNKNOWN_METHODS(DocHostUIHandler) + +#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE