Groundwork to make finding search engines testable

This commit is contained in:
Christian Dywan 2012-09-17 18:27:17 +02:00
parent 09432b2d12
commit b3984ab252
8 changed files with 196 additions and 137 deletions

View file

@ -3,12 +3,20 @@
[CCode (cprefix = "Katze", lower_case_cprefix = "katze_")] [CCode (cprefix = "Katze", lower_case_cprefix = "katze_")]
namespace 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 Array (GLib.Type type);
public void add_item (GLib.Object item); public void add_item (GLib.Object item);
} }
[CCode (cheader_filename = "katze/katze.h")]
public class Item : GLib.Object { 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 bool get_meta_boolean (string key);
public int64 get_meta_integer (string key); public int64 get_meta_integer (string key);
public void set_meta_integer (string key, int64 value); public void set_meta_integer (string key, int64 value);

View file

@ -932,6 +932,113 @@ midori_search_action_token_for_uri (const gchar* uri)
return g_strdup (hostname); 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 void
midori_search_action_get_editor (MidoriSearchAction* search_action, midori_search_action_get_editor (MidoriSearchAction* search_action,

View file

@ -13,6 +13,7 @@
#define __MIDORI_SEARCH_ACTION_H__ #define __MIDORI_SEARCH_ACTION_H__
#include <katze/katze.h> #include <katze/katze.h>
#include <webkit/webkit.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -72,6 +73,15 @@ midori_search_action_set_default_item (MidoriSearchAction* search_action,
GtkWidget* GtkWidget*
midori_search_action_get_dialog (MidoriSearchAction* search_action); 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 G_END_DECLS
#endif /* __MIDORI_SEARCH_ACTION_H__ */ #endif /* __MIDORI_SEARCH_ACTION_H__ */

View file

@ -2433,11 +2433,6 @@ midori_web_view_menu_inspect_element_activate_cb (GtkWidget* widget,
} }
#if WEBKIT_CHECK_VERSION (1, 5, 0) #if WEBKIT_CHECK_VERSION (1, 5, 0)
void
midori_search_action_get_editor (MidoriSearchAction* search_action,
KatzeItem* item,
gboolean new_engine);
static void static void
midori_view_menu_add_search_engine_cb (GtkWidget* widget, midori_view_menu_add_search_engine_cb (GtkWidget* widget,
MidoriView* view) 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"); KatzeItem* item = g_object_get_data (G_OBJECT (widget), "item");
midori_search_action_get_editor (MIDORI_SEARCH_ACTION (action), item, TRUE); 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 #endif
static GtkWidget* static GtkWidget*
@ -2666,7 +2553,8 @@ midori_view_populate_popup (MidoriView* view,
#if WEBKIT_CHECK_VERSION (1, 5, 0) #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) if (item != NULL)
{ {
menuitem = midori_view_insert_menu_item (menu_shell, -1, menuitem = midori_view_insert_menu_item (menu_shell, -1,

View file

@ -16,17 +16,17 @@ namespace Midori {
[NoAccessorMethod] [NoAccessorMethod]
public Midori.WebSettings settings { owned get; set; } public Midori.WebSettings settings { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object bookmarks { get; set; } public Katze.Array bookmarks { get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object trash { get; set; } public Katze.Array trash { get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object search_engines { get; set; } public Katze.Array search_engines { get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object history { get; set; } public Katze.Array history { get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object extensions { get; set; } public Katze.Array extensions { get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object browsers { get; } public Katze.Array browsers { get; }
public Browser? browser { get; } public Browser? browser { get; }
[HasEmitter] [HasEmitter]
@ -35,9 +35,11 @@ namespace Midori {
[HasEmitter] [HasEmitter]
public signal void quit (); public signal void quit ();
} }
[CCode (cheader_filename = "midori/midori.h")]
public class Browser : Gtk.Window { public class Browser : Gtk.Window {
public Browser (); public Browser ();
public int add_item (GLib.Object item); public int add_item (Katze.Item item);
public int add_uri (string uri); public int add_uri (string uri);
public unowned View get_nth_tab (int n); public unowned View get_nth_tab (int n);
public GLib.List<weak View> get_tabs (); public GLib.List<weak View> get_tabs ();
@ -46,7 +48,7 @@ namespace Midori {
public unowned Gtk.ActionGroup get_action_group (); public unowned Gtk.ActionGroup get_action_group ();
public unowned Browser get_for_widget (Gtk.Widget widget); public unowned Browser get_for_widget (Gtk.Widget widget);
public unowned string[] get_toolbar_actions (); public unowned string[] get_toolbar_actions ();
public unowned GLib.Object get_proxy_items (); public unowned Katze.Array get_proxy_items ();
[NoAccessorMethod] [NoAccessorMethod]
public Gtk.MenuBar menubar { owned get; } public Gtk.MenuBar menubar { owned get; }
@ -67,13 +69,13 @@ namespace Midori {
public string statusbar_text { owned get; set; } public string statusbar_text { owned get; set; }
public Midori.WebSettings settings { get; set; } public Midori.WebSettings settings { get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object bookmarks { owned get; set; } public Katze.Array? bookmarks { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object trash { owned get; set; } public Katze.Array? trash { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object search_engines { owned get; set; } public Katze.Array? search_engines { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object history { owned get; set; } public Katze.Array? history { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public bool show_tabs { get; set; } public bool show_tabs { get; set; }
@ -85,7 +87,7 @@ namespace Midori {
public signal void switch_tab (View? old_view, View? new_view); public signal void switch_tab (View? old_view, View? new_view);
[HasEmitter] [HasEmitter]
public signal void activate_action (string name); 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); public signal void populate_tool_menu (Gtk.Menu menu);
[HasEmitter] [HasEmitter]
public signal void quit (); public signal void quit ();
@ -126,6 +128,7 @@ namespace Midori {
public signal void open_preferences (); public signal void open_preferences ();
} }
[CCode (cheader_filename = "midori/midori.h")]
public class View : Gtk.VBox { public class View : Gtk.VBox {
[CCode (type = "GtkWidget*")] [CCode (type = "GtkWidget*")]
public View (GLib.Object net); public View (GLib.Object net);
@ -163,7 +166,7 @@ namespace Midori {
public double progress { get; set; } public double progress { get; set; }
public bool minimized { get; } public bool minimized { get; }
public float zoom_level { get; } public float zoom_level { get; }
public GLib.Object news_feeds { get; } public Katze.Array news_feeds { get; }
public string statusbar_text { get; } public string statusbar_text { get; }
public WebSettings settings { get; set; } public WebSettings settings { get; set; }
public GLib.Object net { get; } 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_")] [CCode (cheader_filename = "midori/midori-view.h", cprefix = "MIDORI_DOWNLOAD_")]
public enum DownloadType { public enum DownloadType {
CANCEL, CANCEL,

View file

@ -9,10 +9,6 @@
See the file COPYING for the full license text. 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 { struct TestCase {
public string data; public string data;
public string? expected; public string? expected;

46
tests/searchaction.vala Normal file
View file

@ -0,0 +1,46 @@
/*
Copyright (C) 2012 Christian Dywan <christian@twotoasts.de>
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 = {
{ "<form></form>", Pango.EllipsizeMode.END, null, null },
{ "<form><input></form>", 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 ();
}

View file

@ -16,10 +16,6 @@ string get_test_file (string contents) {
return file; return file;
} }
namespace Katze {
extern static string assert_str_equal (string input, string result, string expected);
}
static void speeddial_load () { static void speeddial_load () {
string data = get_test_file (""" string data = get_test_file ("""
[Dial 1] [Dial 1]