summaryrefslogtreecommitdiffstats
path: root/browser/components/textrecognition/tests/browser/browser_textrecognition.js
blob: 7b7998e651b5d462d87db39dd6e12d8d048f2eef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";

add_task(async function () {
  const URL_IMG =
    "http://mochi.test:8888/browser/browser/components/textrecognition/tests/browser/image.png";

  await SpecialPowers.pushPrefEnv({
    set: [["dom.text-recognition.enabled", true]],
  });

  clearTelemetry();

  await BrowserTestUtils.withNewTab(URL_IMG, async function (browser) {
    setClipboardText("");
    is(getTextFromClipboard(), "", "The copied text is empty.");
    ok(
      !getTelemetryScalars()["browser.ui.interaction.content_context"],
      "No telemetry has been recorded yet."
    );
    is(
      Services.telemetry
        .getHistogramById("TEXT_RECOGNITION_API_PERFORMANCE")
        .snapshot().sum,
      0,
      "No histogram timing was recorded."
    );

    info("Right click image to show context menu.");
    let popupShownPromise = BrowserTestUtils.waitForEvent(
      document,
      "popupshown"
    );
    await BrowserTestUtils.synthesizeMouseAtCenter(
      "img",
      { type: "contextmenu", button: 2 },
      browser
    );
    await popupShownPromise;

    info("Click context menu to copy the image text.");
    document.getElementById("context-imagetext").doCommand();

    info("Close the context menu.");
    let contextMenu = document.getElementById("contentAreaContextMenu");
    let popupHiddenPromise = BrowserTestUtils.waitForEvent(
      contextMenu,
      "popuphidden"
    );
    contextMenu.hidePopup();
    await popupHiddenPromise;

    info("Waiting for the dialog browser to be shown.");
    const { contentDocument } = await BrowserTestUtils.waitForCondition(() =>
      document.querySelector(".textRecognitionDialogFrame")
    );

    {
      info("Check the scalar telemetry.");
      const scalars = await BrowserTestUtils.waitForCondition(() =>
        getTelemetryScalars()
      );
      const contentContext = scalars["browser.ui.interaction.content_context"];
      ok(contentContext, "Opening the context menu was recorded.");

      is(contentContext["context-imagetext"], 1, "Telemetry has been recorded");
    }

    info("Waiting for text results.");
    const resultsHeader = contentDocument.querySelector(
      "#text-recognition-header-results"
    );
    await BrowserTestUtils.waitForCondition(() => {
      return resultsHeader.style.display !== "none";
    });

    const expectedResultText = "Mozilla\n\nFirefox";

    {
      info("Check the text results.");
      const text = contentDocument.querySelector(".textRecognitionText");
      is(text.children.length, 2, "Two piece of text were found");
      const [p1, p2] = text.children;
      is(p1.tagName, "P", "The children are paragraph tags.");
      is(p2.tagName, "P", "The children are paragraph tags.");
      is(p1.innerText, "Mozilla", "The first piece of text matches.");
      is(p2.innerText, "Firefox", "The second piece of text matches.");

      const clipboardText = getTextFromClipboard();
      is(clipboardText, expectedResultText, "The copied text matches.");

      is(
        clipboardText,
        text.innerText,
        "The copied text and the text elements innerText match."
      );
    }

    ok(
      Services.telemetry
        .getHistogramById("TEXT_RECOGNITION_API_PERFORMANCE")
        .snapshot().sum > 0,
      "Text recognition API performance was recorded."
    );

    info("Close the dialog box.");
    const close = contentDocument.querySelector("#text-recognition-close");
    close.click();

    is(
      Services.telemetry
        .getHistogramById("TEXT_RECOGNITION_TEXT_LENGTH")
        .snapshot().sum,
      expectedResultText.length,
      "The length of the text was recorded."
    );

    info("Waiting for the dialog frame to close.");
    await BrowserTestUtils.waitForCondition(
      () => !document.querySelector(".textRecognitionDialogFrame")
    );

    info("Check for interaction telemetry.");
    const timing = await BrowserTestUtils.waitForCondition(() => {
      const { sum } = Services.telemetry
        .getHistogramById("TEXT_RECOGNITION_INTERACTION_TIMING")
        .snapshot();
      if (sum > 0) {
        return sum;
      }
      return false;
    });
    ok(timing > 0, "Interaction timing was measured.");

    setClipboardText("");
    clearTelemetry();
  });
});