File: handler-tools.js

package info (click to toggle)
thunderbird 1%3A91.12.0-1~deb10u1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 3,008,300 kB
  • sloc: cpp: 6,084,052; javascript: 4,790,441; ansic: 3,341,486; python: 862,958; asm: 366,542; xml: 204,277; java: 152,477; sh: 111,376; makefile: 21,388; perl: 15,312; yacc: 4,583; objc: 3,026; lex: 1,720; exp: 762; pascal: 635; awk: 564; sql: 453; php: 436; lisp: 432; ruby: 99; sed: 69; csh: 45
file content (53 lines) | stat: -rw-r--r-- 2,487 bytes parent folder | download | duplicates (4)
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
// These can be used in an environment that has these global variables defined:
// * type (one of "path", "query", or "fragment")
// * noSW (a boolean)

if (type === "path" && noSW) {
  throw new Error("There is no support for a path handler without a service worker.");
}

const swString = noSW ? "" : "sw";
const handler = {
  "path": "PSS%sPSE/?QES\u2020QEE#FES\u2020FEE",
  "query": "?QES\u2020QEEPSS%sPSE#FES\u2020FEE",
  "fragment": "?QES\u2020QEE#FES\u2020FEEPSS%sPSE"
}[type];
const scheme = `web+wpt${type}${swString}`;

function register() {
  const handlerURL = noSW ? `resources/handler.html${handler}${type}` : `resources/handler/${type}/${handler}`;
  navigator.registerProtocolHandler(scheme, handlerURL, `WPT ${type} handler${noSW ? ", without service worker" : ""}`);
}

function runTest({ includeNull = false } = {}) {
  promise_test(async t => {
    const bc = new BroadcastChannel(`protocol-handler-${type}${swString}`);
    if (!noSW) {
      const reg = await service_worker_unregister_and_register(t, "resources/handler-sw.js", "resources/handler/");
      t.add_cleanup(async () => await reg.unregister());
      await wait_for_state(t, reg.installing, 'activated');
    }
    const a = document.body.appendChild(document.createElement("a"));
    const codePoints = [];
    let i = includeNull ? 0 : 1;
    for (; i < 0x82; i++) {
      codePoints.push(String.fromCharCode(i));
    }
    a.href = `${scheme}:${codePoints.join("")}`;
    a.target = "_blank";
    a.click();
    await new Promise(resolve => {
      bc.onmessage = t.step_func(e => {
        resultingURL = e.data;
        assert_equals(stringBetweenMarkers(resultingURL, "QES", "QEE"), "%86", "query baseline");
        assert_equals(stringBetweenMarkers(resultingURL, "FES", "FEE"), "%E2%80%A0", "fragment baseline");
        assert_equals(stringBetweenMarkers(resultingURL, "PSS", "PSE"), `${encodeURIComponent(scheme)}%3A${includeNull ? "%2500" : ""}%2501%2502%2503%2504%2505%2506%2507%2508%250B%250C%250E%250F%2510%2511%2512%2513%2514%2515%2516%2517%2518%2519%251A%251B%251C%251D%251E%251F%20!%22%23%24%25%26${type === "query" ? "%27" : "'"}()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%257F%25C2%2580%25C2%2581`, "actual test");
        resolve();
      });
    });
  });
}

function stringBetweenMarkers(string, start, end) {
  return string.substring(string.indexOf(start) + start.length, string.indexOf(end));
}