[epiphany] web-extensions: Create the web extension proxy asynchronously
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany] web-extensions: Create the web extension proxy asynchronously
- Date: Sat, 23 Feb 2013 12:40:55 +0000 (UTC)
commit 12458bb74b5179d029a3fd2444183a67cc749af8
Author: Carlos Garcia Campos <cgarcia igalia com>
Date: Sat Feb 23 13:19:13 2013 +0100
web-extensions: Create the web extension proxy asynchronously
And watch the web extension also to clear the proxy if the extension
vanishes, normally due to a web process crash, and create the proxy
again when the web process is re-spawned.
https://bugzilla.gnome.org/show_bug.cgi?id=694519
embed/ephy-embed-shell.c | 82 +++++++++++++++++++++++++++++++++++-----------
embed/ephy-web-view.c | 8 +++-
2 files changed, 69 insertions(+), 21 deletions(-)
---
diff --git a/embed/ephy-embed-shell.c b/embed/ephy-embed-shell.c
index e5aa18e..cfede2f 100644
--- a/embed/ephy-embed-shell.c
+++ b/embed/ephy-embed-shell.c
@@ -60,6 +60,7 @@ struct _EphyEmbedShellPrivate
guint single_initialised : 1;
#ifdef HAVE_WEBKIT2
GDBusProxy *web_extension;
+ guint web_extension_watch_name_id;
#endif
};
@@ -101,6 +102,8 @@ ephy_embed_shell_dispose (GObject *object)
g_clear_object (&priv->adblock_manager);
#ifdef HAVE_WEBKIT2
g_clear_object (&priv->web_extension);
+ if (priv->web_extension_watch_name_id > 0)
+ g_bus_unwatch_name (priv->web_extension_watch_name_id);
#endif
G_OBJECT_CLASS (ephy_embed_shell_parent_class)->dispose (object);
@@ -121,6 +124,63 @@ ephy_embed_shell_finalize (GObject *object)
G_OBJECT_CLASS (ephy_embed_shell_parent_class)->finalize (object);
}
+static void
+web_extension_proxy_created_cb (GDBusConnection *connection,
+ GAsyncResult *result,
+ EphyEmbedShell *shell)
+{
+ GError *error = NULL;
+
+ shell->priv->web_extension = g_dbus_proxy_new_finish (result, &error);
+ if (!shell->priv->web_extension) {
+ g_warning ("Error creating web extension proxy: %s\n", error->message);
+ g_error_free (error);
+ }
+}
+
+static void
+web_extension_appeared_cb (GDBusConnection *connection,
+ const gchar *name,
+ const gchar *name_owner,
+ EphyEmbedShell *shell)
+{
+ g_dbus_proxy_new (connection,
+ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START |
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
+ NULL,
+ name,
+ EPHY_WEB_EXTENSION_OBJECT_PATH,
+ EPHY_WEB_EXTENSION_INTERFACE,
+ NULL,
+ (GAsyncReadyCallback)web_extension_proxy_created_cb,
+ shell);
+}
+
+static void
+web_extension_vanished_cb (GDBusConnection *connection,
+ const gchar *name,
+ EphyEmbedShell *shell)
+{
+ g_clear_object (&shell->priv->web_extension);
+}
+
+static void
+ephy_embed_shell_watch_web_extension (EphyEmbedShell *shell)
+{
+ char *service_name;
+
+ service_name = g_strdup_printf ("%s-%u", EPHY_WEB_EXTENSION_SERVICE_NAME, getpid ());
+ shell->priv->web_extension_watch_name_id =
+ g_bus_watch_name (G_BUS_TYPE_SESSION,
+ service_name,
+ G_BUS_NAME_WATCHER_FLAGS_NONE,
+ (GBusNameAppearedCallback) web_extension_appeared_cb,
+ (GBusNameVanishedCallback) web_extension_vanished_cb,
+ shell, NULL);
+ g_free (service_name);
+}
+
/**
* ephy_embed_shell_get_global_history_service:
* @shell: the #EphyEmbedShell
@@ -323,6 +383,8 @@ ephy_embed_shell_init (EphyEmbedShell *shell)
embed_shell = shell;
shell->priv->downloads = NULL;
+
+ ephy_embed_shell_watch_web_extension (shell);
}
static void
@@ -691,26 +753,8 @@ ephy_embed_shell_launch_handler (EphyEmbedShell *shell,
GDBusProxy *
ephy_embed_shell_get_web_extension_proxy (EphyEmbedShell *shell)
{
- EphyEmbedShellPrivate *priv;
-
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
- priv = shell->priv;
- if (!priv->web_extension) {
- char *service_name;
-
- service_name = g_strdup_printf ("%s-%u", EPHY_WEB_EXTENSION_SERVICE_NAME, getpid ());
- priv->web_extension = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
- NULL,
- service_name,
- EPHY_WEB_EXTENSION_OBJECT_PATH,
- EPHY_WEB_EXTENSION_INTERFACE,
- NULL,
- NULL);
- g_free (service_name);
- }
-
- return priv->web_extension;
+ return shell->priv->web_extension;
}
#endif
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index a2b8133..0973b5c 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -3411,13 +3411,17 @@ gboolean
ephy_web_view_has_modified_forms (EphyWebView *view)
{
#ifdef HAVE_WEBKIT2
+ GDBusProxy *web_extension;
GVariant *result;
gboolean retval = FALSE;
/* FIXME: This should be async */
- result = g_dbus_proxy_call_sync (ephy_embed_shell_get_web_extension_proxy (ephy_embed_shell_get_default
()),
+ web_extension = ephy_embed_shell_get_web_extension_proxy (ephy_embed_shell_get_default ());
+ if (!web_extension)
+ return FALSE;
+ result = g_dbus_proxy_call_sync (web_extension,
"HasModifiedForms",
- g_variant_new("(t)", webkit_web_view_get_page_id (WEBKIT_WEB_VIEW
(view))),
+ g_variant_new ("(t)", webkit_web_view_get_page_id (WEBKIT_WEB_VIEW
(view))),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]