X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/153530afb595110592776c461e52be99b1559439..74a8f67d96591cec101def2a7d47c64072aff7fd:/src/msw/webview_ie.cpp?ds=sidebyside diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index 07cda9f9d5..92edb4ecd5 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -27,6 +27,8 @@ #include "wx/msw/missing.h" #include "wx/filesys.h" +wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewIE, wxWebView); + //We link to urlmon as it is required for CoInternetGetSession #pragma comment(lib, "urlmon") @@ -73,12 +75,12 @@ bool wxWebViewIE::Create(wxWindow* parent, SetBackgroundStyle(wxBG_STYLE_PAINT); SetDoubleBuffered(true); - LoadUrl(url); + LoadURL(url); return true; } -void wxWebViewIE::LoadUrl(const wxString& url) +void wxWebViewIE::LoadURL(const wxString& url) { m_ie.CallMethod("Navigate", (BSTR) url.wc_str(), NULL, NULL, NULL, NULL); } @@ -107,8 +109,8 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) //We send the events when we are done to mimic webkit //Navigated event - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, - GetId(), baseUrl, "", false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, + GetId(), baseUrl, ""); event.SetEventObject(this); HandleWindowEvent(event); @@ -124,7 +126,7 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) } -wxString wxWebViewIE::GetPageSource() +wxString wxWebViewIE::GetPageSource() const { IHTMLDocument2* document = GetDocument(); IHTMLElement *bodyTag = NULL; @@ -148,7 +150,7 @@ wxString wxWebViewIE::GetPageSource() return source; } -wxWebViewZoom wxWebViewIE::GetZoom() +wxWebViewZoom wxWebViewIE::GetZoom() const { if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_LAYOUT) return GetIEOpticalZoom(); @@ -188,7 +190,7 @@ void wxWebViewIE::SetIETextZoom(wxWebViewZoom level) wxASSERT(result == S_OK); } -wxWebViewZoom wxWebViewIE::GetIETextZoom() +wxWebViewZoom wxWebViewIE::GetIETextZoom() const { VARIANT zoomVariant; VariantInit (&zoomVariant); @@ -240,7 +242,7 @@ void wxWebViewIE::SetIEOpticalZoom(wxWebViewZoom level) wxASSERT(result == S_OK); } -wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() +wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() const { VARIANT zoomVariant; VariantInit (&zoomVariant); @@ -307,7 +309,7 @@ void wxWebViewIE::Print() OLECMDEXECOPT_DODEFAULT, NULL, NULL); } -bool wxWebViewIE::CanGoBack() +bool wxWebViewIE::CanGoBack() const { if(m_historyEnabled) return m_historyPosition > 0; @@ -315,7 +317,7 @@ bool wxWebViewIE::CanGoBack() return false; } -bool wxWebViewIE::CanGoForward() +bool wxWebViewIE::CanGoForward() const { if(m_historyEnabled) return m_historyPosition != static_cast(m_historyList.size()) - 1; @@ -323,7 +325,7 @@ bool wxWebViewIE::CanGoForward() return false; } -void wxWebViewIE::LoadHistoryItem(wxSharedPtr item) +void wxWebViewIE::LoadHistoryItem(wxSharedPtr item) { int pos = -1; for(unsigned int i = 0; i < m_historyList.size(); i++) @@ -335,13 +337,13 @@ 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; } -wxVector > wxWebViewIE::GetBackwardHistory() +wxVector > wxWebViewIE::GetBackwardHistory() { - wxVector > backhist; + wxVector > backhist; //As we don't have std::copy or an iterator constructor in the wxwidgets //native vector we construct it by hand for(int i = 0; i < m_historyPosition; i++) @@ -351,9 +353,9 @@ wxVector > wxWebViewIE::GetBackwardHistory() return backhist; } -wxVector > wxWebViewIE::GetForwardHistory() +wxVector > wxWebViewIE::GetForwardHistory() { - wxVector > forwardhist; + wxVector > forwardhist; //As we don't have std::copy or an iterator constructor in the wxwidgets //native vector we construct it by hand for(int i = m_historyPosition + 1; i < static_cast(m_historyList.size()); i++) @@ -431,8 +433,8 @@ void wxWebViewIE::SetOfflineMode(bool offline) wxASSERT(success); } -bool wxWebViewIE::IsBusy() -{ +bool wxWebViewIE::IsBusy() const +{ if (m_isBusy) return true; wxVariant out = m_ie.GetProperty("Busy"); @@ -442,7 +444,7 @@ bool wxWebViewIE::IsBusy() return out.GetBool(); } -wxString wxWebViewIE::GetCurrentURL() +wxString wxWebViewIE::GetCurrentURL() const { wxVariant out = m_ie.GetProperty("LocationURL"); @@ -450,7 +452,7 @@ wxString wxWebViewIE::GetCurrentURL() return out.GetString(); } -wxString wxWebViewIE::GetCurrentTitle() +wxString wxWebViewIE::GetCurrentTitle() const { IHTMLDocument2* document = GetDocument(); BSTR title; @@ -460,16 +462,16 @@ wxString wxWebViewIE::GetCurrentTitle() return wxString(title); } -bool wxWebViewIE::CanCut() +bool wxWebViewIE::CanCut() const { return CanExecCommand("Cut"); } -bool wxWebViewIE::CanCopy() +bool wxWebViewIE::CanCopy() const { return CanExecCommand("Copy"); } -bool wxWebViewIE::CanPaste() +bool wxWebViewIE::CanPaste() const { return CanExecCommand("Paste"); } @@ -489,11 +491,11 @@ void wxWebViewIE::Paste() ExecCommand("Paste"); } -bool wxWebViewIE::CanUndo() +bool wxWebViewIE::CanUndo() const { return CanExecCommand("Undo"); } -bool wxWebViewIE::CanRedo() +bool wxWebViewIE::CanRedo() const { return CanExecCommand("Redo"); } @@ -519,7 +521,7 @@ void wxWebViewIE::SetEditable(bool enable) document->Release(); } -bool wxWebViewIE::IsEditable() +bool wxWebViewIE::IsEditable() const { IHTMLDocument2* document = GetDocument(); BSTR mode; @@ -536,7 +538,7 @@ void wxWebViewIE::SelectAll() ExecCommand("SelectAll"); } -bool wxWebViewIE::HasSelection() +bool wxWebViewIE::HasSelection() const { IHTMLDocument2* document = GetDocument(); IHTMLSelectionObject* selection; @@ -558,7 +560,7 @@ void wxWebViewIE::DeleteSelection() ExecCommand("Delete"); } -wxString wxWebViewIE::GetSelectedText() +wxString wxWebViewIE::GetSelectedText() const { IHTMLDocument2* document = GetDocument(); IHTMLSelectionObject* selection; @@ -587,7 +589,7 @@ wxString wxWebViewIE::GetSelectedText() return selected; } -wxString wxWebViewIE::GetSelectedSource() +wxString wxWebViewIE::GetSelectedSource() const { IHTMLDocument2* document = GetDocument(); IHTMLSelectionObject* selection; @@ -630,7 +632,7 @@ void wxWebViewIE::ClearSelection() document->Release(); } -wxString wxWebViewIE::GetPageText() +wxString wxWebViewIE::GetPageText() const { IHTMLDocument2* document = GetDocument(); wxString text; @@ -663,7 +665,7 @@ void wxWebViewIE::RunScript(const wxString& javascript) document->Release(); } -void wxWebViewIE::RegisterProtocol(wxWebProtocolHandler* handler) +void wxWebViewIE::RegisterHandler(wxSharedPtr handler) { ClassFactory* cf = new ClassFactory(handler); IInternetSession* session; @@ -672,14 +674,14 @@ void wxWebViewIE::RegisterProtocol(wxWebProtocolHandler* handler) wxFAIL_MSG("Could not retrive internet session"); } - HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, handler->GetProtocol(), 0, NULL, 0); + 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) +bool wxWebViewIE::CanExecCommand(wxString command) const { IHTMLDocument2* document = GetDocument(); VARIANT_BOOL enabled; @@ -697,7 +699,7 @@ void wxWebViewIE::ExecCommand(wxString command) document->Release(); } -IHTMLDocument2* wxWebViewIE::GetDocument() +IHTMLDocument2* wxWebViewIE::GetDocument() const { wxVariant variant = m_ie.GetProperty("Document"); IHTMLDocument2* document = (IHTMLDocument2*)variant.GetVoidPtr(); @@ -720,12 +722,12 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString url = evt[1].GetString(); wxString target = evt[3].GetString(); - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, - GetId(), url, target, true); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, + GetId(), url, target); event.SetEventObject(this); HandleWindowEvent(event); - if (event.IsVetoed()) + if (!event.IsAllowed()) { wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters(); @@ -746,8 +748,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString url = evt[1].GetString(); // TODO: set target parameter if possible wxString target = wxEmptyString; - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, - GetId(), url, target, false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, + GetId(), url, target); event.SetEventObject(this); HandleWindowEvent(event); break; @@ -772,7 +774,13 @@ 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 - if(m_historyEnabled && !m_historyLoadingFromList && url == GetCurrentURL()) + //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" && + wxFileSystem::URLToFileName(GetCurrentURL()).GetFullPath() == url))) { //If we are not at the end of the list, then erase everything //between us and the end before adding the new page @@ -781,7 +789,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) m_historyList.erase(m_historyList.begin() + m_historyPosition + 1, m_historyList.end()); } - wxSharedPtr item(new wxWebHistoryItem(url, GetCurrentTitle())); + wxSharedPtr item(new wxWebViewHistoryItem(url, GetCurrentTitle())); m_historyList.push_back(item); m_historyPosition++; } @@ -789,8 +797,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) m_historyLoadingFromList = false; // TODO: set target parameter if possible wxString target = wxEmptyString; - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, GetId(), - url, target, false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, GetId(), + url, target); event.SetEventObject(this); HandleWindowEvent(event); break; @@ -805,8 +813,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) { wxString title = evt[0].GetString(); - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, - GetId(), GetCurrentURL(), wxEmptyString, true); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, + GetId(), GetCurrentURL(), ""); event.SetString(title); event.SetEventObject(this); HandleWindowEvent(event); @@ -815,7 +823,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) case DISPID_NAVIGATEERROR: { - wxWebNavigationError errorType = wxWEB_NAV_ERR_OTHER; + wxWebViewNavigationError errorType = wxWEB_NAV_ERR_OTHER; wxString errorCode = "?"; switch (evt[3].GetLong()) { @@ -929,8 +937,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString url = evt[1].GetString(); wxString target = evt[2].GetString(); - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, GetId(), - url, target, false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, GetId(), + url, target); event.SetEventObject(this); event.SetInt(errorType); event.SetString(errorCode); @@ -941,8 +949,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) { wxString url = evt[4].GetString(); - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, - GetId(), url, wxEmptyString, true); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, + GetId(), url, wxEmptyString); event.SetEventObject(this); HandleWindowEvent(event); @@ -957,7 +965,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) evt.Skip(); } -VirtualProtocol::VirtualProtocol(wxWebProtocolHandler *handler) +VirtualProtocol::VirtualProtocol(wxSharedPtr handler) { m_refCount = 0; m_file = NULL; @@ -983,12 +991,6 @@ HRESULT VirtualProtocol::QueryInterface(REFIID riid, void **ppvObject) AddRef(); return S_OK; } - else if(riid == IID_IInternetProtocolInfo) - { - *ppvObject = (IInternetProtocolInfo*)this; - AddRef(); - return S_OK; - } else { *ppvObject = NULL; @@ -1076,40 +1078,6 @@ HRESULT VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead) } } -HRESULT VirtualProtocol::CombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, - DWORD dwCombineFlags, LPWSTR pwzResult, - DWORD cchResult, DWORD *pcchResult, - DWORD dwReserved) -{ - wxString newuri = m_handler->CombineURIs(pwzBaseUrl, pwzRelativeUrl); - //Check the buffer we are given can hold the new urll - if(wxStrlen(newuri) > cchResult) - return S_FALSE; - - wxStrcpy(pwzResult, newuri.c_str()); - *pcchResult = wxStrlen(newuri); - return S_OK; -} - -HRESULT VirtualProtocol::ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, - DWORD dwParseFlags, LPWSTR pwzResult, - DWORD cchResult, DWORD *pcchResult, - DWORD dwReserved) -{ - //return INET_E_DEFAULT_ACTION; - wxStrcpy(pwzResult, pwzUrl); - *pcchResult = wxStrlen(pwzResult); - return S_OK; -} - -HRESULT VirtualProtocol::QueryInfo(LPCWSTR pwzUrl, QUERYOPTION OueryOption, - DWORD dwQueryFlags, LPVOID pBuffer, - DWORD cbBuffer, DWORD *pcbBuf, - DWORD dwReserved) -{ - return INET_E_DEFAULT_ACTION; -} - HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void ** ppvObject) {