X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/accc94d55c4cd8cbf9351bd4886c25896d8d981e..96c9640205933ad0673d5af2c96af0816c50160c:/src/msw/webview_ie.cpp diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index a48bde92b8..c42c1a00ea 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -87,6 +87,8 @@ bool wxWebViewIE::Create(wxWindow* parent, m_container = new wxIEContainer(this, IID_IWebBrowser2, m_webBrowser, m_uiHandler); + EnableControlFeature(21 /* FEATURE_DISABLE_NAVIGATION_SOUNDS */); + LoadURL(url); return true; } @@ -120,6 +122,10 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) hr = SafeArrayUnaccessData(psaStrings); IHTMLDocument2* document = GetDocument(); + + if(!document) + return; + document->write(psaStrings); document->close(); document->Release(); @@ -138,6 +144,10 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) hr = SafeArrayUnaccessData(psaStrings); document = GetDocument(); + + if(!document) + return; + document->write(psaStrings); document->Release(); @@ -170,25 +180,33 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) wxString wxWebViewIE::GetPageSource() const { IHTMLDocument2* document = GetDocument(); - IHTMLElement *bodyTag = NULL; - IHTMLElement *htmlTag = NULL; - wxString source; - HRESULT hr = document->get_body(&bodyTag); - if(SUCCEEDED(hr)) + + if(document) { - hr = bodyTag->get_parentElement(&htmlTag); + IHTMLElement *bodyTag = NULL; + IHTMLElement *htmlTag = NULL; + 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); + htmlTag->Release(); + } + bodyTag->Release(); } - bodyTag->Release(); - } - document->Release(); - return source; + document->Release(); + return source; + } + else + { + return ""; + } } wxWebViewZoom wxWebViewIE::GetZoom() const @@ -519,11 +537,18 @@ wxString wxWebViewIE::GetCurrentURL() const wxString wxWebViewIE::GetCurrentTitle() const { IHTMLDocument2* document = GetDocument(); - BSTR title; - document->get_nameProp(&title); - document->Release(); - return wxString(title); + if(document) + { + BSTR title; + document->get_nameProp(&title); + document->Release(); + return wxString(title); + } + else + { + return ""; + } } bool wxWebViewIE::CanCut() const @@ -535,6 +560,7 @@ bool wxWebViewIE::CanCopy() const { return CanExecCommand("Copy"); } + bool wxWebViewIE::CanPaste() const { return CanExecCommand("Paste"); @@ -559,6 +585,7 @@ bool wxWebViewIE::CanUndo() const { return CanExecCommand("Undo"); } + bool wxWebViewIE::CanRedo() const { return CanExecCommand("Redo"); @@ -577,24 +604,36 @@ 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")); - document->Release(); + 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; + + if(document) + { + BSTR mode; + document->get_designMode(&mode); + document->Release(); + if(wxString(mode) == "On") + return true; + else + return false; + } else + { return false; + } } void wxWebViewIE::SelectAll() @@ -605,18 +644,26 @@ void wxWebViewIE::SelectAll() bool wxWebViewIE::HasSelection() const { IHTMLDocument2* document = GetDocument(); - IHTMLSelectionObject* selection; - wxString sel; - HRESULT hr = document->get_selection(&selection); - if(SUCCEEDED(hr)) + + if(document) { - BSTR type; - selection->get_type(&type); - sel = wxString(type); - selection->Release(); + IHTMLSelectionObject* selection; + wxString sel; + HRESULT hr = document->get_selection(&selection); + if(SUCCEEDED(hr)) + { + BSTR type; + selection->get_type(&type); + sel = wxString(type); + selection->Release(); + } + document->Release(); + return sel != "None"; + } + else + { + return false; } - document->Release(); - return sel != "None"; } void wxWebViewIE::DeleteSelection() @@ -627,108 +674,140 @@ void wxWebViewIE::DeleteSelection() wxString wxWebViewIE::GetSelectedText() const { IHTMLDocument2* document = GetDocument(); - IHTMLSelectionObject* selection; - wxString selected; - HRESULT hr = document->get_selection(&selection); - if(SUCCEEDED(hr)) + + if(document) { - IDispatch* disrange; - hr = selection->createRange(&disrange); + IHTMLSelectionObject* selection; + wxString selected; + HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) { - IHTMLTxtRange* range; - hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + IDispatch* disrange; + hr = selection->createRange(&disrange); if(SUCCEEDED(hr)) { - BSTR text; - range->get_text(&text); - selected = wxString(text); - range->Release(); + IHTMLTxtRange* range; + hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + if(SUCCEEDED(hr)) + { + BSTR text; + range->get_text(&text); + selected = wxString(text); + range->Release(); + } + disrange->Release(); } - disrange->Release(); + selection->Release(); } - selection->Release(); + document->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)) + + if(document) { - IDispatch* disrange; - hr = selection->createRange(&disrange); + IHTMLSelectionObject* selection; + wxString selected; + HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) { - IHTMLTxtRange* range; - hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + IDispatch* disrange; + hr = selection->createRange(&disrange); if(SUCCEEDED(hr)) { - BSTR text; - range->get_htmlText(&text); - selected = wxString(text); - range->Release(); + IHTMLTxtRange* range; + hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + if(SUCCEEDED(hr)) + { + BSTR text; + range->get_htmlText(&text); + selected = wxString(text); + range->Release(); + } + disrange->Release(); } - disrange->Release(); + selection->Release(); } - selection->Release(); + document->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)) + + if(document) { - selection->empty(); - selection->Release(); + IHTMLSelectionObject* selection; + wxString selected; + HRESULT hr = document->get_selection(&selection); + if(SUCCEEDED(hr)) + { + selection->empty(); + selection->Release(); + } + document->Release(); } - document->Release(); } wxString wxWebViewIE::GetPageText() const { IHTMLDocument2* document = GetDocument(); - wxString text; - IHTMLElement* body; - HRESULT hr = document->get_body(&body); - if(SUCCEEDED(hr)) + + if(document) + { + wxString text; + IHTMLElement* body; + HRESULT hr = document->get_body(&body); + if(SUCCEEDED(hr)) + { + BSTR out; + body->get_innerText(&out); + text = wxString(out); + body->Release(); + } + document->Release(); + 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)) + + if(document) { - VARIANT level; - VariantInit(&level); - V_VT(&level) = VT_EMPTY; - window->execScript(SysAllocString(javascript.wc_str()), - SysAllocString(language.wc_str()), - &level); + IHTMLWindow2* 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(); } - document->Release(); } void wxWebViewIE::RegisterHandler(wxSharedPtr handler) @@ -765,29 +844,88 @@ void wxWebViewIE::RegisterHandler(wxSharedPtr handler) bool wxWebViewIE::CanExecCommand(wxString command) const { IHTMLDocument2* document = GetDocument(); - VARIANT_BOOL enabled; - document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled); - document->Release(); + if(document) + { + VARIANT_BOOL enabled; + + document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled); + document->Release(); + + 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(); + + if(document) + { + document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL); + document->Release(); + } } IHTMLDocument2* wxWebViewIE::GetDocument() const { - wxVariant variant = m_ie.GetProperty("Document"); - IHTMLDocument2* document = (IHTMLDocument2*)variant.GetVoidPtr(); + IDispatch* dispatch = NULL; + HRESULT result = m_webBrowser->get_Document(&dispatch); + if(dispatch && SUCCEEDED(result)) + { + IHTMLDocument2* document; + dispatch->QueryInterface(IID_IHTMLDocument2, (void**)&document); + dispatch->Release(); + //document is set to null automatically if the interface isn't supported + return document; + } + else + { + return NULL; + } +} + +bool wxWebViewIE::EnableControlFeature(long flag, bool enable) +{ +#if wxUSE_DYNLIB_CLASS + + 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); - wxASSERT(document); + HRESULT hr = (*pfnCoInternetIsFeatureEnabled)(flag, + 0x2 /* SET_FEATURE_ON_PROCESS */); + if((hr == S_OK && enable) || (hr == S_FALSE && !enable)) + return true; - return document; + 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) @@ -1161,7 +1299,7 @@ STDMETHODIMP ClassFactory::LockServer(BOOL fLock) return S_OK; } -wxIEContainer::wxIEContainer(wxWindow *parent, REFIID iid, IUnknown *pUnk, +wxIEContainer::wxIEContainer(wxWindow *parent, REFIID iid, IUnknown *pUnk, DocHostUIHandler* uiHandler) : wxActiveXContainer(parent,iid,pUnk) { @@ -1172,7 +1310,7 @@ wxIEContainer::~wxIEContainer() { } -bool wxIEContainer::QueryClientSiteInterface(REFIID iid, void **_interface, +bool wxIEContainer::QueryClientSiteInterface(REFIID iid, void **_interface, const char *&desc) { if (m_uiHandler && IsEqualIID(iid, wxIID_IDocHostUIHandler)) @@ -1184,8 +1322,8 @@ bool wxIEContainer::QueryClientSiteInterface(REFIID iid, void **_interface, return false; } -HRESULT DocHostUIHandler::ShowContextMenu(DWORD dwID, POINT *ppt, - IUnknown *pcmdtReserved, +HRESULT DocHostUIHandler::ShowContextMenu(DWORD dwID, POINT *ppt, + IUnknown *pcmdtReserved, IDispatch *pdispReserved) { wxUnusedVar(dwID); @@ -1197,13 +1335,13 @@ HRESULT DocHostUIHandler::ShowContextMenu(DWORD dwID, POINT *ppt, HRESULT DocHostUIHandler::GetHostInfo(DOCHOSTUIINFO *pInfo) { - //don't show 3d border and ebales themes. + //don't show 3d border and enable themes. pInfo->dwFlags = pInfo->dwFlags | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME; return S_OK; } HRESULT DocHostUIHandler::ShowUI(DWORD dwID, - IOleInPlaceActiveObject *pActiveObject, + IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc) @@ -1244,7 +1382,7 @@ HRESULT DocHostUIHandler::OnFrameWindowActivate(BOOL fActivate) return E_NOTIMPL; } -HRESULT DocHostUIHandler::ResizeBorder(LPCRECT prcBorder, +HRESULT DocHostUIHandler::ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow) { @@ -1254,7 +1392,7 @@ HRESULT DocHostUIHandler::ResizeBorder(LPCRECT prcBorder, return E_NOTIMPL; } -HRESULT DocHostUIHandler::TranslateAccelerator(LPMSG lpMsg, +HRESULT DocHostUIHandler::TranslateAccelerator(LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID) { @@ -1263,10 +1401,15 @@ HRESULT DocHostUIHandler::TranslateAccelerator(LPMSG lpMsg, //control is down? if((GetKeyState(VK_CONTROL) & 0x8000 )) { - //skip CTRL-N, CTRL-F and CTRL-P - if(lpMsg->wParam == 'N' || lpMsg->wParam == 'P' || lpMsg->wParam == 'F') + //skip the accelerators used by the control + switch(lpMsg->wParam) { - return S_OK; + case 'F': + case 'L': + case 'N': + case 'O': + case 'P': + return S_OK; } } //skip F5