[GLIB] Use GUniquePtr instead of GOwnPtr
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKit2Gtk / TestWebKitWebViewGroup.cpp
1 /*
2  * Copyright (C) 2013 Igalia S.L.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2,1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21
22 #include "WebKitTestServer.h"
23 #include "WebViewTest.h"
24 #include <cstdarg>
25 #include <gtk/gtk.h>
26 #include <webkit2/webkit2.h>
27 #include <wtf/gobject/GRefPtr.h>
28
29 static WebKitTestServer* kServer;
30
31 // These are all here so that they can be changed easily, if necessary.
32 static const char* kStyleSheetHTML = "<html><div id=\"styledElement\">Sweet stylez!</div></html>";
33 static const char* kInjectedStyleSheet = "#styledElement { font-weight: bold; }";
34 static const char* kStyleSheetTestScript = "getComputedStyle(document.getElementById('styledElement'))['font-weight']";
35 static const char* kStyleSheetTestScriptResult = "bold";
36
37 static void testWebViewGroupDefault(Test* test, gconstpointer)
38 {
39     // Default group is shared by all WebViews by default.
40     GRefPtr<WebKitWebView> webView1 = WEBKIT_WEB_VIEW(webkit_web_view_new());
41     GRefPtr<WebKitWebView> webView2 = WEBKIT_WEB_VIEW(webkit_web_view_new());
42     g_assert(webkit_web_view_get_group(webView1.get()) == webkit_web_view_get_group(webView2.get()));
43
44     // Settings are shared by all web view in the same group.
45     g_assert(webkit_web_view_get_settings(webView1.get()) == webkit_web_view_get_settings(webView2.get()));
46     g_assert(webkit_web_view_get_settings(webView1.get()) == webkit_web_view_group_get_settings(webkit_web_view_get_group(webView2.get())));
47 }
48
49 static void testWebViewGroupNewGroup(Test* test, gconstpointer)
50 {
51     // Passing 0 as group name generates the name automatically.
52     GRefPtr<WebKitWebViewGroup> viewGroup1 = adoptGRef(webkit_web_view_group_new(0));
53     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(viewGroup1.get()));
54     g_assert(webkit_web_view_group_get_name(viewGroup1.get()));
55
56     // New group with a given name.
57     GRefPtr<WebKitWebViewGroup> viewGroup2 = adoptGRef(webkit_web_view_group_new("TestGroup2"));
58     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(viewGroup2.get()));
59     g_assert_cmpstr(webkit_web_view_group_get_name(viewGroup2.get()), ==, "TestGroup2");
60     g_assert_cmpstr(webkit_web_view_group_get_name(viewGroup2.get()), !=, webkit_web_view_group_get_name(viewGroup1.get()));
61
62     // Every group has its own settings.
63     g_assert(webkit_web_view_group_get_settings(viewGroup1.get()) != webkit_web_view_group_get_settings(viewGroup2.get()));
64 }
65
66 static void testWebViewNewWithGroup(Test* test, gconstpointer)
67 {
68     GRefPtr<WebKitWebViewGroup> viewGroup1 = adoptGRef(webkit_web_view_group_new("TestGroup1"));
69     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(viewGroup1.get()));
70     GRefPtr<WebKitWebView> webView1 = WEBKIT_WEB_VIEW(webkit_web_view_new_with_group(viewGroup1.get()));
71     g_assert(webkit_web_view_get_group(webView1.get()) == viewGroup1.get());
72
73     GRefPtr<WebKitWebView> webView2 = WEBKIT_WEB_VIEW(webkit_web_view_new());
74     g_assert(webkit_web_view_get_group(webView2.get()) != viewGroup1.get());
75
76     // Settings should be different for views in different groups.
77     g_assert(webkit_web_view_get_settings(webView1.get()) != webkit_web_view_get_settings(webView2.get()));
78 }
79
80 static void testWebViewGroupSettings(Test* test, gconstpointer)
81 {
82     GRefPtr<WebKitWebViewGroup> viewGroup1 = adoptGRef(webkit_web_view_group_new("TestGroup1"));
83     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(viewGroup1.get()));
84     GRefPtr<WebKitSettings> newSettings = adoptGRef(webkit_settings_new_with_settings("enable-javascript", FALSE, nullptr));
85     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(newSettings.get()));
86     webkit_web_view_group_set_settings(viewGroup1.get(), newSettings.get());
87     g_assert(webkit_web_view_group_get_settings(viewGroup1.get()) == newSettings.get());
88
89     GRefPtr<WebKitWebView> webView1 = WEBKIT_WEB_VIEW(webkit_web_view_new_with_group(viewGroup1.get()));
90     GRefPtr<WebKitWebView> webView2 = WEBKIT_WEB_VIEW(webkit_web_view_new());
91     WebKitSettings* webView1Settings = webkit_web_view_get_settings(webView1.get());
92     WebKitSettings* webView2Settings = webkit_web_view_get_settings(webView2.get());
93     g_assert(webView1Settings != webView2Settings);
94     g_assert(webkit_settings_get_enable_javascript(webView1Settings) != webkit_settings_get_enable_javascript(webView2Settings));
95
96     webkit_web_view_set_settings(webView1.get(), webView2Settings);
97     g_assert(webkit_web_view_get_settings(webView1.get()) == webView2Settings);
98     g_assert(webkit_web_view_group_get_settings(webkit_web_view_get_group(webView1.get())) == webView2Settings);
99 }
100
101 static bool isStyleSheetInjectedForURLAtPath(WebViewTest* test, const char* path)
102 {
103     test->loadURI(kServer->getURIForPath(path).data());
104     test->waitUntilLoadFinished();
105
106     GOwnPtr<GError> error;
107     WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished(kStyleSheetTestScript, &error.outPtr());
108     g_assert(javascriptResult);
109     g_assert(!error.get());
110
111     GUniquePtr<char> resultString(WebViewTest::javascriptResultToCString(javascriptResult));
112     return !g_strcmp0(resultString.get(), kStyleSheetTestScriptResult);
113 }
114
115 static void fillURLListFromPaths(char** list, const char* path, ...)
116 {
117     va_list argumentList;
118     va_start(argumentList, path);
119
120     int i = 0;
121     while (path) {
122         // FIXME: We must use a wildcard for the host here until http://wkbug.com/112476 is fixed.
123         // Until that time patterns with port numbers in them will not properly match URLs with port numbers.
124         list[i++] = g_strdup_printf("http://*/%s*", path);
125         path = va_arg(argumentList, const char*);
126     }
127 }
128
129 static void removeOldInjectedStyleSheetsAndResetLists(WebKitWebViewGroup* group, char** whitelist, char** blacklist)
130 {
131     webkit_web_view_group_remove_all_user_style_sheets(group);
132
133     while (*whitelist) {
134         g_free(*whitelist);
135         *whitelist = 0;
136         whitelist++;
137     }
138
139     while (*blacklist) {
140         g_free(*blacklist);
141         *blacklist = 0;
142         blacklist++;
143     }
144 }
145
146 static void testWebViewGroupInjectedStyleSheet(WebViewTest* test, gconstpointer)
147 {
148     WebKitWebViewGroup* group = webkit_web_view_get_group(test->m_webView);
149     char* whitelist[3] = { 0, 0, 0 };
150     char* blacklist[3] = { 0, 0, 0 };
151
152     removeOldInjectedStyleSheetsAndResetLists(group, whitelist, blacklist);
153
154     // Without a whitelist or a blacklist all URLs should have the injected style sheet.
155     static const char* randomPath = "somerandompath";
156     g_assert(!isStyleSheetInjectedForURLAtPath(test, randomPath));
157     webkit_web_view_group_add_user_style_sheet(group, kInjectedStyleSheet, 0, 0, 0, WEBKIT_INJECTED_CONTENT_FRAMES_ALL);
158     g_assert(isStyleSheetInjectedForURLAtPath(test, randomPath));
159
160     removeOldInjectedStyleSheetsAndResetLists(group, whitelist, blacklist);
161
162     fillURLListFromPaths(blacklist, randomPath, 0);
163     webkit_web_view_group_add_user_style_sheet(group, kInjectedStyleSheet, 0, 0, blacklist, WEBKIT_INJECTED_CONTENT_FRAMES_ALL);
164     g_assert(!isStyleSheetInjectedForURLAtPath(test, randomPath));
165     g_assert(isStyleSheetInjectedForURLAtPath(test, "someotherrandompath"));
166
167     removeOldInjectedStyleSheetsAndResetLists(group, whitelist, blacklist);
168
169     static const char* inTheWhiteList = "inthewhitelist";
170     static const char* notInWhitelist = "notinthewhitelist";
171     static const char* inTheWhiteListAndBlackList = "inthewhitelistandblacklist";
172
173     fillURLListFromPaths(whitelist, inTheWhiteList, inTheWhiteListAndBlackList, 0);
174     fillURLListFromPaths(blacklist, inTheWhiteListAndBlackList, 0);
175     webkit_web_view_group_add_user_style_sheet(group, kInjectedStyleSheet, 0, whitelist, blacklist, WEBKIT_INJECTED_CONTENT_FRAMES_ALL);
176     g_assert(isStyleSheetInjectedForURLAtPath(test, inTheWhiteList));
177     g_assert(!isStyleSheetInjectedForURLAtPath(test, inTheWhiteListAndBlackList));
178     g_assert(!isStyleSheetInjectedForURLAtPath(test, notInWhitelist));
179
180     // It's important to clean up the environment before other tests.
181     removeOldInjectedStyleSheetsAndResetLists(group, whitelist, blacklist);
182 }
183
184 static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
185 {
186     soup_message_set_status(message, SOUP_STATUS_OK);
187     soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kStyleSheetHTML, strlen(kStyleSheetHTML));
188     soup_message_body_complete(message->response_body);
189 }
190
191 void beforeAll()
192 {
193     kServer = new WebKitTestServer();
194     kServer->run(serverCallback);
195
196     Test::add("WebKitWebViewGroup", "default-group", testWebViewGroupDefault);
197     Test::add("WebKitWebViewGroup", "new-group", testWebViewGroupNewGroup);
198     Test::add("WebKitWebView", "new-with-group", testWebViewNewWithGroup);
199     Test::add("WebKitWebViewGroup", "settings", testWebViewGroupSettings);
200     WebViewTest::add("WebKitWebViewGroup", "injected-style-sheet", testWebViewGroupInjectedStyleSheet);
201 }
202
203 void afterAll()
204 {
205     delete kServer;
206 }