1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* 2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2008 Holger Hans Peter Freyther 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2009, 2010 Collabora Ltd. 4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * This library is free software; you can redistribute it and/or 6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modify it under the terms of the GNU Library General Public 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * License as published by the Free Software Foundation; either 8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * version 2 of the License, or (at your option) any later version. 9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * This library is distributed in the hope that it will be useful, 11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of 12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Library General Public License for more details. 14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * You should have received a copy of the GNU Library General Public License 16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * along with this library; see the file COPYING.LIB. If not, write to 17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Boston, MA 02110-1301, USA. 19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */ 20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "test_utils.h" 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <errno.h> 24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <unistd.h> 25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <string.h> 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <glib.h> 28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <glib/gstdio.h> 29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <gtk/gtk.h> 30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <webkit/webkit.h> 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if GTK_CHECK_VERSION(2, 14, 0) 33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockGMainLoop* loop; 35643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockSoupSession *session; 36643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockchar* base_uri; 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* For real request testing */ 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void 40643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockserver_callback(SoupServer* server, SoupMessage* msg, 41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const char* path, GHashTable* query, 42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block SoupClientContext* context, gpointer data) 43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (msg->method != SOUP_METHOD_GET) { 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_set_status(msg, SOUP_STATUS_NOT_IMPLEMENTED); 46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_set_status(msg, SOUP_STATUS_OK); 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (g_str_equal(path, "/favicon.ico")) { 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* contents; 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gsize length; 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GError* error = NULL; 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_file_get_contents("blank.ico", &contents, &length, &error); 57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(!error); 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_body_append(msg->response_body, SOUP_MEMORY_TAKE, contents, length); 608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block } else if (g_str_equal(path, "/bigdiv.html")) { 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block char* contents = g_strdup("<html><body><a id=\"link\" href=\"http://abc.def\">test</a><div style=\"background-color: green; height: 1200px;\"></div></body></html>"); 628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block soup_message_body_append(msg->response_body, SOUP_MEMORY_TAKE, contents, strlen(contents)); 638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block } else if (g_str_equal(path, "/iframe.html")) { 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block char* contents = g_strdup("<html><body id=\"some-content\"><div style=\"background-color: green; height: 50px;\"></div><iframe src=\"bigdiv.html\"></iframe></body></html>"); 658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block soup_message_body_append(msg->response_body, SOUP_MEMORY_TAKE, contents, strlen(contents)); 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else { 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* contents = g_strdup("<html><body>test</body></html>"); 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_body_append(msg->response_body, SOUP_MEMORY_TAKE, contents, strlen(contents)); 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_body_complete(msg->response_body); 72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 74d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic void idle_quit_loop_cb(WebKitWebView* web_view, GParamSpec* pspec, gpointer data) 75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 76d0825bca7fe65beaee391d30da42e937db621564Steve Block if (webkit_web_view_get_load_status(web_view) == WEBKIT_LOAD_FINISHED || 77d0825bca7fe65beaee391d30da42e937db621564Steve Block webkit_web_view_get_load_status(web_view) == WEBKIT_LOAD_FAILED) 78d0825bca7fe65beaee391d30da42e937db621564Steve Block g_main_loop_quit(loop); 79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 81643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void icon_uri_changed_cb(WebKitWebView* web_view, GParamSpec* pspec, gpointer data) 82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gboolean* been_here = (gboolean*)data; 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* expected_uri; 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert_cmpstr(g_param_spec_get_name(pspec), ==, "icon-uri"); 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block expected_uri = g_strdup_printf("%sfavicon.ico", base_uri); 89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert_cmpstr(webkit_web_view_get_icon_uri(web_view), ==, expected_uri); 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_free(expected_uri); 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *been_here = TRUE; 93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 95643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void icon_loaded_cb(WebKitWebView* web_view, char* icon_uri, gpointer data) 96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gboolean* been_here = (gboolean*)data; 98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* expected_uri = g_strdup_printf("%sfavicon.ico", base_uri); 99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert_cmpstr(icon_uri, ==, expected_uri); 100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_free(expected_uri); 101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert_cmpstr(icon_uri, ==, webkit_web_view_get_icon_uri(web_view)); 103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *been_here = TRUE; 105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void test_webkit_web_view_icon_uri() 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gboolean been_to_uri_changed = FALSE; 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gboolean been_to_icon_loaded = FALSE; 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebKitWebView* view = WEBKIT_WEB_VIEW(webkit_web_view_new()); 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_object_ref_sink(G_OBJECT(view)); 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loop = g_main_loop_new(NULL, TRUE); 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_object_connect(G_OBJECT(view), 117d0825bca7fe65beaee391d30da42e937db621564Steve Block "signal::notify::progress", idle_quit_loop_cb, NULL, 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block "signal::notify::icon-uri", icon_uri_changed_cb, &been_to_uri_changed, 119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block "signal::icon-loaded", icon_loaded_cb, &been_to_icon_loaded, 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block NULL); 121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webkit_web_view_load_uri(view, base_uri); 123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_main_loop_run(loop); 125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(been_to_uri_changed); 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(been_to_icon_loaded); 128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_object_unref(view); 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic gboolean map_event_cb(GtkWidget *widget, GdkEvent* event, gpointer data) 1338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{ 1348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block GMainLoop* loop = (GMainLoop*)data; 1358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_main_loop_quit(loop); 1368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 1378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block return FALSE; 1388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} 1398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void test_webkit_web_view_grab_focus() 141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block char* uri = g_strconcat(base_uri, "iframe.html", NULL); 143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP); 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GtkWidget* scrolled_window = gtk_scrolled_window_new(NULL, NULL); 145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebKitWebView* view = WEBKIT_WEB_VIEW(webkit_web_view_new()); 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GtkAdjustment* adjustment; 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_window_set_default_size(GTK_WINDOW(window), 400, 200); 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_container_add(GTK_CONTAINER(window), scrolled_window); 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(view)); 152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block loop = g_main_loop_new(NULL, TRUE); 157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_signal_connect(view, "notify::progress", G_CALLBACK (idle_quit_loop_cb), NULL); 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* Wait for window to show up */ 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_widget_show_all(window); 162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_signal_connect(window, "map-event", 163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block G_CALLBACK(map_event_cb), loop); 164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_main_loop_run(loop); 165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* Load a page with a big div that will cause scrollbars to appear */ 167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block webkit_web_view_load_uri(view, uri); 168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_main_loop_run(loop); 169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window)); 171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_assert_cmpfloat(gtk_adjustment_get_value(adjustment), ==, 0.0); 172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* Since webkit_web_view_execute_script does not return a value, 174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block it is impossible to know if an inner document has focus after 175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block a node of it was focused via .focus() method. 176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block The code below is an workaround: if the node has focus, a scroll 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block action is performed and afterward it is checked if the adjustment 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block has to be different from 0. 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block char script[] = "var innerDoc = document.defaultView.frames[0].document; \ 181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block innerDoc.getElementById(\"link\").focus(); \ 182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (innerDoc.hasFocus()) \ 183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block window.scrollBy(0, 100);"; 184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* Focus an element using JavaScript */ 186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block webkit_web_view_execute_script(view, script); 187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* Make sure the ScrolledWindow noticed the scroll */ 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_assert_cmpfloat(gtk_adjustment_get_value(adjustment), !=, 0.0); 190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_free(uri); 192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_widget_destroy(window); 193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic void do_test_webkit_web_view_adjustments(gboolean with_page_cache) 1968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{ 1978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block char* effective_uri = g_strconcat(base_uri, "bigdiv.html", NULL); 1988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block char* second_uri = g_strconcat(base_uri, "iframe.html", NULL); 1998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 2008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block GtkWidget* scrolled_window = gtk_scrolled_window_new(NULL, NULL); 2018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block WebKitWebView* view = WEBKIT_WEB_VIEW(webkit_web_view_new()); 2028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block GtkAdjustment* adjustment; 2038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block double lower; 2048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block double upper; 2058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block if (with_page_cache) { 2078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block WebKitWebSettings* settings = webkit_web_view_get_settings(view); 2088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_object_set(settings, "enable-page-cache", TRUE, NULL); 2098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block } 2108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block gtk_window_set_default_size(GTK_WINDOW(window), 400, 200); 2128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block gtk_container_add(GTK_CONTAINER(window), scrolled_window); 2148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(view)); 2158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), 2178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 2188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block loop = g_main_loop_new(NULL, TRUE); 2208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_object_connect(G_OBJECT(view), 2228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block "signal::notify::progress", idle_quit_loop_cb, NULL, 2238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block NULL); 2248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Wait for window to show up */ 2268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block gtk_widget_show_all(window); 2278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_signal_connect(window, "map-event", 2288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block G_CALLBACK(map_event_cb), loop); 2298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_main_loop_run(loop); 2308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Load a page with a big div that will cause scrollbars to appear */ 2328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block webkit_web_view_load_uri(view, effective_uri); 2338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_main_loop_run(loop); 2348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window)); 2368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_assert_cmpfloat(gtk_adjustment_get_value(adjustment), ==, 0.0); 2378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block lower = gtk_adjustment_get_lower(adjustment); 2398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block upper = gtk_adjustment_get_upper(adjustment); 2408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Scroll the view using JavaScript */ 2428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block webkit_web_view_execute_script(view, "window.scrollBy(0, 100)"); 2438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Make sure the ScrolledWindow noticed the scroll */ 2458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_assert_cmpfloat(gtk_adjustment_get_value(adjustment), ==, 100.0); 2468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Load a second URI */ 2488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block webkit_web_view_load_uri(view, second_uri); 2498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_main_loop_run(loop); 2508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Make sure the scrollbar has been reset */ 2528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_assert_cmpfloat(gtk_adjustment_get_value(adjustment), ==, 0.0); 2538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Go back */ 2558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block webkit_web_view_go_back(view); 2568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* When using page cache, go_back will return syncronously */ 2588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block if (!with_page_cache) 2598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_main_loop_run(loop); 2608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Make sure GTK+ has time to process the changes in size, for the adjusments */ 2628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block while (gtk_events_pending()) 2638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block gtk_main_iteration(); 2648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Make sure upper and lower bounds have been restored correctly */ 2668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_assert_cmpfloat(lower, ==, gtk_adjustment_get_lower(adjustment)); 2678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_assert_cmpfloat(upper, ==, gtk_adjustment_get_upper(adjustment)); 2688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2692bde8e466a4451c7319e3a072d118917957d6554Steve Block /* This assert is temporarily disabled until we fix the following bug: */ 2702bde8e466a4451c7319e3a072d118917957d6554Steve Block /* https://bugs.webkit.org/show_bug.cgi?id=57315 */ 2712bde8e466a4451c7319e3a072d118917957d6554Steve Block /* It should be re-enabled ASAP. */ 2722bde8e466a4451c7319e3a072d118917957d6554Steve Block /* g_assert_cmpfloat(gtk_adjustment_get_value(adjustment), ==, 100.0); */ 2738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_free(effective_uri); 2758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_free(second_uri); 2768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block gtk_widget_destroy(window); 2788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} 2798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic void test_webkit_web_view_adjustments() 2818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{ 2828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block /* Test this with page cache disabled, and enabled. */ 2838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block do_test_webkit_web_view_adjustments(FALSE); 2848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block do_test_webkit_web_view_adjustments(TRUE); 2858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} 2868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockgboolean delayed_destroy(gpointer data) 288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_widget_destroy(GTK_WIDGET(data)); 290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_main_loop_quit(loop); 291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return FALSE; 292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void test_webkit_web_view_destroy() 295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GtkWidget* window; 297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GtkWidget* web_view; 298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block web_view = webkit_web_view_new(); 301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_container_add(GTK_CONTAINER(window), web_view); 303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_widget_show_all(window); 305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block loop = g_main_loop_new(NULL, TRUE); 307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_signal_connect(window, "map-event", 309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block G_CALLBACK(map_event_cb), loop); 310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_main_loop_run(loop); 311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_idle_add(delayed_destroy, web_view); 313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_main_loop_run(loop); 314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_widget_destroy(window); 316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void test_webkit_web_view_window_features() 319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GtkWidget* window; 321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GtkWidget* web_view; 322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block web_view = webkit_web_view_new(); 325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_container_add(GTK_CONTAINER(window), web_view); 327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_widget_show_all(window); 329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block loop = g_main_loop_new(NULL, TRUE); 331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_signal_connect(window, "map-event", 333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block G_CALLBACK(map_event_cb), loop); 334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_main_loop_run(loop); 335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* Bug #36144 */ 337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_object_set(G_OBJECT(web_view), "window-features", NULL, NULL); 338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_widget_destroy(window); 340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 342643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockint main(int argc, char** argv) 343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 344643ca7872b450ea4efacab6188849e5aac2ba161Steve Block SoupServer* server; 345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block SoupURI* soup_uri; 346643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 347643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_thread_init(NULL); 348643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gtk_test_init(&argc, &argv, NULL); 349643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 350643ca7872b450ea4efacab6188849e5aac2ba161Steve Block /* Hopefully make test independent of the path it's called from. */ 35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch testutils_relative_chdir("Source/WebKit/gtk/tests/resources/test.html", argv[0]); 352643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 353643ca7872b450ea4efacab6188849e5aac2ba161Steve Block server = soup_server_new(SOUP_SERVER_PORT, 0, NULL); 354643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_server_run_async(server); 355643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 356643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_server_add_handler(server, NULL, server_callback, NULL, NULL); 357643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 358643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_uri = soup_uri_new("http://127.0.0.1/"); 359643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_uri_set_port(soup_uri, soup_server_get_port(server)); 360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 361643ca7872b450ea4efacab6188849e5aac2ba161Steve Block base_uri = soup_uri_to_string(soup_uri, FALSE); 362643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_uri_free(soup_uri); 363643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 364643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_test_bug_base("https://bugs.webkit.org/"); 365643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_test_add_func("/webkit/webview/icon-uri", test_webkit_web_view_icon_uri); 3668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block g_test_add_func("/webkit/webview/adjustments", test_webkit_web_view_adjustments); 367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_test_add_func("/webkit/webview/destroy", test_webkit_web_view_destroy); 368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_test_add_func("/webkit/webview/grab_focus", test_webkit_web_view_grab_focus); 369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block g_test_add_func("/webkit/webview/window-features", test_webkit_web_view_window_features); 370643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 371643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return g_test_run (); 372643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 373643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 374643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else 375643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockint main(int argc, char** argv) 376643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 377f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch g_critical("You will need gtk-2.14.0 to run the unit tests. Doing nothing now."); 378643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 379643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 380643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 381643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 382