[epiphany/carlosgc/pson: 1/2] Use the new WebKit user messages API instead of DBus



commit 35030d18725a387a9f000fddad04e515620f3b12
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Thu Nov 28 12:06:13 2019 +0100

    Use the new WebKit user messages API instead of DBus
    
    It simplifies the code a lot and it's also a lot more efficient.

 embed/ephy-embed-shell.c                           | 388 ++---------------
 embed/ephy-web-process-extension-proxy.c           | 354 ---------------
 embed/ephy-web-process-extension-proxy.h           |  58 ---
 embed/ephy-web-view.c                              | 173 ++++++--
 embed/ephy-web-view.h                              |   3 -
 embed/meson.build                                  |   1 -
 .../ephy-web-process-extension-main.c              |   9 +-
 .../ephy-web-process-extension.c                   | 477 ++++++++++-----------
 .../ephy-web-process-extension.h                   |   1 -
 embed/web-process-extension/resources/js/ephy.js   |   9 +-
 lib/ephy-dbus-names.h                              |  29 --
 lib/ephy-dbus-util.c                               |  40 --
 lib/ephy-dbus-util.h                               |  29 --
 lib/meson.build                                    |   1 -
 meson.build                                        |   2 +-
 15 files changed, 407 insertions(+), 1167 deletions(-)
---
diff --git a/embed/ephy-embed-shell.c b/embed/ephy-embed-shell.c
index 74e12a80d..697b04f85 100644
--- a/embed/ephy-embed-shell.c
+++ b/embed/ephy-embed-shell.c
@@ -23,7 +23,6 @@
 #include "ephy-embed-shell.h"
 
 #include "ephy-about-handler.h"
-#include "ephy-dbus-util.h"
 #include "ephy-debug.h"
 #include "ephy-downloads-manager.h"
 #include "ephy-embed-container.h"
@@ -43,7 +42,6 @@
 #include "ephy-uri-helpers.h"
 #include "ephy-view-source-handler.h"
 #include "ephy-web-app-utils.h"
