Skip to content

Commit e65d643

Browse files
authored
Merge pull request #20907 from calixteman/fix_bad_bugs
Fix various bug around copy/paste/delete/undo (bug 2022586, bug 2022824, bug 2022884, bug 2023171, bug 2023176)
2 parents 8f8bd6a + 75cb69e commit e65d643

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
@@ -1363,6 +1363,19 @@ class PDFPageProxy {
13631363
this.imageCoordinates = null;
13641364
}
13651365

1366+
clone(id) {
1367+
const clone = new PDFPageProxy(
1368+
id,
1369+
this._pageInfo,
1370+
this._transport,
1371+
this.#pagesMapper,
1372+
this._pdfBug
1373+
);
1374+
clone.clonedFromIndex = this.clonedFromIndex ?? this._pageIndex;
1375+
this._transport.updatePage(clone);
1376+
return clone;
1377+
}
1378+
13661379
/**
13671380
* @type {number} Page number of the page. First page is 1.
13681381
*/
@@ -1375,6 +1388,7 @@ class PDFPageProxy {
13751388
*/
13761389
set pageNumber(value) {
13771390
this._pageIndex = value - 1;
1391+
this._transport.updatePage(this);
13781392
}
13791393

13801394
/**
@@ -2431,10 +2445,6 @@ class WorkerTransport {
24312445

24322446
#passwordCapability = null;
24332447

2434-
#copiedPageInfo = null;
2435-
2436-
#savedPageInfo = null;
2437-
24382448
constructor(
24392449
messageHandler,
24402450
loadingTask,
@@ -2468,7 +2478,6 @@ class WorkerTransport {
24682478
this.setupMessageHandler();
24692479

24702480
this.pagesMapper = pagesMapper;
2471-
this.pagesMapper.addListener(this.#updateCaches.bind(this));
24722481

24732482
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
24742483
// For testing purposes.
@@ -2494,76 +2503,10 @@ class WorkerTransport {
24942503
}
24952504
}
24962505

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

25692512
#cacheSimpleMethod(name, data = null) {

0 commit comments

Comments
 (0)