File: clipboard_read_async.html

package info (click to toggle)
firefox 142.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,591,884 kB
  • sloc: cpp: 7,451,570; javascript: 6,392,463; ansic: 3,712,584; python: 1,388,569; xml: 629,223; asm: 426,919; java: 184,857; sh: 63,439; makefile: 19,150; objc: 13,059; perl: 12,983; yacc: 4,583; cs: 3,846; pascal: 3,352; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (100 lines) | stat: -rw-r--r-- 3,769 bytes parent folder | download | duplicates (3)
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
<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 pasteAllowed = document.getElementById("pasteAllowed").checked;
  let plainTextOnly = document.getElementById("plainTextOnly").checked;
  let contentAnalysisReturnsError = document.getElementById("contentAnalysisReturnsError").checked;
  pasteAllowed = pasteAllowed && !contentAnalysisReturnsError;
  is(gotNotAllowedException, !pasteAllowed && isReadTextTest, "Should get exception from readText() if not allowed");
  if (isReadTextTest) {
    is(readResult, pasteAllowed ? "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, !pasteAllowed, "should get exception from reading text data when blocked");
      if (pasteAllowed) {
        is(text, "Some plain text", "check text/plain data");
      }
    }

    {
      // I think this will change when bug 1938618 is fixed - then the HTML should be blocked
      // even if we're in plainTextOnly mode
      let htmlPasteAllowed = pasteAllowed || plainTextOnly;
      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, !htmlPasteAllowed, "should get exception from reading html data when blocked");
      if (htmlPasteAllowed) {
        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="plainTextOnly">Plain text only?</label><input id="plainTextOnly" type="checkbox">
<label for="contentAnalysisReturnsError">Content Analysis returns error?</label><input id="contentAnalysisReturnsError" type="checkbox">
</body>
</html>