Merge lp:~ivaldi/midori/outsource-webinspector into lp:midori

Proposed by André Stösel
Status: Work in progress
Proposed branch: lp:~ivaldi/midori/outsource-webinspector
Merge into: lp:midori
Diff against target: 490 lines (+126/-254)
3 files modified
extensions/webinspector.vala (+126/-0)
midori/midori-browser.c (+0/-75)
midori/midori-view.c (+0/-179)
To merge this branch: bzr merge lp:~ivaldi/midori/outsource-webinspector
Reviewer Review Type Date Requested Status
Cris Dywan Needs Fixing
Review via email: mp+194256@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Cris Dywan (kalikiana) wrote :

I dislike saving the hit test result because it is racy and you will eventually encounter a situation where it's not set, this is what happened before with regard to the URI below the mouse pointer and the selected text.

How about taking the hit test result in the context menu event and storing it in the action, in a subclass maybe, which is added to the menu?

review: Needs Fixing
6468. By André Stösel

use wrapper object to launch the web inspector

6469. By André Stösel

remove unused hit test property

Unmerged revisions

6469. By André Stösel

remove unused hit test property

6468. By André Stösel

use wrapper object to launch the web inspector

6467. By André Stösel

set coordinates for "inspect element"

6466. By André Stösel

add property for view->hit_test

6465. By André Stösel

new webinspector extension

6464. By André Stösel

