From f40f8e17226c2080dec017e2043fe59e2d21e15b Mon Sep 17 00:00:00 2001 From: Steve Lamerton Date: Sun, 3 Jun 2012 17:41:32 +0000 Subject: [PATCH] Use wxCOMPtr throughout wxWebViewIE to simplify the code and reduce the chance of memory leaks. Also mark PPV_ARGS_CHECK as inline so it can be used from multiple libraries. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71639 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/private/comptr.h | 2 +- include/wx/msw/webview_ie.h | 5 +- src/msw/webview_ie.cpp | 94 +++++++++++---------------------- 3 files changed, 34 insertions(+), 67 deletions(-) diff --git a/include/wx/msw/private/comptr.h b/include/wx/msw/private/comptr.h index 286fcdefc0..b0eb4f9506 100644 --- a/include/wx/msw/private/comptr.h +++ b/include/wx/msw/private/comptr.h @@ -113,7 +113,7 @@ private: // Define a helper for the macro below: we just need a function taking a // pointer and not returning anything to avoid warnings about unused return // value of the cast in the macro itself. -namespace wxPrivate { void PPV_ARGS_CHECK(void*) { } } +namespace wxPrivate { inline void PPV_ARGS_CHECK(void*) { } } // Takes the interface name and a pointer to a pointer of the interface type // and expands into the IID of this interface and the same pointer but after a diff --git a/include/wx/msw/webview_ie.h b/include/wx/msw/webview_ie.h index 188d657842..cced6f7822 100644 --- a/include/wx/msw/webview_ie.h +++ b/include/wx/msw/webview_ie.h @@ -19,6 +19,7 @@ #include "wx/msw/ole/automtn.h" #include "wx/msw/ole/activex.h" #include "wx/msw/ole/oleutils.h" +#include "wx/msw/private/comptr.h" #include "wx/msw/wrapwin.h" #include "wx/msw/missing.h" #include "wx/sharedptr.h" @@ -360,7 +361,7 @@ private: wxAutomationObject m_ie; IWebBrowser2* m_webBrowser; DWORD m_dwCookie; - DocHostUIHandler* m_uiHandler; + wxCOMPtr m_uiHandler; //We store the current zoom type; wxWebViewZoomType m_zoomType; @@ -383,7 +384,7 @@ private: //Generic helper functions for IHtmlDocument commands bool CanExecCommand(wxString command) const; void ExecCommand(wxString command); - IHTMLDocument2* GetDocument() const; + wxCOMPtr GetDocument() const; //Toggles control features see INTERNETFEATURELIST for values. bool EnableControlFeature(long flag, bool enable = true); diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index c42c1a00ea..2bdddcdd72 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -83,7 +83,6 @@ bool wxWebViewIE::Create(wxWindow* parent, m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE); m_uiHandler = new DocHostUIHandler; - m_uiHandler->AddRef(); m_container = new wxIEContainer(this, IID_IWebBrowser2, m_webBrowser, m_uiHandler); @@ -99,8 +98,6 @@ wxWebViewIE::~wxWebViewIE() { m_factories[i]->Release(); } - - m_uiHandler->Release(); } void wxWebViewIE::LoadURL(const wxString& url) @@ -121,14 +118,13 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) hr = SafeArrayUnaccessData(psaStrings); - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(!document) return; document->write(psaStrings); document->close(); - document->Release(); SafeArrayDestroy(psaStrings); @@ -149,7 +145,6 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) return; document->write(psaStrings); - document->Release(); // SafeArrayDestroy calls SysFreeString for each BSTR SafeArrayDestroy(psaStrings); @@ -179,12 +174,12 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) wxString wxWebViewIE::GetPageSource() const { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { - IHTMLElement *bodyTag = NULL; - IHTMLElement *htmlTag = NULL; + wxCOMPtr bodyTag; + wxCOMPtr htmlTag; wxString source; HRESULT hr = document->get_body(&bodyTag); if(SUCCEEDED(hr)) @@ -195,12 +190,8 @@ wxString wxWebViewIE::GetPageSource() const BSTR bstr; htmlTag->get_outerHTML(&bstr); source = wxString(bstr); - htmlTag->Release(); } - bodyTag->Release(); } - - document->Release(); return source; } else @@ -536,13 +527,12 @@ wxString wxWebViewIE::GetCurrentURL() const wxString wxWebViewIE::GetCurrentTitle() const { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { BSTR title; document->get_nameProp(&title); - document->Release(); return wxString(title); } else @@ -603,7 +593,7 @@ void wxWebViewIE::Redo() void wxWebViewIE::SetEditable(bool enable) { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { @@ -612,19 +602,17 @@ void wxWebViewIE::SetEditable(bool enable) else document->put_designMode(SysAllocString(L"Off")); - document->Release(); } } bool wxWebViewIE::IsEditable() const { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { BSTR mode; document->get_designMode(&mode); - document->Release(); if(wxString(mode) == "On") return true; else @@ -643,11 +631,11 @@ void wxWebViewIE::SelectAll() bool wxWebViewIE::HasSelection() const { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { - IHTMLSelectionObject* selection; + wxCOMPtr selection; wxString sel; HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) @@ -655,9 +643,7 @@ bool wxWebViewIE::HasSelection() const BSTR type; selection->get_type(&type); sel = wxString(type); - selection->Release(); } - document->Release(); return sel != "None"; } else @@ -673,33 +659,29 @@ void wxWebViewIE::DeleteSelection() wxString wxWebViewIE::GetSelectedText() const { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { - IHTMLSelectionObject* selection; + wxCOMPtr selection; wxString selected; HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) { - IDispatch* disrange; + wxCOMPtr disrange; hr = selection->createRange(&disrange); if(SUCCEEDED(hr)) { - IHTMLTxtRange* range; + wxCOMPtr range; hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); if(SUCCEEDED(hr)) { BSTR text; range->get_text(&text); selected = wxString(text); - range->Release(); } - disrange->Release(); } - selection->Release(); } - document->Release(); return selected; } else @@ -710,33 +692,29 @@ wxString wxWebViewIE::GetSelectedText() const wxString wxWebViewIE::GetSelectedSource() const { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { - IHTMLSelectionObject* selection; + wxCOMPtr selection; wxString selected; HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) { - IDispatch* disrange; + wxCOMPtr disrange; hr = selection->createRange(&disrange); if(SUCCEEDED(hr)) { - IHTMLTxtRange* range; + wxCOMPtr range; hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); if(SUCCEEDED(hr)) { BSTR text; range->get_htmlText(&text); selected = wxString(text); - range->Release(); } - disrange->Release(); } - selection->Release(); } - document->Release(); return selected; } else @@ -747,39 +725,35 @@ wxString wxWebViewIE::GetSelectedSource() const void wxWebViewIE::ClearSelection() { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { - IHTMLSelectionObject* selection; + wxCOMPtr selection; wxString selected; HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) { selection->empty(); - selection->Release(); } - document->Release(); } } wxString wxWebViewIE::GetPageText() const { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { wxString text; - IHTMLElement* body; + wxCOMPtr 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 @@ -790,11 +764,11 @@ wxString wxWebViewIE::GetPageText() const void wxWebViewIE::RunScript(const wxString& javascript) { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { - IHTMLWindow2* window; + wxCOMPtr window; wxString language = "javascript"; HRESULT hr = document->get_parentWindow(&window); if(SUCCEEDED(hr)) @@ -806,7 +780,6 @@ void wxWebViewIE::RunScript(const wxString& javascript) SysAllocString(language.wc_str()), &level); } - document->Release(); } } @@ -843,14 +816,13 @@ void wxWebViewIE::RegisterHandler(wxSharedPtr handler) bool wxWebViewIE::CanExecCommand(wxString command) const { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { VARIANT_BOOL enabled; document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled); - document->Release(); return (enabled == VARIANT_TRUE); } @@ -863,31 +835,25 @@ bool wxWebViewIE::CanExecCommand(wxString command) const void wxWebViewIE::ExecCommand(wxString command) { - IHTMLDocument2* document = GetDocument(); + wxCOMPtr document(GetDocument()); if(document) { document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL); - document->Release(); } } -IHTMLDocument2* wxWebViewIE::GetDocument() const +wxCOMPtr wxWebViewIE::GetDocument() const { - IDispatch* dispatch = NULL; + wxCOMPtr dispatch; + wxCOMPtr document; 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; + dispatch->QueryInterface(IID_IHTMLDocument2, (void**)&document); } + return document; } bool wxWebViewIE::EnableControlFeature(long flag, bool enable) -- 2.47.2