diff options
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKitGtk/testwebinspector.c')
-rw-r--r-- | Tools/TestWebKitAPI/Tests/WebKitGtk/testwebinspector.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKitGtk/testwebinspector.c b/Tools/TestWebKitAPI/Tests/WebKitGtk/testwebinspector.c new file mode 100644 index 000000000..a74382ff3 --- /dev/null +++ b/Tools/TestWebKitAPI/Tests/WebKitGtk/testwebinspector.c @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2012 Gustavo Noronha Silva <gns@gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include "test_utils.h" + +#include <string.h> +#include <glib.h> +#include <gtk/gtk.h> +#include <webkit/webkit.h> + +GMainLoop *loop; +GtkWidget *window; + +static gboolean quitLoop(gpointer data) +{ + g_main_loop_quit(loop); + return TRUE; +} + +/* Ignore simple translation-related messages and upgrade other + * messages to warnings. + */ +static gboolean consoleMessageCallback(WebKitWebView* webView, const char* message, unsigned int line, const char* sourceId) +{ + if (strstr(message, "Localized string") || strstr(message, "Protocol Error: the message is for non-existing domain 'Profiler'") || + strstr(message, "Didn't find a TreeElement for a representedObject")) + return TRUE; + + g_warning("Console: %s @%d: %s\n", sourceId, line, message); + return TRUE; +} + +static WebKitWebView* inspectElementCallback(WebKitWebInspector *inspector, WebKitWebView *inspectedWebView, int *timesElementInspected) +{ + *timesElementInspected = *timesElementInspected + 1; + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + GtkWidget *newWebView = webkit_web_view_new(); + gtk_container_add(GTK_CONTAINER(window), newWebView); + + g_signal_connect(newWebView, "console-message", + G_CALLBACK(consoleMessageCallback), NULL); + + return WEBKIT_WEB_VIEW(newWebView); +} + +static gboolean closeInspector(WebKitWebInspector *inspector, int *timesClosed) +{ + *timesClosed = *timesClosed + 1; + + gtk_widget_destroy(window); + return TRUE; +} + +static gboolean showInspector(WebKitWebInspector *inspector, gpointer data) +{ + g_idle_add(quitLoop, NULL); + return TRUE; +} + +static void loadFinished(WebKitWebView *webView, WebKitWebFrame *frame, gboolean *isLoadFinished) +{ + *isLoadFinished = TRUE; + if (g_main_loop_is_running(loop)) + g_main_loop_quit(loop); +} + +static void test_webkit_web_inspector_close_and_inspect() +{ + WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); + loop = g_main_loop_new(NULL, TRUE); + + gboolean isLoadFinished = FALSE; + g_signal_connect(webView, "load-finished", G_CALLBACK(loadFinished), &isLoadFinished); + webkit_web_view_load_string(webView, + "<html><body><p>woohoo</p></body></html>", + "text/html", "UTF-8", "file://"); + if (!isLoadFinished) + g_main_loop_run(loop); + + g_object_set(webkit_web_view_get_settings(webView), "enable-developer-extras", TRUE, NULL); + WebKitWebInspector *inspector = webkit_web_view_get_inspector(webView); + + int timesElementInspected = 0; + int timesClosed = 0; + g_object_connect(inspector, + "signal::inspect-web-view", G_CALLBACK(inspectElementCallback), ×ElementInspected, + "signal::show-window", G_CALLBACK(showInspector), NULL, + "signal::close-window", G_CALLBACK(closeInspector), ×Closed, + NULL); + + webkit_web_inspector_inspect_coordinates(inspector, 0.0, 0.0); + g_assert_cmpint(timesElementInspected, ==, 1); + + g_main_loop_run(loop); + + webkit_web_inspector_close(inspector); + g_assert_cmpint(timesClosed, ==, 1); + + webkit_web_inspector_inspect_coordinates(inspector, 0.0, 0.0); + g_assert_cmpint(timesElementInspected, ==, 2); + + g_main_loop_run(loop); + + gtk_widget_destroy(GTK_WIDGET(webView)); + g_assert_cmpint(timesClosed, ==, 2); + + g_main_loop_unref(loop); +} + +static void test_webkit_web_inspector_destroy_inspected_web_view() +{ + WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); + loop = g_main_loop_new(NULL, TRUE); + + gboolean isLoadFinished = FALSE; + g_signal_connect(webView, "load-finished", G_CALLBACK(loadFinished), &isLoadFinished); + webkit_web_view_load_string(webView, + "<html><body><p>woohoo</p></body></html>", + "text/html", "UTF-8", "file://"); + if (!isLoadFinished) + g_main_loop_run(loop); + + g_object_set(webkit_web_view_get_settings(webView), "enable-developer-extras", TRUE, NULL); + WebKitWebInspector *inspector = webkit_web_view_get_inspector(webView); + + int timesElementInspected = 0; + int timesClosed = 0; + g_object_connect(inspector, + "signal::inspect-web-view", G_CALLBACK(inspectElementCallback), ×ElementInspected, + "signal::show-window", G_CALLBACK(showInspector), NULL, + "signal::close-window", G_CALLBACK(closeInspector), ×Closed, + NULL); + + webkit_web_inspector_inspect_coordinates(inspector, 0.0, 0.0); + g_assert_cmpint(timesElementInspected, ==, 1); + + g_main_loop_run(loop); + + gtk_widget_destroy(GTK_WIDGET(webView)); + g_assert_cmpint(timesClosed, ==, 1); + + g_main_loop_unref(loop); +} + +int main(int argc, char** argv) +{ + gtk_test_init(&argc, &argv, NULL); + + g_test_bug_base("https://bugs.webkit.org/"); + g_test_add_func("/webkit/webinspector/destroy-inspected-web-view", test_webkit_web_inspector_destroy_inspected_web_view); + g_test_add_func("/webkit/webinspector/close-and-inspect", test_webkit_web_inspector_close_and_inspect); + + return g_test_run(); +} |