Skip to content

Commit 7010086

Browse files
committed
Disable dragging a thumbnail when the user has to paste what they copied (bug 2021934)
1 parent cc680f6 commit 7010086

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
})
@@ -1639,4 +1638,66 @@ describe("Reorganize Pages View", () => {
16391638
);
16401639
});
16411640
});
1641+
1642+
describe("Dragging mustn't be possible when pasting (bug 2021934)", () => {
1643+
let pages;
1644+
1645+
beforeEach(async () => {
1646+
pages = await loadAndWait(
1647+
"page_with_number.pdf",
1648+
"#viewsManagerToggleButton",
1649+
"page-fit",
1650+
null,
1651+
{ enableSplitMerge: true }
1652+
);
1653+
});
1654+
1655+
afterEach(async () => {
1656+
await closePages(pages);
1657+
});
1658+
1659+
it("should check that dragging is disabled when pasting", async () => {
1660+
await Promise.all(
1661+
pages.map(async ([browserName, page]) => {
1662+
await waitForThumbnailVisible(page, 1);
1663+
1664+
await Promise.all([
1665+
page.waitForSelector(`#thumbnailsView.isDragging`, {
1666+
visible: true,
1667+
}),
1668+
dragAndDrop(page, getThumbnailSelector(1), [[0, 10]], 10),
1669+
]);
1670+
1671+
await page.waitForSelector(`#thumbnailsView.isDragging`, {
1672+
hidden: true,
1673+
});
1674+
await waitAndClick(
1675+
page,
1676+
`.thumbnail:has(${getThumbnailSelector(1)}) input`
1677+
);
1678+
await waitAndClick(page, "#viewsManagerStatusActionButton");
1679+
await waitAndClick(page, "#viewsManagerStatusActionCopy");
1680+
1681+
// If dragging isn't disabled, the promise will resolve with the
1682+
// selector. Otherwise, it will resolve with undefined (dragAndDrop
1683+
// has no return), which is the expected behavior.
1684+
const abortController = new AbortController();
1685+
const first = await Promise.race([
1686+
page.waitForSelector(`#thumbnailsView.isDragging`, {
1687+
visible: true,
1688+
signal: abortController.signal,
1689+
}),
1690+
dragAndDrop(page, getThumbnailSelector(1), [[0, 10]], 10),
1691+
]);
1692+
abortController.abort();
1693+
1694+
expect(first)
1695+
.withContext(
1696+
`In ${browserName}, dragging should be disabled when pasting`
1697+
)
1698+
.toBeUndefined();
1699+
})
1700+
);
1701+
});
1702+
});
16421703
});

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) {
@@ -822,14 +823,14 @@ class PDFThumbnailViewer {
822823
this.#toggleMenuEntries(true);
823824

824825
const pagesMapper = this.#pagesMapper;
825-
let currentPageNumber = this.#copiedPageNumbers.includes(
826+
const currentPageNumber = this.#copiedPageNumbers.includes(
826827
this._currentPageNumber
827828
)
828829
? 0
829830
: this._currentPageNumber;
830831

831832
pagesMapper.pastePages(index);
832-
currentPageNumber = this.#updateThumbnails(currentPageNumber);
833+
this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));
833834

834835
this.eventBus.dispatch("pagesedited", {
835836
source: this,
@@ -842,8 +843,6 @@ class PDFThumbnailViewer {
842843
this.#isCut = false;
843844
this.#updateMenuEntries();
844845
this.#updateStatus("select");
845-
846-
this.#updateCurrentPage(currentPageNumber);
847846
}
848847

849848
#deletePages(type = "delete") {
@@ -855,15 +854,15 @@ class PDFThumbnailViewer {
855854
this.#updateStatus("delete");
856855
}
857856
const pagesMapper = this.#pagesMapper;
858-
let currentPageNumber = selectedPages.has(this._currentPageNumber)
857+
const currentPageNumber = selectedPages.has(this._currentPageNumber)
859858
? 0
860859
: this._currentPageNumber;
861860
const pagesToDelete = (this.#deletedPageNumbers = Uint32Array.from(
862861
selectedPages
863862
).sort((a, b) => a - b));
864863

865864
pagesMapper.deletePages(pagesToDelete);
866-
currentPageNumber = this.#updateThumbnails(currentPageNumber);
865+
this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));
867866
selectedPages.clear();
868867
this.#updateMenuEntries();
869868

@@ -873,8 +872,6 @@ class PDFThumbnailViewer {
873872
pageNumbers: pagesToDelete,
874873
type,
875874
});
876-
877-
this.#updateCurrentPage(currentPageNumber);
878875
}
879876

880877
#updateMenuEntries() {
@@ -1224,7 +1221,7 @@ class PDFThumbnailViewer {
12241221
} = e;
12251222
if (
12261223
e.button !== 0 || // Skip right click.
1227-
this.#pagesMapper.copiedPageNumbers?.length > 0 ||
1224+
this.#isInPasteMode ||
12281225
!isNaN(this.#lastDraggedOverIndex) ||
12291226
!draggedImage.classList.contains("thumbnailImageContainer")
12301227
) {

0 commit comments

Comments
 (0)