Skip to content

Commit 123ed24

Browse files
authored
Merge pull request #20750 from calixteman/pr20740_followup
Add an integration test for PR 20740
2 parents 218a687 + 2572285 commit 123ed24

6 files changed

Lines changed: 102 additions & 30 deletions

File tree

test/integration/reorganize_pages_spec.mjs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,13 @@ import {
2828
kbDelete,
2929
loadAndWait,
3030
scrollIntoView,
31+
showViewsManager,
3132
waitAndClick,
3233
waitForDOMMutation,
3334
} from "./test_utils.mjs";
3435

3536
async function waitForThumbnailVisible(page, pageNums) {
36-
const hasAnimations = await page.evaluate(
37-
() => !window.matchMedia("(prefers-reduced-motion: reduce)").matches
38-
);
39-
await page.click("#viewsManagerToggleButton");
40-
if (hasAnimations) {
41-
await page.waitForSelector("#outerContainer.viewsManagerMoving", {
42-
visible: true,
43-
});
44-
}
45-
await page.waitForSelector(
46-
"#outerContainer:not(.viewsManagerMoving).viewsManagerOpen",
47-
{ visible: true }
48-
);
37+
await showViewsManager(page);
4938

5039
const thumbSelector = "#thumbnailsView .thumbnailImageContainer > img";
5140
await page.waitForSelector(thumbSelector, { visible: true });

test/integration/test_utils.mjs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -964,6 +964,26 @@ async function highlightSpan(
964964
await page.waitForSelector(getEditorSelector(nextId));
965965
}
966966

967+
async function showViewsManager(page) {
968+
const hasAnimations = await page.evaluate(
969+
() => !window.matchMedia("(prefers-reduced-motion: reduce)").matches
970+
);
971+
const movingPromise = hasAnimations
972+
? page.waitForSelector("#outerContainer.viewsManagerMoving", {
973+
visible: true,
974+
})
975+
: Promise.resolve();
976+
await page.click("#viewsManagerToggleButton");
977+
if (hasAnimations) {
978+
await movingPromise;
979+
}
980+
await page.waitForSelector("#viewsManager", { visible: true });
981+
await page.waitForSelector(
982+
"#outerContainer:not(.viewsManagerMoving).viewsManagerOpen",
983+
{ visible: true }
984+
);
985+
}
986+
967987
// Unicode bidi isolation characters, Fluent adds these markers to the text.
968988
const FSI = "\u2068";
969989
const PDI = "\u2069";
@@ -1030,6 +1050,7 @@ export {
10301050
selectEditors,
10311051
serializeBitmapDimensions,
10321052
setCaretAt,
1053+
showViewsManager,
10331054
switchToEditor,
10341055
unselectEditor,
10351056
waitAndClick,

test/integration/thumbnail_view_spec.mjs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
kbFocusNext,
66
loadAndWait,
77
PDI,
8+
showViewsManager,
89
} from "./test_utils.mjs";
910

1011
function waitForThumbnailVisible(page, pageNum) {
@@ -29,23 +30,6 @@ async function waitForMenu(page, buttonSelector, visible = true) {
2930
);
3031
}
3132

32-
async function showViewsManager(page) {
33-
const hasAnimations = await page.evaluate(
34-
() => !window.matchMedia("(prefers-reduced-motion: reduce)").matches
35-
);
36-
await page.click("#viewsManagerToggleButton");
37-
if (hasAnimations) {
38-
await page.waitForSelector("#outerContainer.viewsManagerMoving", {
39-
visible: true,
40-
});
41-
}
42-
await page.waitForSelector("#viewsManager", { visible: true });
43-
await page.waitForSelector(
44-
"#outerContainer:not(.viewsManagerMoving).viewsManagerOpen",
45-
{ visible: true }
46-
);
47-
}
48-
4933
describe("PDF Thumbnail View", () => {
5034
describe("Works without errors", () => {
5135
let pages;

test/integration/viewer_spec.mjs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
getSpanRectFromText,
2222
loadAndWait,
2323
scrollIntoView,
24+
showViewsManager,
2425
waitForPageChanging,
2526
waitForPageRendered,
2627
} from "./test_utils.mjs";
@@ -1451,6 +1452,82 @@ describe("PDF viewer", () => {
14511452
});
14521453
});
14531454

1455+
describe("Outline tree shift-click toggle (PR 20740)", () => {
1456+
let pages;
1457+
1458+
beforeEach(async () => {
1459+
pages = await loadAndWait(
1460+
"nested_outline.pdf",
1461+
"#viewsManagerToggleButton"
1462+
);
1463+
});
1464+
1465+
afterEach(async () => {
1466+
await closePages(pages);
1467+
});
1468+
1469+
it("should only toggle the clicked item's subtree, not the whole outline", async () => {
1470+
await Promise.all(
1471+
pages.map(async ([browserName, page]) => {
1472+
// Open the sidebar.
1473+
await showViewsManager(page);
1474+
1475+
// Switch to outline view.
1476+
await page.click("#viewsManagerSelectorButton");
1477+
await page.waitForSelector("#outlinesViewMenu", { visible: true });
1478+
await page.click("#outlinesViewMenu");
1479+
1480+
// Wait for the outline tree to render with nesting (toggle buttons).
1481+
await page.waitForSelector("#outlinesView.withNesting");
1482+
1483+
// Initially all three top-level togglers must be expanded.
1484+
const initialHiddenCount = await page.$$eval(
1485+
"#outlinesView > .treeItem > .treeItemToggler",
1486+
togglers =>
1487+
togglers.filter(t => t.classList.contains("treeItemsHidden"))
1488+
.length
1489+
);
1490+
expect(initialHiddenCount).withContext(`In ${browserName}`).toBe(0);
1491+
1492+
// Shift-click the first top-level toggler (section "1. Introduction")
1493+
// to collapse only its subtree.
1494+
// The toggler has width/height 0 (visual content via ::before), so
1495+
// we dispatch the MouseEvent directly rather than using page.click().
1496+
await page.evaluate(() => {
1497+
const toggler = document.querySelector(
1498+
"#outlinesView > .treeItem:nth-child(1) > .treeItemToggler"
1499+
);
1500+
toggler.dispatchEvent(
1501+
new MouseEvent("click", {
1502+
shiftKey: true,
1503+
bubbles: true,
1504+
cancelable: true,
1505+
})
1506+
);
1507+
});
1508+
1509+
// Section 1's toggler must now be collapsed.
1510+
const section1Collapsed = await page.$eval(
1511+
"#outlinesView > .treeItem:nth-child(1) > .treeItemToggler",
1512+
t => t.classList.contains("treeItemsHidden")
1513+
);
1514+
expect(section1Collapsed).withContext(`In ${browserName}`).toBeTrue();
1515+
1516+
// Sections 2 and 3 must remain expanded (the bug collapsed the whole
1517+
// outline by passing `this.container` instead of
1518+
// `target.parentNode`).
1519+
const otherHiddenCount = await page.$$eval(
1520+
"#outlinesView > .treeItem:nth-child(n+2) > .treeItemToggler",
1521+
togglers =>
1522+
togglers.filter(t => t.classList.contains("treeItemsHidden"))
1523+
.length
1524+
);
1525+
expect(otherHiddenCount).withContext(`In ${browserName}`).toBe(0);
1526+
})
1527+
);
1528+
});
1529+
});
1530+
14541531
describe("Scroll into view", () => {
14551532
let pages;
14561533

test/pdfs/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,3 +874,4 @@
874874
!bug2013793.pdf
875875
!bug2014080.pdf
876876
!two_pages.pdf
877+
!nested_outline.pdf

test/pdfs/nested_outline.pdf

5.79 KB
Binary file not shown.

0 commit comments

Comments
 (0)