summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_ext_storage_manager_capabilities.html
blob: 135d2b9589bb2296c226d80ffd7ab884394780af (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
<!DOCTYPE HTML>
<html>
<head>
  <title>Test Storage API </title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
  <script type="text/javascript" src="head.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>

<script type="text/javascript">
"use strict";

add_task(async function setup() {
  await SpecialPowers.pushPrefEnv({
    "set": [
      ["dom.storageManager.enabled", true],
      ["dom.storageManager.prompt.testing", true],
      ["dom.storageManager.prompt.testing.allow", true],
    ],
  });
});

add_task(async function test_backgroundScript() {
  function background() {
    browser.test.assertTrue(navigator.storage !== undefined, "Has storage api interface");

    // Test estimate.
    browser.test.assertTrue("estimate" in navigator.storage, "Has estimate function");
    browser.test.assertEq("function", typeof navigator.storage.estimate, "estimate is function");
    browser.test.assertTrue(navigator.storage.estimate() instanceof Promise, "estimate returns a promise");

    return browser.test.notifyPass("navigation_storage_api.done");
  }

  let extension = ExtensionTestUtils.loadExtension({
    background,
  });

  await extension.startup();
  await extension.awaitFinish("navigation_storage_api.done");
  await extension.unload();
});

add_task(async function test_contentScript() {
  await SpecialPowers.pushPrefEnv({
    set: [["dom.security.https_first", false]],
  });

  function contentScript() {
    // Should not access storage api in non-secure context.
    browser.test.assertEq(undefined, navigator.storage,
                          "A page from the unsecure http protocol " +
                          "doesn't have access to the navigator.storage API");

    return browser.test.notifyPass("navigation_storage_api.done");
  }

  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      content_scripts: [{
        "matches": ["http://example.com/*/file_sample.html"],
        "js": ["content_script.js"],
      }],
    },

    files: {
      "content_script.js":  `(${contentScript})()`,
    },
  });

  await extension.startup();

  // Open an explicit URL for testing Storage API in an insecure context.
  let win = window.open("http://example.com/tests/toolkit/components/extensions/test/mochitest/file_sample.html");

  await extension.awaitFinish("navigation_storage_api.done");

  await extension.unload();
  win.close();
});

add_task(async function test_contentScriptSecure() {
  function contentScript() {
    browser.test.assertTrue(navigator.storage !== undefined, "Has storage api interface");

    // Test estimate.
    browser.test.assertTrue("estimate" in navigator.storage, "Has estimate function");
    browser.test.assertEq("function", typeof navigator.storage.estimate, "estimate is function");

    // The promise that estimate function returns belongs to the content page,
    // but the Promise constructor belongs to the content script sandbox.
    // Check window.Promise here.
    browser.test.assertTrue(navigator.storage.estimate() instanceof window.Promise, "estimate returns a promise");

    return browser.test.notifyPass("navigation_storage_api.done");
  }

  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      content_scripts: [{
        "matches": ["https://example.com/*/file_sample.html"],
        "js": ["content_script.js"],
      }],
    },

    files: {
      "content_script.js":  `(${contentScript})()`,
    },
  });

  await extension.startup();

  // Open an explicit URL for testing Storage API in a secure context.
  let win = window.open("file_sample.html");

  await extension.awaitFinish("navigation_storage_api.done");

  await extension.unload();
  win.close();
});

add_task(async function cleanup() {
  await SpecialPowers.popPrefEnv();
});
</script>

</body>
</html>