[epiphany] Make new tabs inherit history of parent



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]