[epiphany] Make new tabs inherit history of parent
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany] Make new tabs inherit history of parent
- Date: Tue, 9 Feb 2016 13:22:15 +0000 (UTC)
commit 13231a80e816fca6d7df2b0e1906c35da2b4f0df
Author: Carlos Garcia Campos <cgarcia igalia com>
Date: Wed Jan 20 10:39:20 2016 +0100
Make new tabs inherit history of parent
This feature was lost when we switched to WebKit2, bring it back now
that we have API in WebKit to handle web view session state.
https://bugzilla.gnome.org/show_bug.cgi?id=706731
src/ephy-window.c | 15 +++++++++-
src/popup-commands.c | 79 ++++++++++++++++++++++++--------------------------
2 files changed, 52 insertions(+), 42 deletions(-)
---
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 244db62..61debfb 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -2303,8 +2303,10 @@ decide_policy_cb (WebKitWebView *web_view,
gint button;
gint state;
EphyEmbed *new_embed;
+ EphyWebView *new_view;
EphyNewTabFlags flags = 0;
EphyWindow *target_window = window;
+ gboolean inherit_session = FALSE;
button = webkit_navigation_action_get_mouse_button (navigation_action);
state = webkit_navigation_action_get_modifiers (navigation_action);
@@ -2324,6 +2326,7 @@ decide_policy_cb (WebKitWebView *web_view,
else if (button == 2 || (button == 1 && state == GDK_CONTROL_MASK))
{
flags |= EPHY_NEW_TAB_APPEND_AFTER;
+ inherit_session = TRUE;
}
/* Because we connect to button-press-event *after*
* (G_CONNECT_AFTER) we need to prevent WebKit from browsing to
@@ -2351,7 +2354,17 @@ decide_policy_cb (WebKitWebView *web_view,
embed,
flags,
0);
- ephy_web_view_load_request (ephy_embed_get_web_view (new_embed), request);
+
+ new_view = ephy_embed_get_web_view (new_embed);
+ if (inherit_session)
+ {
+ WebKitWebViewSessionState *session_state;
+
+ session_state = webkit_web_view_get_session_state (web_view);
+ webkit_web_view_restore_session_state (WEBKIT_WEB_VIEW (new_view), session_state);
+ webkit_web_view_session_state_unref (session_state);
+ }
+ ephy_web_view_load_request (new_view, request);
webkit_policy_decision_ignore (decision);
diff --git a/src/popup-commands.c b/src/popup-commands.c
index d58ad72..1ed949c 100644
--- a/src/popup-commands.c
+++ b/src/popup-commands.c
@@ -36,29 +36,51 @@
#include <string.h>
#include <webkit2/webkit2.h>
+typedef enum {
+ NEW_WINDOW,
+ NEW_TAB
+} LinkDestination;
+
static void
-popup_cmd_view_in_new_window (EphyWindow *window,
- const char *property_name)
+view_in_destination (EphyWindow *window,
+ const char *property_name,
+ LinkDestination destination)
{
- EphyWindow *new_window;
EphyEmbedEvent *event;
+ GValue value = { 0, };
EphyEmbed *embed;
EphyEmbed *new_embed;
- GValue value = { 0, };
-
- embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+ EphyWebView *new_view;
+ WebKitWebViewSessionState *session_state;
+ EphyWindow *dest_window = window;
+ EphyNewTabFlags flags = 0;
event = ephy_window_get_context_event (window);
g_return_if_fail (event != NULL);
- new_window = ephy_window_new ();
+ embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+ g_return_if_fail (embed != NULL);
+
ephy_embed_event_get_property (event, property_name, &value);
+ switch (destination) {
+ case NEW_WINDOW:
+ dest_window = ephy_window_new ();
+ break;
+ case NEW_TAB:
+ flags |= EPHY_NEW_TAB_APPEND_AFTER;
+ break;
+ default:
+ g_assert_not_reached();
+ }
new_embed = ephy_shell_new_tab (ephy_shell_get_default (),
- new_window, embed,
- 0);
- ephy_web_view_load_url (ephy_embed_get_web_view (new_embed),
- g_value_get_string (&value));
+ dest_window, embed, flags);
+
+ new_view = ephy_embed_get_web_view (new_embed);
+ session_state = webkit_web_view_get_session_state (WEBKIT_WEB_VIEW (ephy_embed_get_web_view (embed)));
+ webkit_web_view_restore_session_state (WEBKIT_WEB_VIEW (new_view), session_state);
+ webkit_web_view_session_state_unref (session_state);
+ ephy_web_view_load_url (new_view, g_value_get_string (&value));
g_value_unset (&value);
}
@@ -66,14 +88,14 @@ void
popup_cmd_link_in_new_window (GtkAction *action,
EphyWindow *window)
{
- popup_cmd_view_in_new_window (window, "link-uri");
+ view_in_destination (window, "link-uri", NEW_WINDOW);
}
void
popup_cmd_media_in_new_window (GtkAction *action,
EphyWindow *window)
{
- popup_cmd_view_in_new_window (window, "media-uri");
+ view_in_destination (window, "media-uri", NEW_WINDOW);
}
void
@@ -330,50 +352,25 @@ popup_cmd_copy_media_location (GtkAction *action,
popup_cmd_copy_location (window, "media-uri");
}
-static void
-popup_cmd_view_in_new_tab (EphyWindow *window,
- const char *property_name)
-{
- EphyEmbedEvent *event;
- GValue value = { 0, };
- EphyEmbed *embed;
- EphyEmbed *new_embed;
-
- event = ephy_window_get_context_event (window);
- g_return_if_fail (event != NULL);
-
- embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
- g_return_if_fail (embed != NULL);
-
- ephy_embed_event_get_property (event, property_name, &value);
-
- new_embed = ephy_shell_new_tab (ephy_shell_get_default (),
- window, embed,
- EPHY_NEW_TAB_APPEND_AFTER);
- ephy_web_view_load_url (ephy_embed_get_web_view (new_embed),
- g_value_get_string (&value));
- g_value_unset (&value);
-}
-
void
popup_cmd_link_in_new_tab (GtkAction *action,
EphyWindow *window)
{
- popup_cmd_view_in_new_tab (window, "link-uri");
+ view_in_destination (window, "link-uri", NEW_TAB);
}
void
popup_cmd_view_image_in_new_tab (GtkAction *action,
EphyWindow *window)
{
- popup_cmd_view_in_new_tab (window, "image-uri");
+ view_in_destination (window, "image-uri", NEW_TAB);
}
void
popup_cmd_media_in_new_tab (GtkAction *action,
EphyWindow *window)
{
- popup_cmd_view_in_new_tab (window, "media-uri");
+ view_in_destination (window, "media-uri", NEW_TAB);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]