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
This commit is contained in:
Steve Lamerton
2013-05-18 14:07:58 +00:00
parent 43c42c18d3
commit 938506b1f7
2 changed files with 20 additions and 30 deletions

View File

@@ -184,7 +184,7 @@ private:
bool CanExecCommand(wxString command) const;
void ExecCommand(wxString command);
wxCOMPtr<IHTMLDocument2> GetDocument() const;
bool IsElementVisible(IHTMLElement* elm);
bool IsElementVisible(wxCOMPtr<IHTMLElement> elm);
//Find helper functions.
void FindInternal(const wxString& text, int flags, int internal_flag);
long FindNext(int direction = 1);

View File

@@ -940,19 +940,19 @@ wxCOMPtr<IHTMLDocument2> wxWebViewIE::GetDocument() const
return document;
}
bool wxWebViewIE::IsElementVisible(IHTMLElement* elm)
bool wxWebViewIE::IsElementVisible(wxCOMPtr<IHTMLElement> elm)
{
wxIHTMLCurrentStyle* style;
IHTMLElement *elm1 = elm;
wxIHTMLElement2 *elm2;
wxCOMPtr<IHTMLElement> 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<wxIHTMLElement2> elm2;
if(SUCCEEDED(elm1->QueryInterface(wxIID_IHTMLElement2, (void**) &elm2)))
{
wxCOMPtr<wxIHTMLCurrentStyle> 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<wxIMarkupServices> pIMS;
wxCOMPtr<IHTMLDocument2> 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<wxIMarkupContainer> pIMC;
if(SUCCEEDED(document->QueryInterface(wxIID_IMarkupContainer, (void **)&pIMC)))
{
wxCOMPtr<wxIMarkupPointer> 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<IHTMLElement> 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<IHTMLDocument2> document = GetDocument();
wxCOMPtr<IHTMLElement> 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<IHTMLBodyElement> body;
if(SUCCEEDED(body_element->QueryInterface(IID_IHTMLBodyElement,(void**)&body)))
{
wxCOMPtr<wxIHTMLTxtRange> range;
if(SUCCEEDED(body->createTextRange((IHTMLTxtRange**)(&range))))
{
wxCOMPtr<wxIMarkupServices> 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;
}