summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/FileAPI/url/url-in-tags-revoke.window.js
blob: 1cdad79f7e34e080c62ba639f2f363efd4ed26a9 (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
// META: timeout=long
async_test(t => {
  const run_result = 'test_frame_OK';
  const blob_contents = '<!doctype html>\n<meta charset="utf-8">\n' +
    '<script>window.test_result = "' + run_result + '";</script>';
  const blob = new Blob([blob_contents], {type: 'text/html'});
  const url = URL.createObjectURL(blob);

  const frame = document.createElement('iframe');
  frame.setAttribute('src', url);
  frame.setAttribute('style', 'display:none;');
  document.body.appendChild(frame);
  URL.revokeObjectURL(url);

  frame.onload = t.step_func_done(() => {
    assert_equals(frame.contentWindow.test_result, run_result);
  });
}, 'Fetching a blob URL immediately before revoking it works in an iframe.');

async_test(t => {
  const run_result = 'test_frame_OK';
  const blob_contents = '<!doctype html>\n<meta charset="utf-8">\n' +
    '<script>window.test_result = "' + run_result + '";</script>';
  const blob = new Blob([blob_contents], {type: 'text/html'});
  const url = URL.createObjectURL(blob);

  const frame = document.createElement('iframe');
  frame.setAttribute('src', '/common/blank.html');
  frame.setAttribute('style', 'display:none;');
  document.body.appendChild(frame);

  frame.onload = t.step_func(() => {
    frame.contentWindow.location = url;
    URL.revokeObjectURL(url);
    frame.onload = t.step_func_done(() => {
      assert_equals(frame.contentWindow.test_result, run_result);
    });
  });
}, 'Fetching a blob URL immediately before revoking it works in an iframe navigation.');

async_test(t => {
  const run_result = 'test_frame_OK';
  const blob_contents = '<!doctype html>\n<meta charset="utf-8">\n' +
    '<script>window.test_result = "' + run_result + '";</script>';
  const blob = new Blob([blob_contents], {type: 'text/html'});
  const url = URL.createObjectURL(blob);
  const win = window.open(url);
  URL.revokeObjectURL(url);
  add_completion_callback(() => { win.close(); });

  win.onload = t.step_func_done(() => {
    assert_equals(win.test_result, run_result);
  });
}, 'Opening a blob URL in a new window immediately before revoking it works.');

function receive_message_on_channel(t, channel_name) {
  const channel = new BroadcastChannel(channel_name);
  return new Promise(resolve => {
    channel.addEventListener('message', t.step_func(e => {
      resolve(e.data);
    }));
  });
}

function window_contents_for_channel(channel_name) {
  return '<!doctype html>\n' +
    '<script>\n' +
    'new BroadcastChannel("' + channel_name + '").postMessage("foobar");\n' +
    'self.close();\n' +
    '</script>';
}

async_test(t => {
  const channel_name = 'noopener-window-test';
  const blob = new Blob([window_contents_for_channel(channel_name)], {type: 'text/html'});
  receive_message_on_channel(t, channel_name).then(t.step_func_done(t => {
    assert_equals(t, 'foobar');
  }));
  const url = URL.createObjectURL(blob);
  const win = window.open();
  win.opener = null;
  win.location = url;
  URL.revokeObjectURL(url);
}, 'Opening a blob URL in a noopener about:blank window immediately before revoking it works.');

async_test(t => {
  const run_result = 'test_script_OK';
  const blob_contents = 'window.script_test_result = "' + run_result + '";';
  const blob = new Blob([blob_contents]);
  const url = URL.createObjectURL(blob);

  const e = document.createElement('script');
  e.setAttribute('src', url);
  e.onload = t.step_func_done(() => {
    assert_equals(window.script_test_result, run_result);
  });

  document.body.appendChild(e);
  URL.revokeObjectURL(url);
}, 'Fetching a blob URL immediately before revoking it works in <script> tags.');

async_test(t => {
  const channel_name = 'a-click-test';
  const blob = new Blob([window_contents_for_channel(channel_name)], {type: 'text/html'});
  receive_message_on_channel(t, channel_name).then(t.step_func_done(t => {
    assert_equals(t, 'foobar');
  }));
  const url = URL.createObjectURL(blob);
  const anchor = document.createElement('a');
  anchor.href = url;
  anchor.target = '_blank';
  document.body.appendChild(anchor);
  anchor.click();
  URL.revokeObjectURL(url);
}, 'Opening a blob URL in a new window by clicking an <a> tag works immediately before revoking the URL.');