diff options
author | Florian Bruhin <me@the-compiler.org> | 2020-04-27 11:59:57 +0200 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2020-04-27 12:00:46 +0200 |
commit | 63ade39d2ca10cc086b9d4e8fb6131ef3b4c4782 (patch) | |
tree | 8b331b109bf84a0948dfba2d09a5c021ca0dd76d | |
parent | 485708f1a371cf4b3fc004185d014849f950659b (diff) | |
download | qutebrowser-63ade39d2ca10cc086b9d4e8fb6131ef3b4c4782.tar.gz qutebrowser-63ade39d2ca10cc086b9d4e8fb6131ef3b4c4782.zip |
Add stop-gap measure for sessions with Qt 5.15
See #5359
-rw-r--r-- | doc/changelog.asciidoc | 3 | ||||
-rw-r--r-- | qutebrowser/app.py | 4 | ||||
-rw-r--r-- | qutebrowser/browser/qutescheme.py | 7 | ||||
-rw-r--r-- | qutebrowser/browser/webengine/webenginetab.py | 6 | ||||
-rw-r--r-- | qutebrowser/html/warning-sessions.html | 21 | ||||
-rw-r--r-- | qutebrowser/misc/sessions.py | 12 |
6 files changed, 51 insertions, 2 deletions
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 %} +<h1>{{ title }}</h1> +<span class="note">Note this warning will only appear once. Use <span class="mono">:open +qute://warning/sessions</span> to show it again at a later time.</span> + +<p>You're using qutebrowser with Qt 5.15.</p> + +<p>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.</p> + +<p>At the time of writing (April 2020), a new session format which stores part of the needed binary data in saved sessions is <a href="https://github.com/qutebrowser/qutebrowser/issues/5359">in development</a> and will be released with qutebrowser v1.12.0.</p> + +<p>As a stop-gap measure:</p> + +<ul> + <li>Loading a session with this release will <b>only load the most recently opened page</b> for every tab. As a result, the back/forward-history of every tab <b>will be lost</b> as soon as the session is saved again.</li> + <li>A one-time backup of the session folder has been created at <span class="mono">{{ datadir }}{{ sep }}sessions{{ sep }}before-qt-515</span>.</li> +</ul> + +{% 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: |