summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2020-04-27 11:59:57 +0200
committerFlorian Bruhin <me@the-compiler.org>2020-04-27 12:00:46 +0200
commit63ade39d2ca10cc086b9d4e8fb6131ef3b4c4782 (patch)
tree8b331b109bf84a0948dfba2d09a5c021ca0dd76d
parent485708f1a371cf4b3fc004185d014849f950659b (diff)
downloadqutebrowser-63ade39d2ca10cc086b9d4e8fb6131ef3b4c4782.tar.gz
qutebrowser-63ade39d2ca10cc086b9d4e8fb6131ef3b4c4782.zip
Add stop-gap measure for sessions with Qt 5.15
See #5359
-rw-r--r--doc/changelog.asciidoc3
-rw-r--r--qutebrowser/app.py4
-rw-r--r--qutebrowser/browser/qutescheme.py7
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py6
-rw-r--r--qutebrowser/html/warning-sessions.html21
-rw-r--r--qutebrowser/misc/sessions.py12
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: