diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index e490e3885d..ba42a93f74 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -43,6 +43,7 @@ except ImportError: vprefs = JSONConfig('viewer-webengine') viewer_config_dir = os.path.join(config_dir, 'viewer') vprefs.defaults['session_data'] = {} +vprefs.defaults['local_storage'] = {} vprefs.defaults['main_window_state'] = None vprefs.defaults['main_window_geometry'] = None vprefs.defaults['old_prefs_migrated'] = False @@ -223,6 +224,7 @@ def create_profile(): class ViewerBridge(Bridge): set_session_data = from_js(object, object) + set_local_storage = from_js(object, object) reload_book = from_js() toggle_toc = from_js() toggle_bookmarks = from_js() @@ -399,6 +401,7 @@ class WebView(RestartingWebEngineView): self._page = WebPage(self) self.bridge.bridge_ready.connect(self.on_bridge_ready) self.bridge.set_session_data.connect(self.set_session_data) + self.bridge.set_local_storage.connect(self.set_local_storage) self.bridge.reload_book.connect(self.reload_book) self.bridge.toggle_toc.connect(self.toggle_toc) self.bridge.toggle_bookmarks.connect(self.toggle_bookmarks) @@ -482,7 +485,7 @@ class WebView(RestartingWebEngineView): f = QApplication.instance().font() fi = QFontInfo(f) self.bridge.create_view( - vprefs['session_data'], QFontDatabase().families(), field_metadata.all_metadata(), + vprefs['session_data'], vprefs['local_storage'], QFontDatabase().families(), field_metadata.all_metadata(), f.family(), '{}px'.format(fi.pixelSize()), self.show_home_page_on_ready) for func, args in iteritems(self.pending_bridge_ready_actions): getattr(self.bridge, func)(*args) @@ -517,6 +520,14 @@ class WebView(RestartingWebEngineView): if key in ('standalone_font_settings', 'base_font_size'): apply_font_settings(self._page) + def set_local_storage(self, key, val): + if key == '*' and val is None: + vprefs['local_storage'] = {} + elif key != '*': + sd = vprefs['local_storage'] + sd[key] = val + vprefs['local_storage'] = sd + def do_callback(self, func_name, callback): cid = next(self.callback_id_counter) self.callback_map[cid] = callback diff --git a/src/pyj/viewer-main.pyj b/src/pyj/viewer-main.pyj index 5f760f8cfd..87c9d3e9a5 100644 --- a/src/pyj/viewer-main.pyj +++ b/src/pyj/viewer-main.pyj @@ -20,7 +20,7 @@ from read_book.globals import runtime, ui_operations from read_book.iframe import main as iframe_main from read_book.shortcuts import add_standalone_viewer_shortcuts from read_book.view import View -from session import session_defaults +from session import session_defaults, local_storage from utils import encode_query_with_path, parse_url_params from viewer.constants import FAKE_HOST, FAKE_PROTOCOL, READER_BACKGROUND_URL @@ -183,20 +183,43 @@ class SessionData: to_python.set_session_data('*', None) -def create_session_data(prefs): +class LocalStorage: + + def __init__(self, data): + self.data = data + + def get(self, key, defval): + ans = self.data[key] + if ans is undefined or ans is None: + if defval is undefined: + defval = None + return defval + return ans + + def set(self, key, val): + self.data[key] = val + to_python.set_local_storage(key, val) + + def clear(self): + self.data = {} + to_python.set_local_storage('*', None) + + +def create_session_data(prefs, local_storage_data): sd = SessionData(prefs) set_session_data(sd) + local_storage.storage = LocalStorage(local_storage_data) @from_python -def create_view(prefs, all_font_families, field_metadata, ui_font_family, ui_font_sz, show_home_page_on_ready): +def create_view(prefs, local_storage, all_font_families, field_metadata, ui_font_family, ui_font_sz, show_home_page_on_ready): nonlocal view runtime.all_font_families = all_font_families library_data.field_metadata = field_metadata document.documentElement.style.fontFamily = f'"{ui_font_family}", sans-serif' document.documentElement.style.fontSize = ui_font_sz if view is None: - create_session_data(prefs) + create_session_data(prefs, local_storage) view = View(document.getElementById('view')) if show_home_page_on_ready: view.overlay.open_book(False)