summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_clipboard.html
blob: 900ee5f1086682e2cd8b1e40dcafb9df040c7741 (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
140
<!DOCTYPE HTML>
<html>
<head>
  <title>clipboard permission test</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script src="/tests/SimpleTest/SpawnTask.js"></script>
  <script src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
  <script src="head.js"></script>
  <link rel="stylesheet" href="/tests/SimpleTest/test.css">
</head>
<body>

<script>
"use strict";

function doCopy(txt) {
  let field = document.createElement("textarea");
  document.body.appendChild(field);
  field.value = txt;
  field.select();
  return document.execCommand("copy");
}

add_task(function* no_permission_deny_copy() {
  function backgroundScript() {
    browser.test.assertEq(false, doCopy("whatever"),
      "copy should be denied without permission");
    browser.test.sendMessage("ready");
  }
  let extensionData = {
    background: `${doCopy};(${backgroundScript})();`,
  };
  let extension = ExtensionTestUtils.loadExtension(extensionData);
  yield extension.startup();

  yield extension.awaitMessage("ready");

  yield extension.unload();
});

/** Selecting text in a bg page is not possible, skip test until it's fixed.
add_task(function* with_permission_allow_copy() {
  function backgroundScript() {
    browser.test.onMessage.addListener(txt => {
      browser.test.assertEq(true, doCopy(txt),
        "copy should be allowed with permission");
    });
    browser.test.sendMessage("ready");
  }
  let extensionData = {
    background: `${doCopy};(${backgroundScript})();`,
    manifest: {
      permissions: [
        "clipboardWrite",
      ],
    },
  };
  let extension = ExtensionTestUtils.loadExtension(extensionData);
  yield extension.startup();
  yield extension.awaitMessage("ready");

  const DUMMY_STR = "dummy string to copy";
  yield new Promise(resolve => {
    SimpleTest.waitForClipboard(DUMMY_STR, () => {
      extension.sendMessage(DUMMY_STR);
    }, resolve, resolve);
  });

  yield extension.unload();
}); */

add_task(function* content_script_no_permission_deny_copy() {
  function contentScript() {
    browser.test.assertEq(false, doCopy("whatever"),
      "copy should be denied without permission");
    browser.test.sendMessage("ready");
  }
  let extensionData = {
    manifest: {
      content_scripts: [{
        js: ["contentscript.js"],
        matches: ["http://mochi.test/*/file_sample.html"],
      }],
    },
    files: {
      "contentscript.js": `${doCopy};(${contentScript})();`,
    },
  };
  let extension = ExtensionTestUtils.loadExtension(extensionData);
  yield extension.startup();

  let win = window.open("file_sample.html");
  yield extension.awaitMessage("ready");
  win.close();

  yield extension.unload();
});

add_task(function* content_script_with_permission_allow_copy() {
  function contentScript() {
    browser.test.onMessage.addListener(txt => {
      browser.test.assertEq(true, doCopy(txt),
        "copy should be allowed with permission");
    });
    browser.test.sendMessage("ready");
  }
  let extensionData = {
    manifest: {
      content_scripts: [{
        js: ["contentscript.js"],
        matches: ["http://mochi.test/*/file_sample.html"],
      }],
      permissions: [
        "clipboardWrite",
      ],
    },
    files: {
      "contentscript.js": `${doCopy};(${contentScript})();`,
    },
  };
  let extension = ExtensionTestUtils.loadExtension(extensionData);
  yield extension.startup();

  let win = window.open("file_sample.html");
  yield extension.awaitMessage("ready");

  const DUMMY_STR = "dummy string to copy in content script";
  yield new Promise(resolve => {
    SimpleTest.waitForClipboard(DUMMY_STR, () => {
      extension.sendMessage(DUMMY_STR);
    }, resolve, resolve);
  });

  win.close();

  yield extension.unload();
});
</script>
</body>
</html>