|
15 | 15 |
|
16 | 16 | import { |
17 | 17 | awaitPromise, |
| 18 | + clearInput, |
18 | 19 | closePages, |
19 | 20 | createPromise, |
20 | 21 | dragAndDrop, |
@@ -56,6 +57,46 @@ function waitForPagesEdited(page) { |
56 | 57 | }); |
57 | 58 | } |
58 | 59 |
|
| 60 | +function getSearchResults(page) { |
| 61 | + return page.evaluate(() => { |
| 62 | + const pages = document.querySelectorAll(".page"); |
| 63 | + const results = []; |
| 64 | + for (let i = 0; i < pages.length; i++) { |
| 65 | + const domPage = pages[i]; |
| 66 | + const pageNumber = parseInt(domPage.getAttribute("data-page-number"), 10); |
| 67 | + const highlights = domPage.querySelectorAll("span.highlight"); |
| 68 | + if (highlights.length === 0) { |
| 69 | + continue; |
| 70 | + } |
| 71 | + results.push([ |
| 72 | + i + 1, |
| 73 | + pageNumber, |
| 74 | + Array.from(highlights).map(span => span.textContent), |
| 75 | + ]); |
| 76 | + } |
| 77 | + return results; |
| 78 | + }); |
| 79 | +} |
| 80 | + |
| 81 | +function movePages(page, selectedPages, atIndex) { |
| 82 | + return page.evaluate( |
| 83 | + (selected, index) => { |
| 84 | + const viewer = window.PDFViewerApplication.pdfViewer; |
| 85 | + const pagesToMove = Array.from(selected).sort((a, b) => a - b); |
| 86 | + viewer.pagesMapper.pagesNumber = |
| 87 | + document.querySelectorAll(".page").length; |
| 88 | + viewer.pagesMapper.movePages(new Set(pagesToMove), pagesToMove, index); |
| 89 | + window.PDFViewerApplication.eventBus.dispatch("pagesedited", { |
| 90 | + pagesMapper: viewer.pagesMapper, |
| 91 | + index, |
| 92 | + pagesToMove, |
| 93 | + }); |
| 94 | + }, |
| 95 | + selectedPages, |
| 96 | + atIndex |
| 97 | + ); |
| 98 | +} |
| 99 | + |
59 | 100 | describe("Reorganize Pages View", () => { |
60 | 101 | describe("Drag & Drop", () => { |
61 | 102 | let pages; |
@@ -262,4 +303,116 @@ describe("Reorganize Pages View", () => { |
262 | 303 | ); |
263 | 304 | }); |
264 | 305 | }); |
| 306 | + |
| 307 | + describe("Search in pdf", () => { |
| 308 | + let pages; |
| 309 | + |
| 310 | + beforeEach(async () => { |
| 311 | + pages = await loadAndWait( |
| 312 | + "page_with_number.pdf", |
| 313 | + "#viewsManagerToggleButton", |
| 314 | + "1", |
| 315 | + null, |
| 316 | + { enableSplitMerge: true } |
| 317 | + ); |
| 318 | + }); |
| 319 | + |
| 320 | + afterEach(async () => { |
| 321 | + await closePages(pages); |
| 322 | + }); |
| 323 | + |
| 324 | + it("should check if the search is working after moving pages", async () => { |
| 325 | + await Promise.all( |
| 326 | + pages.map(async ([browserName, page]) => { |
| 327 | + await page.click("#viewFindButton"); |
| 328 | + await page.waitForSelector(":has(> #findHighlightAll)", { |
| 329 | + visible: true, |
| 330 | + }); |
| 331 | + await page.click(":has(> #findHighlightAll)"); |
| 332 | + |
| 333 | + await page.waitForSelector("#findInput", { visible: true }); |
| 334 | + await page.type("#findInput", "1"); |
| 335 | + await page.keyboard.press("Enter"); |
| 336 | + |
| 337 | + await page.waitForFunction( |
| 338 | + () => document.querySelectorAll("span.highlight").length === 10 |
| 339 | + ); |
| 340 | + |
| 341 | + let results = await getSearchResults(page); |
| 342 | + expect(results) |
| 343 | + .withContext(`In ${browserName}`) |
| 344 | + .toEqual([ |
| 345 | + // Page number, Id, [matches] |
| 346 | + [1, 1, ["1"]], |
| 347 | + [10, 10, ["1"]], |
| 348 | + [11, 11, ["1", "1"]], |
| 349 | + [12, 12, ["1"]], |
| 350 | + [13, 13, ["1"]], |
| 351 | + [14, 14, ["1"]], |
| 352 | + [15, 15, ["1"]], |
| 353 | + [16, 16, ["1"]], |
| 354 | + [17, 17, ["1"]], |
| 355 | + ]); |
| 356 | + |
| 357 | + await movePages(page, [11, 2], 3); |
| 358 | + await page.waitForFunction( |
| 359 | + () => document.querySelectorAll("span.highlight").length === 0 |
| 360 | + ); |
| 361 | + |
| 362 | + await clearInput(page, "#findInput", true); |
| 363 | + await page.type("#findInput", "1"); |
| 364 | + await page.keyboard.press("Enter"); |
| 365 | + |
| 366 | + await page.waitForFunction( |
| 367 | + () => document.querySelectorAll("span.highlight").length === 10 |
| 368 | + ); |
| 369 | + |
| 370 | + results = await getSearchResults(page); |
| 371 | + expect(results) |
| 372 | + .withContext(`In ${browserName}`) |
| 373 | + .toEqual([ |
| 374 | + // Page number, Id, [matches] |
| 375 | + [1, 1, ["1"]], |
| 376 | + [4, 11, ["1", "1"]], |
| 377 | + [11, 10, ["1"]], |
| 378 | + [12, 12, ["1"]], |
| 379 | + [13, 13, ["1"]], |
| 380 | + [14, 14, ["1"]], |
| 381 | + [15, 15, ["1"]], |
| 382 | + [16, 16, ["1"]], |
| 383 | + [17, 17, ["1"]], |
| 384 | + ]); |
| 385 | + |
| 386 | + await movePages(page, [13], 0); |
| 387 | + await page.waitForFunction( |
| 388 | + () => document.querySelectorAll("span.highlight").length === 0 |
| 389 | + ); |
| 390 | + |
| 391 | + await clearInput(page, "#findInput", true); |
| 392 | + await page.type("#findInput", "1"); |
| 393 | + await page.keyboard.press("Enter"); |
| 394 | + |
| 395 | + await page.waitForFunction( |
| 396 | + () => document.querySelectorAll("span.highlight").length === 10 |
| 397 | + ); |
| 398 | + |
| 399 | + results = await getSearchResults(page); |
| 400 | + expect(results) |
| 401 | + .withContext(`In ${browserName}`) |
| 402 | + .toEqual([ |
| 403 | + // Page number, Id, [matches] |
| 404 | + [1, 13, ["1"]], |
| 405 | + [2, 1, ["1"]], |
| 406 | + [5, 11, ["1", "1"]], |
| 407 | + [12, 10, ["1"]], |
| 408 | + [13, 12, ["1"]], |
| 409 | + [14, 14, ["1"]], |
| 410 | + [15, 15, ["1"]], |
| 411 | + [16, 16, ["1"]], |
| 412 | + [17, 17, ["1"]], |
| 413 | + ]); |
| 414 | + }) |
| 415 | + ); |
| 416 | + }); |
| 417 | + }); |
265 | 418 | }); |
0 commit comments