Skip to content

Commit 98f7e85

Browse files
authored
Merge pull request #20837 from calixteman/bug2021934
Disable dragging a thumbnail when the user has to paste what they copied (bug 2021934)
2 parents eb159ab + 7010086 commit 98f7e85

File tree

2 files changed

+74
-16
lines changed

2 files changed

+74
-16
lines changed

test/integration/reorganize_pages_spec.mjs

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,12 @@ describe("Reorganize Pages View", () => {
190190
return false;
191191
}
192192
);
193-
const dndPromise = dragAndDrop(
193+
await dragAndDrop(
194194
page,
195195
getThumbnailSelector(1),
196196
[[0, rect2.y - rect1.y + rect2.height / 2]],
197197
10
198198
);
199-
await dndPromise;
200199
await awaitPromise(handleAddedMarker);
201200
await awaitPromise(handleRemovedMarker);
202201
})
@@ -1685,4 +1684,66 @@ describe("Reorganize Pages View", () => {
16851684
);
16861685
});
16871686
});
1687+
1688+
describe("Dragging mustn't be possible when pasting (bug 2021934)", () => {
1689+
let pages;
1690+
1691+
beforeEach(async () => {
1692+
pages = await loadAndWait(
1693+
"page_with_number.pdf",
1694+
"#viewsManagerToggleButton",
1695+
"page-fit",
1696+
null,
1697+
{ enableSplitMerge: true }
1698+
);
1699+
});
1700+
1701+
afterEach(async () => {
1702+
await closePages(pages);
1703+
});
1704+
1705+
it("should check that dragging is disabled when pasting", async () => {
1706+
await Promise.all(
1707+
pages.map(async ([browserName, page]) => {
1708+
await waitForThumbnailVisible(page, 1);
1709+
1710+
await Promise.all([
1711+
page.waitForSelector(`#thumbnailsView.isDragging`, {
1712+
visible: true,
1713+
}),
1714+
dragAndDrop(page, getThumbnailSelector(1), [[0, 10]], 10),
1715+
]);
1716+
1717+
await page.waitForSelector(`#thumbnailsView.isDragging`, {
1718+
hidden: true,
1719+
});
1720+
await waitAndClick(
1721+
page,
1722+
`.thumbnail:has(${getThumbnailSelector(1)}) input`
1723+
);
1724+
await waitAndClick(page, "#viewsManagerStatusActionButton");
1725+
await waitAndClick(page, "#viewsManagerStatusActionCopy");
1726+
1727+
// If dragging isn't disabled, the promise will resolve with the
1728+
// selector. Otherwise, it will resolve with undefined (dragAndDrop
1729+
// has no return), which is the expected behavior.
1730+
const abortController = new AbortController();
1731+
const first = await Promise.race([
1732+
page.waitForSelector(`#thumbnailsView.isDragging`, {
1733+
visible: true,
1734+
signal: abortController.signal,
1735+
}),
1736+
dragAndDrop(page, getThumbnailSelector(1), [[0, 10]], 10),
1737+
]);
1738+
abortController.abort();
1739+
1740+
expect(first)
1741+
.withContext(
1742+
`In ${browserName}, dragging should be disabled when pasting`
1743+
)
1744+
.toBeUndefined();
1745+
})
1746+
);
1747+
});
1748+
});
16881749
});

