Merge pull request #17719 from calixteman/bug1881692
[Editor] In caret browsing mode, get the caret position in the text layer (bug 1881692)
This commit is contained in:
		
						commit
						b8b8f1af66
					
				@ -1030,4 +1030,67 @@ describe("Highlight Editor", () => {
 | 
				
			|||||||
      );
 | 
					      );
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe("Highlight and caret browsing", () => {
 | 
				
			||||||
 | 
					    let pages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    beforeAll(async () => {
 | 
				
			||||||
 | 
					      pages = await loadAndWait(
 | 
				
			||||||
 | 
					        "tracemonkey.pdf",
 | 
				
			||||||
 | 
					        ".annotationEditorLayer",
 | 
				
			||||||
 | 
					        null,
 | 
				
			||||||
 | 
					        null,
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          highlightEditorColors: "red=#AB0000",
 | 
				
			||||||
 | 
					          supportsCaretBrowsingMode: true,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    afterAll(async () => {
 | 
				
			||||||
 | 
					      await closePages(pages);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it("must check that the caret can move a highlighted text", async () => {
 | 
				
			||||||
 | 
					      await Promise.all(
 | 
				
			||||||
 | 
					        pages.map(async ([browserName, page]) => {
 | 
				
			||||||
 | 
					          await page.click("#editorHighlight");
 | 
				
			||||||
 | 
					          await page.waitForSelector(".annotationEditorLayer.highlightEditing");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          const rect = await getSpanRectFromText(page, 1, "Abstract");
 | 
				
			||||||
 | 
					          const x = rect.x + rect.width / 2;
 | 
				
			||||||
 | 
					          const y = rect.y + rect.height / 2;
 | 
				
			||||||
 | 
					          await page.mouse.click(x, y, { count: 2 });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          await page.waitForSelector(`${getEditorSelector(0)}`);
 | 
				
			||||||
 | 
					          await page.keyboard.press("Escape");
 | 
				
			||||||
 | 
					          await page.waitForSelector(
 | 
				
			||||||
 | 
					            `${getEditorSelector(0)}:not(.selectedEditor)`
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          await page.evaluate(() => {
 | 
				
			||||||
 | 
					            const text =
 | 
				
			||||||
 | 
					              "Dynamic languages such as JavaScript are more difficult to com-";
 | 
				
			||||||
 | 
					            for (const el of document.querySelectorAll(
 | 
				
			||||||
 | 
					              `.page[data-page-number="${1}"] > .textLayer > span`
 | 
				
			||||||
 | 
					            )) {
 | 
				
			||||||
 | 
					              if (el.textContent === text) {
 | 
				
			||||||
 | 
					                window.getSelection().setPosition(el.firstChild, 1);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          await page.keyboard.press("ArrowUp");
 | 
				
			||||||
 | 
					          const [text, offset] = await page.evaluate(() => {
 | 
				
			||||||
 | 
					            const selection = window.getSelection();
 | 
				
			||||||
 | 
					            return [selection.anchorNode.textContent, selection.anchorOffset];
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          expect(text).withContext(`In ${browserName}`).toEqual("Abstract");
 | 
				
			||||||
 | 
					          expect(offset).withContext(`In ${browserName}`).toEqual(1);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
				
			|||||||
@ -329,6 +329,12 @@ const PDFViewerApplication = {
 | 
				
			|||||||
          params.get("highlighteditorcolors")
 | 
					          params.get("highlighteditorcolors")
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      if (params.has("supportscaretbrowsingmode")) {
 | 
				
			||||||
 | 
					        AppOptions.set(
 | 
				
			||||||
 | 
					          "supportsCaretBrowsingMode",
 | 
				
			||||||
 | 
					          params.get("supportscaretbrowsingmode") === "true"
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -130,11 +130,29 @@ class CaretBrowsingMode {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const midY = rect.y + rect.height / 2;
 | 
					    const midY = rect.y + rect.height / 2;
 | 
				
			||||||
    const caretPosition = CaretBrowsingMode.#caretPositionFromPoint(
 | 
					    let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);
 | 
				
			||||||
      caretX,
 | 
					    let parentElement = caretPosition.offsetNode?.parentElement;
 | 
				
			||||||
      midY
 | 
					    if (parentElement && parentElement !== element) {
 | 
				
			||||||
    );
 | 
					      // There is an element on top of the one in the text layer, so we
 | 
				
			||||||
    if (caretPosition.offsetNode?.parentElement !== element) {
 | 
					      // need to hide all the elements (except the one in the text layer)
 | 
				
			||||||
 | 
					      // at this position in order to get the correct caret position.
 | 
				
			||||||
 | 
					      const elementsAtPoint = document.elementsFromPoint(caretX, midY);
 | 
				
			||||||
 | 
					      const savedVisibilities = [];
 | 
				
			||||||
 | 
					      for (const el of elementsAtPoint) {
 | 
				
			||||||
 | 
					        if (el === element) {
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        const { style } = el;
 | 
				
			||||||
 | 
					        savedVisibilities.push([el, style.visibility]);
 | 
				
			||||||
 | 
					        style.visibility = "hidden";
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);
 | 
				
			||||||
 | 
					      parentElement = caretPosition.offsetNode?.parentElement;
 | 
				
			||||||
 | 
					      for (const [el, visibility] of savedVisibilities) {
 | 
				
			||||||
 | 
					        el.style.visibility = visibility;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (parentElement !== element) {
 | 
				
			||||||
      // The element targeted by caretPositionFromPoint isn't in the text
 | 
					      // The element targeted by caretPositionFromPoint isn't in the text
 | 
				
			||||||
      // layer.
 | 
					      // layer.
 | 
				
			||||||
      if (select) {
 | 
					      if (select) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user