Initial support for the Web Inspector

This commit is contained in:
Christian Dywan 2008-11-01 19:15:58 +01:00
parent d8edb2f05d
commit 96ddc8ae0a
3 changed files with 177 additions and 26 deletions

View file

@ -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"), "<Ctrl><Shift>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"), "<Ctrl><Alt>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)
{
GtkToolItem* toolitem;
GtkRcStyle* rcstyle;
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;
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);

View file

@ -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"));

View file

@ -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
}
/**