diff --git a/external/quickjs/quickjs-eval.js b/external/quickjs/quickjs-eval.js index ab93ae4e2a7ec..53f0a74b03043 100644 Binary files a/external/quickjs/quickjs-eval.js and b/external/quickjs/quickjs-eval.js differ diff --git a/src/scripting_api/app.js b/src/scripting_api/app.js index 7c4235186f103..3c8619615d421 100644 --- a/src/scripting_api/app.js +++ b/src/scripting_api/app.js @@ -152,13 +152,10 @@ class App extends PDFObject { } static _getLanguage(language) { - const [main, sub] = language.toLowerCase().split(/[-_]/); + const [main, sub] = language.toLowerCase().split(/[-_]/, 2); switch (main) { case "zh": - if (sub === "cn" || sub === "sg") { - return "CHS"; - } - return "CHT"; + return sub === "cn" || sub === "sg" ? "CHS" : "CHT"; case "da": return "DAN"; case "de": @@ -178,10 +175,7 @@ class App extends PDFObject { case "no": return "NOR"; case "pt": - if (sub === "br") { - return "PTB"; - } - return "ENU"; + return sub === "br" ? "PTB" : "ENU"; case "fi": return "SUO"; case "SV": @@ -249,13 +243,10 @@ class App extends PDFObject { } get fs() { - if (this._fs === null) { - this._fs = new Proxy( - new FullScreen({ send: this._send }), - this._proxyHandler - ); - } - return this._fs; + return (this._fs ??= new Proxy( + new FullScreen({ send: this._send }), + this._proxyHandler + )); } set fs(_) { @@ -356,13 +347,10 @@ class App extends PDFObject { } get thermometer() { - if (this._thermometer === null) { - this._thermometer = new Proxy( - new Thermometer({ send: this._send }), - this._proxyHandler - ); - } - return this._thermometer; + return (this._thermometer ??= new Proxy( + new Thermometer({ send: this._send }), + this._proxyHandler + )); } set thermometer(_) { diff --git a/src/scripting_api/field.js b/src/scripting_api/field.js index b5de544e783e4..5e355d924911c 100644 --- a/src/scripting_api/field.js +++ b/src/scripting_api/field.js @@ -453,11 +453,9 @@ class Field extends PDFObject { return array; } - if (this._children === null) { - this._children = this._document.obj._getTerminalChildren(this._fieldPath); - } - - return this._children; + return (this._children ??= this._document.obj._getTerminalChildren( + this._fieldPath + )); } getLock() { diff --git a/test/integration/thumbnail_view_spec.mjs b/test/integration/thumbnail_view_spec.mjs index 6c18182d3936e..ae830a7548f61 100644 --- a/test/integration/thumbnail_view_spec.mjs +++ b/test/integration/thumbnail_view_spec.mjs @@ -413,6 +413,46 @@ describe("PDF Thumbnail View", () => { }); }); + describe("Views manager status visibility (bug 2016656)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "page_with_number_and_link.pdf", + "#viewsManagerToggleButton", + null, + null, + { enableSplitMerge: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("should show the manage button in thumbnail view and hide it in outline view", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await page.click("#viewsManagerToggleButton"); + await waitForThumbnailVisible(page, 1); + + // The status bar (Select pages + Manage button) must be visible in + // thumbnail view. + await page.waitForSelector("#viewsManagerStatus", { visible: true }); + + // Switch to outline view. + await page.click("#viewsManagerSelectorButton"); + await page.waitForSelector("#outlinesViewMenu", { visible: true }); + await page.click("#outlinesViewMenu"); + await page.waitForSelector("#outlinesView", { visible: true }); + + // The status bar must no longer be visible in outline view. + await page.waitForSelector("#viewsManagerStatus", { hidden: true }); + }) + ); + }); + }); + describe("Checkbox keyboard navigation", () => { let pages; diff --git a/web/viewer.js b/web/viewer.js index 0e86d3c2d54ec..7cba84a10db7f 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -133,6 +133,7 @@ function getViewerConfiguration() { viewsManagerHeaderLabel: document.getElementById( "viewsManagerHeaderLabel" ), + viewsManagerStatus: document.getElementById("viewsManagerStatus"), manageMenu: { button: document.getElementById("viewsManagerStatusActionButton"), menu: document.getElementById("viewsManagerStatusActionOptions"), diff --git a/web/views_manager.js b/web/views_manager.js index 9c08e7fb497fe..f4eb38d1acfc3 100644 --- a/web/views_manager.js +++ b/web/views_manager.js @@ -90,6 +90,7 @@ class ViewsManager extends Sidebar { viewsManagerSelectorButton, viewsManagerSelectorOptions, viewsManagerHeaderLabel, + viewsManagerStatus, }, eventBus, l10n, @@ -132,6 +133,7 @@ class ViewsManager extends Sidebar { this.viewsManagerCurrentOutlineButton = viewsManagerCurrentOutlineButton; this.viewsManagerHeaderLabel = viewsManagerHeaderLabel; + this.viewsManagerStatus = viewsManagerStatus; this.eventBus = eventBus; @@ -245,6 +247,7 @@ class ViewsManager extends Sidebar { return; } + this.viewsManagerStatus.hidden = view !== SidebarView.THUMBS; this.viewsManagerCurrentOutlineButton.hidden = view !== SidebarView.OUTLINE; this.viewsManagerHeaderLabel.setAttribute( "data-l10n-id",