From 4919dae2943e8021a3b543c659368442feb63022 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 15 Aug 2022 16:21:58 +0200 Subject: [PATCH] Refresh the viewer if the window resolution changes (bug 1784850) *Please note:* This probably fixes bug 1784850, however I don't have the necessary hardware to reproduce the situation described in https://bugzilla.mozilla.org/show_bug.cgi?id=1784850#c0 Unfortunately it doesn't, as far as I can tell, appear possible to detect *all* resolution changes with a single media query. Instead we have to update it, and its listener, on every resolution change as outlined in [this MDN example](https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio#monitoring_screen_resolution_or_zoom_level_changes). --- web/app.js | 26 ++++++++++++++++++++++++++ web/base_viewer.js | 11 +++++++++++ 2 files changed, 37 insertions(+) diff --git a/web/app.js b/web/app.js index 749b829fb..c53ebc71e 100644 --- a/web/app.js +++ b/web/app.js @@ -2004,6 +2004,27 @@ const PDFViewerApplication = { bindWindowEvents() { const { eventBus, _boundEvents } = this; + function addWindowResolutionChange(evt = null) { + if (evt) { + webViewerResolutionChange(evt); + } + const mediaQueryList = window.matchMedia( + `(resolution: ${window.devicePixelRatio || 1}dppx)` + ); + mediaQueryList.addEventListener("change", addWindowResolutionChange, { + once: true, + }); + + if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { + return; + } + _boundEvents.removeWindowResolutionChange ||= function () { + mediaQueryList.removeEventListener("change", addWindowResolutionChange); + _boundEvents.removeWindowResolutionChange = null; + }; + } + addWindowResolutionChange(); + _boundEvents.windowResize = () => { eventBus.dispatch("resize", { source: window }); }; @@ -2123,6 +2144,7 @@ const PDFViewerApplication = { _boundEvents.windowUpdateFromSandbox ); + _boundEvents.removeWindowResolutionChange?.(); _boundEvents.windowResize = null; _boundEvents.windowHashChange = null; _boundEvents.windowBeforePrint = null; @@ -2689,6 +2711,10 @@ function webViewerPageChanging({ pageNumber, pageLabel }) { } } +function webViewerResolutionChange(evt) { + PDFViewerApplication.pdfViewer.refresh(); +} + function webViewerVisibilityChange(evt) { if (document.visibilityState === "visible") { // Ignore mouse wheel zooming during tab switches (bug 1503412). diff --git a/web/base_viewer.js b/web/base_viewer.js index e1541235f..5ff689585 100644 --- a/web/base_viewer.js +++ b/web/base_viewer.js @@ -2247,6 +2247,17 @@ class BaseViewer { } this.#annotationEditorUIManager.updateParams(type, value); } + + refresh() { + if (!this.pdfDocument) { + return; + } + const updateArgs = {}; + for (const pageView of this._pages) { + pageView.update(updateArgs); + } + this.update(); + } } export { BaseViewer, PagesCountLimit, PDFPageViewBuffer };