summaryrefslogtreecommitdiffstats
path: root/toolkit/components/contentanalysis/tests/browser/clipboard_read_async.html
blob: 14414a0f28df9d3ed7707a6c191433166a874bb3 (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
<html>
<body>

<!--<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>-->
<script class="testbody" type="application/javascript">
function is(a, b, msg) {
  if (!Object.is(a, b)) {
    throw new Error(`FAIL: expected ${b} got ${a} - ${msg}`);
  }
}

function isNotAllowedException(ex) {
  return /NS_ERROR_CONTENT_BLOCKED/.test(ex.toString()) ||
    /DataError/.test(ex.toString()) ||
    /NotAllowedError/.test(ex.toString());
}

async function checkReadHelper(readResult, gotNotAllowedException, isReadTextTest) {
  // Set by injected JS in the test
  let filePasteAllowed = document.getElementById("pasteAllowed").checked;
  let contentAnalysisReturnsError = document.getElementById("contentAnalysisReturnsError").checked;
  filePasteAllowed = filePasteAllowed && !contentAnalysisReturnsError;
  is(gotNotAllowedException, !filePasteAllowed && isReadTextTest, "Should get exception from readText() if not allowed");
  if (isReadTextTest) {
    is(readResult, filePasteAllowed ? "Some plain text" : null,  "Should get expected text from clipboard.readText()");
  }
  else {
    is(readResult.length, 1, "check number of ClipboardItems in response");
    is(readResult[0].types.length, 2, "check number of types in ClipboardItem");

    {
      let text = null;
      let gotNotAllowedException = false;
      try {
        let textBlob = await readResult[0].getType("text/plain");
        text = await textBlob.text();
      } catch (ex) {
        gotNotAllowedException = isNotAllowedException(ex);
      }
      is(gotNotAllowedException, !filePasteAllowed, "should get exception from reading text data when blocked");
      if (filePasteAllowed) {
        is(text, "Some plain text", "check text/plain data");
      }
    }

    {
      let html = null;
      let gotNotAllowedException = false;
      try {
        let htmlBlob = await readResult[0].getType("text/html");
        html = await htmlBlob.text();
      } catch (ex) {
        gotNotAllowedException = isNotAllowedException(ex);
      }
      is(gotNotAllowedException, !filePasteAllowed, "should get exception from reading html data when blocked");
      if (filePasteAllowed) {
        const CLIPBOARD_HTML_STRING = "<b>Some HTML</b>";
        let expectedHtml = navigator.platform.includes("Win")
          ? `<html><body>\n<!--StartFragment-->${CLIPBOARD_HTML_STRING}<!--EndFragment-->\n</body>\n</html>`
          : CLIPBOARD_HTML_STRING;
        is(html, expectedHtml, "check text/html data");
      }
    }
  }
  return true;
}

document.addEventListener("teststart", async e => {
  let isReadTextTest = e.detail.testType == "readText";
  let gotNotAllowedException = false;
  let readResult = null;
  try {
    let readPromise = isReadTextTest ? navigator.clipboard.readText() : navigator.clipboard.read();
    readResult = await readPromise;
  } catch (ex) {
    gotNotAllowedException = isNotAllowedException(ex);
  }

  let result = null;
  try {
    result = checkReadHelper(readResult, gotNotAllowedException, isReadTextTest);
  } catch (ex) {
    result = ex.toString();
  }

  document.dispatchEvent(new CustomEvent('testresult', {
    detail: { result }
  }));
});
</script>

<label for="pasteAllowed">Paste allowed?</label><input id="pasteAllowed" type="checkbox">
<label for="contentAnalysisReturnsError">Content Analysis returns error?</label><input id="contentAnalysisReturnsError" type="checkbox">
</body>
</html>