]> spindle.queued.net Git - midori/commitdiff
Replace window-object-cleared with context-ready
authorChristian Dywan <christian@twotoasts.de>
Sun, 23 Nov 2008 04:19:43 +0000 (05:19 +0100)
committerChristian Dywan <christian@twotoasts.de>
Sun, 23 Nov 2008 04:22:58 +0000 (05:22 +0100)
Introduce MidoriBrowser::load-status and also
midori_view_execute_script while we are at it.

midori/main.c
midori/midori-addons.c
midori/midori-browser.c
midori/midori-view.c
midori/midori-view.h

index 707a90f56af5e468fbee8d1136dce3aecacf12dd..d4cdd1c841a1e64a9d579fc5071f9caad1b0127d 100644 (file)
@@ -1033,6 +1033,7 @@ midori_app_add_browser_cb (MidoriApp*     app,
     gtk_widget_show (toolbar);
     midori_panel_append_page (MIDORI_PANEL (panel), addon, toolbar,
                               STOCK_SCRIPTS, _("Userscripts"));
+
     /* Userstyles */
     addon = midori_addons_new (MIDORI_ADDON_USER_STYLES, GTK_WIDGET (browser));
     gtk_widget_show (addon);
@@ -1043,8 +1044,7 @@ midori_app_add_browser_cb (MidoriApp*     app,
 
     /* Extensions */
     #if 0
-    addon = midori_addons_new (MIDORI_ADDON_EXTENSIONS,
-                               katze_object_get_object (app, "extensions"), NULL);
+    addon = midori_addons_new (MIDORI_ADDON_EXTENSIONS);
     gtk_widget_show (addon);
     toolbar = midori_addons_get_toolbar (MIDORI_ADDONS (addon));
     gtk_widget_show (toolbar);
index 51a8b6b707257e6e41b9aa84f351464abee1fed2..b0d2c41537344dd497a7438a1c2071f86d52dc11 100644 (file)
@@ -813,11 +813,9 @@ _js_style_from_file (JSContextRef js_context,
 }
 
 static void
-midori_web_widget_window_object_cleared_cb (GtkWidget*         web_widget,
-                                            WebKitWebFrame*    web_frame,
-                                            JSGlobalContextRef js_context,
-                                            JSObjectRef        js_window,
-                                            MidoriAddons*      addons)
+midori_web_widget_context_ready_cb (GtkWidget*         web_widget,
+                                    JSGlobalContextRef js_context,
+                                    MidoriAddons*      addons)
 {
     const gchar* uri;
     GSList* elements;
@@ -826,7 +824,7 @@ midori_web_widget_window_object_cleared_cb (GtkWidget*         web_widget,
     gchar* exception;
     gchar* message;
 
-    uri = webkit_web_frame_get_uri (web_frame);
+    uri = katze_object_get_string (web_widget, "uri");
     if (!uri)
         return;
 
@@ -904,8 +902,8 @@ midori_addons_new (MidoriAddonKind kind,
                            NULL);
 
     if (kind == MIDORI_ADDON_USER_SCRIPTS || kind == MIDORI_ADDON_USER_STYLES)
-        g_signal_connect (addons->web_widget, "window-object-cleared",
-            G_CALLBACK (midori_web_widget_window_object_cleared_cb), addons);
+        g_signal_connect (addons->web_widget, "context-ready",
+            G_CALLBACK (midori_web_widget_context_ready_cb), addons);
 
     midori_addons_update_elements (addons);
 
index 94f6430cf90b9c3469abd937c908bcded5963543..788e09c7b34e9cfaaae6a742d63974bff45678b7 100644 (file)
@@ -89,6 +89,7 @@ enum
     PROP_PANEL,
     PROP_URI,
     PROP_TAB,
+    PROP_LOAD_STATUS,
     PROP_STATUSBAR,
     PROP_STATUSBAR_TEXT,
     PROP_SETTINGS,
@@ -100,12 +101,11 @@ enum
 
 enum
 {
-    WINDOW_OBJECT_CLEARED,
     NEW_WINDOW,
-
     ADD_TAB,
     REMOVE_TAB,
     ACTIVATE_ACTION,
+    CONTEXT_READY,
     QUIT,
 
     LAST_SIGNAL
@@ -392,6 +392,8 @@ midori_view_notify_load_status_cb (GtkWidget*      view,
         _midori_browser_update_interface (browser);
         _midori_browser_set_statusbar_text (browser, NULL);
     }
+
+    g_object_notify (G_OBJECT (browser), "load-status");
 }
 
 static void
@@ -404,14 +406,11 @@ midori_view_notify_progress_cb (GtkWidget*     view,
 }
 
 static void
-midori_view_window_object_cleared_cb (GtkWidget*      view,
-                                      WebKitWebFrame* web_frame,
-                                      JSContextRef    js_context,
-                                      JSObjectRef     js_window,
-                                      MidoriBrowser*  browser)
+midori_view_context_ready_cb (GtkWidget*     view,
+                              JSContextRef   js_context,
+                              MidoriBrowser* browser)
 {
-    g_signal_emit (browser, signals[WINDOW_OBJECT_CLEARED], 0,
-                   web_frame, js_context, js_window);
+    g_signal_emit (browser, signals[CONTEXT_READY], 0, js_context);
 }
 
 /*
@@ -866,8 +865,8 @@ _midori_browser_add_tab (MidoriBrowser* browser,
                       midori_view_notify_load_status_cb, browser,
                       "signal::notify::progress",
                       midori_view_notify_progress_cb, browser,
-                      "signal::window-object-cleared",
-                      midori_view_window_object_cleared_cb, browser,
+                      "signal::context-ready",
+                      midori_view_context_ready_cb, browser,
                       /* "signal::news-feed-ready",
                       midori_view_news_feed_ready_cb, browser, */
                       "signal::notify::title",
@@ -930,64 +929,12 @@ _midori_browser_quit (MidoriBrowser* browser)
     /* Nothing to do */
 }
 
-static void
-midori_cclosure_marshal_VOID__OBJECT_POINTER_POINTER (GClosure*     closure,
-                                                      GValue*       return_value,
-                                                      guint         n_param_values,
-                                                      const GValue* param_values,
-                                                      gpointer      invocation_hint,
-                                                      gpointer      marshal_data)
-{
-    typedef gboolean(*GMarshalFunc_VOID__OBJECT_POINTER_POINTER) (gpointer  data1,
-                                                                  gpointer  arg_1,
-                                                                  gpointer  arg_2,
-                                                                  gpointer  arg_3,
-                                                                  gpointer  data2);
-    register GMarshalFunc_VOID__OBJECT_POINTER_POINTER callback;
-    register GCClosure* cc = (GCClosure*) closure;
-    register gpointer data1, data2;
-
-    g_return_if_fail (n_param_values == 4);
-
-    if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-        data1 = closure->data;
-        data2 = g_value_peek_pointer (param_values + 0);
-    }
-    else
-    {
-        data1 = g_value_peek_pointer (param_values + 0);
-        data2 = closure->data;
-    }
-    callback = (GMarshalFunc_VOID__OBJECT_POINTER_POINTER) (marshal_data
-        ? marshal_data : cc->callback);
-
-    callback (data1,
-              g_value_get_object (param_values + 1),
-              g_value_get_pointer (param_values + 2),
-              g_value_get_pointer (param_values + 3),
-              data2);
-}
-
 static void
 midori_browser_class_init (MidoriBrowserClass* class)
 {
     GObjectClass* gobject_class;
     GParamFlags flags;
 
-    signals[WINDOW_OBJECT_CLEARED] = g_signal_new (
-        "window-object-cleared",
-        G_TYPE_FROM_CLASS (class),
-        (GSignalFlags)(G_SIGNAL_RUN_LAST),
-        G_STRUCT_OFFSET (MidoriBrowserClass, window_object_cleared),
-        0,
-        NULL,
-        midori_cclosure_marshal_VOID__OBJECT_POINTER_POINTER,
-        G_TYPE_NONE, 3,
-        WEBKIT_TYPE_WEB_FRAME,
-        G_TYPE_POINTER,
-        G_TYPE_POINTER);
-
     signals[NEW_WINDOW] = g_signal_new (
         "new-window",
         G_TYPE_FROM_CLASS (class),
@@ -1032,6 +979,17 @@ midori_browser_class_init (MidoriBrowserClass* class)
         G_TYPE_NONE, 1,
         G_TYPE_STRING);
 
+    signals[CONTEXT_READY] = g_signal_new (
+        "context-ready",
+        G_TYPE_FROM_CLASS (class),
+        (GSignalFlags)(G_SIGNAL_RUN_LAST),
+        0,
+        0,
+        NULL,
+        g_cclosure_marshal_VOID__POINTER,
+        G_TYPE_NONE, 1,
+        G_TYPE_POINTER);
+
     signals[QUIT] = g_signal_new (
         "quit",
         G_TYPE_FROM_CLASS (class),
@@ -1109,6 +1067,16 @@ midori_browser_class_init (MidoriBrowserClass* class)
                                      GTK_TYPE_WIDGET,
                                      G_PARAM_READWRITE));
 
+    g_object_class_install_property (gobject_class,
+                                     PROP_LOAD_STATUS,
+                                     g_param_spec_enum (
+                                     "load-status",
+                                     "Load Status",
+                                     "The current load status",
+                                     MIDORI_TYPE_LOAD_STATUS,
+                                     MIDORI_LOAD_FINISHED,
+                                     G_PARAM_READABLE));
+
     g_object_class_install_property (gobject_class,
                                      PROP_STATUSBAR,
                                      g_param_spec_object (
index 36c90dfebec2e7eb994dcabe58cf509e4e4e8357..201e9ecb22e9793bb6999f9a0977e6f27eaf1645 100644 (file)
 
 #include "midori-view.h"
 #include "midori-source.h"
-
 #include "midori-stock.h"
 
 #include "compat.h"
 #include "sokoke.h"
-#include "gjs.h"
+/* #include "gjs.h" */
 
 #include <string.h>
 #include <stdlib.h>
@@ -48,7 +47,7 @@ struct _MidoriView
     gchar* selected_text;
     MidoriWebSettings* settings;
     GtkWidget* web_view;
-    gboolean window_object_cleared;
+    /* KatzeArray* news_feeds; */
 
     gchar* download_manager;
     gboolean middle_click_opens_selection;
@@ -100,6 +99,7 @@ enum
     PROP_LOAD_STATUS,
     PROP_PROGRESS,
     PROP_ZOOM_LEVEL,
+    /* PROP_NEWS_FEEDS, */
     PROP_STATUSBAR_TEXT,
     PROP_SETTINGS,
     PROP_NET
@@ -108,8 +108,8 @@ enum
 enum {
     ACTIVATE_ACTION,
     CONSOLE_MESSAGE,
+    CONTEXT_READY,
     ATTACH_INSPECTOR,
-    WINDOW_OBJECT_CLEARED,
     NEW_TAB,
     NEW_WINDOW,
     SEARCH_TEXT,
@@ -215,45 +215,6 @@ midori_cclosure_marshal_VOID__STRING_INT_STRING (GClosure*     closure,
               data2);
 }
 
-static void
-midori_cclosure_marshal_VOID__OBJECT_POINTER_POINTER (GClosure*     closure,
-                                                      GValue*       return_value,
-                                                      guint         n_param_values,
-                                                      const GValue* param_values,
-                                                      gpointer      invocation_hint,
-                                                      gpointer      marshal_data)
-{
-    typedef gboolean(*GMarshalFunc_VOID__OBJECT_POINTER_POINTER) (gpointer  data1,
-                                                                  gpointer  arg_1,
-                                                                  gpointer  arg_2,
-                                                                  gpointer  arg_3,
-                                                                  gpointer  data2);
-    register GMarshalFunc_VOID__OBJECT_POINTER_POINTER callback;
-    register GCClosure* cc = (GCClosure*) closure;
-    register gpointer data1, data2;
-
-    g_return_if_fail (n_param_values == 4);
-
-    if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-        data1 = closure->data;
-        data2 = g_value_peek_pointer (param_values + 0);
-    }
-    else
-    {
-        data1 = g_value_peek_pointer (param_values + 0);
-        data2 = closure->data;
-    }
-    callback = (GMarshalFunc_VOID__OBJECT_POINTER_POINTER) (marshal_data
-        ? marshal_data : cc->callback);
-
-    callback (data1,
-              g_value_get_object (param_values + 1),
-              g_value_get_pointer (param_values + 2),
-              g_value_get_pointer (param_values + 3),
-              data2);
-}
-
 static void
 midori_view_class_init (MidoriViewClass* class)
 {
@@ -284,29 +245,27 @@ midori_view_class_init (MidoriViewClass* class)
         G_TYPE_INT,
         G_TYPE_STRING);
 
-    signals[ATTACH_INSPECTOR] = g_signal_new (
-        "attach-inspector",
+    signals[CONTEXT_READY] = g_signal_new (
+        "context-ready",
         G_TYPE_FROM_CLASS (class),
-        (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+        (GSignalFlags)(G_SIGNAL_RUN_LAST),
         0,
         0,
         NULL,
-        g_cclosure_marshal_VOID__OBJECT,
+        g_cclosure_marshal_VOID__POINTER,
         G_TYPE_NONE, 1,
-        GTK_TYPE_WIDGET);
+        G_TYPE_POINTER);
 
-    signals[WINDOW_OBJECT_CLEARED] = g_signal_new (
-        "window-object-cleared",
+    signals[ATTACH_INSPECTOR] = g_signal_new (
+        "attach-inspector",
         G_TYPE_FROM_CLASS (class),
         (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
         0,
         0,
         NULL,
-        midori_cclosure_marshal_VOID__OBJECT_POINTER_POINTER,
-        G_TYPE_NONE, 3,
-        WEBKIT_TYPE_WEB_FRAME,
-        G_TYPE_POINTER,
-        G_TYPE_POINTER);
+        g_cclosure_marshal_VOID__OBJECT,
+        G_TYPE_NONE, 1,
+        GTK_TYPE_WIDGET);
 
     signals[NEW_TAB] = g_signal_new (
         "new-tab",
@@ -428,6 +387,15 @@ midori_view_class_init (MidoriViewClass* class)
                                      1.0f,
                                      G_PARAM_READWRITE));
 
+    /* g_object_class_install_property (gobject_class,
+                                     PROP_NEWS_FEEDS,
+                                     g_param_spec_object (
+                                     "news-feeds",
+                                     "News Feeds",
+                                     "The list of available news feeds",
+                                     KATZE_TYPE_ARRAY,
+                                     G_PARAM_READWRITE)); */
+
     g_object_class_install_property (gobject_class,
                                      PROP_STATUSBAR_TEXT,
                                      g_param_spec_string (
@@ -506,8 +474,6 @@ webkit_web_view_load_started_cb (WebKitWebView*  web_view,
                                  WebKitWebFrame* web_frame,
                                  MidoriView*     view)
 {
-    view->window_object_cleared = FALSE;
-
     view->load_status = MIDORI_LOAD_PROVISIONAL;
     g_object_notify (G_OBJECT (view), "load-status");
 
@@ -546,17 +512,11 @@ webkit_web_view_progress_changed_cb (WebKitWebView* web_view,
     g_object_notify (G_OBJECT (view), "progress");
 }
 
-/*
-static void
+/*static void
 gjs_value_links_foreach_cb (GjsValue*   link,
                             MidoriView* view)
 {
     const gchar* type;
-#if GLIB_CHECK_VERSION (2, 16, 0)
-    const gchar* rel;
-    GFile* icon_file;
-    GIcon* icon;
-#endif
 
     if (gjs_value_is_object (link) && gjs_value_has_attribute (link, "href"))
     {
@@ -568,29 +528,14 @@ gjs_value_links_foreach_cb (GjsValue*   link,
                 || !strcmp (type, "application/atom+xml"))
             {
                 katze_array_add_item (view->news_feeds, link);
-                g_signal_emit_by_name (view, "news-feed-ready",
+                g_signal_emit (view, signals[NEWS_FEED_READY],
                     gjs_value_get_attribute_string (link, "href"), type,
                     gjs_value_has_attribute (link, "title")
                     ? gjs_value_get_attribute_string (link, "title") : NULL);
             }
         }
-#if GLIB_CHECK_VERSION (2, 16, 0)
-        if (gjs_value_has_attribute (link, "rel"))
-        {
-            rel = gjs_value_get_attribute_string (link, "rel");
-            if (!strcmp (rel, "icon") || !strcmp (rel, "shortcut icon"))
-            {
-                icon_file = g_file_new_for_uri (
-                    gjs_value_get_attribute_string (link, "href"));
-                icon = g_file_icon_new (icon_file);
-                g_loadable_icon_load_async (G_LOADABLE_ICON (icon),
-                    0, NULL, (GAsyncReadyCallback)loadable_icon_finish_cb, view);
-            }
-        }
-#endif
     }
-}
-*/
+}*/
 
 static void
 webkit_web_frame_load_done_cb (WebKitWebFrame* web_frame,
@@ -598,11 +543,6 @@ webkit_web_frame_load_done_cb (WebKitWebFrame* web_frame,
                                MidoriView*     view)
 {
     gchar* data;
-    /*JSContextRef js_context;
-    JSValueRef js_window;
-    GjsValue* value;
-    GjsValue* document;
-    GjsValue* links; */
 
     if (!success)
     {
@@ -622,16 +562,6 @@ webkit_web_frame_load_done_cb (WebKitWebFrame* web_frame,
         g_free (data);
     }
 
-    /* js_context = webkit_web_frame_get_global_context (web_frame);
-    value = gjs_value_new (js_context, NULL);
-    document = gjs_value_get_by_name (value, "document");
-    links = gjs_value_get_elements_by_tag_name (document, "link");
-    katze_array_clear (web_view->news_feeds);
-    gjs_value_foreach (links, (GjsCallback)gjs_value_links_foreach_cb, web_view);
-    g_object_unref (links);
-    g_object_unref (document);
-    g_object_unref (value); */
-
     view->load_status = MIDORI_LOAD_FINISHED;
     g_object_notify (G_OBJECT (view), "load-status");
 }
@@ -641,8 +571,23 @@ webkit_web_view_load_finished_cb (WebKitWebView*  web_view,
                                   WebKitWebFrame* web_frame,
                                   MidoriView*     view)
 {
+    /* JSContextRef js_context;
+    GjsValue* value;
+    GjsValue* document;
+    GjsValue* links; */
+
     view->progress = 1.0;
     g_object_notify (G_OBJECT (view), "progress");
+
+    /* js_context = webkit_web_frame_get_global_context (web_frame);
+    value = gjs_value_new (js_context, NULL);
+    document = gjs_value_get_by_name (value, "document");
+    links = gjs_value_get_elements_by_tag_name (document, "link");
+    katze_array_clear (view->news_feeds);
+    gjs_value_foreach (links, (GjsCallback)gjs_value_links_foreach_cb, view);
+    g_object_unref (links);
+    g_object_unref (document);
+    g_object_unref (value); */
 }
 
 static void
@@ -1000,8 +945,7 @@ webkit_web_view_window_object_cleared_cb (GtkWidget*      web_view,
                                           JSObjectRef     js_window,
                                           MidoriView*     view)
 {
-    g_signal_emit (view, signals[WINDOW_OBJECT_CLEARED], 0,
-                   web_frame, js_context, js_window);
+    g_signal_emit (view, signals[CONTEXT_READY], 0, js_context);
 }
 
 static void
@@ -2154,3 +2098,26 @@ midori_view_set_highlight_text_matches (MidoriView* view,
     webkit_web_view_set_highlight_text_matches (
         WEBKIT_WEB_VIEW (view->web_view), highlight);
 }
+
+/**
+ * midori_view_execute_script
+ * @view: a #MidoriView
+ * @script: script code
+ * @exception: location to store an exception message
+ *
+ * Execute a script on the view.
+ *
+ * Returns: %TRUE if the script was executed successfully
+ **/
+gboolean
+midori_view_execute_script (MidoriView*  view,
+                            const gchar* script,
+                            gchar**      exception)
+{
+    g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE);
+    g_return_val_if_fail (script != NULL, FALSE);
+
+    /* FIXME Actually store exception. */
+    webkit_web_view_execute_script (WEBKIT_WEB_VIEW (view->web_view), script);
+    return TRUE;
+}
index 13a8c4baba2d10e7869fa50dfe19308059be3d5b..8a839d55c4a609cc2e6bd9eafd6d0dc4d1b0c2b3 100644 (file)
@@ -171,6 +171,11 @@ void
 midori_view_set_highlight_text_matches (MidoriView*        view,
                                         gboolean           highlight);
 
+gboolean
+midori_view_execute_script             (MidoriView*        view,
+                                        const gchar*       script,
+                                        gchar**            exception);
+
 G_END_DECLS
 
 #endif /* __MIDORI_VIEW_H__ */