]> git.saurik.com Git - wxWidgets.git/commitdiff
Use wxCOMPtr throughout the wxWebViewIE Find code.
authorSteve Lamerton <steve.lamerton@gmail.com>
Sat, 18 May 2013 14:07:58 +0000 (14:07 +0000)
committerSteve Lamerton <steve.lamerton@gmail.com>
Sat, 18 May 2013 14:07:58 +0000 (14:07 +0000)
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
src/msw/webview_ie.cpp

index 020bd7fb8774f9f96366e183d66240809463e477..e51ec3e03d0e846dd49878495b81f748eeac7099 100644 (file)
@@ -184,7 +184,7 @@ private:
     bool CanExecCommand(wxString command) const;
     void ExecCommand(wxString command);
     wxCOMPtr<IHTMLDocument2> GetDocument() const;
     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);
     //Find helper functions.
     void FindInternal(const wxString& text, int flags, int internal_flag);
     long FindNext(int direction = 1);
index d52a5ad373b82b8560cb369976aa61f6c2e32e9d..b3f5e289ef2b613928e6ea4eb7d95e0799a5970e 100644 (file)
@@ -940,19 +940,19 @@ wxCOMPtr<IHTMLDocument2> wxWebViewIE::GetDocument() const
     return document;
 }
 
     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)
     {
     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)))
         {
         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.
             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)))
         {
         IHTMLElement* parent;
         if(is_visible && SUCCEEDED(elm1->get_parentElement(&parent)))
         {
-            elm1->Release();
             elm1 = parent;
         }
         else
             elm1 = parent;
         }
         else
@@ -990,17 +989,17 @@ bool wxWebViewIE::IsElementVisible(IHTMLElement* elm)
 
 void wxWebViewIE::FindInternal(const wxString& text, int flags, int internal_flag)
 {
 
 void wxWebViewIE::FindInternal(const wxString& text, int flags, int internal_flag)
 {
-    wxIMarkupServices *pIMS;
-    wxIMarkupContainer *pIMC;
-    wxIMarkupPointer *ptrBegin, *ptrEnd;
-    IHTMLElement* elm;
     long find_flag = 0;
     long find_flag = 0;
-    IHTMLDocument2 *document = GetDocument();
+    wxCOMPtr<wxIMarkupServices> pIMS;
+    wxCOMPtr<IHTMLDocument2> document = GetDocument();
+
     //This function does the acutal work.
     //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)))
         {
         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);
             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)
             {
 
             while(ptrBegin->FindText(text_bstr, find_flag, ptrEnd, NULL) == S_OK)
             {
+                wxCOMPtr<IHTMLElement> elm;
                 if(ptrBegin->CurrentScope(&elm) == S_OK)
                 {
                     if(IsElementVisible(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));
                         }
                     }
                             m_findPointers.push_back(wxFindPointers(cptrBegin,cptrEnd));
                         }
                     }
-                    elm->Release();
                 }
                 ptrBegin->MoveToPointer(ptrEnd);
             }
             //Clean up.
             SysFreeString(text_bstr);
             SysFreeString(attr_bstr);
                 }
                 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)
 }
 
 long wxWebViewIE::FindNext(int direction)
@@ -1111,20 +1105,21 @@ long wxWebViewIE::FindNext(int direction)
             return wxNOT_FOUND;
         }
     }
             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.
     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)))
         {
         if(SUCCEEDED(body_element->QueryInterface(IID_IHTMLBodyElement,(void**)&body)))
         {
+            wxCOMPtr<wxIHTMLTxtRange> range;
             if(SUCCEEDED(body->createTextRange((IHTMLTxtRange**)(&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)))
                 {
                 //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;
                     }
                     {
                         ret = m_findPosition;
                     }
-                    pIMS->Release();
                 }
                 }
-                range->Release();
             }
             }
-            body->Release();
         }
         }
-        body_element->Release();
     }
     }
-    document->Release();
     return ret;
 }
 
     return ret;
 }