-#include "ephy-web-process-extension-proxy.h"
 
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
@@ -66,8 +64,6 @@ typedef struct {
   EphyAboutHandler *about_handler;
   EphyViewSourceHandler *source_handler;
   char *guid;
-  GDBusServer *dbus_server;
-  GList *web_process_extensions;
   EphyFiltersManager *filters_manager;
   EphySearchEngineManager *search_engine_manager;
   GCancellable *cancellable;
@@ -76,7 +72,6 @@ typedef struct {
 enum {
   RESTORED_WINDOW,
   WEB_VIEW_CREATED,
-  PAGE_CREATED,
   ALLOW_TLS_CERTIFICATE,
   ALLOW_UNSAFE_BROWSING,
   PASSWORD_FORM_FOCUSED,
@@ -135,15 +130,6 @@ ephy_embed_shell_get_view_for_page_id (EphyEmbedShell *self,
   return NULL;
 }
 
-static EphyWebProcessExtensionProxy *
-ephy_embed_shell_get_extension_proxy_for_page_id (EphyEmbedShell *self,
-                                                  guint64         page_id,
-                                                  const char     *origin)
-{
-  EphyWebView *view = ephy_embed_shell_get_view_for_page_id (self, page_id, origin);
-  return view ? ephy_web_view_get_web_process_extension_proxy (view) : NULL;
-}
-
 static GList *
 tabs_catalog_get_tabs_info (EphyTabsCatalog *catalog)
 {
@@ -196,11 +182,6 @@ ephy_embed_shell_dispose (GObject *object)
     g_clear_object (&priv->cancellable);
   }
 
-  if (priv->web_process_extensions) {
-    g_list_free_full (priv->web_process_extensions, g_object_unref);
-    priv->web_process_extensions = NULL;
-  }
-
   g_clear_object (&priv->encodings);
   g_clear_object (&priv->page_setup);
   g_clear_object (&priv->print_settings);
@@ -213,7 +194,6 @@ ephy_embed_shell_dispose (GObject *object)
   g_clear_object (&priv->permissions_manager);
   g_clear_object (&priv->web_context);
   g_clear_pointer (&priv->guid, g_free);
-  g_clear_object (&priv->dbus_server);
   g_clear_object (&priv->filters_manager);
   g_clear_object (&priv->search_engine_manager);
 
@@ -246,18 +226,22 @@ history_service_query_urls_cb (EphyHistoryService *service,
 {
   EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
   GList *l;
+  GVariantBuilder builder;
 
   if (!success)
     return;
 
-  for (l = priv->web_process_extensions; l; l = g_list_next (l)) {
-    EphyWebProcessExtensionProxy *web_process_extension = (EphyWebProcessExtensionProxy *)l->data;
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ss)"));
+  for (l = urls; l; l = g_list_next (l)) {
+    EphyHistoryURL *url = (EphyHistoryURL *)l->data;
 
-    ephy_web_process_extension_proxy_history_set_urls (web_process_extension, urls);
+    g_variant_builder_add (&builder, "(ss)", url->url, url->title);
+    ephy_embed_shell_schedule_thumbnail_update (shell, (EphyHistoryURL *)l->data);
   }
 
-  for (l = urls; l; l = g_list_next (l))
-    ephy_embed_shell_schedule_thumbnail_update (shell, (EphyHistoryURL *)l->data);
+  webkit_web_context_send_message_to_all_extensions (priv->web_context,
+                                                     webkit_user_message_new ("History.SetURLs",
+                                                                              g_variant_builder_end 
(&builder)));
 }
 
 static void
@@ -340,46 +324,6 @@ web_process_extension_about_apps_message_received_cb (WebKitUserContentManager *
   ephy_web_application_delete (app_id);
 }
 
-typedef struct {
-  EphyEmbedShell *shell;
-  char *origin;
-  gint32 promise_id;
-  guint64 page_id;
-  guint64 frame_id;
-} PasswordManagerData;
-
-static void
-password_manager_data_free (PasswordManagerData *data)
-{
-  g_object_unref (data->shell);
-  g_free (data->origin);
-  g_free (data);
-}
-
-static void
-password_manager_query_finished_cb (GList               *records,
-                                    PasswordManagerData *data)
-{
-  EphyWebProcessExtensionProxy *proxy;
-  EphyPasswordRecord *record;
-  const char *username = NULL;
-  const char *password = NULL;
-
-  record = records && records->data ? EPHY_PASSWORD_RECORD (records->data) : NULL;
-  if (record) {
-    username = ephy_password_record_get_username (record);
-    password = ephy_password_record_get_password (record);
-  }
-
-  proxy = ephy_embed_shell_get_extension_proxy_for_page_id (data->shell,
-                                                            data->page_id,
-                                                            data->origin);
-  if (proxy)
-    ephy_web_process_extension_proxy_password_query_response (proxy, username, password, data->promise_id, 
data->frame_id);
-
-  password_manager_data_free (data);
-}
-
 static char *
 property_to_string_or_null (JSCValue   *value,
                             const char *name)
@@ -406,51 +350,6 @@ property_to_uint64 (JSCValue   *value,
   return (guint64)jsc_value_to_double (prop);
 }
 
-static void
-web_process_extension_password_manager_query_received_cb (WebKitUserContentManager *manager,
-                                                          WebKitJavascriptResult   *message,
-                                                          EphyEmbedShell           *shell)
-{
-  EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  JSCValue *value = webkit_javascript_result_get_js_value (message);
-  g_autofree char *origin = property_to_string_or_null (value, "origin");
-  g_autofree char *target_origin = property_to_string_or_null (value, "targetOrigin");
-  g_autofree char *username = property_to_string_or_null (value, "username");
-  g_autofree char *username_field = property_to_string_or_null (value, "usernameField");
-  g_autofree char *password_field = property_to_string_or_null (value, "passwordField");
-  gint32 promise_id = property_to_int32 (value, "promiseID");
-  guint64 page_id = property_to_uint64 (value, "pageID");
-  guint64 frame_id = property_to_uint64 (value, "frameID");
-  PasswordManagerData *data;
-
-  if (!origin || !target_origin || !password_field)
-    return;
-
-  /* Don't include username_field in queries unless we actually have a username
-   * to go along with it, or the query will fail because we don't save
-   * username_field without a corresponding username.
-   */
-  if (!username && username_field)
-    g_clear_pointer (&username_field, g_free);
-
-  data = g_new (PasswordManagerData, 1);
-  data->shell = g_object_ref (shell);
-  data->promise_id = promise_id;
-  data->page_id = page_id;
-  data->frame_id = frame_id;
-  data->origin = g_strdup (origin);
-
-  ephy_password_manager_query (priv->password_manager,
-                               NULL,
-                               origin,
-                               target_origin,
-                               username,
-                               username_field,
-                               password_field,
-                               (EphyPasswordManagerQueryCallback)password_manager_query_finished_cb,
-                               data);
-}
-
 typedef struct {
   EphyPasswordManager *password_manager;
   EphyPermissionsManager *permissions_manager;
@@ -577,30 +476,6 @@ web_process_extension_password_manager_request_save_received_cb (WebKitUserConte
   web_process_extension_password_manager_save_real (shell, value, TRUE);
 }
 
-static void
-web_process_extension_password_manager_query_usernames_received_cb (WebKitUserContentManager *manager,
-                                                                    WebKitJavascriptResult   *message,
-                                                                    EphyEmbedShell           *shell)
-{
-  EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  JSCValue *value = webkit_javascript_result_get_js_value (message);
-  g_autofree char *origin = property_to_string_or_null (value, "origin");
-  gint32 promise_id = property_to_int32 (value, "promiseID");
-  guint64 page_id = property_to_uint64 (value, "pageID");
-  guint64 frame_id = property_to_uint64 (value, "frameID");
-  GList *usernames;
-  EphyWebProcessExtensionProxy *proxy;
-
-  if (!origin)
-    return;
-
-  usernames = ephy_password_manager_get_usernames_for_origin (priv->password_manager, origin);
-
-  proxy = ephy_embed_shell_get_extension_proxy_for_page_id (shell, page_id, origin);
-  if (proxy)
-    ephy_web_process_extension_proxy_password_query_usernames_response (proxy, usernames, promise_id, 
frame_id);
-}
-
 static void
 history_service_url_title_changed_cb (EphyHistoryService *service,
                                       const char         *url,
@@ -608,13 +483,10 @@ history_service_url_title_changed_cb (EphyHistoryService *service,
                                       EphyEmbedShell     *shell)
 {
   EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  GList *l;
 
-  for (l = priv->web_process_extensions; l; l = g_list_next (l)) {
-    EphyWebProcessExtensionProxy *web_process_extension = (EphyWebProcessExtensionProxy *)l->data;
-
-    ephy_web_process_extension_proxy_history_set_url_title (web_process_extension, url, title);
-  }
+  webkit_web_context_send_message_to_all_extensions (priv->web_context,
+                                                     webkit_user_message_new ("History.SetURLTitle",
+                                                                              g_variant_new ("(ss)", url, 
title)));
 }
 
 static void
@@ -623,13 +495,10 @@ history_service_url_deleted_cb (EphyHistoryService *service,
                                 EphyEmbedShell     *shell)
 {
   EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  GList *l;
 
-  for (l = priv->web_process_extensions; l; l = g_list_next (l)) {
-    EphyWebProcessExtensionProxy *web_process_extension = (EphyWebProcessExtensionProxy *)l->data;
-
-    ephy_web_process_extension_proxy_history_delete_url (web_process_extension, url->url);
-  }
+  webkit_web_context_send_message_to_all_extensions (priv->web_context,
+                                                     webkit_user_message_new ("History.DeleteURL",
+                                                                              g_variant_new ("s", url)));
 }
 
 static void
@@ -638,16 +507,12 @@ history_service_host_deleted_cb (EphyHistoryService *service,
                                  EphyEmbedShell     *shell)
 {
   EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  GList *l;
   g_autoptr (SoupURI) deleted_uri = NULL;
 
   deleted_uri = soup_uri_new (deleted_url);
-
-  for (l = priv->web_process_extensions; l; l = g_list_next (l)) {
-    EphyWebProcessExtensionProxy *web_process_extension = (EphyWebProcessExtensionProxy *)l->data;
-
-    ephy_web_process_extension_proxy_history_delete_host (web_process_extension, soup_uri_get_host 
(deleted_uri));
-  }
+  webkit_web_context_send_message_to_all_extensions (priv->web_context,
+                                                     webkit_user_message_new ("History.DeleteHost",
+                                                                              g_variant_new ("s", 
soup_uri_get_host (deleted_uri))));
 }
 
 static void
@@ -655,60 +520,10 @@ history_service_cleared_cb (EphyHistoryService *service,
                             EphyEmbedShell     *shell)
 {
   EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  GList *l;
 
-  for (l = priv->web_process_extensions; l; l = g_list_next (l)) {
-    EphyWebProcessExtensionProxy *web_process_extension = (EphyWebProcessExtensionProxy *)l->data;
-
-    ephy_web_process_extension_proxy_history_clear (web_process_extension);
-  }
-}
-
-typedef struct {
-  EphyWebProcessExtensionProxy *extension;
-  char *url;
-  char *path;
-} DelayedThumbnailUpdateData;
-
-static DelayedThumbnailUpdateData *
-delayed_thumbnail_update_data_new (EphyWebProcessExtensionProxy *extension,
-                                   const char                   *url,
-                                   const char                   *path)
-{
-  DelayedThumbnailUpdateData *data = g_new (DelayedThumbnailUpdateData, 1);
-  data->extension = extension;
-  data->url = g_strdup (url);
-  data->path = g_strdup (path);
-  g_object_add_weak_pointer (G_OBJECT (extension), (gpointer *)&data->extension);
-  return data;
-}
-
-static void
-delayed_thumbnail_update_data_free (DelayedThumbnailUpdateData *data)
-{
-  if (data->extension)
-    g_object_remove_weak_pointer (G_OBJECT (data->extension), (gpointer *)&data->extension);
-  g_free (data->url);
-  g_free (data->path);
-  g_free (data);
-}
-
-static gboolean
-delayed_thumbnail_update_cb (DelayedThumbnailUpdateData *data)
-{
-  if (!data->extension) {
-    delayed_thumbnail_update_data_free (data);
-    return G_SOURCE_REMOVE;
-  }
-
-  if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data->extension), "initialized"))) {
-    ephy_web_process_extension_proxy_history_set_url_thumbnail (data->extension, data->url, data->path);
-    delayed_thumbnail_update_data_free (data);
-    return G_SOURCE_REMOVE;
-  }
-
-  /* Web process extension is not initialized yet, try again later.... */
-  return G_SOURCE_CONTINUE;
+  webkit_web_context_send_message_to_all_extensions (priv->web_context,
+                                                     webkit_user_message_new ("History.Clear",
+                                                                              NULL));
 }
 
 void
@@ -717,17 +532,10 @@ ephy_embed_shell_set_thumbnail_path (EphyEmbedShell *shell,
                                      const char     *path)
 {
   EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  GList *l;
 
-  for (l = priv->web_process_extensions; l; l = g_list_next (l)) {
-    EphyWebProcessExtensionProxy *web_process_extension = (EphyWebProcessExtensionProxy *)l->data;
-    if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (web_process_extension), "initialized"))) {
-      ephy_web_process_extension_proxy_history_set_url_thumbnail (web_process_extension, url, path);
-    } else {
-      DelayedThumbnailUpdateData *data = delayed_thumbnail_update_data_new (web_process_extension, url, 
path);
-      g_timeout_add (50, (GSourceFunc)delayed_thumbnail_update_cb, data);
-    }
-  }
+  webkit_web_context_send_message_to_all_extensions (priv->web_context,
+                                                     webkit_user_message_new ("History.SetURLThumbnail",
+                                                                              g_variant_new ("(ss)", url, 
path)));
 }
 
 static void
