From 938506b1f78bb6c7f3a3a3b84ce90a2683eb3c0a Mon Sep 17 00:00:00 2001 From: Steve Lamerton Date: Sat, 18 May 2013 14:07:58 +0000 Subject: [PATCH 1/1] Use wxCOMPtr throughout the wxWebViewIE Find code. As well as making the code a bit neater this seems to fix some memory issues. See #15207. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74020 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/webview_ie.h | 2 +- src/msw/webview_ie.cpp | 48 +++++++++++++++---------------------- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/include/wx/msw/webview_ie.h b/include/wx/msw/webview_ie.h index 020bd7fb87..e51ec3e03d 100644 --- a/include/wx/msw/webview_ie.h +++ b/include/wx/msw/webview_ie.h @@ -184,7 +184,7 @@ private: bool CanExecCommand(wxString command) const; void ExecCommand(wxString command); wxCOMPtr GetDocument() const; - bool IsElementVisible(IHTMLElement* elm); + bool IsElementVisible(wxCOMPtr elm); //Find helper functions. void FindInternal(const wxString& text, int flags, int internal_flag); long FindNext(int direction = 1); diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index d52a5ad373..b3f5e289ef 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -940,19 +940,19 @@ wxCOMPtr wxWebViewIE::GetDocument() const return document; } -bool wxWebViewIE::IsElementVisible(IHTMLElement* elm) +bool wxWebViewIE::IsElementVisible(wxCOMPtr elm) { - wxIHTMLCurrentStyle* style; - IHTMLElement *elm1 = elm; - wxIHTMLElement2 *elm2; + wxCOMPtr elm1 = elm; BSTR tmp_bstr; bool is_visible = true; //This method is not perfect but it does discover most of the hidden elements. //so if a better solution is found, then please do improve. while(elm1) { + wxCOMPtr elm2; if(SUCCEEDED(elm1->QueryInterface(wxIID_IHTMLElement2, (void**) &elm2))) { + wxCOMPtr style; if(SUCCEEDED(elm2->get_currentStyle(&style))) { //Check if the object has the style display:none. @@ -976,7 +976,6 @@ bool wxWebViewIE::IsElementVisible(IHTMLElement* elm) IHTMLElement* parent; if(is_visible && SUCCEEDED(elm1->get_parentElement(&parent))) { - elm1->Release(); elm1 = parent; } else @@ -990,17 +989,17 @@ bool wxWebViewIE::IsElementVisible(IHTMLElement* elm) void wxWebViewIE::FindInternal(const wxString& text, int flags, int internal_flag) { - wxIMarkupServices *pIMS; - wxIMarkupContainer *pIMC; - wxIMarkupPointer *ptrBegin, *ptrEnd; - IHTMLElement* elm; long find_flag = 0; - IHTMLDocument2 *document = GetDocument(); + wxCOMPtr pIMS; + wxCOMPtr document = GetDocument(); + //This function does the acutal work. - if(SUCCEEDED(document->QueryInterface(wxIID_IMarkupServices, (void **)&pIMS))) + if(document && SUCCEEDED(document->QueryInterface(wxIID_IMarkupServices, (void **)&pIMS))) { + wxCOMPtr pIMC; if(SUCCEEDED(document->QueryInterface(wxIID_IMarkupContainer, (void **)&pIMC))) { + wxCOMPtr ptrBegin, ptrEnd; BSTR attr_bstr = SysAllocString(L"style=\"background-color:#ffff00\""); BSTR text_bstr = SysAllocString(text.wc_str()); pIMS->CreateMarkupPointer(&ptrBegin); @@ -1026,6 +1025,7 @@ void wxWebViewIE::FindInternal(const wxString& text, int flags, int internal_fla while(ptrBegin->FindText(text_bstr, find_flag, ptrEnd, NULL) == S_OK) { + wxCOMPtr elm; if(ptrBegin->CurrentScope(&elm) == S_OK) { if(IsElementVisible(elm)) @@ -1054,20 +1054,14 @@ void wxWebViewIE::FindInternal(const wxString& text, int flags, int internal_fla m_findPointers.push_back(wxFindPointers(cptrBegin,cptrEnd)); } } - elm->Release(); } ptrBegin->MoveToPointer(ptrEnd); } //Clean up. SysFreeString(text_bstr); SysFreeString(attr_bstr); - pIMC->Release(); - ptrBegin->Release(); - ptrEnd->Release(); } - pIMS->Release(); } - document->Release(); } long wxWebViewIE::FindNext(int direction) @@ -1111,20 +1105,21 @@ long wxWebViewIE::FindNext(int direction) return wxNOT_FOUND; } } - //some variables to use later on. - IHTMLElement *body_element; - IHTMLBodyElement *body; - wxIHTMLTxtRange *range = NULL; - wxIMarkupServices *pIMS; - IHTMLDocument2 *document = GetDocument(); + + wxCOMPtr document = GetDocument(); + wxCOMPtr body_element; + long ret = -1; //Now try to create a range from the body. - if(SUCCEEDED(document->get_body(&body_element))) + if(document && SUCCEEDED(document->get_body(&body_element))) { + wxCOMPtr body; if(SUCCEEDED(body_element->QueryInterface(IID_IHTMLBodyElement,(void**)&body))) { + wxCOMPtr range; if(SUCCEEDED(body->createTextRange((IHTMLTxtRange**)(&range)))) { + wxCOMPtr pIMS; //So far so good, now we try to position our find pointers. if(SUCCEEDED(document->QueryInterface(wxIID_IMarkupServices,(void **)&pIMS))) { @@ -1133,15 +1128,10 @@ long wxWebViewIE::FindNext(int direction) { ret = m_findPosition; } - pIMS->Release(); } - range->Release(); } - body->Release(); } - body_element->Release(); } - document->Release(); return ret; } -- 2.45.2