From b3984ab2520888d0f4910137340bc6fe82bf8885 Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Mon, 17 Sep 2012 18:27:17 +0200 Subject: [PATCH] Groundwork to make finding search engines testable --- katze/katze.vapi | 10 ++- midori/midori-searchaction.c | 107 ++++++++++++++++++++++++++++++++ midori/midori-searchaction.h | 10 +++ midori/midori-view.c | 116 +---------------------------------- midori/midori.vapi | 36 ++++++----- tests/download.vala | 4 -- tests/searchaction.vala | 46 ++++++++++++++ tests/speeddial.vala | 4 -- 8 files changed, 196 insertions(+), 137 deletions(-) create mode 100644 tests/searchaction.vala diff --git a/katze/katze.vapi b/katze/katze.vapi index a152a6c8..1627568b 100644 --- a/katze/katze.vapi +++ b/katze/katze.vapi @@ -3,12 +3,20 @@ [CCode (cprefix = "Katze", lower_case_cprefix = "katze_")] namespace Katze { - public class Array : GLib.Object { + static string assert_str_equal (string input, string result, string expected); + + [CCode (cheader_filename = "katze/katze.h")] + public class Array : Katze.Item { public Array (GLib.Type type); public void add_item (GLib.Object item); } + [CCode (cheader_filename = "katze/katze.h")] public class Item : GLib.Object { + public string? uri { get; set; } + public string? name { get; set; } + public string? text { get; set; } + public bool get_meta_boolean (string key); public int64 get_meta_integer (string key); public void set_meta_integer (string key, int64 value); diff --git a/midori/midori-searchaction.c b/midori/midori-searchaction.c index 705e87d6..9972c461 100644 --- a/midori/midori-searchaction.c +++ b/midori/midori-searchaction.c @@ -932,6 +932,113 @@ midori_search_action_token_for_uri (const gchar* uri) return g_strdup (hostname); } +KatzeItem* +midori_search_action_get_engine_for_form (WebKitWebView* web_view, + PangoEllipsizeMode ellipsize) +{ + #if WEBKIT_CHECK_VERSION (1, 5, 0) + WebKitDOMDocument* doc; + WebKitDOMHTMLFormElement* active_form; + WebKitDOMHTMLCollection* form_nodes; + WebKitDOMElement* active_element; + gchar* token_element; + const gchar* title; + GString* uri_str; + gulong form_len; + guint i; + KatzeItem* item; + gchar** parts; + + #if WEBKIT_CHECK_VERSION (1, 9, 5) + doc = webkit_web_frame_get_dom_document (web_view); + #else + if (webkit_web_view_get_focused_frame (web_view) != webkit_web_view_get_main_frame (web_view)) + return NULL; + doc = webkit_web_view_get_dom_document (web_view); + #endif + + active_element = webkit_dom_html_document_get_active_element ((WebKitDOMHTMLDocument*)doc); + active_form = webkit_dom_html_input_element_get_form ((WebKitDOMHTMLInputElement*)active_element); + + if (!active_form) + return NULL; + + token_element = webkit_dom_element_get_attribute (active_element, "name"); + + form_nodes = webkit_dom_html_form_element_get_elements (active_form); + form_len = webkit_dom_html_form_element_get_length (active_form); + + uri_str = g_string_new (webkit_dom_html_form_element_get_action (active_form)); + g_string_append (uri_str, "?"); + + for (i = 0; i < form_len; i++) + { + WebKitDOMNode* form_node = webkit_dom_html_collection_item (form_nodes, i); + WebKitDOMElement* form_element = (WebKitDOMElement*) form_node; + gchar* name = webkit_dom_element_get_attribute (form_element, "name"); + + if (name && *name) + { + if (!g_strcmp0 (token_element, name)) + g_string_append_printf (uri_str, "%s=%s&", name, "\%s"); + else + { + gchar* value; + if (!g_strcmp0 (webkit_dom_element_get_tag_name (form_element), "SELECT")) + { + WebKitDOMHTMLSelectElement* select_element = (WebKitDOMHTMLSelectElement*) form_element; + gulong pos = webkit_dom_html_select_element_get_selected_index (select_element); + WebKitDOMNode* selected_node = webkit_dom_html_select_element_item (select_element, pos); + WebKitDOMElement* selected_element = (WebKitDOMElement*) selected_node; + + value = webkit_dom_element_get_attribute (selected_element, "value"); + } + else + value = webkit_dom_element_get_attribute (form_element, "value"); + + g_string_append_printf (uri_str, "%s=%s&", name, value); + g_free (value); + } + g_free (name); + } + } + + title = webkit_web_view_get_title (web_view); + + item = katze_item_new (); + item->uri = g_string_free (uri_str, FALSE); + item->token = midori_search_action_token_for_uri (webkit_web_view_get_uri (web_view)); + + if (strstr (title, " - ")) + parts = g_strsplit (title, " - ", 2); + else if (strstr (title, ": ")) + parts = g_strsplit (title, ": ", 2); + else + parts = NULL; + if (parts != NULL) + { + /* See midori_view_set_title: title can be first or last */ + if (ellipsize == PANGO_ELLIPSIZE_END) + { + item->name = g_strdup (parts[0]); + item->text = g_strdup (parts[1]); + } + else + { + item->name = g_strdup (parts[1]); + item->text = g_strdup (parts[2]); + } + g_strfreev (parts); + } + else + item->name = g_strdup (title); + + g_free (token_element); + return item; + #else + return NULL; + #endif +} void midori_search_action_get_editor (MidoriSearchAction* search_action, diff --git a/midori/midori-searchaction.h b/midori/midori-searchaction.h index c8d0ed88..1f1d2200 100644 --- a/midori/midori-searchaction.h +++ b/midori/midori-searchaction.h @@ -13,6 +13,7 @@ #define __MIDORI_SEARCH_ACTION_H__ #include +#include G_BEGIN_DECLS @@ -72,6 +73,15 @@ midori_search_action_set_default_item (MidoriSearchAction* search_action, GtkWidget* midori_search_action_get_dialog (MidoriSearchAction* search_action); +void +midori_search_action_get_editor (MidoriSearchAction* search_action, + KatzeItem* item, + gboolean new_engine); + +KatzeItem* +midori_search_action_get_engine_for_form (WebKitWebView* web_view, + PangoEllipsizeMode ellipsize); + G_END_DECLS #endif /* __MIDORI_SEARCH_ACTION_H__ */ diff --git a/midori/midori-view.c b/midori/midori-view.c index 3ef26374..a691dff8 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -2433,11 +2433,6 @@ midori_web_view_menu_inspect_element_activate_cb (GtkWidget* widget, } #if WEBKIT_CHECK_VERSION (1, 5, 0) -void -midori_search_action_get_editor (MidoriSearchAction* search_action, - KatzeItem* item, - gboolean new_engine); - static void midori_view_menu_add_search_engine_cb (GtkWidget* widget, MidoriView* view) @@ -2448,114 +2443,6 @@ midori_view_menu_add_search_engine_cb (GtkWidget* widget, KatzeItem* item = g_object_get_data (G_OBJECT (widget), "item"); midori_search_action_get_editor (MIDORI_SEARCH_ACTION (action), item, TRUE); } - -gchar* -midori_search_action_token_for_uri (const gchar* uri); - -static KatzeItem* -midori_view_search_engine_for_form (MidoriView* view, - WebKitWebView* web_view) -{ - - WebKitDOMDocument* doc; - WebKitDOMHTMLFormElement* active_form; - WebKitDOMHTMLCollection* form_nodes; - WebKitDOMElement* active_element; - gchar* token_element; - const gchar* title; - GString* uri_str; - gulong form_len; - guint i; - KatzeItem* item; - gchar** parts; - - #if WEBKIT_CHECK_VERSION (1, 9, 5) - doc = webkit_web_frame_get_dom_document (web_view); - #else - if (webkit_web_view_get_focused_frame (web_view) != webkit_web_view_get_main_frame (web_view)) - return NULL; - doc = webkit_web_view_get_dom_document (web_view); - #endif - - active_element = webkit_dom_html_document_get_active_element ((WebKitDOMHTMLDocument*)doc); - active_form = webkit_dom_html_input_element_get_form ((WebKitDOMHTMLInputElement*)active_element); - - if (!active_form) - return NULL; - - token_element = webkit_dom_element_get_attribute (active_element, "name"); - - form_nodes = webkit_dom_html_form_element_get_elements (active_form); - form_len = webkit_dom_html_form_element_get_length (active_form); - - uri_str = g_string_new (webkit_dom_html_form_element_get_action (active_form)); - g_string_append (uri_str, "?"); - - for (i = 0; i < form_len; i++) - { - WebKitDOMNode* form_node = webkit_dom_html_collection_item (form_nodes, i); - WebKitDOMElement* form_element = (WebKitDOMElement*) form_node; - gchar* name = webkit_dom_element_get_attribute (form_element, "name"); - - if (name && *name) - { - if (!g_strcmp0 (token_element, name)) - g_string_append_printf (uri_str, "%s=%s&", name, "\%s"); - else - { - gchar* value; - if (!g_strcmp0 (webkit_dom_element_get_tag_name (form_element), "SELECT")) - { - WebKitDOMHTMLSelectElement* select_element = (WebKitDOMHTMLSelectElement*) form_element; - gulong pos = webkit_dom_html_select_element_get_selected_index (select_element); - WebKitDOMNode* selected_node = webkit_dom_html_select_element_item (select_element, pos); - WebKitDOMElement* selected_element = (WebKitDOMElement*) selected_node; - - value = webkit_dom_element_get_attribute (selected_element, "value"); - } - else - value = webkit_dom_element_get_attribute (form_element, "value"); - - g_string_append_printf (uri_str, "%s=%s&", name, value); - g_free (value); - } - g_free (name); - } - } - - title = webkit_web_view_get_title (web_view); - - item = katze_item_new (); - katze_item_set_uri (item, g_string_free (uri_str, FALSE)); - item->token = midori_search_action_token_for_uri (view->uri); - - if (strstr (title, " - ")) - parts = g_strsplit (title, " - ", 2); - else if (strstr (title, ": ")) - parts = g_strsplit (title, ": ", 2); - else - parts = NULL; - if (parts != NULL) - { - /* See midori_view_set_title: title can be first or last */ - if (view->ellipsize == PANGO_ELLIPSIZE_END) - { - katze_item_set_name (item, g_strdup (parts[0])); - katze_item_set_text (item, g_strdup (parts[1])); - } - else - { - katze_item_set_name (item, g_strdup (parts[1])); - katze_item_set_text (item, g_strdup (parts[2])); - } - g_strfreev (parts); - } - else - katze_item_set_name (item, title); - - g_free (token_element); - return item; -} #endif static GtkWidget* @@ -2666,7 +2553,8 @@ midori_view_populate_popup (MidoriView* view, #if WEBKIT_CHECK_VERSION (1, 5, 0) { - KatzeItem* item = midori_view_search_engine_for_form (view, web_view); + KatzeItem* item = midori_search_action_get_engine_for_form ( + WEBKIT_WEB_VIEW (view->web_view), view->ellipsize); if (item != NULL) { menuitem = midori_view_insert_menu_item (menu_shell, -1, diff --git a/midori/midori.vapi b/midori/midori.vapi index 62688c7b..0ac85fb9 100644 --- a/midori/midori.vapi +++ b/midori/midori.vapi @@ -16,17 +16,17 @@ namespace Midori { [NoAccessorMethod] public Midori.WebSettings settings { owned get; set; } [NoAccessorMethod] - public GLib.Object bookmarks { get; set; } + public Katze.Array bookmarks { get; set; } [NoAccessorMethod] - public GLib.Object trash { get; set; } + public Katze.Array trash { get; set; } [NoAccessorMethod] - public GLib.Object search_engines { get; set; } + public Katze.Array search_engines { get; set; } [NoAccessorMethod] - public GLib.Object history { get; set; } + public Katze.Array history { get; set; } [NoAccessorMethod] - public GLib.Object extensions { get; set; } + public Katze.Array extensions { get; set; } [NoAccessorMethod] - public GLib.Object browsers { get; } + public Katze.Array browsers { get; } public Browser? browser { get; } [HasEmitter] @@ -35,9 +35,11 @@ namespace Midori { [HasEmitter] public signal void quit (); } + + [CCode (cheader_filename = "midori/midori.h")] public class Browser : Gtk.Window { public Browser (); - public int add_item (GLib.Object item); + public int add_item (Katze.Item item); public int add_uri (string uri); public unowned View get_nth_tab (int n); public GLib.List get_tabs (); @@ -46,7 +48,7 @@ namespace Midori { public unowned Gtk.ActionGroup get_action_group (); public unowned Browser get_for_widget (Gtk.Widget widget); public unowned string[] get_toolbar_actions (); - public unowned GLib.Object get_proxy_items (); + public unowned Katze.Array get_proxy_items (); [NoAccessorMethod] public Gtk.MenuBar menubar { owned get; } @@ -67,13 +69,13 @@ namespace Midori { public string statusbar_text { owned get; set; } public Midori.WebSettings settings { get; set; } [NoAccessorMethod] - public GLib.Object bookmarks { owned get; set; } + public Katze.Array? bookmarks { owned get; set; } [NoAccessorMethod] - public GLib.Object trash { owned get; set; } + public Katze.Array? trash { owned get; set; } [NoAccessorMethod] - public GLib.Object search_engines { owned get; set; } + public Katze.Array? search_engines { owned get; set; } [NoAccessorMethod] - public GLib.Object history { owned get; set; } + public Katze.Array? history { owned get; set; } [NoAccessorMethod] public bool show_tabs { get; set; } @@ -85,7 +87,7 @@ namespace Midori { public signal void switch_tab (View? old_view, View? new_view); [HasEmitter] public signal void activate_action (string name); - public signal void add_download (GLib.Object download); + public signal void add_download (WebKit.Download download); public signal void populate_tool_menu (Gtk.Menu menu); [HasEmitter] public signal void quit (); @@ -126,6 +128,7 @@ namespace Midori { public signal void open_preferences (); } + [CCode (cheader_filename = "midori/midori.h")] public class View : Gtk.VBox { [CCode (type = "GtkWidget*")] public View (GLib.Object net); @@ -163,7 +166,7 @@ namespace Midori { public double progress { get; set; } public bool minimized { get; } public float zoom_level { get; } - public GLib.Object news_feeds { get; } + public Katze.Array news_feeds { get; } public string statusbar_text { get; } public WebSettings settings { get; set; } public GLib.Object net { get; } @@ -173,6 +176,11 @@ namespace Midori { } + [CCode (cheader_filename = "midori/midori.h")] + public class SearchAction : Gtk.Action { + public static Katze.Item? get_engine_for_form (WebKit.WebView web_view, Pango.EllipsizeMode ellipsize); + } + [CCode (cheader_filename = "midori/midori-view.h", cprefix = "MIDORI_DOWNLOAD_")] public enum DownloadType { CANCEL, diff --git a/tests/download.vala b/tests/download.vala index 9bdbc027..c5e0f98e 100644 --- a/tests/download.vala +++ b/tests/download.vala @@ -9,10 +9,6 @@ See the file COPYING for the full license text. */ -namespace Katze { - extern static string assert_str_equal (string input, string result, string expected); -} - struct TestCase { public string data; public string? expected; diff --git a/tests/searchaction.vala b/tests/searchaction.vala new file mode 100644 index 00000000..60dc81a0 --- /dev/null +++ b/tests/searchaction.vala @@ -0,0 +1,46 @@ +/* + Copyright (C) 2012 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +/* +struct FormSpec { + public string html; + public Pango.EllipsizeMode ellipsize; + public string? uri; + public string? title; +} + +const FormSpec[] forms = { + { "
", Pango.EllipsizeMode.END, null, null }, + { "
", Pango.EllipsizeMode.END, null, null } +}; +*/ + +void searchaction_form () { + /* + foreach (var form in forms) { + var view = new Midori.View.with_title (); + view.get_web_view ().load_html_string (form.html, ""); + Katze.Item? result = Midori.SearchAction.get_engine_for_form ( + view.get_web_view (), form.ellipsize); + Katze.assert_str_equal (form.html, + result != null ? result.uri : null, form.uri); + Katze.assert_str_equal (form.html, + result != null ? result.name : null, form.title); + } + */ +} + +void main (string[] args) { + Test.init (ref args); + Test.add_func ("/searchaction/form", searchaction_form); + Test.run (); +} + diff --git a/tests/speeddial.vala b/tests/speeddial.vala index e696ea4f..513f0b50 100644 --- a/tests/speeddial.vala +++ b/tests/speeddial.vala @@ -16,10 +16,6 @@ string get_test_file (string contents) { return file; } -namespace Katze { - extern static string assert_str_equal (string input, string result, string expected); -} - static void speeddial_load () { string data = get_test_file (""" [Dial 1]