Title: [278451] trunk/Tools
Revision
278451
Author
[email protected]
Date
2021-06-04 03:43:40 -0700 (Fri, 04 Jun 2021)

Log Message

[GTK] MiniBrowser: add support for saving multiple tabs in session state
https://bugs.webkit.org/show_bug.cgi?id=225763

Reviewed by Michael Catanzaro.

* MiniBrowser/gtk/BrowserWindow.c:
(browserWindowSaveSession):
(browserWindowTryClose):
(browserWindowFinalize):
(browserWindowDispose):
(browser_window_load_session):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (278450 => 278451)


--- trunk/Tools/ChangeLog	2021-06-04 08:03:35 UTC (rev 278450)
+++ trunk/Tools/ChangeLog	2021-06-04 10:43:40 UTC (rev 278451)
@@ -1,3 +1,17 @@
+2021-06-04  Carlos Garcia Campos  <[email protected]>
+
+        [GTK] MiniBrowser: add support for saving multiple tabs in session state
+        https://bugs.webkit.org/show_bug.cgi?id=225763
+
+        Reviewed by Michael Catanzaro.
+
+        * MiniBrowser/gtk/BrowserWindow.c:
+        (browserWindowSaveSession):
+        (browserWindowTryClose):
+        (browserWindowFinalize):
+        (browserWindowDispose):
+        (browser_window_load_session):
+
 2021-06-03  Said Abou-Hallawa  <[email protected]>
 
         [MotionMark] Controller.filterOutOutliers() sorts the frameLengths array incorrectly

Modified: trunk/Tools/MiniBrowser/gtk/BrowserWindow.c (278450 => 278451)


--- trunk/Tools/MiniBrowser/gtk/BrowserWindow.c	2021-06-04 08:03:35 UTC (rev 278450)
+++ trunk/Tools/MiniBrowser/gtk/BrowserWindow.c	2021-06-04 10:43:40 UTC (rev 278451)
@@ -331,6 +331,37 @@
 }
 #endif
 