remove webinspector from core

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'extensions/webinspector.vala'
2--- extensions/webinspector.vala 1970-01-01 00:00:00 +0000
3+++ extensions/webinspector.vala 2013-11-28 20:51:46 +0000
4@@ -0,0 +1,126 @@
5+/*
6+ Copyright (C) 2013 André Stösel <andre@stoesel.de>
7+
8+ This library is free software; you can redistribute it and/or
9+ modify it under the terms of the GNU Lesser General Public
10+ License as published by the Free Software Foundation; either
11+ version 2.1 of the License, or (at your option) any later version.
12+
13+ See the file COPYING for the full license text.
14+*/
15+
16+namespace WebInspector {
17+ private class Launcher : GLib.Object {
18+ private GLib.Value v;
19+ private Midori.App app;
20+
21+ public Launcher (Midori.App app, WebKit.HitTestResult hit_test_result) {
22+ this.app = app;
23+ this.v = new GLib.Value (typeof (WebKit.HitTestResult));
24+ this.v.set_object (hit_test_result);
25+ }
26+
27+ public void inspect_element (Gtk.Action action) {
28+ Midori.Browser browser = this.app.browser;
29+ Midori.View view = browser.tab as Midori.View;
30+
31+ WebKit.WebInspector inspector = view.web_view.web_inspector;
32+
33+ WebKit.HitTestResult hit_test_result = this.v.get_object () as WebKit.HitTestResult;
34+
35+ int x, y;
36+ hit_test_result.get("x", out x);
37+ hit_test_result.get("y", out y);
38+
39+ inspector.inspect_coordinates (x, y);
40+ inspector.show();
41+
42+ this.unref ();
43+ }
44+ }
45+
46+ private class Manager : Midori.Extension {
47+ private unowned WebKit.WebView inspector_inspect_web_view (WebKit.WebView web_view) {
48+ Gtk.Widget inspector_view = new WebKit.WebView ();
49+ Gtk.Window window = new Gtk.Window ();
50+ window.add (inspector_view);
51+ window.show_all ();
52+ return inspector_view as WebKit.WebView;
53+ }
54+
55+ private bool inspector_show_window (WebKit.WebInspector inspector) {
56+ Gtk.Widget inspector_view = inspector.web_view as Gtk.Widget;
57+ Gtk.Widget window = inspector_view.get_toplevel ();
58+ window.show ();
59+ return true;
60+ }
61+
62+ private void context_menu (WebKit.HitTestResult hit_test_result, Midori.ContextAction menu) {
63+ Launcher launcher = new Launcher (this.get_app (), hit_test_result);
64+ launcher.ref ();
65+ menu.add_simple ("InspectElement", _("Inspect _Element"), null, null, launcher.inspect_element);
66+ }
67+
68+ private void tab_added (Midori.Browser browser, Midori.View view) {
69+ view.context_menu.connect (this.context_menu);
70+
71+ view.web_view.web_inspector.show_window.connect (this.inspector_show_window);
72+ view.web_view.web_inspector.inspect_web_view.connect (this.inspector_inspect_web_view);
73+ }
74+
75+ private void tab_removed (Midori.Browser browser, Midori.View view) {
76+ view.context_menu.disconnect (this.context_menu);
77+ }
78+
79+ private void browser_added (Midori.Browser browser) {
80+ foreach (Midori.View tab in browser.get_tabs ()) {
81+ this.tab_added (browser, tab);
82+ }
83+
84+ browser.add_tab.connect (this.tab_added);
85+ browser.remove_tab.connect (this.tab_removed);
86+ }
87+
88+ private void browser_removed (Midori.Browser browser) {
89+ foreach (Midori.View tab in browser.get_tabs ()) {
90+ this.tab_removed (browser, tab);
91+ }
92+
93+ browser.add_tab.disconnect (this.tab_added);
94+ browser.remove_tab.disconnect (this.tab_removed);
95+ }
96+
97+ private void activated (Midori.App app) {
98+ foreach (Midori.Browser browser in app.get_browsers ()) {
99+ this.browser_added (browser);
100+ }
101+
102+ app.add_browser.connect (this.browser_added);
103+ app.remove_browser.connect (this.browser_removed);
104+ }
105+
106+ private void deactivated () {
107+ Midori.App app = this.get_app ();
108+ foreach (Midori.Browser browser in app.get_browsers ()) {
109+ this.browser_removed (browser);
110+ }
111+
112+ app.add_browser.disconnect (this.browser_added);
113+ app.remove_browser.disconnect (this.browser_removed);
114+ }
115+
116+ internal Manager () {
117+ GLib.Object (name: _("WebInspector"),
118+ description: _("WebInspector support"),
119+ version: "0.1" + Midori.VERSION_SUFFIX,
120+ authors: "André Stösel <andre@stoesel.de>");
121+
122+ this.activate.connect (this.activated);
123+ this.deactivate.connect (this.deactivated);
124+ }
125+ }
126+}
127+
128+public Midori.Extension extension_init () {
129+ return new WebInspector.Manager ();
130+}
131
132=== modified file 'midori/midori-browser.c'
133--- midori/midori-browser.c 2013-11-27 09:47:37 +0000
134+++ midori/midori-browser.c 2013-11-28 20:51:46 +0000
135@@ -71,9 +71,6 @@
136 GtkWidget* panel;
137 GtkWidget* notebook;
138
139- GtkWidget* inspector;
140- GtkWidget* inspector_view;
141-
142 GtkWidget* find;
143
144 GtkWidget* statusbar;
145@@ -1401,41 +1398,6 @@
146 }
147
148 static void
149-midori_view_attach_inspector_cb (GtkWidget* view,
150- GtkWidget* inspector_view,
151- MidoriBrowser* browser)
152-{
153- GtkWidget* toplevel = gtk_widget_get_toplevel (inspector_view);
154- GtkWidget* scrolled = gtk_widget_get_parent (browser->inspector_view);
155- if (browser->inspector_view == inspector_view)
156- return;
157-
158- gtk_widget_hide (toplevel);
159- gtk_widget_destroy (browser->inspector_view);
160- gtk_widget_reparent (inspector_view, scrolled);
161- gtk_widget_show_all (browser->inspector);
162- browser->inspector_view = inspector_view;
163- gtk_widget_destroy (toplevel);
164- if (!katze_object_get_boolean (browser->settings, "last-inspector-attached"))
165- g_object_set (browser->settings, "last-inspector-attached", TRUE, NULL);
166-}
167-
168-static void
169-midori_view_detach_inspector_cb (GtkWidget* view,
170- GtkWidget* inspector_view,
171- MidoriBrowser* browser)
172-{
173- GtkWidget* scrolled = gtk_widget_get_parent (GTK_WIDGET (inspector_view));
174- GtkWidget* paned = gtk_widget_get_parent (scrolled);
175- browser->inspector_view = gtk_viewport_new (NULL, NULL);
176- gtk_container_remove (GTK_CONTAINER (scrolled), GTK_WIDGET (inspector_view));
177- gtk_container_add (GTK_CONTAINER (scrolled), browser->inspector_view);
178- gtk_widget_hide (paned);
179- if (katze_object_get_boolean (browser->settings, "last-inspector-attached"))
180- g_object_set (browser->settings, "last-inspector-attached", FALSE, NULL);
181-}
182-
183-static void
184 midori_browser_view_copy_history (GtkWidget* view_to,
185 GtkWidget* view_from,
186 gboolean omit_last)
187@@ -1904,10 +1866,6 @@
188 midori_view_notify_zoom_level_cb, browser,
189 "signal::notify::statusbar-text",
190 midori_view_notify_statusbar_text_cb, browser,
191- "signal::attach-inspector",
192- midori_view_attach_inspector_cb, browser,
193- "signal::detach-inspector",
194- midori_view_detach_inspector_cb, browser,
195 "signal::new-tab",
196 midori_view_new_tab_cb, browser,
197 "signal::new-window",
198@@ -1979,10 +1937,6 @@
199 midori_view_notify_zoom_level_cb, browser,
200 "any_signal",
201 midori_view_notify_statusbar_text_cb, browser,
202- "any_signal::attach-inspector",
203- midori_view_attach_inspector_cb, browser,
204- "any_signal::detach-inspector",
205- midori_view_detach_inspector_cb, browser,
206 "any_signal::new-tab",
207 midori_view_new_tab_cb, browser,
208 "any_signal::new-window",
209@@ -3227,7 +3181,6 @@
210 midori_context_action_add_action_group (menu, browser->action_group);
211 midori_context_action_add_by_name (menu, "ManageSearchEngines");
212 midori_context_action_add_by_name (menu, "ClearPrivateData");
213- midori_context_action_add_by_name (menu, "InspectPage");
214 g_signal_emit (browser, signals[POPULATE_TOOL_MENU], 0, default_menu);
215 midori_context_action_add (menu, NULL);
216 gsize j = 0;
217@@ -4702,16 +4655,6 @@
218 }
219
220 static void
221-_action_inspect_page_activate (GtkAction* action,
222- MidoriBrowser* browser)
223-{
224- GtkWidget* view = midori_browser_get_current_tab (browser);
225- WebKitWebView* web_view = WEBKIT_WEB_VIEW (midori_view_get_web_view (MIDORI_VIEW (view)));
226- WebKitWebInspector* inspector = webkit_web_view_get_inspector (web_view);
227- webkit_web_inspector_show (inspector);
228-}
229-
230-static void
231 _action_tab_move_activate (GtkAction* action,
232 MidoriBrowser* browser)
233 {
234@@ -5515,9 +5458,6 @@
235 { "ClearPrivateData", NULL,
236 N_("_Clear Private Data…"), "<Ctrl><Shift>Delete",
237 NULL, G_CALLBACK (_action_clear_private_data_activate) },
238- { "InspectPage", NULL,
239- N_("_Inspect Page"), "<Ctrl><Shift>i",
240- NULL, G_CALLBACK (_action_inspect_page_activate) },
241
242 { "TabPrevious", GTK_STOCK_GO_BACK,
243 N_("_Previous Tab"), "<Ctrl>Page_Up",
244@@ -5893,7 +5833,6 @@
245 "<menuitem action='UndoTabClose'/>"
246 "<menuitem action='TrashEmpty'/>"
247 "<menuitem action='Preferences'/>"
248- "<menuitem action='InspectPage'/>"
249 "<menuitem action='ReloadUncached'/>"
250 "<menuitem action='CaretBrowsing'/>"
251 "</menu>"
252@@ -6079,7 +6018,6 @@
253 GtkSettings* gtk_settings;
254 GtkWidget* hpaned;
255 GtkWidget* vpaned;
256- GtkWidget* scrolled;
257 KatzeArray* dummy_array;
258
259 browser->settings = midori_web_settings_new ();
260@@ -6464,19 +6402,6 @@
261 #endif
262 gtk_widget_show (browser->notebook);
263
264- /* Inspector container */
265- browser->inspector = gtk_vbox_new (FALSE, 0);
266- gtk_paned_pack2 (GTK_PANED (vpaned), browser->inspector, FALSE, FALSE);
267- scrolled = gtk_scrolled_window_new (NULL, NULL);
268- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
269- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
270- gtk_widget_set_can_focus (scrolled, TRUE);
271- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled),
272- GTK_SHADOW_ETCHED_IN);
273- gtk_box_pack_start (GTK_BOX (browser->inspector), scrolled, TRUE, TRUE, 0);
274- browser->inspector_view = gtk_viewport_new (NULL, NULL);
275- gtk_container_add (GTK_CONTAINER (scrolled), browser->inspector_view);
276-
277 /* Incremental findbar */
278 browser->find = g_object_new (MIDORI_TYPE_FINDBAR, NULL);
279 gtk_box_pack_start (GTK_BOX (vbox), browser->find, FALSE, FALSE, 0);
280
281=== modified file 'midori/midori-view.c'
282--- midori/midori-view.c 2013-11-22 18:03:14 +0000
283+++ midori/midori-view.c 2013-11-28 20:51:46 +0000
284@@ -2300,21 +2300,6 @@
285 #endif
286
287 static void
288-midori_view_inspect_element_activate_cb (GtkAction* action,
289- gpointer user_data)
290-{
291- MidoriView* view = user_data;
292- WebKitWebInspector* inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW (view->web_view));
293- #ifndef HAVE_WEBKIT2
294- WebKitHitTestResult* hit_test_result = view->hit_test;
295- gint x = katze_object_get_int (hit_test_result, "x");
296- gint y = katze_object_get_int (hit_test_result, "y");
297- webkit_web_inspector_inspect_coordinates (inspector, x, y);
298- #endif
299- webkit_web_inspector_show (inspector);
300-}
301-
302-static void
303 midori_view_add_search_engine_cb (GtkWidget* widget,
304 MidoriView* view)
305 {
306@@ -2569,10 +2554,6 @@
307 midori_context_action_add_by_name (menu, "Fullscreen");
308 }
309
310- if (katze_object_get_boolean (view->settings, "enable-developer-extras"))
311- midori_context_action_add_simple (menu, "InspectElement", _("Inspect _Element"), NULL, NULL,
312- midori_view_inspect_element_activate_cb, view);
313-
314 g_signal_emit_by_name (view, "context-menu", hit_test_result, menu);
315 return menu;
316 }
317@@ -3383,152 +3364,6 @@
318 return midori_tab_get_progress (MIDORI_TAB (view));
319 }
320
321-#ifndef HAVE_WEBKIT2
322-static gboolean
323-midori_view_inspector_window_key_press_event_cb (GtkWidget* window,
324- GdkEventKey* event,
325- gpointer user_data)
326-{
327- /* Close window on Ctrl+W */
328- if (event->keyval == 'w' && (event->state & GDK_CONTROL_MASK))
329- gtk_widget_destroy (window);
330-
331- return FALSE;
332-}
333-
334-static void
335-midori_view_web_inspector_construct_window (gpointer inspector,
336- WebKitWebView* web_view,
337- GtkWidget* inspector_view,
338- MidoriView* view)
339-{
340- gchar* title;
341- const gchar* label;
342- GtkWidget* window;
343- GtkWidget* toplevel;
344- const gchar* icon_name;
345- GtkIconTheme* icon_theme;
346- GdkPixbuf* icon;
347- GdkPixbuf* gray_icon;
348-
349- label = midori_view_get_display_title (view);
350- title = g_strdup_printf (_("Inspect page - %s"), label);
351- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
352- gtk_window_set_title (GTK_WINDOW (window), title);
353- g_free (title);
354-
355- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view));
356- if (gtk_widget_is_toplevel (toplevel))
357- {
358- gtk_window_set_screen (GTK_WINDOW (window), gtk_window_get_screen (GTK_WINDOW (toplevel)));
359- katze_window_set_sensible_default_size (GTK_WINDOW (window));
360- }
361-
362- /* Attempt to make a gray version of the icon on the fly */
363- icon_name = gtk_window_get_icon_name (GTK_WINDOW (toplevel));
364- icon_theme = gtk_icon_theme_get_for_screen (
365- gtk_widget_get_screen (GTK_WIDGET (view)));
366- icon = gtk_icon_theme_load_icon (icon_theme, icon_name, 32,
367- GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
368- if (icon)
369- {
370- gray_icon = gdk_pixbuf_copy (icon);
371- if (gray_icon)
372- {
373- gdk_pixbuf_saturate_and_pixelate (gray_icon, gray_icon, 0.1f, FALSE);
374- gtk_window_set_icon (GTK_WINDOW (window), gray_icon);
375- g_object_unref (gray_icon);
376- }
377- g_object_unref (icon);
378- }
379- else
380- gtk_window_set_icon_name (GTK_WINDOW (window), icon_name);
381- #if GTK_CHECK_VERSION (3, 4, 0)
382- gtk_window_set_hide_titlebar_when_maximized (GTK_WINDOW (window), TRUE);
383- #endif
384- gtk_container_add (GTK_CONTAINER (window), inspector_view);
385- gtk_widget_show_all (inspector_view);
386-
387- g_signal_connect (window, "key-press-event",
388- G_CALLBACK (midori_view_inspector_window_key_press_event_cb), NULL);
389-
390- /* FIXME: Update window title with URI */
391-}
392-
393-static WebKitWebView*
394-midori_view_web_inspector_inspect_web_view_cb (gpointer inspector,
395- WebKitWebView* web_view,
396- MidoriView* view)
397-{
398- GtkWidget* inspector_view = webkit_web_view_new ();
399- midori_view_web_inspector_construct_window (inspector,
400- web_view, inspector_view, view);
401- return WEBKIT_WEB_VIEW (inspector_view);
402-}
403-
404-static gboolean
405-midori_view_web_inspector_show_window_cb (WebKitWebInspector* inspector,
406- MidoriView* view)
407-{
408- GtkWidget* inspector_view = GTK_WIDGET (webkit_web_inspector_get_web_view (inspector));
409- GtkWidget* window = gtk_widget_get_toplevel (inspector_view);
410- if (!window)
411- return FALSE;
412- if (katze_object_get_boolean (view->settings, "last-inspector-attached"))
413- {
414- gboolean handled = FALSE;
415- g_signal_emit_by_name (inspector, "attach-window", &handled);
416- }
417- else
418- {
419- gtk_widget_show (window);
420- gtk_window_present (GTK_WINDOW (window));
421- }
422- return TRUE;
423-}
424-
425-static gboolean
426-midori_view_web_inspector_attach_window_cb (gpointer inspector,
427- MidoriView* view)
428-{
429- GtkWidget* inspector_view = GTK_WIDGET (webkit_web_inspector_get_web_view (inspector));
430- g_signal_emit_by_name (view, "attach-inspector", inspector_view);
431- return TRUE;
432-}
433-
434-static gboolean
435-midori_view_web_inspector_detach_window_cb (gpointer inspector,
436- MidoriView* view)
437-{
438- GtkWidget* inspector_view = GTK_WIDGET (webkit_web_inspector_get_web_view (inspector));
439- GtkWidget* parent = gtk_widget_get_parent (inspector_view);
440- if (GTK_IS_WINDOW (parent))
441- return FALSE;
442-
443- gtk_widget_hide (parent);
444- g_signal_emit_by_name (view, "detach-inspector", inspector_view);
445- midori_view_web_inspector_construct_window (inspector,
446- WEBKIT_WEB_VIEW (view->web_view), inspector_view, view);
447- return TRUE;
448-}
449-
450-static gboolean
451-midori_view_web_inspector_close_window_cb (gpointer inspector,
452- MidoriView* view)
453-{
454- GtkWidget* inspector_view = GTK_WIDGET (webkit_web_inspector_get_web_view (inspector));
455- #ifdef HAVE_WEBKIT2
456- GtkWidget* scrolled = inspector_view;
457- #else
458- GtkWidget* scrolled = gtk_widget_get_parent (inspector_view);
459- #endif
460- if (!scrolled)
461- return FALSE;
462- gtk_widget_hide (gtk_widget_get_parent (scrolled));
463- return TRUE;
464-}
465-#endif
466-
467 static GObject*
468 midori_view_constructor (GType type,
469 guint n_construct_properties,
470@@ -3670,20 +3505,6 @@
471
472 #ifndef HAVE_WEBKIT2
473 gtk_container_add (GTK_CONTAINER (view->scrolled_window), view->web_view);
474-
475- gpointer inspector = webkit_web_view_get_inspector ((WebKitWebView*)view->web_view);
476- g_object_connect (inspector,
477- "signal::inspect-web-view",
478- midori_view_web_inspector_inspect_web_view_cb, view,
479- "signal::show-window",
480- midori_view_web_inspector_show_window_cb, view,
481- "signal::attach-window",
482- midori_view_web_inspector_attach_window_cb, view,
483- "signal::detach-window",
484- midori_view_web_inspector_detach_window_cb, view,
485- "signal::close-window",
486- midori_view_web_inspector_close_window_cb, view,
487- NULL);
488 #endif
489 gtk_widget_show_all (view->scrolled_window);
490 return object;

Subscribers

People subscribed via source and target branches

to all changes: