From a6adb4c1e9169f89dad3b6136eb1f791cd4419b1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Jul 2022 12:09:24 +0530 Subject: [PATCH] Try to always set the default webengine profile's cache path to the calibre cache directory --- src/calibre/constants.py | 1 + .../ebooks/conversion/plugins/pdf_output.py | 2 ++ src/calibre/ebooks/render_html.py | 2 ++ src/calibre/gui2/toc/main.py | 2 ++ src/calibre/gui2/tweak_book/main.py | 2 ++ src/calibre/gui2/viewer/main.py | 8 +++++--- src/calibre/utils/rapydscript.py | 19 +++++++++++-------- src/calibre/utils/webengine.py | 15 +++++++++++---- 8 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 513154a8fa..36fccb785b 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -39,6 +39,7 @@ isworker = hasenv('CALIBRE_WORKER') or hasenv('CALIBRE_SIMPLE_WORKER') if isworker: os.environ.pop(environ_item('CALIBRE_FORCE_ANSI'), None) FAKE_PROTOCOL, FAKE_HOST = 'clbr', 'internal.invalid' +SPECIAL_TITLE_FOR_WEBENGINE_COMMS = '__webengine_messages_pending__' VIEWER_APP_UID = 'com.calibre-ebook.viewer' EDITOR_APP_UID = 'com.calibre-ebook.edit-book' MAIN_APP_UID = 'com.calibre-ebook.main-gui' diff --git a/src/calibre/ebooks/conversion/plugins/pdf_output.py b/src/calibre/ebooks/conversion/plugins/pdf_output.py index 66db84a0b3..959d7b6d0b 100644 --- a/src/calibre/ebooks/conversion/plugins/pdf_output.py +++ b/src/calibre/ebooks/conversion/plugins/pdf_output.py @@ -155,6 +155,8 @@ class PDFOutput(OutputFormatPlugin): scheme.setFlags(QWebEngineUrlScheme.Flag.SecureScheme) QWebEngineUrlScheme.registerScheme(scheme) must_use_qt() + from calibre.utils.webengine import setup_default_profile + setup_default_profile() self.input_fmt = input_fmt if opts.pdf_use_document_margins: diff --git a/src/calibre/ebooks/render_html.py b/src/calibre/ebooks/render_html.py index f22404ebab..9f037e8876 100644 --- a/src/calibre/ebooks/render_html.py +++ b/src/calibre/ebooks/render_html.py @@ -99,6 +99,8 @@ def main(path_to_html, tdir, image_format='jpeg'): if image_format not in ('jpeg', 'png'): raise ValueError('Image format must be either jpeg or png') must_use_qt() + from calibre.utils.webengine import setup_default_profile + setup_default_profile() path_to_html = os.path.abspath(path_to_html) os.chdir(tdir) renderer = Render() diff --git a/src/calibre/gui2/toc/main.py b/src/calibre/gui2/toc/main.py index c9da36de82..b8c336b481 100644 --- a/src/calibre/gui2/toc/main.py +++ b/src/calibre/gui2/toc/main.py @@ -1188,6 +1188,8 @@ def main(shm_name=None): override = 'calibre-gui' if islinux else None app = Application([], override_program_name=override) + from calibre.utils.webengine import setup_default_profile + setup_default_profile() d = TOCEditor(path, title=title, write_result_to=path + '.result') d.start() ok = 0 diff --git a/src/calibre/gui2/tweak_book/main.py b/src/calibre/gui2/tweak_book/main.py index a4daf6dcfc..30d8ae9b94 100644 --- a/src/calibre/gui2/tweak_book/main.py +++ b/src/calibre/gui2/tweak_book/main.py @@ -71,6 +71,8 @@ def _run(args, notify=None): decouple('edit-book-'), set_gui_prefs(tprefs) override = 'calibre-ebook-edit' if islinux else None app = Application(args, override_program_name=override, color_prefs=tprefs, windows_app_uid=EDITOR_APP_UID) + from calibre.utils.webengine import setup_default_profile + setup_default_profile() app.file_event_hook = EventAccumulator() app.load_builtin_fonts() app.setWindowIcon(QIcon.ic('tweak.png')) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 2506deaf8e..701de2a469 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -5,15 +5,15 @@ import json import os import sys +from contextlib import closing from qt.core import QIcon, QObject, Qt, QTimer, pyqtSignal from qt.webengine import QWebEngineUrlScheme -from contextlib import closing from calibre.constants import FAKE_PROTOCOL, VIEWER_APP_UID, islinux from calibre.gui2 import Application, error_dialog, setup_gui_option_parser +from calibre.gui2.listener import send_message_in_process from calibre.gui2.viewer.config import get_session_pref, vprefs from calibre.gui2.viewer.ui import EbookViewer, is_float -from calibre.gui2.listener import send_message_in_process from calibre.ptempfile import reset_base_dir from calibre.utils.config import JSONConfig from calibre.utils.ipc import viewer_socket_address @@ -194,6 +194,8 @@ def main(args=sys.argv): pass args = processed_args app = Application(args, override_program_name=override, windows_app_uid=VIEWER_APP_UID) + from calibre.utils.webengine import setup_default_profile + setup_default_profile() parser = option_parser() opts, args = parser.parse_args(args) @@ -204,8 +206,8 @@ def main(args=sys.argv): raise SystemExit(f'Not a valid --open-at value: {opts.open_at}') if get_session_pref('singleinstance', False): - from calibre.utils.lock import SingleInstance from calibre.gui2.listener import Listener + from calibre.utils.lock import SingleInstance with SingleInstance(singleinstance_name) as si: if si: try: diff --git a/src/calibre/utils/rapydscript.py b/src/calibre/utils/rapydscript.py index 82019506b2..1768a6898c 100644 --- a/src/calibre/utils/rapydscript.py +++ b/src/calibre/utils/rapydscript.py @@ -11,15 +11,15 @@ import sys from calibre import force_unicode from calibre.constants import ( - FAKE_HOST, FAKE_PROTOCOL, __appname__, __version__, builtin_colors_dark, - builtin_colors_light, builtin_decorations, dark_link_color + FAKE_HOST, FAKE_PROTOCOL, SPECIAL_TITLE_FOR_WEBENGINE_COMMS, __appname__, + __version__, builtin_colors_dark, builtin_colors_light, builtin_decorations, + dark_link_color ) from calibre.ptempfile import TemporaryDirectory from calibre.utils.filenames import atomic_rename from polyglot.builtins import as_bytes, as_unicode, exec_path COMPILER_PATH = 'rapydscript/compiler.js.xz' -special_title = '__webengine_messages_pending__' def abspath(x): @@ -59,8 +59,9 @@ def compiler(): from calibre import walk from calibre.gui2 import must_use_qt - from calibre.utils.webengine import secure_webengine + from calibre.utils.webengine import secure_webengine, setup_default_profile must_use_qt() + setup_default_profile() with lzma.open(P(COMPILER_PATH, allow_user_override=False)) as lzf: compiler_script = lzf.read().decode('utf-8') @@ -124,7 +125,7 @@ document.title = 'compiler initialized'; class Compiler(QWebEnginePage): def __init__(self): - QWebEnginePage.__init__(self) + super().__init__() self.errors = [] secure_webengine(self) script = compiler_script @@ -330,17 +331,19 @@ def atomic_write(base, name, content): def run_rapydscript_tests(): - from urllib.parse import parse_qs from qt.core import QApplication, QByteArray, QEventLoop, QUrl from qt.webengine import ( QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineUrlRequestJob, QWebEngineUrlScheme, QWebEngineUrlSchemeHandler ) + from urllib.parse import parse_qs from calibre.constants import FAKE_HOST, FAKE_PROTOCOL from calibre.gui2 import must_use_qt from calibre.gui2.viewer.web_view import send_reply - from calibre.utils.webengine import secure_webengine, insert_scripts, create_script + from calibre.utils.webengine import ( + create_script, insert_scripts, secure_webengine + ) must_use_qt() scheme = QWebEngineUrlScheme(FAKE_PROTOCOL.encode('ascii')) scheme.setSyntax(QWebEngineUrlScheme.Syntax.Host) @@ -418,7 +421,7 @@ def run_rapydscript_tests(): def set_data(src, **kw): for k, v in { - '__SPECIAL_TITLE__': special_title, + '__SPECIAL_TITLE__': SPECIAL_TITLE_FOR_WEBENGINE_COMMS, '__FAKE_PROTOCOL__': FAKE_PROTOCOL, '__FAKE_HOST__': FAKE_HOST, '__CALIBRE_VERSION__': __version__, diff --git a/src/calibre/utils/webengine.py b/src/calibre/utils/webengine.py index 94c097d4c8..3d036c67e8 100644 --- a/src/calibre/utils/webengine.py +++ b/src/calibre/utils/webengine.py @@ -3,11 +3,18 @@ # License: GPL v3 Copyright: 2021, Kovid Goyal -import json +import json, os from qt.core import QBuffer, QIODevice, QObject, pyqtSignal, sip -from qt.webengine import QWebEngineScript, QWebEngineSettings +from qt.webengine import QWebEngineScript, QWebEngineSettings, QWebEngineProfile -from calibre.utils.rapydscript import special_title +from calibre.constants import cache_dir, SPECIAL_TITLE_FOR_WEBENGINE_COMMS + + +def setup_default_profile(): + p = QWebEngineProfile.defaultProfile() + q = os.path.join(cache_dir(), 'qt-webeng') + if p.cachePath() != q: + p.setCachePath(q) def send_reply(rq, mime_type, data): @@ -112,7 +119,7 @@ class Bridge(QObject): return self._signals_registered def _title_changed(self, title): - if title.startswith(special_title): + if title.startswith(SPECIAL_TITLE_FOR_WEBENGINE_COMMS): self._poll_for_messages() def _register_signals(self):