Commit 38a72f6b authored by Patrick Griffis's avatar Patrick Griffis

Don't store WebPage in EphyWebExtension

The caller can provide the needed information and this avoids
a potentially stale pointer.
parent c4a2f52a
Pipeline #50503 passed with stages
in 14 minutes and 22 seconds
......@@ -349,7 +349,7 @@ typedef struct {
EphyEmbedShell *shell;
char *origin;
gint32 promise_id;
gint32 page_id;
guint64 page_id;
} PasswordManagerData;
static void
......@@ -370,7 +370,7 @@ password_manager_query_finished_cb (GList *records,
data->page_id,
data->origin);
if (proxy)
ephy_web_extension_proxy_password_query_response (proxy, username, password, data->promise_id);
ephy_web_extension_proxy_password_query_response (proxy, username, password, data->promise_id, data->page_id);
g_object_unref (data->shell);
g_free (data->origin);
......@@ -395,6 +395,14 @@ property_to_int32 (JSCValue *value,
return jsc_value_to_int32 (prop);
}
static int
property_to_uint64 (JSCValue *value,
const char *name)
{
g_autoptr(JSCValue) prop = jsc_value_object_get_property (value, name);
return (guint64)jsc_value_to_double (prop);
}
static void
web_extension_password_manager_query_received_cb (WebKitUserContentManager *manager,
WebKitJavascriptResult *message,
......@@ -408,7 +416,7 @@ web_extension_password_manager_query_received_cb (WebKitUserContentManager *mana
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");
gint32 page_id = property_to_int32 (value, "pageID");
guint64 page_id = property_to_uint64 (value, "pageID");
PasswordManagerData *data = g_new (PasswordManagerData, 1);
data->shell = g_object_ref (shell);
......@@ -483,7 +491,7 @@ web_extension_password_manager_save_real (EphyEmbedShell *shell,
g_autofree char *password_field = property_to_string_or_null (value, "passwordField");
g_autoptr(JSCValue) is_new_prop = jsc_value_object_get_property (value, "isNew");
gboolean is_new = jsc_value_to_boolean (is_new_prop);
gint32 page_id = property_to_int32 (value, "pageID");
guint64 page_id = property_to_uint64 (value, "pageID");
EphyWebView *view;
/* Both password and password field are required. */
......@@ -553,9 +561,9 @@ web_extension_password_manager_cached_users_received_cb (WebKitUserContentManage
EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
JSCValue *value = webkit_javascript_result_get_js_value (message);
g_autofree char *origin = jsc_value_to_string (jsc_value_object_get_property (value, "origin"));
gint32 promise_id = jsc_value_to_int32 (jsc_value_object_get_property (value, "promiseID"));
gint32 page_id = jsc_value_to_int32 (jsc_value_object_get_property (value, "pageID"));
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");
GList *cached_users;
cached_users = ephy_password_manager_get_cached_users (priv->password_manager, origin);
......@@ -563,7 +571,7 @@ web_extension_password_manager_cached_users_received_cb (WebKitUserContentManage
EphyWebExtensionProxy *proxy = ephy_embed_shell_get_extension_proxy_for_page_id (
shell, page_id, origin);
if (proxy)
ephy_web_extension_proxy_password_cached_users_response (proxy, cached_users, promise_id);
ephy_web_extension_proxy_password_cached_users_response (proxy, cached_users, promise_id, page_id);
}
static void
......
......@@ -298,7 +298,8 @@ ephy_web_extension_proxy_history_clear (EphyWebExtensionProxy *web_extension)
void
ephy_web_extension_proxy_password_cached_users_response (EphyWebExtensionProxy *web_extension,
GList *users,
gint32 id)
gint32 promise_id,
guint64 page_id)
{
if (!web_extension->proxy)
return;
......@@ -310,7 +311,7 @@ ephy_web_extension_proxy_password_cached_users_response (EphyWebExtensionProxy *
g_dbus_proxy_call (web_extension->proxy,
"PasswordQueryUsernamesResponse",
g_variant_new ("(asi)", &builder, id),
g_variant_new ("(asit)", &builder, promise_id, page_id),
G_DBUS_CALL_FLAGS_NONE,
-1,
web_extension->cancellable,
......@@ -321,14 +322,15 @@ void
ephy_web_extension_proxy_password_query_response (EphyWebExtensionProxy *web_extension,
const char *username,
const char *password,
gint32 id)
gint32 promise_id,
guint64 page_id)
{
if (!web_extension->proxy)
return;
g_dbus_proxy_call (web_extension->proxy,
"PasswordQueryResponse",
g_variant_new ("(ssi)", username ?: "", password ?: "", id),
g_variant_new ("(ssit)", username ?: "", password ?: "", promise_id, page_id),
G_DBUS_CALL_FLAGS_NONE,
-1,
web_extension->cancellable,
......
......@@ -44,9 +44,11 @@ void ephy_web_extension_proxy_history_delete_host
void ephy_web_extension_proxy_history_clear (EphyWebExtensionProxy *web_extension);
void ephy_web_extension_proxy_password_cached_users_response (EphyWebExtensionProxy *web_extension,
GList *users,
gint32 id);
gint32 promise_id,
guint64 page_id);
void ephy_web_extension_proxy_password_query_response (EphyWebExtensionProxy *web_extension,
const char *username,
const char *password,
gint32 id);
gint32 promise_id,
guint64 page_id);
G_END_DECLS
......@@ -55,7 +55,6 @@ struct _EphyWebExtension {
EphyUriTester *uri_tester;
WebKitScriptWorld *script_world;
WebKitWebPage *web_page;
gboolean is_private_profile;
};
......@@ -87,11 +86,13 @@ static const char introspection_xml[] =
" <method name='PasswordQueryResponse'>"
" <arg type='s' name='username' direction='in'/>"
" <arg type='s' name='password' direction='in'/>"
" <arg type='i' name='id' direction='in'/>"
" <arg type='i' name='promise_id' direction='in'/>"
" <arg type='t' name='page_id' direction='in'/>"
" </method>"
" <method name='PasswordQueryUsernamesResponse'>"
" <arg type='as' name='users' direction='in'/>"
" <arg type='i' name='id' direction='in'/>"
" <arg type='i' name='promise_id' direction='in'/>"
" <arg type='t' name='page_id' direction='in'/>"
" </method>"
" </interface>"
"</node>";
......@@ -388,7 +389,6 @@ ephy_web_extension_page_created_cb (EphyWebExtension *extension,
g_object_unref (js_context);
page_id = webkit_web_page_get_id (web_page);
extension->web_page = web_page;
if (extension->dbus_connection)
ephy_web_extension_emit_page_created (extension, page_id);
else
......@@ -409,11 +409,12 @@ ephy_web_extension_page_created_cb (EphyWebExtension *extension,
}
static JSCValue *
get_password_manager (EphyWebExtension *self)
get_password_manager (EphyWebExtension *self, guint64 page_id)
{
g_assert (self->web_page);
WebKitFrame *frame = webkit_web_page_get_main_frame (self->web_page);
WebKitWebPage *page = webkit_web_extension_get_page (self->extension, page_id);
if (page == NULL)
return NULL;
WebKitFrame *frame = webkit_web_page_get_main_frame (page);
JSCContext *context = webkit_frame_get_js_context_for_script_world (frame,
self->script_world);
g_autoptr(JSCValue) ephy = jsc_context_get_value (context, "Ephy");
......@@ -494,26 +495,32 @@ handle_method_call (GDBusConnection *connection,
} else if (g_strcmp0 (method_name, "PasswordQueryUsernamesResponse") == 0) {
g_autofree const char **users;
g_autoptr(JSCValue) ret;
gint32 id;
gint32 promise_id;
guint64 page_id;
users = g_variant_get_strv (g_variant_get_child_value (parameters, 0), NULL);
g_variant_get_child (parameters, 1, "i", &id);
g_variant_get_child (parameters, 1, "i", &promise_id);
g_variant_get_child (parameters, 2, "t", &page_id);
g_autoptr(JSCValue) password_manager = get_password_manager (extension);
ret = jsc_value_object_invoke_method (password_manager, "_onQueryUsernamesResponse",
G_TYPE_STRV, users, G_TYPE_INT, id, G_TYPE_NONE);
g_autoptr(JSCValue) password_manager = get_password_manager (extension, page_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 id;
gint32 promise_id;
guint64 page_id;
g_autoptr(JSCValue) ret;
g_variant_get (parameters, "(&s&si)", &username, &password, &id);
g_autoptr(JSCValue) password_manager = get_password_manager (extension);
ret = jsc_value_object_invoke_method (password_manager, "_onQueryResponse",
G_TYPE_STRING, username,
G_TYPE_STRING, password,
G_TYPE_INT, id, G_TYPE_NONE);
g_variant_get (parameters, "(&s&sit)", &username, &password, &promise_id, &page_id);
g_autoptr(JSCValue) password_manager = get_password_manager (extension, page_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);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment