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)