From 396bc0c1721af8d3ee970228e7df457f6b2c73d5 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Mon, 13 Apr 2020 15:44:09 +0300 Subject: Rewrite Session backend Add session.hpp, containing structs that describe session data MainWindow, SubWindow and WebView can be created from Session::structs Opening new window will automatically open a default subwindow and tab if none were specified Add lib/session_formats Add JsonSession, to serialize/deserialize Session structs into JSON - add some tests clang-tidy: - fix various warnings - disable modernize-use-trailing-return-type check --- src/session/session.cpp | 177 ------------------------------------------------ 1 file changed, 177 deletions(-) delete mode 100644 src/session/session.cpp (limited to 'src/session/session.cpp') diff --git a/src/session/session.cpp b/src/session/session.cpp deleted file mode 100644 index c97c22b..0000000 --- a/src/session/session.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * This file is part of smolbote. It's copyrighted by the contributors recorded - * in the version control history of the file, available from its original - * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote - * - * SPDX-License-Identifier: GPL-3.0 - */ - -#include "session.h" -#include "../webengine/webview.h" -#include "browser.h" -#include "configuration.h" -#include "mainwindow/mainwindow.h" -#include "subwindow/subwindow.h" -#include "webengine/webprofilemanager.h" -#include "webengine/webview.h" -#include -#include -#include -#include - -QJsonObject Session::fromCommandLine(const QString &profile, const QStringList &urls) -{ - QJsonObject session; - - QJsonArray subwindows; - { - QJsonObject window; - window.insert("profile", profile); - - QJsonArray tabs; - for(const auto &url : urls) { - QJsonObject tab; - tab.insert("url", url); - tab.insert("profile", profile); - tabs.append(tab); - } - window.insert("tabs", tabs); - - subwindows.append(window); - } - session.insert("subwindows", subwindows); - - return session; -} - -////// - -QJsonObject Session::_session(const QVector windows) -{ - QJsonObject sessionData; - - { - QJsonArray windowList; - for(const auto *window : windows) { - windowList.append(Session::_window(window)); - } - sessionData.insert("windows", windowList); - } - - return sessionData; -} - -QJsonObject Session::_window(const MainWindow *window) -{ - QJsonObject windowData; - - { - QJsonArray subwindows; - for(const auto *subwindow : window->subWindows()) { - subwindows.append(Session::_subwindow(subwindow)); - } - windowData.insert("subwindows", subwindows); - } - - return windowData; -} - -QJsonObject Session::_subwindow(const SubWindow *subwindow) -{ - const auto *profileManager = WebProfileManager::instance(); - Q_CHECK_PTR(profileManager); - - QJsonObject subwindowData; - - subwindowData.insert("profile", profileManager->id(subwindow->profile())); - - { - QJsonArray tabs; - for(int i = 0; i < subwindow->tabCount(); ++i) { - tabs.append(Session::view(subwindow->view(i))); - } - subwindowData.insert("tabs", tabs); - } - - return subwindowData; -} - -QJsonObject Session::view(const WebView *view) -{ - const auto *profileManager = WebProfileManager::instance(); - Q_CHECK_PTR(profileManager); - - QByteArray historyData; - QDataStream historyStream(&historyData, QIODevice::WriteOnly); - historyStream << *view->history(); - - QJsonObject viewData; - viewData.insert("profile", profileManager->id(view->profile())); - - // store history: compress, toBase64 (to make printable), toQString (to store in json) - viewData.insert("history", QString(qCompress(historyData).toBase64())); - - return viewData; -} - -void Session::restoreView(WebView *view, const QJsonObject &data) -{ - const auto *profileManager = WebProfileManager::instance(); - Q_CHECK_PTR(profileManager); - - auto *profile = profileManager->profile(data["profile"].toString()); - if(profile != nullptr) - view->setProfile(profile); - - auto url = data.value("url"); - if(url.isString()) - view->load(QUrl::fromUserInput(url.toString())); - else { - // restore history: toLatin1 (turn into bytearray), fromBase64, uncompress - QByteArray historyData = qUncompress(QByteArray::fromBase64(data["history"].toString().toLatin1())); - QDataStream historyStream(&historyData, QIODevice::ReadOnly); - historyStream >> *view->history(); - } -} - -void Session::restoreSession(const QJsonObject &sessionData) -{ - auto *browser = dynamic_cast(qApp); - Q_CHECK_PTR(browser); - const auto *profileManager = WebProfileManager::instance(); - Q_CHECK_PTR(profileManager); - - for(const auto subwindowData : sessionData["subwindows"].toArray()) { - MainWindow *window = nullptr; - SubWindow *subwindow = nullptr; - - if(!browser->windows().isEmpty()) { - window = browser->windows().last(); - subwindow = window->currentSubWindow(); - } else { - window = browser->createWindow(); - subwindow = window->createSubWindow(profileManager->profile(subwindowData.toObject()["profile"].toString())); - } - - Q_CHECK_PTR(window); - Q_CHECK_PTR(subwindow); - - for(const auto tabData : subwindowData.toObject()["tabs"].toArray()) { - auto *view = subwindow->view(subwindow->addTab()); - Session::restoreView(view, tabData.toObject()); - } - } - - for(const auto windowData : sessionData["windows"].toArray()) { - auto *window = browser->createWindow(); - - for(const auto subwindowData : windowData.toObject()["subwindows"].toArray()) { - auto *subwindow = window->createSubWindow(profileManager->profile(subwindowData.toObject()["profile"].toString())); - - for(const auto tabData : subwindowData.toObject()["tabs"].toArray()) { - auto *view = subwindow->view(subwindow->addTab()); - Session::restoreView(view, tabData.toObject()); - } - } - } -} -- cgit v1.2.1