1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        tests/controls/webtest.cpp
3 // Purpose:     wxWebView unit test
4 // Author:      Steven Lamerton
5 // Created:     2011-07-08
6 // Copyright:   (c) 2011 Steven Lamerton
7 ///////////////////////////////////////////////////////////////////////////////
8 
9 #include "testprec.h"
10 
11 #if wxUSE_WEBVIEW && (wxUSE_WEBVIEW_WEBKIT || wxUSE_WEBVIEW_IE)
12 
13 #ifdef __BORLANDC__
14     #pragma hdrstop
15 #endif
16 
17 #ifndef WX_PRECOMP
18     #include "wx/app.h"
19 #endif // WX_PRECOMP
20 
21 #include "testableframe.h"
22 #include "wx/uiaction.h"
23 #include "wx/webview.h"
24 #include "asserthelper.h"
25 
26 class WebTestCase : public CppUnit::TestCase
27 {
28 public:
WebTestCase()29     WebTestCase() { }
30 
31     void setUp();
32     void tearDown();
33 
34 private:
35     CPPUNIT_TEST_SUITE( WebTestCase );
36         CPPUNIT_TEST( Title );
37         CPPUNIT_TEST( Url );
38         CPPUNIT_TEST( History );
39         CPPUNIT_TEST( HistoryEnable );
40         CPPUNIT_TEST( HistoryClear );
41         CPPUNIT_TEST( HistoryList );
42         CPPUNIT_TEST( Editable );
43         CPPUNIT_TEST( Selection );
44         CPPUNIT_TEST( Zoom );
45         CPPUNIT_TEST( RunScript );
46         CPPUNIT_TEST( SetPage );
47     CPPUNIT_TEST_SUITE_END();
48 
49     void Title();
50     void Url();
51     void History();
52     void HistoryEnable();
53     void HistoryClear();
54     void HistoryList();
55     void Editable();
56     void Selection();
57     void Zoom();
58     void RunScript();
59     void SetPage();
60     void LoadUrl(int times = 1);
61 
62     wxWebView* m_browser;
63     EventCounter* m_loaded;
64 
65     DECLARE_NO_COPY_CLASS(WebTestCase)
66 };
67 
68 //Convenience macro
69 #define ENSURE_LOADED WX_ASSERT_EVENT_OCCURS((*m_loaded), 1)
70 
71 // register in the unnamed registry so that these tests are run by default
72 CPPUNIT_TEST_SUITE_REGISTRATION( WebTestCase );
73 
74 // also include in its own registry so that these tests can be run alone
75 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( WebTestCase, "WebTestCase" );
76 
setUp()77 void WebTestCase::setUp()
78 {
79     m_browser = wxWebView::New(wxTheApp->GetTopWindow(), wxID_ANY);
80 
81     m_loaded = new EventCounter(m_browser, wxEVT_WEBVIEW_LOADED);
82     m_browser->LoadURL("about:blank");
83     ENSURE_LOADED;
84 }
85 
tearDown()86 void WebTestCase::tearDown()
87 {
88     wxDELETE(m_loaded);
89     wxDELETE(m_browser);
90 }
91 
LoadUrl(int times)92 void WebTestCase::LoadUrl(int times)
93 {
94     //We alternate between urls as otherwise webkit merges them in the history
95     //we use about and about blank to avoid the need for a network connection
96     for(int i = 0; i < times; i++)
97     {
98         if(i % 2 == 1)
99             m_browser->LoadURL("about:blank");
100         else
101             m_browser->LoadURL("about:");
102         ENSURE_LOADED;
103     }
104 }
105 
Title()106 void WebTestCase::Title()
107 {
108     CPPUNIT_ASSERT_EQUAL("", m_browser->GetCurrentTitle());
109 
110     //Test title after loading raw html
111     m_browser->SetPage("<html><title>Title</title><body>Text</body></html>", "");
112     ENSURE_LOADED;
113     CPPUNIT_ASSERT_EQUAL("Title", m_browser->GetCurrentTitle());
114 
115     //Test title after loading a url, we yield to let events process
116     LoadUrl();
117     CPPUNIT_ASSERT_EQUAL("", m_browser->GetCurrentTitle());
118 }
119 
Url()120 void WebTestCase::Url()
121 {
122     CPPUNIT_ASSERT_EQUAL("about:blank", m_browser->GetCurrentURL());
123 
124     //After first loading about:blank the next in the sequence is about:
125     LoadUrl();
126     CPPUNIT_ASSERT_EQUAL("about:", m_browser->GetCurrentURL());
127 }
128 
History()129 void WebTestCase::History()
130 {
131     LoadUrl(3);
132 
133     CPPUNIT_ASSERT(m_browser->CanGoBack());
134     CPPUNIT_ASSERT(!m_browser->CanGoForward());
135 
136     m_browser->GoBack();
137     ENSURE_LOADED;
138 
139     CPPUNIT_ASSERT(m_browser->CanGoBack());
140     CPPUNIT_ASSERT(m_browser->CanGoForward());
141 
142     m_browser->GoBack();
143     ENSURE_LOADED;
144     m_browser->GoBack();
145     ENSURE_LOADED;
146 
147     //We should now be at the start of the history
148     CPPUNIT_ASSERT(!m_browser->CanGoBack());
149     CPPUNIT_ASSERT(m_browser->CanGoForward());
150 }
151 
HistoryEnable()152 void WebTestCase::HistoryEnable()
153 {
154     LoadUrl();
155     m_browser->EnableHistory(false);
156 
157     CPPUNIT_ASSERT(!m_browser->CanGoForward());
158     CPPUNIT_ASSERT(!m_browser->CanGoBack());
159 
160     LoadUrl();
161 
162     CPPUNIT_ASSERT(!m_browser->CanGoForward());
163     CPPUNIT_ASSERT(!m_browser->CanGoBack());
164 }
165 
HistoryClear()166 void WebTestCase::HistoryClear()
167 {
168     LoadUrl(2);
169 
170     //Now we are in the 'middle' of the history
171     m_browser->GoBack();
172     ENSURE_LOADED;
173 
174     CPPUNIT_ASSERT(m_browser->CanGoForward());
175     CPPUNIT_ASSERT(m_browser->CanGoBack());
176 
177     m_browser->ClearHistory();
178 
179     CPPUNIT_ASSERT(!m_browser->CanGoForward());
180     CPPUNIT_ASSERT(!m_browser->CanGoBack());
181 }
182 
HistoryList()183 void WebTestCase::HistoryList()
184 {
185     LoadUrl(2);
186     m_browser->GoBack();
187     ENSURE_LOADED;
188 
189     CPPUNIT_ASSERT_EQUAL(1, m_browser->GetBackwardHistory().size());
190     CPPUNIT_ASSERT_EQUAL(1, m_browser->GetForwardHistory().size());
191 
192     m_browser->LoadHistoryItem(m_browser->GetForwardHistory()[0]);
193     ENSURE_LOADED;
194 
195     CPPUNIT_ASSERT(!m_browser->CanGoForward());
196     CPPUNIT_ASSERT_EQUAL(2, m_browser->GetBackwardHistory().size());
197 }
198 
Editable()199 void WebTestCase::Editable()
200 {
201     CPPUNIT_ASSERT(!m_browser->IsEditable());
202 
203     m_browser->SetEditable(true);
204 
205     CPPUNIT_ASSERT(m_browser->IsEditable());
206 
207     m_browser->SetEditable(false);
208 
209     CPPUNIT_ASSERT(!m_browser->IsEditable());
210 }
211 
Selection()212 void WebTestCase::Selection()
213 {
214     m_browser->SetPage("<html><body>Some <strong>strong</strong> text</body></html>", "");
215     ENSURE_LOADED;
216     CPPUNIT_ASSERT(!m_browser->HasSelection());
217 
218     m_browser->SelectAll();
219 
220     CPPUNIT_ASSERT(m_browser->HasSelection());
221     CPPUNIT_ASSERT_EQUAL("Some strong text", m_browser->GetSelectedText());
222 
223     // The web engine doesn't necessarily represent the HTML in the same way as
224     // we used above, e.g. IE uses upper case for all the tags while WebKit
225     // under OS X inserts plenty of its own <span> tags, so don't test for
226     // equality and just check that the source contains things we'd expect it
227     // to.
228     const wxString selSource = m_browser->GetSelectedSource();
229     WX_ASSERT_MESSAGE
230     (
231         ("Unexpected selection source: \"%s\"", selSource),
232         selSource.Lower().Matches("*some*<strong*strong</strong>*text*")
233     );
234 
235     m_browser->ClearSelection();
236     CPPUNIT_ASSERT(!m_browser->HasSelection());
237 }
238 
Zoom()239 void WebTestCase::Zoom()
240 {
241     if(m_browser->CanSetZoomType(wxWEBVIEW_ZOOM_TYPE_LAYOUT))
242     {
243         m_browser->SetZoomType(wxWEBVIEW_ZOOM_TYPE_LAYOUT);
244         CPPUNIT_ASSERT_EQUAL(wxWEBVIEW_ZOOM_TYPE_LAYOUT, m_browser->GetZoomType());
245 
246         m_browser->SetZoom(wxWEBVIEW_ZOOM_TINY);
247         CPPUNIT_ASSERT_EQUAL(wxWEBVIEW_ZOOM_TINY, m_browser->GetZoom());
248     }
249 
250     //Reset the zoom level
251     m_browser->SetZoom(wxWEBVIEW_ZOOM_MEDIUM);
252 
253     if(m_browser->CanSetZoomType(wxWEBVIEW_ZOOM_TYPE_TEXT))
254     {
255         m_browser->SetZoomType(wxWEBVIEW_ZOOM_TYPE_TEXT);
256         CPPUNIT_ASSERT_EQUAL(wxWEBVIEW_ZOOM_TYPE_TEXT, m_browser->GetZoomType());
257 
258         m_browser->SetZoom(wxWEBVIEW_ZOOM_TINY);
259         CPPUNIT_ASSERT_EQUAL(wxWEBVIEW_ZOOM_TINY, m_browser->GetZoom());
260     }
261 }
262 
RunScript()263 void WebTestCase::RunScript()
264 {
265     m_browser->RunScript("document.write(\"Hello World!\");");
266     CPPUNIT_ASSERT_EQUAL("Hello World!", m_browser->GetPageText());
267 }
268 
SetPage()269 void WebTestCase::SetPage()
270 {
271     m_browser->SetPage("<html><body>text</body></html>", "");
272     ENSURE_LOADED;
273     CPPUNIT_ASSERT_EQUAL("text", m_browser->GetPageText());
274 
275     m_browser->SetPage("<html><body>other text</body></html>", "");
276     ENSURE_LOADED;
277     CPPUNIT_ASSERT_EQUAL("other text", m_browser->GetPageText());
278 }
279 
280 #endif //wxUSE_WEBVIEW && (wxUSE_WEBVIEW_WEBKIT || wxUSE_WEBVIEW_IE)
281