Skip to content

Commit 75cb69e

Browse files
committed
Fix various bug around copy/paste/delete/undo (bug 2022586, bug 2022824, bug 2022884, bug 2023171, bug 2023176)
Those bugs are more or less related so it's why they're all fixed together in the same patch.
1 parent 979d9c3 commit 75cb69e

7 files changed

Lines changed: 795 additions & 274 deletions

File tree

src/display/api.js

Lines changed: 18 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,19 @@ class PDFPageProxy {
13601360
this.imageCoordinates = null;
13611361
}
13621362

1363+
clone(id) {
1364+
const clone = new PDFPageProxy(
1365+
id,
1366+
this._pageInfo,
1367+
this._transport,
1368+
this.#pagesMapper,
1369+
this._pdfBug
1370+
);
1371+
clone.clonedFromIndex = this.clonedFromIndex ?? this._pageIndex;
1372+
this._transport.updatePage(clone);
1373+
return clone;
1374+
}
1375+
13631376
/**
13641377
* @type {number} Page number of the page. First page is 1.
13651378
*/
@@ -1372,6 +1385,7 @@ class PDFPageProxy {
13721385
*/
13731386
set pageNumber(value) {
13741387
this._pageIndex = value - 1;
1388+
this._transport.updatePage(this);
13751389
}
13761390

13771391
/**
@@ -2428,10 +2442,6 @@ class WorkerTransport {
24282442

24292443
#passwordCapability = null;
24302444

2431-
#copiedPageInfo = null;
2432-
2433-
#savedPageInfo = null;
2434-
24352445
constructor(
24362446
messageHandler,
24372447
loadingTask,
@@ -2465,7 +2475,6 @@ class WorkerTransport {
24652475
this.setupMessageHandler();
24662476

24672477
this.pagesMapper = pagesMapper;
2468-
this.pagesMapper.addListener(this.#updateCaches.bind(this));
24692478

24702479
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
24712480
// For testing purposes.
@@ -2491,76 +2500,10 @@ class WorkerTransport {
24912500
}
24922501
}
24932502

2494-
#updateCaches({ type, pageNumbers }) {
2495-
if (type === "copy") {
2496-
this.#copiedPageInfo = new Map();
2497-
for (const pageNum of pageNumbers) {
2498-
this.#copiedPageInfo.set(pageNum, {
2499-
proxy: this.#pageCache.get(pageNum - 1) || null,
2500-
promise: this.#pagePromises.get(pageNum - 1) || null,
2501-
});
2502-
}
2503-
return;
2504-
}
2505-
2506-
if (type === "cancelCopy") {
2507-
this.#copiedPageInfo = null;
2508-
return;
2509-
}
2510-
2511-
if (type === "delete") {
2512-
this.#savedPageInfo = {
2513-
pageCache: new Map(this.#pageCache),
2514-
pagePromises: new Map(this.#pagePromises),
2515-
};
2516-
for (const pageNum of pageNumbers) {
2517-
this.#pageCache.delete(pageNum - 1);
2518-
this.#pagePromises.delete(pageNum - 1);
2519-
}
2520-
}
2521-
2522-
if (type === "cancelDelete") {
2523-
if (this.#savedPageInfo) {
2524-
this.#pageCache = this.#savedPageInfo.pageCache;
2525-
this.#pagePromises = this.#savedPageInfo.pagePromises;
2526-
this.#savedPageInfo = null;
2527-
}
2528-
return;
2529-
}
2530-
2531-
if (type === "cleanSavedData") {
2532-
this.#savedPageInfo = null;
2533-
return;
2534-
}
2535-
2536-
const newPageCache = new Map();
2537-
const newPromiseCache = new Map();
2538-
const { pagesMapper } = this;
2539-
for (let i = 0, ii = pagesMapper.pagesNumber; i < ii; i++) {
2540-
const prevPageNumber = pagesMapper.getPrevPageNumber(i + 1);
2541-
if (prevPageNumber < 0) {
2542-
const { proxy, promise } =
2543-
this.#copiedPageInfo?.get(-prevPageNumber) || {};
2544-
if (proxy) {
2545-
newPageCache.set(i, proxy);
2546-
}
2547-
if (promise) {
2548-
newPromiseCache.set(i, promise);
2549-
}
2550-
continue;
2551-
}
2552-
const prevPageIndex = prevPageNumber - 1;
2553-
const page = this.#pageCache.get(prevPageIndex);
2554-
if (page) {
2555-
newPageCache.set(i, page);
2556-
}
2557-
const promise = this.#pagePromises.get(prevPageIndex);
2558-
if (promise) {
2559-
newPromiseCache.set(i, promise);
2560-
}
2561-
}
2562-
this.#pageCache = newPageCache;
2563-
this.#pagePromises = newPromiseCache;
2503+
updatePage(page) {
2504+
const { _pageIndex } = page;
2505+
this.#pageCache.set(_pageIndex, page);
2506+
this.#pagePromises.set(_pageIndex, Promise.resolve(page));
25642507
}
25652508

25662509
#cacheSimpleMethod(name, data = null) {

0 commit comments

Comments
 (0)