+static void browserWindowSaveSession(BrowserWindow *window)
+{
+    if (!window->sessionFile)
+        return;
+
+    GKeyFile *session = g_key_file_new();
+    int tabsCount = gtk_notebook_get_n_pages(GTK_NOTEBOOK(window->notebook));
+    int i;
+    for (i = 0; i < tabsCount; ++i) {
+        BrowserTab *tab = (BrowserTab *)gtk_notebook_get_nth_page(GTK_NOTEBOOK(window->notebook), i);
+        WebKitWebView *webView = browser_tab_get_web_view(tab);
+        WebKitWebViewSessionState *state = webkit_web_view_get_session_state(webView);
+        GBytes *bytes = webkit_web_view_session_state_serialize(state);
+        if (bytes) {
+            gsize dataLength;
+            gconstpointer data;
+            data = "" &dataLength);
+
+            gchar *groupName = g_strdup_printf("Tab-%d", i);
+            gchar *base64 = g_base64_encode(data, dataLength);
+            g_key_file_set_string(session, groupName, "state", base64);
+            g_free(base64);
+            g_free(groupName);
+            g_bytes_unref(bytes);
+        }
+        webkit_web_view_session_state_unref(state);
+    }
+    g_key_file_save_to_file(session, window->sessionFile, NULL);
+    g_key_file_free(session);
+}
+
 static void browserWindowTryCloseCurrentWebView(GSimpleAction *action, GVariant *parameter, gpointer userData)
 {
     BrowserWindow *window = BROWSER_WINDOW(userData);
@@ -342,6 +373,8 @@
 static void browserWindowTryClose(GSimpleAction *action, GVariant *parameter, gpointer userData)
 {
     BrowserWindow *window = BROWSER_WINDOW(userData);
+    browserWindowSaveSession(window);
+
     GSList *webViews = NULL;
     int n = gtk_notebook_get_n_pages(GTK_NOTEBOOK(window->notebook));
     int i;
@@ -856,20 +889,6 @@
     g_simple_action_set_state(G_SIMPLE_ACTION(action), g_variant_new_boolean(typingAttributes & WEBKIT_EDITOR_TYPING_ATTRIBUTE_STRIKETHROUGH));
 }
 
-static void browserWindowSaveSession(BrowserWindow *window)
-{
-    if (!window->sessionFile)
-        return;
-
-    WebKitWebView *webView = browser_tab_get_web_view(window->activeTab);
-    WebKitWebViewSessionState *state = webkit_web_view_get_session_state(webView);
-    GBytes *bytes = webkit_web_view_session_state_serialize(state);
-    webkit_web_view_session_state_unref(state);
-    g_file_set_contents(window->sessionFile, g_bytes_get_data(bytes, NULL), g_bytes_get_size(bytes), NULL);
-    g_bytes_unref(bytes);
-    g_clear_pointer(&window->sessionFile, g_free);
-}
-
 static void browserWindowFinalize(GObject *gObject)
 {
     BrowserWindow *window = BROWSER_WINDOW(gObject);
@@ -886,6 +905,7 @@
         g_source_remove(window->resetEntryProgressTimeoutId);
 
     g_clear_object(&window->editActionGroup);
+    g_clear_pointer(&window->sessionFile, g_free);
 
     G_OBJECT_CLASS(browser_window_parent_class)->finalize(gObject);
 }
@@ -894,8 +914,6 @@
 {
     BrowserWindow *window = BROWSER_WINDOW(gObject);
 
-    browserWindowSaveSession(window);
-
     if (window->parentWindow) {
         g_object_remove_weak_pointer(G_OBJECT(window->parentWindow), (gpointer *)&window->parentWindow);
         window->parentWindow = NULL;
@@ -1439,27 +1457,70 @@
     g_return_if_fail(sessionFile);
 
     WebKitWebView *webView = browser_tab_get_web_view(window->activeTab);
+
     window->sessionFile = g_strdup(sessionFile);
-    gchar *data = ""
-    gsize dataLength;
-    if (g_file_get_contents(sessionFile, &data, &dataLength, NULL)) {
-        GBytes *bytes = g_bytes_new_take(data, dataLength);
-        WebKitWebViewSessionState *state = webkit_web_view_session_state_new(bytes);
-        g_bytes_unref(bytes);
+    GKeyFile *session = g_key_file_new();
+    GError *error = NULL;
+    if (!g_key_file_load_from_file(session, sessionFile, G_KEY_FILE_NONE, &error)) {
+        if (!g_error_matches(error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
+            g_warning("Failed to open session file: %s", error->message);
+        g_error_free(error);
+        webkit_web_view_load_uri(webView, BROWSER_DEFAULT_URL);
+        g_key_file_free(session);
+        return;
+    }
 
+    gsize groupCount;
+    gchar **groups = g_key_file_get_groups(session, &groupCount);
+    if (!groupCount) {
+        webkit_web_view_load_uri(webView, BROWSER_DEFAULT_URL);
+        g_strfreev(groups);
+        g_key_file_free(session);
+        return;
+    }
+
+    WebKitWebView *previousWebView = NULL;
+    gsize i;
+    for (i = 0; i < groupCount; ++i) {
+        WebKitWebViewSessionState *state = NULL;
+        gchar *base64 = g_key_file_get_string(session, groups[i], "state", NULL);
+        if (base64) {
+            gsize stateDataLength;
+            guchar *stateData = g_base64_decode(base64, &stateDataLength);
+            GBytes *bytes = g_bytes_new_take(stateData, stateDataLength);
+            state = webkit_web_view_session_state_new(bytes);
+            g_bytes_unref(bytes);
+            g_free(base64);
+        }
+
+        if (!webView) {
+            webView = WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
+                "web-context", webkit_web_view_get_context(previousWebView),
+                "settings", webkit_web_view_get_settings(previousWebView),
+                "user-content-manager", webkit_web_view_get_user_content_manager(previousWebView),
+                "website-policies", webkit_web_view_get_website_policies(previousWebView),
+                NULL));
+            browser_window_append_view(window, webView);
+        }
+
         if (state) {
             webkit_web_view_restore_session_state(webView, state);
             webkit_web_view_session_state_unref(state);
         }
+
+        WebKitBackForwardList *bfList = webkit_web_view_get_back_forward_list(webView);
+        WebKitBackForwardListItem *item = webkit_back_forward_list_get_current_item(bfList);
+        if (item)
+            webkit_web_view_go_to_back_forward_list_item(webView, item);
+        else
+            webkit_web_view_load_uri(webView, "about:blank");
+
+        previousWebView = webView;
+        webView = NULL;
     }
 
-    WebKitBackForwardList *bfList = webkit_web_view_get_back_forward_list(webView);
-    WebKitBackForwardListItem *item = webkit_back_forward_list_get_current_item(bfList);
-    if (item)
-        webkit_web_view_go_to_back_forward_list_item(webView, item);
-    else
-        webkit_web_view_load_uri(webView, BROWSER_DEFAULT_URL);
-
+    g_strfreev(groups);
+    g_key_file_free(session);
 }
 
 void browser_window_set_background_color(BrowserWindow *window, GdkRGBA *rgba)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to