@@ -913,7 +721,6 @@ initialize_web_process_extensions (WebKitWebContext *web_context,
   EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
   g_autoptr (GVariant) user_data = NULL;
   gboolean private_profile;
-  const char *address;
 
 #if DEVELOPER_MODE
   webkit_web_context_set_web_extensions_directory (web_context, BUILD_ROOT "/embed/web-process-extension");
@@ -921,12 +728,9 @@ initialize_web_process_extensions (WebKitWebContext *web_context,
   webkit_web_context_set_web_extensions_directory (web_context, EPHY_WEB_PROCESS_EXTENSIONS_DIR);
 #endif
 
-  address = priv->dbus_server ? g_dbus_server_get_client_address (priv->dbus_server) : NULL;
-
   private_profile = priv->mode == EPHY_EMBED_SHELL_MODE_PRIVATE || priv->mode == 
EPHY_EMBED_SHELL_MODE_INCOGNITO || priv->mode == EPHY_EMBED_SHELL_MODE_AUTOMATION;
-  user_data = g_variant_new ("(smsmsbb)",
+  user_data = g_variant_new ("(smsbb)",
                              priv->guid,
-                             address,
                              ephy_profile_dir_is_default () ? NULL : ephy_profile_dir (),
                              g_settings_get_boolean (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_REMEMBER_PASSWORDS),
                              private_profile);
@@ -948,93 +752,6 @@ initialize_notification_permissions (WebKitWebContext *web_context,
   webkit_web_context_initialize_notification_permissions (web_context, permitted_origins, denied_origins);
 }
 
-static void
-web_process_extension_page_created (EphyWebProcessExtensionProxy *extension,
-                                    guint64                       page_id,
-                                    EphyEmbedShell               *shell)
-{
-  g_object_set_data (G_OBJECT (extension), "initialized", GINT_TO_POINTER (TRUE));
-  g_signal_emit (shell, signals[PAGE_CREATED], 0, page_id, extension);
-}
-
-static void
-web_process_extension_connection_closed (EphyWebProcessExtensionProxy *extension,
-                                         EphyEmbedShell               *shell)
-{
-  EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-
-  priv->web_process_extensions = g_list_remove (priv->web_process_extensions, extension);
-  g_object_unref (extension);
-}
-
-static gboolean
-new_connection_cb (GDBusServer     *server,
-                   GDBusConnection *connection,
-                   EphyEmbedShell  *shell)
-{
-  EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  g_autoptr (EphyWebProcessExtensionProxy) extension = NULL;
-
-  extension = ephy_web_process_extension_proxy_new (connection);
-
-  g_signal_connect_object (extension, "page-created",
-                           G_CALLBACK (web_process_extension_page_created), shell, 0);
-  g_signal_connect_object (extension, "connection-closed",
-                           G_CALLBACK (web_process_extension_connection_closed), shell, 0);
-
-  priv->web_process_extensions = g_list_prepend (priv->web_process_extensions, g_steal_pointer (&extension));
-
-  return TRUE;
-}
-
-static gboolean
-authorize_authenticated_peer_cb (GDBusAuthObserver *observer,
-                                 GIOStream         *stream,
-                                 GCredentials      *credentials,
-                                 EphyEmbedShell    *shell)
-{
-  return ephy_dbus_peer_is_authorized (credentials);
-}
-
-static void
-ephy_embed_shell_setup_web_process_extensions_server (EphyEmbedShell *shell)
-{
-  EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  g_autoptr (GDBusAuthObserver) observer = NULL;
-  g_autofree char *address = NULL;
-  g_autoptr (GError) error = NULL;
-
-  /* Due to the bubblewrap sandbox, we cannot use any abstract sockets here.
-   * This means that unix:tmpdir= or unix:abstract= addresses will not work.
-   * Using unix:dir= guarantees that abstract sockets won't be used.
-   */
-  address = g_strdup_printf ("unix:dir=%s", ephy_file_tmp_dir ());
-
-  observer = g_dbus_auth_observer_new ();
-
-  g_signal_connect_object (observer, "authorize-authenticated-peer",
-                           G_CALLBACK (authorize_authenticated_peer_cb), shell, 0);
-
-  /* Why sync?
-   *
-   * (a) The server must be started before web process extensions try to connect.
-   * (b) Gio actually has no async version. Don't know why.
-   */
-  priv->dbus_server = g_dbus_server_new_sync (address,
-                                              G_DBUS_SERVER_FLAGS_NONE,
-                                              priv->guid,
-                                              observer,
-                                              NULL,
-                                              &error);
-
-  if (error)
-    g_error ("Failed to start embed shell D-Bus server on %s: %s", address, error->message);
-
-  g_signal_connect_object (priv->dbus_server, "new-connection",
-                           G_CALLBACK (new_connection_cb), shell, 0);
-  g_dbus_server_start (priv->dbus_server);
-}
-
 static void
 ephy_embed_shell_create_web_context (EphyEmbedShell *shell)
 {
@@ -1095,16 +812,12 @@ remember_passwords_setting_changed_cb (GSettings      *settings,
 {
   EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
   gboolean should_remember_passwords;
-  GList *l;
 
   should_remember_passwords = g_settings_get_boolean (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_REMEMBER_PASSWORDS);
 
-  for (l = priv->web_process_extensions; l; l = g_list_next (l)) {
-    EphyWebProcessExtensionProxy *web_process_extension = (EphyWebProcessExtensionProxy *)l->data;
-
-    ephy_web_process_extension_proxy_set_should_remember_passwords (web_process_extension,
-                                                                    should_remember_passwords);
-  }
+  webkit_web_context_send_message_to_all_extensions (priv->web_context,
+                                                     webkit_user_message_new 
("PasswordManager.SetShouldRememberPasswords",
+                                                                              g_variant_new ("b", 
should_remember_passwords)));
 }
 
 static void
@@ -1121,8 +834,6 @@ ephy_embed_shell_startup (GApplication *application)
 
   ephy_embed_shell_create_web_context (shell);
 
-  ephy_embed_shell_setup_web_process_extensions_server (shell);
-
   webkit_web_context_set_process_model (priv->web_context, 
WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES);
 
   webkit_web_context_set_sandbox_enabled (priv->web_context, TRUE);
@@ -1204,14 +915,8 @@ ephy_embed_shell_startup (GApplication *application)
 static void
 ephy_embed_shell_shutdown (GApplication *application)
 {
-  EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (EPHY_EMBED_SHELL (application));
-
   G_APPLICATION_CLASS (ephy_embed_shell_parent_class)->shutdown (application);
 
-  if (priv->dbus_server)
-    g_dbus_server_stop (priv->dbus_server);
-
-
   g_object_unref (ephy_embed_prefs_get_settings ());
   ephy_embed_utils_shutdown ();
 }
@@ -1339,23 +1044,6 @@ ephy_embed_shell_class_init (EphyEmbedShellClass *klass)
                   G_TYPE_NONE, 1,
                   EPHY_TYPE_WEB_VIEW);
 
-  /**
-   * EphyEmbedShell::page-created:
-   * @shell: the #EphyEmbedShell
-   * @page_id: the identifier of the web page created
-   * @web_process_extension: the #EphyWebProcessExtensionProxy
-   *
-   * Emitted when a web page is created in the web process.
-   */
-  signals[PAGE_CREATED] =
-    g_signal_new ("page-created",
-                  EPHY_TYPE_EMBED_SHELL,
-                  G_SIGNAL_RUN_FIRST,
-                  0, NULL, NULL, NULL,
-                  G_TYPE_NONE, 2,
-                  G_TYPE_UINT64,
-                  EPHY_TYPE_WEB_PROCESS_EXTENSION_PROXY);
-
   /**
    * EphyEmbedShell::allow-tls-certificate:
    * @shell: the #EphyEmbedShell
@@ -1658,20 +1346,6 @@ ephy_embed_shell_register_ucm_handler (EphyEmbedShell           *shell,
                            G_CALLBACK (web_process_extension_about_apps_message_received_cb),
                            shell, 0);
 
-  webkit_user_content_manager_register_script_message_handler_in_world (ucm,
-                                                                        "passwordManagerQuery",
-                                                                        priv->guid);
-  g_signal_connect_object (ucm, "script-message-received::passwordManagerQuery",
-                           G_CALLBACK (web_process_extension_password_manager_query_received_cb),
-                           shell, 0);
-
-  webkit_user_content_manager_register_script_message_handler_in_world (ucm,
-                                                                        "passwordManagerQueryUsernames",
-                                                                        priv->guid);
-  g_signal_connect_object (ucm, "script-message-received::passwordManagerQueryUsernames",
-                           G_CALLBACK (web_process_extension_password_manager_query_usernames_received_cb),
-                           shell, 0);
-
   webkit_user_content_manager_register_script_message_handler_in_world (ucm,
                                                                         "passwordManagerSave",
                                                                         priv->guid);
@@ -1724,13 +1398,7 @@ ephy_embed_shell_unregister_ucm_handler (EphyEmbedShell           *shell,
                                                                           "passwordFormFocused",
                                                                           priv->guid);
   webkit_user_content_manager_unregister_script_message_handler (ucm, "aboutApps");
-  webkit_user_content_manager_unregister_script_message_handler_in_world (ucm,
-                                                                          "passwordManagerQuery",
-                                                                          priv->guid);
   webkit_user_content_manager_unregister_script_message_handler_in_world (ucm,
                                                                           "passwordManagerSave",
                                                                           priv->guid);
-  webkit_user_content_manager_unregister_script_message_handler_in_world (ucm,
-                                                                          "passwordManagerQueryUsernames",
-                                                                          priv->guid);
 }
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index 1c5676183..bc2096543 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -128,9 +128,6 @@ struct _EphyWebView {
   char *tls_error_failing_uri;
 
   EphyWebViewErrorPage error_page;
-
-  /* Web Process Extension */
-  EphyWebProcessExtensionProxy *web_process_extension;
 };
 
 typedef struct {
@@ -899,22 +896,6 @@ allow_unsafe_browsing_cb (EphyEmbedShell *shell,
   ephy_web_view_load_url (view, ephy_web_view_get_address (view));
 }
 
-static void
-page_created_cb (EphyEmbedShell               *shell,
-                 guint64                       page_id,
-                 EphyWebProcessExtensionProxy *web_process_extension,
-                 EphyWebView                  *view)
-{
-  if (webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (view)) != page_id)
-    return;
-
-  if (view->web_process_extension)
-    g_object_remove_weak_pointer (G_OBJECT (view->web_process_extension), (gpointer 
*)&view->web_process_extension);
-
-  view->web_process_extension = web_process_extension;
-  g_object_add_weak_pointer (G_OBJECT (view->web_process_extension), (gpointer 
*)&view->web_process_extension);
-}
-
 static void
 ephy_web_view_dispose (GObject *object)
 {
@@ -924,11 +905,6 @@ ephy_web_view_dispose (GObject *object)
   ephy_embed_prefs_unregister_ucm (ucm);
   ephy_embed_shell_unregister_ucm_handler (ephy_embed_shell_get_default (), ucm);
 
-  if (view->web_process_extension) {
-    g_object_remove_weak_pointer (G_OBJECT (view->web_process_extension), (gpointer 
*)&view->web_process_extension);
-    view->web_process_extension = NULL;
-  }
-
   untrack_info_bar (&view->geolocation_info_bar);
   untrack_info_bar (&view->notification_info_bar);
   untrack_info_bar (&view->microphone_info_bar);
@@ -2958,6 +2934,143 @@ authenticate_cb (WebKitWebView               *web_view,
   return FALSE;
 }
 
+typedef struct {
+  WebKitWebView *web_view;
+  char *origin;
+  WebKitUserMessage *message;
+} PasswordManagerData;
+
+static void
+password_manager_data_free (PasswordManagerData *data)
+{
+  g_object_unref (data->web_view);
+  g_object_unref (data->message);
+  g_free (data);
+}
+
+static void
+password_manager_query_finished_cb (GList               *records,
+                                    PasswordManagerData *data)
+{
+  EphyPasswordRecord *record;
+  const char *origin;
+  const char *username = NULL;
+  const char *password = NULL;
+  g_autofree char *real_origin = NULL;
+
+  record = records && records->data ? EPHY_PASSWORD_RECORD (records->data) : NULL;
+  if (record) {
+    username = ephy_password_record_get_username (record);
+    password = ephy_password_record_get_password (record);
+  }
+
+  g_variant_get (webkit_user_message_get_parameters (data->message), "(&s@sm@sm@s@s)", &origin, NULL, NULL, 
NULL, NULL);
+  real_origin = ephy_uri_to_security_origin (webkit_web_view_get_uri (data->web_view));
+  if (g_strcmp0 (real_origin, origin) != 0) {
+    g_debug ("Extension's origin '%s' doesn't match real origin '%s'", origin, real_origin);
+    password_manager_data_free (data);
+    return;
+  }
+
+  webkit_user_message_send_reply (data->message,
+                                  webkit_user_message_new ("PasswordManager.QueryPasswordResponse",
+                                                           g_variant_new ("(msms)", username, password)));
+  password_manager_data_free (data);
+}
+
+static gboolean
+password_manager_handle_query_usernames_message (WebKitWebView     *web_view,
+                                                 WebKitUserMessage *message)
+{
+  GVariant *parameters;
+  const char *origin;
+  EphyPasswordManager *password_manager;
+  GList *usernames, *l;
+  GVariantBuilder builder;
+  g_autofree char *real_origin = NULL;
+
+  parameters = webkit_user_message_get_parameters (message);
+  if (!parameters)
+    return FALSE;
+
+  g_variant_get (parameters, "&s", &origin);
+  real_origin = ephy_uri_to_security_origin (webkit_web_view_get_uri (web_view));
+  if (g_strcmp0 (real_origin, origin) != 0) {
+    g_debug ("Extension's origin '%s' doesn't match real origin '%s'", origin, real_origin);
+    return FALSE;
+  }
+
+  password_manager = ephy_embed_shell_get_password_manager (ephy_embed_shell_get_default ());
+  usernames = ephy_password_manager_get_usernames_for_origin (password_manager, origin);
+
+  g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
+  for (l = usernames; l != NULL; l = g_list_next (l))
+    g_variant_builder_add (&builder, "s", l->data);
+
+  webkit_user_message_send_reply (message, webkit_user_message_new ("PasswordManager.QueryUsernamesResponse",
+                                                                    g_variant_builder_end (&builder)));
+  return TRUE;
+}
+
+static gboolean
+password_manager_handle_query_password_message (WebKitWebView     *web_view,
+                                                WebKitUserMessage *message)
+{
+  GVariant *parameters;
+  const char *origin;
+  const char *target_origin;
+  const char *username;
+  const char *username_field;
+  const char *password_field;
+  EphyPasswordManager *password_manager;
+  PasswordManagerData *data;
+
+  parameters = webkit_user_message_get_parameters (message);
+  if (!parameters)
+    return FALSE;
+
+  g_variant_get (parameters, "(&s&sm&sm&s&s)", &origin, &target_origin, &username, &username_field, 
&password_field);
+
+  /* Don't include username_field in queries unless we actually have a username
+   * to go along with it, or the query will fail because we don't save
+   * username_field without a corresponding username.
+   */
+  if (!username && username_field)
+    username_field = NULL;
+
+  data = g_new (PasswordManagerData, 1);
+  data->web_view = g_object_ref (web_view);
+  data->message = g_object_ref (message);
+
+  password_manager = ephy_embed_shell_get_password_manager (ephy_embed_shell_get_default ());
+  ephy_password_manager_query (password_manager,
+                               NULL,
+                               origin,
+                               target_origin,
+                               username,
+                               username_field,
+                               password_field,
+                               (EphyPasswordManagerQueryCallback)password_manager_query_finished_cb,
+                               data);
+  return TRUE;
+}
+
+static gboolean
+user_message_received_cb (WebKitWebView     *web_view,
+                          WebKitUserMessage *message)
+{
+  const char *name;
+
+  name = webkit_user_message_get_name (message);
+  if (g_strcmp0 (name, "PasswordManager.QueryUsernames") == 0)
+    return password_manager_handle_query_usernames_message (web_view, message);
+
+  if (g_strcmp0 (name, "PasswordManager.QueryPassword") == 0)
+    return password_manager_handle_query_password_message (web_view, message);
+
+  return FALSE;
+}
+
 static void
 ephy_web_view_init (EphyWebView *web_view)
 {
@@ -3042,9 +3155,9 @@ ephy_web_view_init (EphyWebView *web_view)
                     G_CALLBACK (authenticate_cb),
                     NULL);
 
-  g_signal_connect_object (shell, "page-created",
-                           G_CALLBACK (page_created_cb),
-                           web_view, 0);
+  g_signal_connect (web_view, "user-message-received",
+                    G_CALLBACK (user_message_received_cb),
+                    NULL);
 
   g_signal_connect_object (shell, "password-form-focused",
                            G_CALLBACK (password_form_focused_cb),
@@ -4028,12 +4141,6 @@ ephy_web_view_get_reader_mode_state (EphyWebView *view)
   return view->reader_active;
 }
 
-EphyWebProcessExtensionProxy *
-ephy_web_view_get_web_process_extension_proxy (EphyWebView *view)
-{
-  return view->web_process_extension;
-}
-
 gboolean
 ephy_web_view_is_in_auth_dialog (EphyWebView *view)
 {
diff --git a/embed/ephy-web-view.h b/embed/ephy-web-view.h
index acb032738..3d66760be 100644
--- a/embed/ephy-web-view.h
+++ b/embed/ephy-web-view.h
@@ -26,7 +26,6 @@
 #include "ephy-embed-shell.h"
 #include "ephy-history-types.h"
 #include "ephy-security-levels.h"
-#include "ephy-web-process-extension-proxy.h"
 
 G_BEGIN_DECLS
 
@@ -166,8 +165,6 @@ gboolean                   ephy_web_view_get_reader_mode_state    (EphyWebView
 
 gboolean                   ephy_web_view_is_in_auth_dialog        (EphyWebView               *view);
 
-EphyWebProcessExtensionProxy *ephy_web_view_get_web_process_extension_proxy  (EphyWebView               
*view);
-
 void                       ephy_web_view_show_auth_form_save_request (EphyWebView                    
*web_view,
                                                                       const char                     *origin,
                                                                       const char                     
*username,
diff --git a/embed/meson.build b/embed/meson.build
index 05a064090..47a38c499 100644
--- a/embed/meson.build
+++ b/embed/meson.build
@@ -28,7 +28,6 @@ libephyembed_sources = [
   'ephy-find-toolbar.c',
   'ephy-view-source-handler.c',
   'ephy-web-view.c',
-  'ephy-web-process-extension-proxy.c',
   enums
 ]
 
diff --git a/embed/web-process-extension/ephy-web-process-extension-main.c 
b/embed/web-process-extension/ephy-web-process-extension-main.c
index 76fb294cc..3a155a13c 100644
--- a/embed/web-process-extension/ephy-web-process-extension-main.c
+++ b/embed/web-process-extension/ephy-web-process-extension-main.c
@@ -36,18 +36,12 @@ webkit_web_extension_initialize_with_user_data (WebKitWebExtension *webkit_exten
                                                 GVariant           *user_data)
 {
   const char *guid;
-  const char *server_address;
   const char *profile_dir;
   gboolean private_profile;
   gboolean should_remember_passwords;
   g_autoptr (GError) error = NULL;
 
-  g_variant_get (user_data, "(&sm&sm&sbb)", &guid, &server_address, &profile_dir, 
&should_remember_passwords, &private_profile);
-
-  if (!server_address) {
-    g_warning ("UI process did not start D-Bus server, giving up.");
-    return;
-  }
+  g_variant_get (user_data, "(&sm&sbb)", &guid, &profile_dir, &should_remember_passwords, &private_profile);
 
   if (!ephy_file_helpers_init (profile_dir, 0, &error))
     g_warning ("Failed to initialize file helpers: %s", error->message);
@@ -62,7 +56,6 @@ webkit_web_extension_initialize_with_user_data (WebKitWebExtension *webkit_exten
   ephy_web_process_extension_initialize (extension,
                                          webkit_extension,
                                          guid,
-                                         server_address,
                                          should_remember_passwords,
                                          private_profile);
 }
diff --git a/embed/web-process-extension/ephy-web-process-extension.c 
b/embed/web-process-extension/ephy-web-process-extension.c
index e0b0adc49..d779aa7af 100644
--- a/embed/web-process-extension/ephy-web-process-extension.c
+++ b/embed/web-process-extension/ephy-web-process-extension.c
@@ -21,8 +21,6 @@
 #include "config.h"
 #include "ephy-web-process-extension.h"
 
-#include "ephy-dbus-names.h"
-#include "ephy-dbus-util.h"
 #include "ephy-debug.h"
 #include "ephy-file-helpers.h"
 #include "ephy-permissions-manager.h"
@@ -47,9 +45,6 @@ struct _EphyWebProcessExtension {
   WebKitWebExtension *extension;
   gboolean initialized;
 
-  GDBusConnection *dbus_connection;
-  GArray *page_created_signals_pending;
-
   EphyWebOverviewModel *overview_model;
   EphyPermissionsManager *permissions_manager;
 
@@ -61,47 +56,6 @@ struct _EphyWebProcessExtension {
   GHashTable *frames_map;
 };
 
-static const char introspection_xml[] =
-  "<node>"
-  " <interface name='org.gnome.Epiphany.WebProcessExtension'>"
-  "  <signal name='PageCreated'>"
-  "   <arg type='t' name='page_id' direction='out'/>"
-  "  </signal>"
-  "  <method name='HistorySetURLs'>"
-  "   <arg type='a(ss)' name='urls' direction='in'/>"
-  "  </method>"
-  "  <method name='HistorySetURLThumbnail'>"
-  "   <arg type='s' name='url' direction='in'/>"
-  "   <arg type='s' name='path' direction='in'/>"
-  "  </method>"
-  "  <method name='HistorySetURLTitle'>"
-  "   <arg type='s' name='url' direction='in'/>"
-  "   <arg type='s' name='title' direction='in'/>"
-  "  </method>"
-  "  <method name='HistoryDeleteURL'>"
-  "   <arg type='s' name='url' direction='in'/>"
-  "  </method>"
-  "  <method name='HistoryDeleteHost'>"
-  "   <arg type='s' name='host' direction='in'/>"
-  "  </method>"
-  "  <method name='HistoryClear'/>"
-  "  <method name='PasswordQueryResponse'>"
-  "    <arg type='s' name='username' direction='in'/>"
-  "    <arg type='s' name='password' direction='in'/>"
-  "    <arg type='i' name='promise_id' direction='in'/>"
-  "    <arg type='t' name='frame_id' direction='in'/>"
-  "  </method>"
-  "  <method name='PasswordQueryUsernamesResponse'>"
-  "    <arg type='as' name='users' direction='in'/>"
-  "    <arg type='i' name='promise_id' direction='in'/>"
-  "    <arg type='t' name='frame_id' direction='in'/>"
-  "  </method>"
-  "  <method name='SetShouldRememberPasswords'>"
-  "    <arg type='b' name='should_remember_passwords' direction='in'/>"
-  "  </method>"
-  " </interface>"
-  "</node>";
-
 G_DEFINE_TYPE (EphyWebProcessExtension, ephy_web_process_extension, G_TYPE_OBJECT)
 
 static gboolean
@@ -273,67 +227,15 @@ web_page_context_menu (WebKitWebPage          *web_page,
   return TRUE;
 }
 
-static void
-ephy_web_process_extension_emit_page_created (EphyWebProcessExtension *extension,
-                                              guint64                  page_id)
-{
-  g_autoptr (GError) error = NULL;
-
-  g_dbus_connection_emit_signal (extension->dbus_connection,
-                                 NULL,
-                                 EPHY_WEB_PROCESS_EXTENSION_OBJECT_PATH,
-                                 EPHY_WEB_PROCESS_EXTENSION_INTERFACE,
-                                 "PageCreated",
-                                 g_variant_new ("(t)", page_id),
-                                 &error);
-  if (error)
-    g_warning ("Error emitting signal PageCreated: %s\n", error->message);
-}
-
-static void
-ephy_web_process_extension_emit_page_created_signals_pending (EphyWebProcessExtension *extension)
-{
-  guint i;
-
-  if (!extension->page_created_signals_pending)
-    return;
-
-  for (i = 0; i < extension->page_created_signals_pending->len; i++) {
-    guint64 page_id;
-
-    page_id = g_array_index (extension->page_created_signals_pending, guint64, i);
-    ephy_web_process_extension_emit_page_created (extension, page_id);
-  }
-
-  g_array_free (extension->page_created_signals_pending, TRUE);
-  extension->page_created_signals_pending = NULL;
-}
-
-static void
-ephy_web_process_extension_queue_page_created_signal_emission (EphyWebProcessExtension *extension,
-                                                               guint64                  page_id)
-{
-  if (!extension->page_created_signals_pending)
-    extension->page_created_signals_pending = g_array_new (FALSE, FALSE, sizeof (guint64));
-  extension->page_created_signals_pending = g_array_append_val (extension->page_created_signals_pending, 
page_id);
-}
-
 static void
 ephy_web_process_extension_page_created_cb (EphyWebProcessExtension *extension,
                                             WebKitWebPage           *web_page)
 {
-  guint64 page_id;
   g_autoptr (JSCContext) js_context = NULL;
 
   /* Enforce the creation of the script world global context in the main frame */
   js_context = webkit_frame_get_js_context_for_script_world (webkit_web_page_get_main_frame (web_page), 
extension->script_world);
 
-  page_id = webkit_web_page_get_id (web_page);
-  if (extension->dbus_connection)
-    ephy_web_process_extension_emit_page_created (extension, page_id);
-  else
-    ephy_web_process_extension_queue_page_created_signal_emission (extension, page_id);
-
   g_signal_connect (web_page, "send-request",
                     G_CALLBACK (web_page_send_request),
                     extension);
@@ -348,48 +250,26 @@ ephy_web_process_extension_page_created_cb (EphyWebProcessExtension *extension,
                     extension);
 }
 
-static JSCValue *
-get_password_manager (EphyWebProcessExtension *self,
-                      guint64                  frame_id)
-{
-  WebKitFrame *frame;
-  g_autoptr (JSCContext) js_context = NULL;
-  g_autoptr (JSCValue) js_ephy = NULL;
-
-  frame = g_hash_table_lookup (self->frames_map, GINT_TO_POINTER (frame_id));
-  if (!frame)
-    return NULL;
-
-  js_context = webkit_frame_get_js_context_for_script_world (frame, self->script_world);
-  js_ephy = jsc_context_get_value (js_context, "Ephy");
-
-  return jsc_value_object_get_property (js_ephy, "passwordManager");
-}
-
 static void
-handle_method_call (GDBusConnection       *connection,
-                    const char            *sender,
-                    const char            *object_path,
-                    const char            *interface_name,
-                    const char            *method_name,
-                    GVariant              *parameters,
-                    GDBusMethodInvocation *invocation,
-                    gpointer               user_data)
+ephy_web_process_extension_user_message_received_cb (EphyWebProcessExtension *extension,
+                                                     WebKitUserMessage       *message)
 {
-  EphyWebProcessExtension *extension = EPHY_WEB_PROCESS_EXTENSION (user_data);
+  const char *name = webkit_user_message_get_name (message);
 
-  if (g_strcmp0 (interface_name, EPHY_WEB_PROCESS_EXTENSION_INTERFACE) != 0)
-    return;
-
-  if (g_strcmp0 (method_name, "HistorySetURLs") == 0) {
+  if (g_strcmp0 (name, "History.SetURLs") == 0) {
     if (extension->overview_model) {
+      GVariant *parameters;
       GVariantIter iter;
-      g_autoptr (GVariant) array = NULL;
       const char *url;
       const char *title;
       GList *items = NULL;
+      g_autoptr (GVariant) array = NULL;
+
+      parameters = webkit_user_message_get_parameters (message);
+      if (!parameters)
+        return;
 
-      g_variant_get (parameters, "(@a(ss))", &array);
+      g_variant_get (parameters, "@a(ss)", &array);
       g_variant_iter_init (&iter, array);
 
       while (g_variant_iter_loop (&iter, "(&s&s)", &url, &title))
@@ -397,85 +277,87 @@ handle_method_call (GDBusConnection       *connection,
 
       ephy_web_overview_model_set_urls (extension->overview_model, g_list_reverse (items));
     }
-    g_dbus_method_invocation_return_value (invocation, NULL);
-  } else if (g_strcmp0 (method_name, "HistorySetURLThumbnail") == 0) {
+  } else if (g_strcmp0 (name, "History.SetURLThumbnail") == 0) {
     if (extension->overview_model) {
+      GVariant *parameters;
       const char *url;
       const char *path;
 
+      parameters = webkit_user_message_get_parameters (message);
+      if (!parameters)
+        return;
+
       g_variant_get (parameters, "(&s&s)", &url, &path);
       ephy_web_overview_model_set_url_thumbnail (extension->overview_model, url, path, TRUE);
     }
-    g_dbus_method_invocation_return_value (invocation, NULL);
-  } else if (g_strcmp0 (method_name, "HistorySetURLTitle") == 0) {
+  } else if (g_strcmp0 (name, "History.SetURLTitle") == 0) {
     if (extension->overview_model) {
+      GVariant *parameters;
       const char *url;
       const char *title;
 
+      parameters = webkit_user_message_get_parameters (message);
+      if (!parameters)
+        return;
+
       g_variant_get (parameters, "(&s&s)", &url, &title);
       ephy_web_overview_model_set_url_title (extension->overview_model, url, title);
     }
-    g_dbus_method_invocation_return_value (invocation, NULL);
-  } else if (g_strcmp0 (method_name, "HistoryDeleteURL") == 0) {
+  } else if (g_strcmp0 (name, "History.DeleteURL") == 0) {
     if (extension->overview_model) {
+      GVariant *parameters;
       const char *url;
 
-      g_variant_get (parameters, "(&s)", &url);
+      parameters = webkit_user_message_get_parameters (message);
+      if (!parameters)
+        return;
+
+      g_variant_get (parameters, "&s", &url);
       ephy_web_overview_model_delete_url (extension->overview_model, url);
     }
-    g_dbus_method_invocation_return_value (invocation, NULL);
-  } else if (g_strcmp0 (method_name, "HistoryDeleteHost") == 0) {
+  } else if (g_strcmp0 (name, "History.DeleteHost") == 0) {
     if (extension->overview_model) {
+      GVariant *parameters;
       const char *host;
 
-      g_variant_get (parameters, "(&s)", &host);
+      parameters = webkit_user_message_get_parameters (message);
+      if (!parameters)
+        return;
+
+      g_variant_get (parameters, "&s", &host);
       ephy_web_overview_model_delete_host (extension->overview_model, host);
     }
-    g_dbus_method_invocation_return_value (invocation, NULL);
-  } else if (g_strcmp0 (method_name, "HistoryClear") == 0) {
+  } else if (g_strcmp0 (name, "History.Clear") == 0) {
     if (extension->overview_model)
       ephy_web_overview_model_clear (extension->overview_model);
-    g_dbus_method_invocation_return_value (invocation, NULL);
-  } else if (g_strcmp0 (method_name, "PasswordQueryUsernamesResponse") == 0) {
-    g_autofree const char **users;
-    g_autoptr (JSCValue) ret = NULL;
-    g_autoptr (JSCValue) password_manager = NULL;
-    gint32 promise_id;
-    guint64 frame_id;
-
-    users = g_variant_get_strv (g_variant_get_child_value (parameters, 0), NULL);
-    g_variant_get_child (parameters, 1, "i", &promise_id);
-    g_variant_get_child (parameters, 2, "t", &frame_id);
-
-    password_manager = get_password_manager (extension, frame_id);
-    if (password_manager != NULL)
-      ret = jsc_value_object_invoke_method (password_manager, "_onQueryUsernamesResponse",
-                                            G_TYPE_STRV, users, G_TYPE_INT, promise_id, G_TYPE_NONE);
-  } else if (g_strcmp0 (method_name, "PasswordQueryResponse") == 0) {
-    const char *username;
-    const char *password;
-    gint32 promise_id;
-    guint64 frame_id;
-    g_autoptr (JSCValue) ret = NULL;
-    g_autoptr (JSCValue) password_manager = NULL;
-
-    g_variant_get (parameters, "(&s&sit)", &username, &password, &promise_id, &frame_id);
-    password_manager = get_password_manager (extension, frame_id);
-    if (password_manager != NULL)
-      ret = jsc_value_object_invoke_method (password_manager, "_onQueryResponse",
-                                            G_TYPE_STRING, username,
-                                            G_TYPE_STRING, password,
-                                            G_TYPE_INT, promise_id, G_TYPE_NONE);
-  } else if (g_strcmp0 (method_name, "SetShouldRememberPasswords") == 0) {
-    g_variant_get (parameters, "(b)", &extension->should_remember_passwords);
+  } else if (g_strcmp0 (name, "PasswordManager.SetShouldRememberPasswords") == 0) {
+    GVariant *parameters;
+
+    parameters = webkit_user_message_get_parameters (message);
+    if (!parameters)
+      return;
+
+    g_variant_get (parameters, "b", &extension->should_remember_passwords);
   }
 }
 
-static const GDBusInterfaceVTable interface_vtable = {
-  handle_method_call,
-  NULL,
-  NULL
-};
+static JSCValue *
+get_password_manager (EphyWebProcessExtension *self,
+                      guint64                  frame_id)
+{
+  WebKitFrame *frame;
+  g_autoptr (JSCContext) js_context = NULL;
+  g_autoptr (JSCValue) js_ephy = NULL;
+
+  frame = g_hash_table_lookup (self->frames_map, GINT_TO_POINTER (frame_id));
+  if (!frame)
+    return NULL;
+
+  js_context = webkit_frame_get_js_context_for_script_world (frame, self->script_world);
+  js_ephy = jsc_context_get_value (js_context, "Ephy");
+
+  return jsc_value_object_get_property (js_ephy, "passwordManager");
+}
 
 static void
 drop_frame_weak_ref (gpointer key,
@@ -493,13 +375,7 @@ ephy_web_process_extension_dispose (GObject *object)
   g_clear_object (&extension->overview_model);
   g_clear_object (&extension->permissions_manager);
 
-  if (extension->page_created_signals_pending) {
-    g_array_free (extension->page_created_signals_pending, TRUE);
-    extension->page_created_signals_pending = NULL;
-  }
-
   g_clear_object (&extension->script_world);
-  g_clear_object (&extension->dbus_connection);
   g_clear_object (&extension->extension);
 
   if (extension->frames_map) {
@@ -537,47 +413,6 @@ ephy_web_process_extension_get (void)
   return EPHY_WEB_PROCESS_EXTENSION (g_once (&once_init, ephy_web_process_extension_create_instance, NULL));
 }
 
-static void
-dbus_connection_created_cb (GObject                 *source_object,
-                            GAsyncResult            *result,
-                            EphyWebProcessExtension *extension)
-{
-  static GDBusNodeInfo *introspection_data = NULL;
-  g_autoptr (GDBusConnection) connection = NULL;
-  guint registration_id;
-  g_autoptr (GError) error = NULL;
-
-  if (!introspection_data)
-    introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
-
-  connection = g_dbus_connection_new_for_address_finish (result, &error);
-  if (error)
-    g_error ("Failed to connect to UI process: %s", error->message);
-
-  registration_id =
-    g_dbus_connection_register_object (connection,
-                                       EPHY_WEB_PROCESS_EXTENSION_OBJECT_PATH,
-                                       introspection_data->interfaces[0],
-                                       &interface_vtable,
-                                       extension,
-                                       NULL,
-                                       &error);
-  if (!registration_id)
-    g_error ("Failed to register web process extension object: %s\n", error->message);
-
-  extension->dbus_connection = g_steal_pointer (&connection);
-  ephy_web_process_extension_emit_page_created_signals_pending (extension);
-}
-
-static gboolean
-authorize_authenticated_peer_cb (GDBusAuthObserver       *observer,
-                                 GIOStream               *stream,
-                                 GCredentials            *credentials,
-                                 EphyWebProcessExtension *extension)
-{
-  return ephy_dbus_peer_is_authorized (credentials);
-}
-
 static void
 js_log (const char *message)
 {
@@ -604,6 +439,153 @@ js_auto_fill (JSCValue   *js_element,
   webkit_dom_element_html_input_element_set_editing_value (element, value);
 }
 
+typedef struct {
+  EphyWebProcessExtension *extension;
+  guint64 promise_id;
+  guint64 frame_id;
+} PasswordManagerQueryData;
+
+static void
+web_view_query_usernames_ready_cb (WebKitWebPage            *web_page,
+                                   GAsyncResult             *result,
+                                   PasswordManagerQueryData *data)
+{
+  WebKitUserMessage *reply;
+  GVariant *parameters;
+  const char **usernames;
+  g_autoptr (JSCValue) password_manager = NULL;
+  g_autoptr (GError) error = NULL;
+
+  reply = webkit_web_page_send_message_to_view_finish (web_page, result, &error);
+  if (error) {
+    g_warning ("Error getting usernames from WebView: %s\n", error->message);
+    g_free (data);
+    return;
+  }
+
+  parameters = webkit_user_message_get_parameters (reply);
+  if (!parameters) {
+    g_free (data);
+    return;
+  }
+
+  usernames = g_variant_get_strv (parameters, NULL);
+  password_manager = get_password_manager (data->extension, data->frame_id);
+  if (password_manager) {
+    g_autoptr (JSCValue) ret = NULL;
+
+    ret = jsc_value_object_invoke_method (password_manager, "_onQueryUsernamesResponse",
+                                          G_TYPE_STRV, usernames,
+                                          G_TYPE_UINT64, data->promise_id,
+                                          G_TYPE_NONE);
+  }
+
+  g_free (usernames);
+  g_free (data);
+}
+
+static void
+js_query_usernames (const char              *origin,
+                    guint64                  promise_id,
+                    guint64                  page_id,
+                    guint64                  frame_id,
+                    EphyWebProcessExtension *extension)
+{
+  WebKitWebPage *web_page;
+  WebKitUserMessage *message;
+  PasswordManagerQueryData *data;
+
+  if (!origin)
+    return;
+
+  web_page = webkit_web_extension_get_page (extension->extension, page_id);
+  if (!web_page)
+    return;
+
+  data = g_new0 (PasswordManagerQueryData, 1);
+  data->extension = extension;
+  data->promise_id = promise_id;
+  data->frame_id = frame_id;
+  message = webkit_user_message_new ("PasswordManager.QueryUsernames",
+                                     g_variant_new ("s", origin));
+  webkit_web_page_send_message_to_view (web_page, message, NULL,
+                                        (GAsyncReadyCallback)web_view_query_usernames_ready_cb,
+                                        data);
+}
+
+static void
+web_view_query_password_ready_cb (WebKitWebPage            *web_page,
+                                  GAsyncResult             *result,
+                                  PasswordManagerQueryData *data)
+{
+  WebKitUserMessage *reply;
+  GVariant *parameters;
+  const char *username;
+  const char *password;
+  g_autoptr (JSCValue) password_manager = NULL;
+  g_autoptr (GError) error = NULL;
+
+  reply = webkit_web_page_send_message_to_view_finish (web_page, result, &error);
+  if (error) {
+    g_warning ("Error getting password from WebView: %s\n", error->message);
+    g_free (data);
+    return;
+  }
+
+  parameters = webkit_user_message_get_parameters (reply);
+  if (!parameters) {
+    g_free (data);
+    return;
+  }
+
+  g_variant_get (parameters, "(m&sm&s)", &username, &password);
+  password_manager = get_password_manager (data->extension, data->frame_id);
+  if (password_manager) {
+    g_autoptr (JSCValue) ret = NULL;
+
+    ret = jsc_value_object_invoke_method (password_manager, "_onQueryResponse",
+                                          G_TYPE_STRING, username,
+                                          G_TYPE_STRING, password,
+                                          G_TYPE_UINT64, data->promise_id,
+                                          G_TYPE_NONE);
+  }
+
+  g_free (data);
+}
+
+static void
+js_query_password (const char              *origin,
+                   const char              *target_origin,
+                   const char              *username,
+                   const char              *username_field,
+                   const char              *password_field,
+                   guint64                  promise_id,
+                   guint64                  page_id,
+                   guint64                  frame_id,
+                   EphyWebProcessExtension *extension)
+{
+  WebKitWebPage *web_page;
+  WebKitUserMessage *message;
+  PasswordManagerQueryData *data;
+
+  if (!origin || !target_origin || !password_field)
+    return;
+
+  web_page = webkit_web_extension_get_page (extension->extension, page_id);
+  if (!web_page)
+    return;
+
+  data = g_new0 (PasswordManagerQueryData, 1);
+  data->extension = extension;
+  data->promise_id = promise_id;
+  data->frame_id = frame_id;
+  message = webkit_user_message_new ("PasswordManager.QueryPassword",
+                                     g_variant_new ("(ssmsmss)", origin, target_origin, username, 
username_field, password_field));
+  webkit_web_page_send_message_to_view (web_page, message, NULL,
+                                        (GAsyncReadyCallback)web_view_query_password_ready_cb,
+                                        data);
+}
+
 static gboolean
 js_is_web_application (void)
 {
@@ -726,6 +708,28 @@ window_object_cleared_cb (WebKitScriptWorld       *world,
                                           JSC_TYPE_VALUE, G_TYPE_STRING);
     jsc_value_object_set_property (js_ephy, "autoFill", js_function);
     g_clear_object (&js_function);
+
+    js_function = jsc_value_new_function (js_context,
+                                          "queryUsernames",
+                                          G_CALLBACK (js_query_usernames),
+                                          extension, NULL,
+                                          G_TYPE_NONE, 4,
+                                          G_TYPE_STRING, G_TYPE_UINT64,
+                                          G_TYPE_UINT64, G_TYPE_UINT64);
+    jsc_value_object_set_property (js_ephy, "queryUsernames", js_function);
+    g_clear_object (&js_function);
+
+    js_function = jsc_value_new_function (js_context,
+                                          "queryPassword",
+                                          G_CALLBACK (js_query_password),
+                                          extension, NULL,
+                                          G_TYPE_NONE, 8,
+                                          G_TYPE_STRING, G_TYPE_STRING,
+                                          G_TYPE_STRING, G_TYPE_STRING,
+                                          G_TYPE_STRING, G_TYPE_UINT64,
+                                          G_TYPE_UINT64, G_TYPE_UINT64);
+    jsc_value_object_set_property (js_ephy, "queryPassword", js_function);
+    g_clear_object (&js_function);
   }
 
   js_function = jsc_value_new_function (js_context,
@@ -756,12 +760,9 @@ void
 ephy_web_process_extension_initialize (EphyWebProcessExtension *extension,
                                        WebKitWebExtension      *wk_extension,
                                        const char              *guid,
-                                       const char              *server_address,
                                        gboolean                 should_remember_passwords,
                                        gboolean                 is_private_profile)
 {
-  g_autoptr (GDBusAuthObserver) observer = NULL;
-
   g_assert (EPHY_IS_WEB_PROCESS_EXTENSION (extension));
 
   if (extension->initialized)
@@ -782,21 +783,13 @@ ephy_web_process_extension_initialize (EphyWebProcessExtension *extension,
 
   extension->permissions_manager = ephy_permissions_manager_new ();
 
+  g_signal_connect_swapped (extension->extension, "user-message-received",
+                            G_CALLBACK (ephy_web_process_extension_user_message_received_cb),
+                            extension);
   g_signal_connect_swapped (extension->extension, "page-created",
                             G_CALLBACK (ephy_web_process_extension_page_created_cb),
                             extension);
 
-  observer = g_dbus_auth_observer_new ();
-  g_signal_connect (observer, "authorize-authenticated-peer",
-                    G_CALLBACK (authorize_authenticated_peer_cb), extension);
-
-  g_dbus_connection_new_for_address (server_address,
-                                     G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
-                                     observer,
-                                     NULL,
-                                     (GAsyncReadyCallback)dbus_connection_created_cb,
-                                     extension);
-
   extension->frames_map = g_hash_table_new_full (g_direct_hash, g_direct_equal,
                                                  NULL, NULL);
 }
diff --git a/embed/web-process-extension/ephy-web-process-extension.h 
b/embed/web-process-extension/ephy-web-process-extension.h
index f11b5e0e8..45467dcf2 100644
--- a/embed/web-process-extension/ephy-web-process-extension.h
+++ b/embed/web-process-extension/ephy-web-process-extension.h
@@ -33,7 +33,6 @@ EphyWebProcessExtension *ephy_web_process_extension_get        (void);
 void                     ephy_web_process_extension_initialize (EphyWebProcessExtension *extension,
                                                                 WebKitWebExtension      *wk_extension,
                                                                 const char              *guid,
-                                                                const char              *server_address,
                                                                 gboolean                 
should_remember_passwords,
                                                                 gboolean                 is_private_profile);
 
diff --git a/embed/web-process-extension/resources/js/ephy.js 
b/embed/web-process-extension/resources/js/ephy.js
index 9759b882e..aecddbc18 100644
--- a/embed/web-process-extension/resources/js/ephy.js
+++ b/embed/web-process-extension/resources/js/ephy.js
@@ -345,10 +345,7 @@ Ephy.PasswordManager = class PasswordManager
     {
         return new Promise((resolver, reject) => {
             let promiseID = this._promiseCounter++;
-            window.webkit.messageHandlers.passwordManagerQuery.postMessage({
-                origin, targetOrigin, username, usernameField, passwordField, promiseID,
-                pageID: this._pageID, frameID: this._frameID
-            });
+            Ephy.queryPassword(origin, targetOrigin, username, usernameField, passwordField, promiseID, 
this._pageID, this._frameID);
             this._pendingPromises.push({promiseID, resolver});
         });
     }
@@ -381,9 +378,7 @@ Ephy.PasswordManager = class PasswordManager
     {
         return new Promise((resolver, reject) => {
             let promiseID = this._promiseCounter++;
-            window.webkit.messageHandlers.passwordManagerQueryUsernames.postMessage({
-                origin, promiseID, pageID: this._pageID, frameID: this._frameID
-            });
+            Ephy.queryUsernames(origin, promiseID, this._pageID, this._frameID);
             this._pendingPromises.push({promiseID, resolver});
         });
     }
diff --git a/lib/meson.build b/lib/meson.build
index cb309d166..a9f651a7a 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -14,7 +14,6 @@ libephymisc_sources = [
   'contrib/gnome-languages.c',
   'contrib/gvdb/gvdb-builder.c',
   'contrib/gvdb/gvdb-reader.c',
-  'ephy-dbus-util.c',
   'ephy-debug.c',
   'ephy-dnd.c',
   'ephy-favicon-helpers.c',
diff --git a/meson.build b/meson.build
index 0644c1a02..f48d2e821 100644
--- a/meson.build
+++ b/meson.build
@@ -76,7 +76,7 @@ config_h = declare_dependency(
 glib_requirement = '>= 2.61.2'
 gtk_requirement = '>= 3.24.0'
 nettle_requirement = '>= 3.4'
-webkitgtk_requirement = '>= 2.26.0'
+webkitgtk_requirement = '>= 2.27.3'
 
 cairo_dep = dependency('cairo', version: '>= 1.2')
 gcr_dep = dependency('gcr-3', version: '>= 3.5.5')


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]