summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_ext_webrequest_upgrade.html
blob: f086d29d02c571963b05abce577c9e7a62aa33d8 (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
<!DOCTYPE HTML>
<html>
<head>
  <title>Test for simple WebExtension</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 test_webRequest_upgrade() {
  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: [
        "webRequest",
        "webRequestBlocking",
        "*://mochi.test/tests/*",
      ],
    },
    background() {
      browser.webRequest.onSendHeaders.addListener((details) => {
        // At this point, the request should have been upgraded.
        browser.test.assertTrue(details.url.startsWith("https:"), "request is upgraded");
        browser.test.assertTrue(details.url.includes("file_sample"), "redirect after upgrade worked");
        // Note: although not significant for the test assertions, note that
        // the requested file won't load - https://mochi.test:8888/ does not
        // resolve to anything on the test server.
        browser.test.sendMessage("finished");
      }, {urls: ["*://mochi.test/tests/*"]});

      browser.webRequest.onBeforeRequest.addListener((details) => {
        browser.test.log(`onBeforeRequest ${details.requestId} ${details.url}`);
        let url = new URL(details.url);
        if (url.protocol == "http:") {
          return {upgradeToSecure: true};
        }
        // After the channel is initially upgraded, we get another onBeforeRequest
        // call.  Here we can redirect again to a new url.
        if (details.url.includes("file_mixed.html")) {
          let redirectUrl = new URL("file_sample.html", details.url).href;
          return {redirectUrl};
        }
      }, {urls: ["*://mochi.test/tests/*"]}, ["blocking"]);
    },
  });

  await extension.startup();
  let win = window.open("http://mochi.test:8888/tests/toolkit/components/extensions/test/mochitest/file_mixed.html");
  await extension.awaitMessage("finished");
  win.close();
  await extension.unload();
});

add_task(async function test_webRequest_redirect_wins() {
  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: [
        "webRequest",
        "webRequestBlocking",
        "*://mochi.test/tests/*",
      ],
    },
    background() {
      browser.webRequest.onSendHeaders.addListener((details) => {
        // At this point, the request should have been redirected instead of upgraded.
        browser.test.assertTrue(details.url.includes("file_sample"), "request was redirected");
        browser.test.sendMessage("finished");
      }, {urls: ["*://mochi.test/tests/*"]});

      browser.webRequest.onBeforeRequest.addListener((details) => {
        if (details.url.includes("file_mixed.html")) {
          let redirectUrl = new URL("file_sample.html", details.url).href;
          return {upgradeToSecure: true, redirectUrl};
        }
      }, {urls: ["*://mochi.test/tests/*"]}, ["blocking"]);
    },
  });

  await extension.startup();
  let win = window.open("http://mochi.test:8888/tests/toolkit/components/extensions/test/mochitest/file_mixed.html");
  await extension.awaitMessage("finished");
  win.close();
  await extension.unload();
});

// Test that there is no infinite redirect loop when upgradeToSecure is used on
// https. This test checks that the redirect chain is: http -> https -> done.
add_task(async function upgradeToSecure_for_https_is_noop() {
  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: [
        "webRequest",
        "webRequestBlocking",
        "*://example.com/tests/*",
      ],
    },
    background() {
      let count = 0;
      browser.webRequest.onBeforeRequest.addListener(
        details => {
          browser.test.log(`onBeforeRequest ${details.requestId} ${details.url}`);
          ++count;
          if (details.url.startsWith("http:")) {
            browser.test.assertEq(1, count, "Initial request is http:");
          } else {
            browser.test.assertEq(2, count, "Second request is https:");
          }
          return {upgradeToSecure: true};
        },
        { urls: ["*://example.com/tests/*file_sample.html"] },
        ["blocking"]
      );
      browser.webRequest.onCompleted.addListener(
        details => {
          browser.test.log(`onCompleted ${details.requestId} ${details.url}`);
          browser.test.assertTrue(details.url.startsWith("https"), "is https");
          browser.test.assertEq(2, count, "Seen two requests (http + https)");
          browser.test.sendMessage("finished");
        },
        { urls: ["*://example.com/tests/*file_sample.html"] },
      );
    },
  });

  await extension.startup();
  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
  let win = window.open("http://example.com/tests/toolkit/components/extensions/test/mochitest/file_sample.html");
  await extension.awaitMessage("finished");
  win.close();
  await extension.unload();
});
</script>

</body>
</html>