From 63ade39d2ca10cc086b9d4e8fb6131ef3b4c4782 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 27 Apr 2020 11:59:57 +0200 Subject: Add stop-gap measure for sessions with Qt 5.15 See #5359 --- doc/changelog.asciidoc | 3 ++- qutebrowser/app.py | 4 ++++ qutebrowser/browser/qutescheme.py | 7 ++++++- qutebrowser/browser/webengine/webenginetab.py | 6 ++++++ qutebrowser/html/warning-sessions.html | 21 +++++++++++++++++++++ qutebrowser/misc/sessions.py | 12 ++++++++++++ 6 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 qutebrowser/html/warning-sessions.html diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index f8ed0d08d..309f36b2e 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -40,6 +40,8 @@ Added Changed ~~~~~~~ +- First adaptions to Qt 5.15, including a stop-gap measure for session loading + not working properly with it. - Searching now wraps around the page by default with QtWebKit (where it didn't before). Set `search.wrap` to `false` to restore the old behavior. - The `{}` placeholder for search engines (the `url.searchengines` setting) now @@ -58,7 +60,6 @@ Changed data. - The `dictcli.py` script now shows better error messages. - Various improvements to the `mkvenv.py` script (mainly useful for development). -- First adoptions to Qt 5.15. - Minor performance improvements. Deprecated diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 9d38071bf..22ae62b96 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -336,6 +336,10 @@ def _open_special_pages(args): ('old-qt-warning-shown', not qtutils.version_check('5.11'), 'qute://warning/old-qt'), + + ('session-warning-shown', + qtutils.version_check('5.15', compiled=False), + 'qute://warning/sessions'), ] for state, condition, url in pages: diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 3bc057796..6c61fbc22 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -47,7 +47,7 @@ import qutebrowser from qutebrowser.browser import pdfjs, downloads, history from qutebrowser.config import config, configdata, configexc, configdiff from qutebrowser.utils import (version, utils, jinja, log, message, docutils, - objreg, urlutils) + objreg, urlutils, standarddir) from qutebrowser.qt import sip @@ -576,6 +576,11 @@ def qute_warning(url): elif path == '/webkit': src = jinja.render('warning-webkit.html', title='QtWebKit backend warning') + elif path == '/sessions': + src = jinja.render('warning-sessions.html', + title='Qt 5.15 sessions warning', + datadir=standarddir.data(), + sep=os.sep) else: raise NotFoundError("Invalid warning page {}".format(path)) return 'text/html', src diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 8b26f2136..ffe227988 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -645,6 +645,12 @@ class WebEngineHistoryPrivate(browsertab.AbstractHistoryPrivate): qtutils.deserialize(data, self._history) def load_items(self, items): + if qtutils.version_check('5.15', compiled=False): + # WORKAROUND for https://github.com/qutebrowser/qutebrowser/issues/5359 + if items: + self._tab.load_url(items[-1].url) + return + if items: self._tab.before_load_started.emit(items[-1].url) diff --git a/qutebrowser/html/warning-sessions.html b/qutebrowser/html/warning-sessions.html new file mode 100644 index 000000000..f93971c6a --- /dev/null +++ b/qutebrowser/html/warning-sessions.html @@ -0,0 +1,21 @@ +{% extends "styled.html" %} + +{% block content %} +

{{ title }}

+Note this warning will only appear once. Use :open +qute://warning/sessions to show it again at a later time. + +

You're using qutebrowser with Qt 5.15.

+ +

Since Qt doesn't provide an API to load the history of a tab, qutebrowser relies on a reverse-engineered binary serialization format to load tab history from session files. With Qt 5.15, unfortunately that format changed (due to the underlying Chromium upgrade), in a way which makes it impossible for qutebrowser to load tab history from existing session data.

+ +

At the time of writing (April 2020), a new session format which stores part of the needed binary data in saved sessions is in development and will be released with qutebrowser v1.12.0.

+ +

As a stop-gap measure:

+ + + +{% endblock %} diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index 1bcd42baf..b0116eb09 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -24,6 +24,8 @@ import os.path import itertools import urllib import typing +import glob +import shutil from PyQt5.QtCore import QUrl, QObject, QPoint, QTimer, pyqtSlot from PyQt5.QtWidgets import QApplication @@ -59,6 +61,16 @@ def init(parent=None): parent: The parent to use for the SessionManager. """ base_path = os.path.join(standarddir.data(), 'sessions') + + # WORKAROUND for https://github.com/qutebrowser/qutebrowser/issues/5359 + backup_path = os.path.join(base_path, 'before-qt-515') + if (os.path.exists(base_path) and + not os.path.exists(backup_path) and + qtutils.version_check('5.15', compiled=False)): + os.mkdir(backup_path) + for filename in glob.glob(os.path.join(base_path, '*.yml')): + shutil.copy(filename, backup_path) + try: os.mkdir(base_path) except FileExistsError: -- cgit v1.2.3-54-g00ecf