123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- /* Copyright 2020 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- const {
- closePages,
- getSelector,
- getQuerySelector,
- loadAndWait,
- } = require("./test_utils.js");
- describe("Annotation highlight", () => {
- describe("annotation-highlight.pdf", () => {
- let pages;
- beforeAll(async () => {
- pages = await loadAndWait(
- "annotation-highlight.pdf",
- "[data-annotation-id='19R']"
- );
- });
- afterAll(async () => {
- await closePages(pages);
- });
- it("must show a popup on mouseover", async () => {
- await Promise.all(
- pages.map(async ([browserName, page]) => {
- let hidden = await page.$eval(
- "[data-annotation-id='21R']",
- el => el.hidden
- );
- expect(hidden).withContext(`In ${browserName}`).toEqual(true);
- await page.hover("[data-annotation-id='19R']");
- await page.waitForSelector("[data-annotation-id='21R']", {
- visible: true,
- timeout: 0,
- });
- hidden = await page.$eval(
- "[data-annotation-id='21R']",
- el => el.hidden
- );
- expect(hidden).withContext(`In ${browserName}`).toEqual(false);
- })
- );
- });
- });
- });
- describe("Checkbox annotation", () => {
- describe("issue12706.pdf", () => {
- let pages;
- beforeAll(async () => {
- pages = await loadAndWait("issue12706.pdf", "[data-annotation-id='63R']");
- });
- afterAll(async () => {
- await closePages(pages);
- });
- it("must let checkboxes with the same name behave like radio buttons", async () => {
- const selectors = [63, 70, 79].map(n => `[data-annotation-id='${n}R']`);
- await Promise.all(
- pages.map(async ([browserName, page]) => {
- for (const selector of selectors) {
- await page.click(selector);
- await page.waitForFunction(
- `document.querySelector("${selector} > :first-child").checked`
- );
- for (const otherSelector of selectors) {
- const checked = await page.$eval(
- `${otherSelector} > :first-child`,
- el => el.checked
- );
- expect(checked)
- .withContext(`In ${browserName}`)
- .toBe(selector === otherSelector);
- }
- }
- })
- );
- });
- });
- describe("issue15597.pdf", () => {
- let pages;
- beforeAll(async () => {
- pages = await loadAndWait("issue15597.pdf", "[data-annotation-id='7R']");
- });
- afterAll(async () => {
- await closePages(pages);
- });
- it("must check the checkbox", async () => {
- await Promise.all(
- pages.map(async ([browserName, page]) => {
- const selector = "[data-annotation-id='7R']";
- await page.click(selector);
- await page.waitForFunction(
- `document.querySelector("${selector} > :first-child").checked`
- );
- expect(true).withContext(`In ${browserName}`).toEqual(true);
- })
- );
- });
- });
- });
- describe("Text widget", () => {
- describe("issue13271.pdf", () => {
- let pages;
- beforeAll(async () => {
- pages = await loadAndWait("issue13271.pdf", "[data-annotation-id='24R']");
- });
- afterAll(async () => {
- await closePages(pages);
- });
- it("must update all the fields with the same value", async () => {
- const base = "hello world";
- await Promise.all(
- pages.map(async ([browserName, page]) => {
- await page.type(getSelector("25R"), base);
- await page.waitForFunction(`${getQuerySelector("24R")}.value !== ""`);
- await page.waitForFunction(`${getQuerySelector("26R")}.value !== ""`);
- let text = await page.$eval(getSelector("24R"), el => el.value);
- expect(text).withContext(`In ${browserName}`).toEqual(base);
- text = await page.$eval(getSelector("26R"), el => el.value);
- expect(text).withContext(`In ${browserName}`).toEqual(base);
- })
- );
- });
- });
- });
- describe("Annotation and storage", () => {
- describe("issue14023.pdf", () => {
- let pages;
- beforeAll(async () => {
- pages = await loadAndWait("issue14023.pdf", "[data-annotation-id='64R']");
- });
- afterAll(async () => {
- await closePages(pages);
- });
- it("must let checkboxes with the same name behave like radio buttons", async () => {
- const text1 = "hello world!";
- const text2 = "!dlrow olleh";
- await Promise.all(
- pages.map(async ([browserName, page]) => {
- // Text field.
- await page.type(getSelector("64R"), text1);
- // Checkbox.
- await page.click("[data-annotation-id='65R']");
- // Radio.
- await page.click("[data-annotation-id='67R']");
- for (const [pageNumber, textId, checkId, radio1Id, radio2Id] of [
- [2, "18R", "19R", "21R", "20R"],
- [5, "23R", "24R", "22R", "25R"],
- ]) {
- await page.evaluate(n => {
- window.document
- .querySelectorAll(`[data-page-number="${n}"][class="page"]`)[0]
- .scrollIntoView();
- }, pageNumber);
- // Need to wait to have a displayed text input.
- await page.waitForSelector(getSelector(textId), {
- timeout: 0,
- });
- const text = await page.$eval(getSelector(textId), el => el.value);
- expect(text).withContext(`In ${browserName}`).toEqual(text1);
- let checked = await page.$eval(
- getSelector(checkId),
- el => el.checked
- );
- expect(checked).toEqual(true);
- checked = await page.$eval(getSelector(radio1Id), el => el.checked);
- expect(checked).toEqual(false);
- checked = await page.$eval(getSelector(radio2Id), el => el.checked);
- expect(checked).toEqual(false);
- }
- // Change data on page 5 and check that other pages changed.
- // Text field.
- await page.type(getSelector("23R"), text2);
- // Checkbox.
- await page.click("[data-annotation-id='24R']");
- // Radio.
- await page.click("[data-annotation-id='25R']");
- for (const [pageNumber, textId, checkId, radio1Id, radio2Id] of [
- [1, "64R", "65R", "67R", "68R"],
- [2, "18R", "19R", "21R", "20R"],
- ]) {
- await page.evaluate(n => {
- window.document
- .querySelectorAll(`[data-page-number="${n}"][class="page"]`)[0]
- .scrollIntoView();
- }, pageNumber);
- // Need to wait to have a displayed text input.
- await page.waitForSelector(getSelector(textId), {
- timeout: 0,
- });
- const text = await page.$eval(getSelector(textId), el => el.value);
- expect(text)
- .withContext(`In ${browserName}`)
- .toEqual(text2 + text1);
- let checked = await page.$eval(
- getSelector(checkId),
- el => el.checked
- );
- expect(checked).toEqual(false);
- checked = await page.$eval(getSelector(radio1Id), el => el.checked);
- expect(checked).toEqual(false);
- checked = await page.$eval(getSelector(radio2Id), el => el.checked);
- expect(checked).toEqual(false);
- }
- })
- );
- });
- });
- });
- describe("ResetForm action", () => {
- describe("resetform.pdf", () => {
- let pages;
- beforeAll(async () => {
- pages = await loadAndWait("resetform.pdf", "[data-annotation-id='63R']");
- });
- afterAll(async () => {
- await closePages(pages);
- });
- it("must reset all fields", async () => {
- await Promise.all(
- pages.map(async ([browserName, page]) => {
- const base = "hello world";
- for (let i = 63; i <= 67; i++) {
- await page.type(getSelector(`${i}R`), base);
- }
- const selectors = [69, 71, 75].map(
- n => `[data-annotation-id='${n}R']`
- );
- for (const selector of selectors) {
- await page.click(selector);
- }
- await page.select(getSelector("78R"), "b");
- await page.select(getSelector("81R"), "f");
- await page.click("[data-annotation-id='82R']");
- await page.waitForFunction(`${getQuerySelector("63R")}.value === ""`);
- for (let i = 63; i <= 68; i++) {
- const text = await page.$eval(getSelector(`${i}R`), el => el.value);
- expect(text).withContext(`In ${browserName}`).toEqual("");
- }
- const ids = [69, 71, 72, 73, 74, 75, 76, 77];
- for (const id of ids) {
- const checked = await page.$eval(
- getSelector(`${id}R`),
- el => el.checked
- );
- expect(checked).withContext(`In ${browserName}`).toEqual(false);
- }
- let selected = await page.$eval(
- `${getSelector("78R")} [value="a"]`,
- el => el.selected
- );
- expect(selected).withContext(`In ${browserName}`).toEqual(true);
- selected = await page.$eval(
- `${getSelector("81R")} [value="d"]`,
- el => el.selected
- );
- expect(selected).withContext(`In ${browserName}`).toEqual(true);
- })
- );
- });
- it("must reset some fields", async () => {
- await Promise.all(
- pages.map(async ([browserName, page]) => {
- const base = "hello world";
- for (let i = 63; i <= 68; i++) {
- await page.type(getSelector(`${i}R`), base);
- }
- const selectors = [69, 71, 72, 73, 75].map(
- n => `[data-annotation-id='${n}R']`
- );
- for (const selector of selectors) {
- await page.click(selector);
- }
- await page.select(getSelector("78R"), "b");
- await page.select(getSelector("81R"), "f");
- await page.click("[data-annotation-id='84R']");
- await page.waitForFunction(`${getQuerySelector("63R")}.value === ""`);
- for (let i = 63; i <= 68; i++) {
- const expected = (i - 3) % 2 === 0 ? "" : base;
- const text = await page.$eval(getSelector(`${i}R`), el => el.value);
- expect(text).withContext(`In ${browserName}`).toEqual(expected);
- }
- let ids = [69, 72, 73, 74, 76, 77];
- for (const id of ids) {
- const checked = await page.$eval(
- getSelector(`${id}R`),
- el => el.checked
- );
- expect(checked)
- .withContext(`In ${browserName + id}`)
- .toEqual(false);
- }
- ids = [71, 75];
- for (const id of ids) {
- const checked = await page.$eval(
- getSelector(`${id}R`),
- el => el.checked
- );
- expect(checked).withContext(`In ${browserName}`).toEqual(true);
- }
- let selected = await page.$eval(
- `${getSelector("78R")} [value="a"]`,
- el => el.selected
- );
- expect(selected).withContext(`In ${browserName}`).toEqual(true);
- selected = await page.$eval(
- `${getSelector("81R")} [value="f"]`,
- el => el.selected
- );
- expect(selected).withContext(`In ${browserName}`).toEqual(true);
- })
- );
- });
- });
- });
|