web/pdf_thumbnail_viewer.js

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ class PDFThumbnailViewer {
159159

160160
#undoCloseButton = null;
161161

162+
#isInPasteMode = false;
163+
162164
/**
163165
* @param {PDFThumbnailViewerOptions} options
164166
*/
@@ -525,6 +527,7 @@ class PDFThumbnailViewer {
525527
}
526528

527529
#updateThumbnails(currentPageNumber) {
530+
this.#resetCurrentThumbnail(0);
528531
let newCurrentPageNumber = 0;
529532
const pagesMapper = this.#pagesMapper;
530533
const prevThumbnails = (this.#savedThumbnails = this._thumbnails);
@@ -658,13 +661,13 @@ class PDFThumbnailViewer {
658661
const newIndex = lastDraggedOverIndex + 1;
659662
const pagesToMove = Array.from(selectedPages).sort((a, b) => a - b);
660663
const pagesMapper = this.#pagesMapper;
661-
let currentPageNumber = isNaN(this.#pageNumberToRemove)
664+
const currentPageNumber = isNaN(this.#pageNumberToRemove)
662665
? pagesToMove[0]
663666
: this.#pageNumberToRemove;
664667

665668
pagesMapper.movePages(selectedPages, pagesToMove, newIndex);
666669

667-
currentPageNumber = this.#updateThumbnails(currentPageNumber);
670+
this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));
668671
this.#computeThumbnailsPosition();
669672

670673
selectedPages.clear();
@@ -676,8 +679,6 @@ class PDFThumbnailViewer {
676679
pagesMapper,
677680
type: "move",
678681
});
679-
680-
this.#updateCurrentPage(currentPageNumber);
681682
}
682683

683684
if (!isNaN(this.#pageNumberToRemove)) {
@@ -695,7 +696,6 @@ class PDFThumbnailViewer {
695696

696697
#updateCurrentPage(currentPageNumber) {
697698
setTimeout(() => {
698-
this.#resetCurrentThumbnail(0);
699699
this.forceRendering();
700700
const newPageNumber = currentPageNumber || 1;
701701
this.linkService.goToPage(newPageNumber);
@@ -765,6 +765,7 @@ class PDFThumbnailViewer {
765765
}
766766

767767
#togglePasteMode(enable) {
768+
this.#isInPasteMode = enable;
768769
if (enable) {
769770
this.container.classList.add("pasteMode");
770771
for (const thumbnail of this._thumbnails) {
@@ -819,14 +820,14 @@ class PDFThumbnailViewer {
819820

820821
#pastePages(index) {
821822
const pagesMapper = this.#pagesMapper;
822-
let currentPageNumber = this.#copiedPageNumbers.includes(
823+
const currentPageNumber = this.#copiedPageNumbers.includes(
823824
this._currentPageNumber
824825
)
825826
? 0
826827
: this._currentPageNumber;
827828

828829
pagesMapper.pastePages(index);
829-
currentPageNumber = this.#updateThumbnails(currentPageNumber);
830+
this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));
830831

831832
this.eventBus.dispatch("pagesedited", {
832833
source: this,
@@ -840,8 +841,6 @@ class PDFThumbnailViewer {
840841
this.#togglePasteMode(false);
841842
this.#toggleMenuEntries(false);
842843
this.#updateStatus("select");
843-
844-
this.#updateCurrentPage(currentPageNumber);
845844
}
846845

847846
#deletePages(type = "delete") {
@@ -853,15 +852,15 @@ class PDFThumbnailViewer {
853852
this.#updateStatus("delete");
854853
}
855854
const pagesMapper = this.#pagesMapper;
856-
let currentPageNumber = selectedPages.has(this._currentPageNumber)
855+
const currentPageNumber = selectedPages.has(this._currentPageNumber)
857856
? 0
858857
: this._currentPageNumber;
859858
const pagesToDelete = (this.#deletedPageNumbers = Uint32Array.from(
860859
selectedPages
861860
).sort((a, b) => a - b));
862861

863862
pagesMapper.deletePages(pagesToDelete);
864-
currentPageNumber = this.#updateThumbnails(currentPageNumber);
863+
this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));
865864
selectedPages.clear();
866865
this.#updateMenuEntries();
867866

@@ -871,8 +870,6 @@ class PDFThumbnailViewer {
871870
pageNumbers: pagesToDelete,
872871
type,
873872
});
874-
875-
this.#updateCurrentPage(currentPageNumber);
876873
}
877874

878875
#updateMenuEntries() {
@@ -1225,7 +1222,7 @@ class PDFThumbnailViewer {
12251222
} = e;
12261223
if (
12271224
e.button !== 0 || // Skip right click.
1228-
this.#pagesMapper.copiedPageNumbers?.length > 0 ||
1225+
this.#isInPasteMode ||
12291226
!isNaN(this.#lastDraggedOverIndex) ||
12301227
!draggedImage.classList.contains("thumbnailImageContainer")
12311228
) {

0 commit comments

Comments
 (0)