From 7f98bdd6a50b7d328a6fb3bd59a95e36f34aa68c Mon Sep 17 00:00:00 2001
From: Steve Lamerton <steve.lamerton@gmail.com>
Date: Sun, 18 Dec 2011 11:51:52 +0000
Subject: [PATCH] Ensure wxWebViewIE::SetPage clears the existing content
 before writing the new output. Also add a basic unit test to verify
 correctness in the future.

Fixes #13770

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70041 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 src/msw/webview_ie.cpp     | 58 +++++++++++++++++++++++++-------------
 tests/controls/webtest.cpp | 11 ++++++++
 2 files changed, 50 insertions(+), 19 deletions(-)

diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp
index 80941967d2..1ddf1efc7e 100644
--- a/src/msw/webview_ie.cpp
+++ b/src/msw/webview_ie.cpp
@@ -102,43 +102,63 @@ void wxWebViewIE::LoadURL(const wxString& url)
 
 void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl)
 {
-    BSTR bstr = SysAllocString(html.wc_str());
-
-    // Creates a new one-dimensional array
+    BSTR bstr = SysAllocString(OLESTR(""));
     SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
     if (psaStrings != NULL)
     {
         VARIANT *param;
-
         HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
         param->vt = VT_BSTR;
         param->bstrVal = bstr;
-        hr = SafeArrayUnaccessData(psaStrings);
 
+        hr = SafeArrayUnaccessData(psaStrings);
+        
         IHTMLDocument2* document = GetDocument();
         document->write(psaStrings);
+        document->close();
         document->Release();
 
-        // SafeArrayDestroy calls SysFreeString for each BSTR
         SafeArrayDestroy(psaStrings);
 
-        //We send the events when we are done to mimic webkit
-        //Navigated event
-        wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED,
-                             GetId(), baseUrl, "");
-        event.SetEventObject(this);
-        HandleWindowEvent(event);
-
-        //Document complete event
-        event.SetEventType(wxEVT_COMMAND_WEB_VIEW_LOADED);
-        event.SetEventObject(this);
-        HandleWindowEvent(event);
+        bstr = SysAllocString(html.wc_str());
+
+        // Creates a new one-dimensional array
+        psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
+        if (psaStrings != NULL)
+        {
+            hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
+            param->vt = VT_BSTR;
+            param->bstrVal = bstr;
+            hr = SafeArrayUnaccessData(psaStrings);
+
+            document = GetDocument();
+            document->write(psaStrings);
+            document->Release();
+
+            // SafeArrayDestroy calls SysFreeString for each BSTR
+            SafeArrayDestroy(psaStrings);
+
+            //We send the events when we are done to mimic webkit
+            //Navigated event
+            wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED,
+                                 GetId(), baseUrl, "");
+            event.SetEventObject(this);
+            HandleWindowEvent(event);
+
+            //Document complete event
+            event.SetEventType(wxEVT_COMMAND_WEB_VIEW_LOADED);
+            event.SetEventObject(this);
+            HandleWindowEvent(event);
+        }
+        else
+        {
+            wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL");
+        }
     }
     else
     {
-        wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL");
+        wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL during clear");
     }
-
 }
 
 wxString wxWebViewIE::GetPageSource() const
diff --git a/tests/controls/webtest.cpp b/tests/controls/webtest.cpp
index 7ab8a7570e..41e7adfdfe 100644
--- a/tests/controls/webtest.cpp
+++ b/tests/controls/webtest.cpp
@@ -44,6 +44,7 @@ private:
         CPPUNIT_TEST( Selection );
         CPPUNIT_TEST( Zoom );
         CPPUNIT_TEST( RunScript );
+        CPPUNIT_TEST( SetPage );
     CPPUNIT_TEST_SUITE_END();
 
     void Title();
@@ -56,6 +57,7 @@ private:
     void Selection();
     void Zoom();
     void RunScript();
+    void SetPage();
     void LoadUrl(int times = 1);
 
     wxWebView* m_browser;
@@ -244,4 +246,13 @@ void WebTestCase::RunScript()
     CPPUNIT_ASSERT_EQUAL("Hello World!", m_browser->GetPageText());
 }
 
+void WebTestCase::SetPage()
+{
+    m_browser->SetPage("<html><body>text</body></html>", "");
+    CPPUNIT_ASSERT_EQUAL("text", m_browser->GetPageText());
+
+    m_browser->SetPage("<html><body>other text</body></html>", "");
+    CPPUNIT_ASSERT_EQUAL("other text", m_browser->GetPageText());
+}
+
 #endif //wxUSE_WEBVIEW && (wxUSE_WEBVIEW_WEBKIT || wxUSE_WEBVIEW_IE)
-- 
2.47.2