Skip to content

Commit f609ee8

Browse files
authored
Merge pull request #20670 from calixteman/reorg_delete
Add support for deleting, cutting, copying and pasting pages (bug 2010830, 2010831)
2 parents e331d45 + d755fba commit f609ee8

18 files changed

Lines changed: 1040 additions & 227 deletions

l10n/en-US/viewer.ftl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,3 +766,4 @@ pdfjs-views-manager-status-undo-button-label = Undo
766766
pdfjs-views-manager-status-close-button =
767767
.title = Close
768768
pdfjs-views-manager-status-close-button-label = Close
769+
pdfjs-views-manager-paste-button-label = Paste

src/display/api.js

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2405,6 +2405,8 @@ class WorkerTransport {
24052405

24062406
#passwordCapability = null;
24072407

2408+
#copiedPageInfo = null;
2409+
24082410
constructor(
24092411
messageHandler,
24102412
loadingTask,
@@ -2464,11 +2466,42 @@ class WorkerTransport {
24642466
}
24652467
}
24662468

2467-
#updateCaches() {
2469+
#updateCaches({ type, pageNumbers }) {
2470+
if (type === "copy") {
2471+
this.#copiedPageInfo = new Map();
2472+
for (const pageNum of pageNumbers) {
2473+
this.#copiedPageInfo.set(pageNum, {
2474+
proxy: this.#pageCache.get(pageNum - 1) || null,
2475+
promise: this.#pagePromises.get(pageNum - 1) || null,
2476+
});
2477+
}
2478+
return;
2479+
}
2480+
2481+
if (type === "delete") {
2482+
for (const pageNum of pageNumbers) {
2483+
this.#pageCache.delete(pageNum - 1);
2484+
this.#pagePromises.delete(pageNum - 1);
2485+
}
2486+
}
2487+
24682488
const newPageCache = new Map();
24692489
const newPromiseCache = new Map();
2470-
for (let i = 0, ii = this.pagesMapper.pagesNumber; i < ii; i++) {
2471-
const prevPageIndex = this.pagesMapper.getPrevPageNumber(i + 1) - 1;
2490+
const { pagesMapper } = this;
2491+
for (let i = 0, ii = pagesMapper.pagesNumber; i < ii; i++) {
2492+
const prevPageNumber = pagesMapper.getPrevPageNumber(i + 1);
2493+
if (prevPageNumber < 0) {
2494+
const { proxy, promise } =
2495+
this.#copiedPageInfo?.get(-prevPageNumber) || {};
2496+
if (proxy) {
2497+
newPageCache.set(i, proxy);
2498+
}
2499+
if (promise) {
2500+
newPromiseCache.set(i, promise);
2501+
}
2502+
continue;
2503+
}
2504+
const prevPageIndex = prevPageNumber - 1;
24722505
const page = this.#pageCache.get(prevPageIndex);
24732506
if (page) {
24742507
newPageCache.set(i, page);
@@ -3001,7 +3034,11 @@ class WorkerTransport {
30013034
num: ref.num,
30023035
gen: ref.gen,
30033036
});
3004-
return this.pagesMapper.getPageNumber(index + 1) - 1;
3037+
const pageNumber = this.pagesMapper.getPageNumber(index + 1);
3038+
if (pageNumber === 0) {
3039+
throw new Error("GetPageIndex: page has been removed.");
3040+
}
3041+
return pageNumber - 1;
30053042
}
30063043

30073044
getAnnotations(pageIndex, intent) {
@@ -3150,9 +3187,13 @@ class WorkerTransport {
31503187
}
31513188
const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`;
31523189
const pageIndex = this.#pageRefCache.get(refStr);
3153-
return pageIndex >= 0
3154-
? this.pagesMapper.getPageNumber(pageIndex + 1)
3155-
: null;
3190+
if (pageIndex >= 0) {
3191+
const pageNumber = this.pagesMapper.getPageNumber(pageIndex + 1);
3192+
if (pageNumber !== 0) {
3193+
return pageNumber;
3194+
}
3195+
}
3196+
return null;
31563197
}
31573198
}
31583199

0 commit comments

Comments
 (0)