summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Catanzaro <mcatanzaro@redhat.com>2021-12-20 10:32:36 -0600
committerMichael Catanzaro <mcatanzaro@redhat.com>2021-12-20 11:37:02 -0600
commit039d85ced607079936b1b0131b4883a31fcb6af6 (patch)
treeedfa948a362c4c030480db26026c0e8ebffeede2
parent2325b441c91f289c794a6fbda7f459eb44f4290a (diff)
downloadepiphany-039d85ced607079936b1b0131b4883a31fcb6af6.tar.gz
Fix reload buttons on error pages
The encoded URL here does not work. And we cannot reload via the web process, because the window.location is about:blank for alternate HTML, so we'll have to send a message to the UI process to have it do so instead. Fixes #1663 Part-of: <https://gitlab.gnome.org/GNOME/epiphany/-/merge_requests/1050>
-rw-r--r--embed/ephy-embed-shell.c36
-rw-r--r--embed/ephy-web-view.c137
2 files changed, 114 insertions, 59 deletions
diff --git a/embed/ephy-embed-shell.c b/embed/ephy-embed-shell.c
index 189370bd8..99d1fb0ef 100644
--- a/embed/ephy-embed-shell.c
+++ b/embed/ephy-embed-shell.c
@@ -78,6 +78,7 @@ enum {
WEB_VIEW_CREATED,
ALLOW_TLS_CERTIFICATE,
ALLOW_UNSAFE_BROWSING,
+ RELOAD_PAGE,
PASSWORD_FORM_FOCUSED,
LAST_SIGNAL
@@ -310,6 +311,17 @@ web_process_extension_tls_error_page_message_received_cb (WebKitUserContentManag
}
static void
+web_process_extension_reload_page_message_received_cb (WebKitUserContentManager *manager,
+ WebKitJavascriptResult *message,
+ EphyEmbedShell *shell)
+{
+ guint64 page_id;
+
+ page_id = jsc_value_to_double (webkit_javascript_result_get_js_value (message));
+ g_signal_emit (shell, signals[RELOAD_PAGE], 0, page_id);
+}
+
+static void
web_process_extension_unsafe_browsing_error_page_message_received_cb (WebKitUserContentManager *manager,
WebKitJavascriptResult *message,
EphyEmbedShell *shell)
@@ -1171,6 +1183,23 @@ ephy_embed_shell_class_init (EphyEmbedShellClass *klass)
G_TYPE_UINT64);
/**
+ * EphyEmbedShell::reload-page:
+ * @shell: the #EphyEmbedShell
+ * @page_id: the identifier of the web page
+ *
+ * Emitted when the web process extension requests a view be reloaded.
+ * This is needed when window.location.reload() doesn't work properly,
+ * specifically after loading alternate HTML.
+ */
+ signals[RELOAD_PAGE] =
+ g_signal_new ("reload-page",
+ EPHY_TYPE_EMBED_SHELL,
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1,
+ G_TYPE_UINT64);
+
+ /**
* EphyEmbedShell::password-form-focused
* @shell: the #EphyEmbedShell
* @page_id: the identifier of the web page
@@ -1408,6 +1437,7 @@ ephy_embed_shell_register_ucm_handler (EphyEmbedShell *shell,
EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
/* User content manager */
+ /* FIXME: See https://gitlab.gnome.org/GNOME/epiphany/-/issues/1664 */
webkit_user_content_manager_register_script_message_handler_in_world (ucm,
"overview",
priv->guid);
@@ -1422,6 +1452,12 @@ ephy_embed_shell_register_ucm_handler (EphyEmbedShell *shell,
shell, 0);
webkit_user_content_manager_register_script_message_handler (ucm,
+ "reloadPage");
+ g_signal_connect_object (ucm, "script-message-received::reloadPage",
+ G_CALLBACK (web_process_extension_reload_page_message_received_cb),
+ shell, 0);
+
+ webkit_user_content_manager_register_script_message_handler (ucm,
"unsafeBrowsingErrorPage");
g_signal_connect_object (ucm, "script-message-received::unsafeBrowsingErrorPage",
G_CALLBACK (web_process_extension_unsafe_browsing_error_page_message_received_cb),
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index ae8413e94..98e3e1533 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -671,6 +671,17 @@ allow_unsafe_browsing_cb (EphyEmbedShell *shell,
}
static void
+reload_page_cb (EphyEmbedShell *shell,
+ guint64 page_id,
+ EphyWebView *view)
+{
+ if (webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (view)) != page_id)
+ return;
+
+ webkit_web_view_reload (WEBKIT_WEB_VIEW (view));
+}
+
+static void
_ephy_web_view_set_is_blank (EphyWebView *view,
gboolean is_blank)
{
@@ -1846,20 +1857,20 @@ ephy_web_view_get_error_page (EphyWebView *view)
* strings. Everywhere, but also here on the error pages in particular. */
static void
-format_network_error_page (const char *uri,
- const char *origin,
- const char *reason,
- char **page_title,
- char **message_title,
- char **message_body,
- char **message_details,
- char **button_label,
- char **button_action,
- const char **button_accesskey,
- const char **icon_name,
- const char **style)
+format_network_error_page (EphyWebView *view,
+ const char *uri,
+ const char *origin,
+ const char *reason,
+ char **page_title,
+ char **message_title,
+ char **message_body,
+ char **message_details,
+ char **button_label,
+ char **button_action,
+ const char **button_accesskey,
+ const char **icon_name,
+ const char **style)
{
- g_autofree char *encoded_uri = NULL;
g_autofree char *encoded_origin = NULL;
g_autofree char *formatted_origin = NULL;
g_autofree char *formatted_reason = NULL;
@@ -1895,8 +1906,8 @@ format_network_error_page (const char *uri,
/* The button on the network error page. DO NOT ADD MNEMONICS HERE. */
*button_label = g_strdup (_("Reload"));
- encoded_uri = ephy_encode_for_javascript (uri);
- *button_action = g_strdup_printf ("window.location = '%s';", encoded_uri);
+ *button_action = g_strdup_printf ("window.webkit.messageHandlers.reloadPage.postMessage(%" G_GUINT64_FORMAT ");",
+ webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (view)));
/* Mnemonic for the Reload button on browser error pages. */
*button_accesskey = C_("reload-access-key", "R");
@@ -1905,18 +1916,18 @@ format_network_error_page (const char *uri,
}
static void
-format_crash_error_page (const char *uri,
- char **page_title,
- char **message_title,
- char **message_body,
- char **button_label,
- char **button_action,
- const char **button_accesskey,
- const char **icon_name,
- const char **style)
-{
- g_autofree char *html_encoded_uri = NULL;
- g_autofree char *js_encoded_uri = NULL;
+format_crash_error_page (EphyWebView *view,
+ const char *uri,
+ char **page_title,
+ char **message_title,
+ char **message_body,
+ char **button_label,
+ char **button_action,
+ const char **button_accesskey,
+ const char **icon_name,
+ const char **style)
+{
+ g_autofree char *encoded_uri = NULL;
g_autofree char *formatted_uri = NULL;
g_autofree char *formatted_distributor = NULL;
g_autofree char *first_paragraph = NULL;
@@ -1928,8 +1939,8 @@ format_crash_error_page (const char *uri,
/* Message title when a site cannot be loaded due to a page crash error. */
*message_title = g_strdup (_("Oops! There may be a problem"));
- html_encoded_uri = ephy_encode_for_html_entity (uri);
- formatted_uri = g_strdup_printf ("<strong>%s</strong>", html_encoded_uri);
+ encoded_uri = ephy_encode_for_html_entity (uri);
+ formatted_uri = g_strdup_printf ("<strong>%s</strong>", encoded_uri);
/* Error details when a site cannot be loaded due to a page crash error. */
first_paragraph = g_strdup_printf (_("The page %s may have caused Web to "
"close unexpectedly."),
@@ -1948,8 +1959,8 @@ format_crash_error_page (const char *uri,
/* The button on the page crash error page. DO NOT ADD MNEMONICS HERE. */
*button_label = g_strdup (_("Reload"));
- js_encoded_uri = ephy_encode_for_javascript (uri);
- *button_action = g_strdup_printf ("window.location = '%s';", js_encoded_uri);
+ *button_action = g_strdup_printf ("window.webkit.messageHandlers.reloadPage.postMessage(%" G_GUINT64_FORMAT ");",
+ webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (view)));
/* Mnemonic for the Reload button on browser error pages. */
*button_accesskey = C_("reload-access-key", "R");
@@ -1958,17 +1969,17 @@ format_crash_error_page (const char *uri,
}
static void
-format_process_crash_error_page (const char *uri,
- char **page_title,
- char **message_title,
- char **message_body,
- char **button_label,
- char **button_action,
- const char **button_accesskey,
- const char **icon_name,
- const char **style)
+format_process_crash_error_page (EphyWebView *view,
+ const char *uri,
+ char **page_title,
+ char **message_title,
+ char **message_body,
+ char **button_label,
+ char **button_action,
+ const char **button_accesskey,
+ const char **icon_name,
+ const char **style)
{
- g_autofree char *encoded_uri = NULL;
const char *first_paragraph;
/* Page title when a site cannot be loaded due to a process crash error. */
@@ -1984,8 +1995,8 @@ format_process_crash_error_page (const char *uri,
/* The button on the process crash error page. DO NOT ADD MNEMONICS HERE. */
*button_label = g_strdup (_("Reload"));
- encoded_uri = ephy_encode_for_javascript (uri);
- *button_action = g_strdup_printf ("window.location = '%s';", encoded_uri);
+ *button_action = g_strdup_printf ("window.webkit.messageHandlers.reloadPage.postMessage(%" G_GUINT64_FORMAT ");",
+ webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (view)));
/* Mnemonic for the Reload button on browser error pages. */
*button_accesskey = C_("reload-access-key", "R");
@@ -1994,17 +2005,17 @@ format_process_crash_error_page (const char *uri,
}
static void
-format_unresponsive_process_error_page (const char *uri,
- char **page_title,
- char **message_title,
- char **message_body,
- char **button_label,
- char **button_action,
- const char **button_accesskey,
- const char **icon_name,
- const char **style)
+format_unresponsive_process_error_page (EphyWebView *view,
+ const char *uri,
+ char **page_title,
+ char **message_title,
+ char **message_body,
+ char **button_label,
+ char **button_action,
+ const char **button_accesskey,
+ const char **icon_name,
+ const char **style)
{
- g_autofree char *encoded_uri = NULL;
const char *first_paragraph;
/* Page title when web content has become unresponsive. */
@@ -2020,8 +2031,8 @@ format_unresponsive_process_error_page (const char *uri,
/* The button on the unresponsive process error page. DO NOT ADD MNEMONICS HERE. */
*button_label = g_strdup (_("Reload"));
- encoded_uri = ephy_encode_for_javascript (uri);
- *button_action = g_strdup_printf ("window.location = '%s';", encoded_uri);
+ *button_action = g_strdup_printf ("window.webkit.messageHandlers.reloadPage.postMessage(%" G_GUINT64_FORMAT ");",
+ webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (view)));
/* Mnemonic for the Reload button on browser error pages. */
*button_accesskey = C_("reload-access-key", "R");
@@ -2275,7 +2286,8 @@ ephy_web_view_load_error_page (EphyWebView *view,
switch (page) {
case EPHY_WEB_VIEW_ERROR_PAGE_NETWORK_ERROR:
- format_network_error_page (uri,
+ format_network_error_page (view,
+ uri,
origin,
reason,
&page_title,
@@ -2289,7 +2301,8 @@ ephy_web_view_load_error_page (EphyWebView *view,
&style);
break;
case EPHY_WEB_VIEW_ERROR_PAGE_CRASH:
- format_crash_error_page (uri,
+ format_crash_error_page (view,
+ uri,
&page_title,
&msg_title,
&msg_body,
@@ -2300,7 +2313,8 @@ ephy_web_view_load_error_page (EphyWebView *view,
&style);
break;
case EPHY_WEB_VIEW_ERROR_PROCESS_CRASH:
- format_process_crash_error_page (uri,
+ format_process_crash_error_page (view,
+ uri,
&page_title,
&msg_title,
&msg_body,
@@ -2311,7 +2325,8 @@ ephy_web_view_load_error_page (EphyWebView *view,
&style);
break;
case EPHY_WEB_VIEW_ERROR_UNRESPONSIVE_PROCESS:
- format_unresponsive_process_error_page (uri,
+ format_unresponsive_process_error_page (view,
+ uri,
&page_title,
&msg_title,
&msg_body,
@@ -4079,6 +4094,10 @@ ephy_web_view_init (EphyWebView *web_view)
g_signal_connect_object (shell, "allow-unsafe-browsing",
G_CALLBACK (allow_unsafe_browsing_cb),
web_view, 0);
+
+ g_signal_connect_object (shell, "reload-page",
+ G_CALLBACK (reload_page_cb),
+ web_view, 0);
}
static void