From 96ddc8ae0a4da7a8279a56e7b142213dcd7abea2 Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Sat, 1 Nov 2008 19:15:58 +0100 Subject: [PATCH] Initial support for the Web Inspector --- midori/midori-browser.c | 98 ++++++++++++++++++++++++++++--------- midori/midori-preferences.c | 11 ++++- midori/midori-view.c | 92 ++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 25 deletions(-) diff --git a/midori/midori-browser.c b/midori/midori-browser.c index 61af8da4..f329d548 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -58,6 +58,9 @@ struct _MidoriBrowser GtkWidget* panel_pageholder; GtkWidget* notebook; + GtkWidget* inspector; + GtkWidget* inspector_view; + GtkWidget* find; GtkWidget* find_text; GtkToolItem* find_case; @@ -259,7 +262,8 @@ _midori_browser_update_interface (MidoriBrowser* browser) "stock-id", GTK_STOCK_STOP, "tooltip", _("Stop loading the current page"), NULL); gtk_widget_show (browser->progressbar); - if (!GTK_WIDGET_VISIBLE (browser->statusbar) && !GTK_WIDGET_VISIBLE (browser->navigationbar)) + if (!GTK_WIDGET_VISIBLE (browser->statusbar) + && !GTK_WIDGET_VISIBLE (browser->navigationbar)) gtk_widget_show (browser->navigationbar); action = _action_by_name (browser, "Location"); midori_location_action_set_progress (MIDORI_LOCATION_ACTION (action), @@ -655,6 +659,17 @@ midori_view_console_message_cb (GtkWidget* view, message, line, source_id); } +static void +midori_view_attach_inspector_cb (GtkWidget* view, + GtkWidget* inspector_view, + MidoriBrowser* browser) +{ + GtkWidget* scrolled = gtk_widget_get_parent (browser->inspector_view); + gtk_container_remove (GTK_CONTAINER (scrolled), browser->inspector_view); + gtk_container_add (GTK_CONTAINER (scrolled), inspector_view); + browser->inspector_view = inspector_view; +} + static void midori_view_new_tab_cb (GtkWidget* view, const gchar* uri, @@ -774,6 +789,8 @@ _midori_browser_add_tab (MidoriBrowser* browser, midori_view_activate_action_cb, browser, "signal::console-message", midori_view_console_message_cb, browser, + "signal::attach-inspector", + midori_view_attach_inspector_cb, browser, "signal::new-tab", midori_view_new_tab_cb, browser, "signal::new-window", @@ -3038,7 +3055,8 @@ static const GtkActionEntry entries[] = { N_("Find the next occurrence of a word or phrase"), G_CALLBACK (_action_find_next_activate) }, { "FindPrevious", GTK_STOCK_GO_BACK, N_("Find _Previous"), "g", - N_("Find the previous occurrence of a word or phrase"), G_CALLBACK (_action_find_previous_activate) }, + N_("Find the previous occurrence of a word or phrase"), + G_CALLBACK (_action_find_previous_activate) }, { "FindQuick", GTK_STOCK_FIND, N_("_Quick Find"), "period", N_("Quickly jump to a word or phrase"), NULL/*G_CALLBACK (_action_find_quick_activate)*/ }, @@ -3071,7 +3089,8 @@ static const GtkActionEntry entries[] = { N_("View the source code of the page"), G_CALLBACK (_action_source_view_activate) }, { "SelectionSourceView", NULL, N_("View Selection Source"), "", - N_("View the source code of the selection"), NULL/*G_CALLBACK (_action_selection_source_view_activate)*/ }, + N_("View the source code of the selection"), + NULL/*G_CALLBACK (_action_selection_source_view_activate)*/ }, { "Fullscreen", GTK_STOCK_FULLSCREEN, NULL, "F11", N_("Toggle fullscreen view"), G_CALLBACK (_action_fullscreen_activate) }, @@ -3113,7 +3132,8 @@ static const GtkActionEntry entries[] = { N_("Clear the entire history"), G_CALLBACK (_action_history_clear_activate) }, { "HistoryAddBookmark", STOCK_BOOKMARK_ADD, NULL, "", - N_("Add the selected history item as a bookmark"), G_CALLBACK (_action_history_add_bookmark_activate) }, + N_("Add the selected history item as a bookmark"), + G_CALLBACK (_action_history_add_bookmark_activate) }, { "Tools", NULL, N_("_Tools") }, { "ManageSearchEngines", GTK_STOCK_PROPERTIES, N_("_Manage Search Engines"), "s", @@ -3147,7 +3167,8 @@ static const GtkActionEntry entries[] = { static const GtkToggleActionEntry toggle_entries[] = { { "PrivateBrowsing", NULL, N_("P_rivate Browsing"), "", - N_("Don't save any private data while browsing"), NULL/*G_CALLBACK (_action_private_browsing_activate)*/, + N_("Don't save any private data while browsing"), + NULL/*G_CALLBACK (_action_private_browsing_activate)*/, FALSE }, { "Menubar", NULL, @@ -3360,9 +3381,26 @@ midori_browser_toolbar_item_button_press_event_cb (GtkWidget* toolitem, static void midori_browser_init (MidoriBrowser* browser) { + GtkWidget* vbox; + GtkUIManager* ui_manager; + GError* error; + GtkAction* action; + GtkWidget* menuitem; + GtkSettings* gtk_settings; + GtkWidget* hbox; + GtkWidget* hpaned; + GtkWidget* vpaned; + GtkWidget* box; + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_text; + GtkCellRenderer* renderer_pixbuf; + GtkTreeStore* treestore; + GtkWidget* treeview; + GtkWidget* toolbar; GtkToolItem* toolitem; + GtkWidget* panel; GtkRcStyle* rcstyle; - GtkAction* action; + GtkWidget* scrolled; browser->net = katze_net_new (); @@ -3384,7 +3422,7 @@ midori_browser_init (MidoriBrowser* browser) G_CALLBACK (midori_browser_destroy_cb), NULL); gtk_window_set_icon_name (GTK_WINDOW (browser), "web-browser"); gtk_window_set_title (GTK_WINDOW (browser), g_get_application_name ()); - GtkWidget* vbox = gtk_vbox_new (FALSE, 0); + vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (browser), vbox); gtk_widget_show (vbox); @@ -3395,12 +3433,12 @@ midori_browser_init (MidoriBrowser* browser) entries, entries_n, browser); gtk_action_group_add_toggle_actions (browser->action_group, toggle_entries, toggle_entries_n, browser); - GtkUIManager* ui_manager = gtk_ui_manager_new (); + ui_manager = gtk_ui_manager_new (); gtk_ui_manager_insert_action_group (ui_manager, browser->action_group, 0); gtk_window_add_accel_group (GTK_WINDOW (browser), gtk_ui_manager_get_accel_group (ui_manager)); - GError* error = NULL; + error = NULL; if (!gtk_ui_manager_add_ui_from_string (ui_manager, ui_markup, -1, &error)) { /* TODO: Should this be a message dialog? When does this happen? */ @@ -3525,7 +3563,7 @@ midori_browser_init (MidoriBrowser* browser) /* Create the menubar */ browser->menubar = gtk_ui_manager_get_widget (ui_manager, "/menubar"); - GtkWidget* menuitem = gtk_menu_item_new (); + menuitem = gtk_menu_item_new (); gtk_widget_show (menuitem); browser->throbber = katze_throbber_new (); gtk_widget_show (browser->throbber); @@ -3552,7 +3590,7 @@ midori_browser_init (MidoriBrowser* browser) browser->navigationbar = gtk_ui_manager_get_widget ( ui_manager, "/toolbar_navigation"); /* FIXME: settings should be connected with screen changes */ - GtkSettings* gtk_settings = gtk_widget_get_settings (GTK_WIDGET (browser)); + gtk_settings = gtk_widget_get_settings (GTK_WIDGET (browser)); if (gtk_settings) g_signal_connect (gtk_settings, "notify::gtk-toolbar-style", G_CALLBACK (midori_browser_navigationbar_notify_style_cb), browser); @@ -3575,12 +3613,11 @@ midori_browser_init (MidoriBrowser* browser) G_CALLBACK (midori_browser_toolbar_popup_context_menu_cb), browser); /* Superuser warning */ - GtkWidget* hbox; if ((hbox = sokoke_superuser_warning_new ())) gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); /* Create the panel */ - GtkWidget* hpaned = gtk_hpaned_new (); + hpaned = gtk_hpaned_new (); g_signal_connect (hpaned, "notify::position", G_CALLBACK (midori_panel_notify_position_cb), browser); @@ -3595,12 +3632,9 @@ midori_browser_init (MidoriBrowser* browser) gtk_paned_pack1 (GTK_PANED (hpaned), browser->panel, FALSE, FALSE); /* Bookmarks */ - GtkWidget* box = gtk_vbox_new (FALSE, 0); - GtkTreeViewColumn* column; - GtkCellRenderer* renderer_text; - GtkCellRenderer* renderer_pixbuf; - GtkTreeStore* treestore = gtk_tree_store_new (1, KATZE_TYPE_ITEM); - GtkWidget* treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (treestore)); + box = gtk_vbox_new (FALSE, 0); + treestore = gtk_tree_store_new (1, KATZE_TYPE_ITEM); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (treestore)); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); column = gtk_tree_view_column_new (); renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); @@ -3632,8 +3666,7 @@ midori_browser_init (MidoriBrowser* browser) gtk_box_pack_start (GTK_BOX (box), treeview, TRUE, TRUE, 0); browser->panel_bookmarks = treeview; gtk_widget_show_all (box); - GtkWidget* toolbar = gtk_ui_manager_get_widget (ui_manager, - "/toolbar_bookmarks"); + toolbar = gtk_ui_manager_get_widget (ui_manager, "/toolbar_bookmarks"); _action_set_sensitive (browser, "BookmarkAdd", FALSE); gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_MENU); gtk_widget_show_all (toolbar); @@ -3642,7 +3675,7 @@ midori_browser_init (MidoriBrowser* browser) STOCK_BOOKMARKS, _("Bookmarks")); /* Transfers */ - GtkWidget* panel = midori_view_new (browser->net); + panel = midori_view_new (browser->net); gtk_widget_show (panel); midori_panel_append_page (MIDORI_PANEL (browser->panel), panel, NULL, @@ -3731,6 +3764,9 @@ midori_browser_init (MidoriBrowser* browser) STOCK_EXTENSIONS, _("Extensions")); /* Notebook, containing all views */ + vpaned = gtk_vpaned_new (); + gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, FALSE, FALSE); + gtk_widget_show (vpaned); browser->notebook = gtk_notebook_new (); /* Remove the inner border between scrollbars and the window border */ rcstyle = gtk_rc_style_new (); @@ -3738,12 +3774,28 @@ midori_browser_init (MidoriBrowser* browser) gtk_widget_modify_style (browser->notebook, rcstyle); g_object_unref (rcstyle); gtk_notebook_set_scrollable (GTK_NOTEBOOK (browser->notebook), TRUE); - gtk_paned_pack2 (GTK_PANED (hpaned), browser->notebook, FALSE, FALSE); + gtk_paned_pack2 (GTK_PANED (vpaned), browser->notebook, FALSE, FALSE); g_signal_connect_after (browser->notebook, "switch-page", G_CALLBACK (gtk_notebook_switch_page_cb), browser); gtk_widget_show (browser->notebook); + /* Inspector container */ + browser->inspector = gtk_vbox_new (FALSE, 0); + gtk_paned_pack2 (GTK_PANED (vpaned), browser->inspector, TRUE, TRUE); + scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + GTK_WIDGET_SET_FLAGS (scrolled, GTK_CAN_FOCUS); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), + GTK_SHADOW_ETCHED_IN); + gtk_box_pack_start (GTK_BOX (browser->inspector), + scrolled, TRUE, TRUE, 0); + browser->inspector_view = webkit_web_view_new (); + gtk_container_add (GTK_CONTAINER (scrolled), browser->inspector_view); + gtk_widget_show_all (browser->inspector); + /* Incremental findbar */ browser->find = gtk_toolbar_new (); gtk_toolbar_set_icon_size (GTK_TOOLBAR (browser->find), GTK_ICON_SIZE_MENU); diff --git a/midori/midori-preferences.c b/midori/midori-preferences.c index 6127bc7a..d4bd25f9 100644 --- a/midori/midori-preferences.c +++ b/midori/midori-preferences.c @@ -423,10 +423,17 @@ midori_preferences_set_settings (MidoriPreferences* preferences, button = katze_property_proxy (settings, "enable-plugins", NULL); gtk_button_set_label (GTK_BUTTON (button), _("Enable scripts")); SPANNED_ADD (button, 1, 2, 2, 3); + #ifdef WEBKIT_CHECK_VERSION + #if WEBKIT_CHECK_VERSION (1, 0, 3) + button = katze_property_proxy (settings, "enable-developer-extras", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Developer tools")); + SPANNED_ADD (button, 0, 1, 3, 4); + #endif + #endif label = katze_property_label (settings, "location-entry-search"); - INDENTED_ADD (label, 0, 1, 3, 4); + INDENTED_ADD (label, 0, 1, 4, 5); entry = katze_property_proxy (settings, "location-entry-search", NULL); - FILLED_ADD (entry, 1, 2, 3, 4); + FILLED_ADD (entry, 1, 2, 4, 5); /* Page "Interface" */ PAGE_NEW (GTK_STOCK_CONVERT, _("Interface")); diff --git a/midori/midori-view.c b/midori/midori-view.c index 4de7c599..a394d0ad 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -106,6 +106,7 @@ enum enum { ACTIVATE_ACTION, CONSOLE_MESSAGE, + ATTACH_INSPECTOR, WINDOW_OBJECT_CLEARED, NEW_TAB, NEW_WINDOW, @@ -280,6 +281,17 @@ midori_view_class_init (MidoriViewClass* class) G_TYPE_INT, G_TYPE_STRING); + signals[ATTACH_INSPECTOR] = g_signal_new ( + "attach-inspector", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GTK_TYPE_WIDGET); + signals[WINDOW_OBJECT_CLEARED] = g_signal_new ( "window-object-cleared", G_TYPE_FROM_CLASS (class), @@ -1215,10 +1227,80 @@ midori_view_get_progress (MidoriView* view) return view->progress; } +#ifdef WEBKIT_CHECK_VERSION +#if WEBKIT_CHECK_VERSION (1, 0, 3) +static WebKitWebView* +webkit_web_inspector_inspect_web_view_cb (WebKitWebInspector* inspector, + WebKitWebView* web_view, + MidoriView* view) +{ + gchar* title; + GtkWidget* window; + GtkWidget* toplevel; + GdkScreen* screen; + gint width, height; + GtkIconTheme* icon_theme; + GdkPixbuf* icon; + GdkPixbuf* gray_icon; + GtkWidget* inspector_view; + + title = g_strdup_printf (_("Inspect page - %s"), ""); + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), title); + g_free (title); + + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view)); + if (GTK_WIDGET_TOPLEVEL (toplevel)) + { + gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (toplevel)); + screen = gtk_window_get_screen (GTK_WINDOW (toplevel)); + width = gdk_screen_get_width (screen) / 1.7; + height = gdk_screen_get_height (screen) / 1.7; + gtk_window_set_default_size (GTK_WINDOW (window), width, height); + } + + /* Attempt to make a gray version of the icon on the fly */ + icon_theme = gtk_icon_theme_get_for_screen ( + gtk_widget_get_screen (GTK_WIDGET (view))); + icon = gtk_icon_theme_load_icon (icon_theme, "midori", 32, + GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + if (icon) + { + gray_icon = gdk_pixbuf_copy (icon); + if (gray_icon) + { + gdk_pixbuf_saturate_and_pixelate (gray_icon, gray_icon, 0.1, FALSE); + gtk_window_set_icon (GTK_WINDOW (window), gray_icon); + g_object_unref (gray_icon); + } + g_object_unref (icon); + } + else + gtk_window_set_icon_name (GTK_WINDOW (window), "midori"); + inspector_view = webkit_web_view_new (); + gtk_container_add (GTK_CONTAINER (window), inspector_view); + + /* FIXME: Implement web inspector signals properly + FIXME: Save and restore window size + FIXME: Update window title with URI */ + gtk_widget_show_all (window); + /* inspector_view = webkit_web_view_new (); + gtk_widget_show (inspector_view); + g_signal_emit (view, signals[ATTACH_INSPECTOR], 0, inspector_view); */ + return WEBKIT_WEB_VIEW (inspector_view); +} +#endif +#endif + static void midori_view_construct_web_view (MidoriView* view) { WebKitWebFrame* web_frame; + #ifdef WEBKIT_CHECK_VERSION + #if WEBKIT_CHECK_VERSION (1, 0, 3) + WebKitWebInspector* inspector; + #endif + #endif view->web_view = webkit_web_view_new (); @@ -1261,6 +1343,16 @@ midori_view_construct_web_view (MidoriView* view) gtk_widget_show (view->web_view); gtk_container_add (GTK_CONTAINER (view), view->web_view); + + #ifdef WEBKIT_CHECK_VERSION + #if WEBKIT_CHECK_VERSION (1, 0, 3) + inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW (view->web_view)); + g_object_connect (inspector, + "signal::inspect-web-view", + webkit_web_inspector_inspect_web_view_cb, view, + NULL); + #endif + #endif } /** -- 2.39.5