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*)¶m); 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*)¶m); + 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