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 29static WebKitTestServer* kServer; 30 31// These are all here so that they can be changed easily, if necessary. 32static const char* kStyleSheetHTML = "<html><div id=\"styledElement\">Sweet stylez!</div></html>"; 33static const char* kInjectedStyleSheet = "#styledElement { font-weight: bold; }"; 34static const char* kStyleSheetTestScript = "getComputedStyle(document.getElementById('styledElement'))['font-weight']"; 35static const char* kStyleSheetTestScriptResult = "bold"; 36 37static 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 49static 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 66static 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 80static 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, NULL)); 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 101static 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 GOwnPtr<char> resultString(WebViewTest::javascriptResultToCString(javascriptResult)); 112 return !g_strcmp0(resultString.get(), kStyleSheetTestScriptResult); 113} 114 115static 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 129static 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 146static 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 184static 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 191void 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 203void afterAll() 204{ 205 delete kServer; 206} 207