blob: 7a5c137f24f047a8d7fbf34771b01f3a129cdf59 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>self.queueMicrotask works in Window</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
</head>
<body>
<iframe></iframe>
<script>
promise_test(() => {
var counter = 0;
self.queueMicrotask(() => {
assert_equals(counter++, 1);
self.queueMicrotask(() => {
assert_equals(counter++, 2);
});
});
var promise = new Promise((resolve, reject) => {
setTimeout(() => {
assert_equals(counter++, 3);
resolve();
}, 0);
});
assert_equals(counter++, 0);
return promise;
}, `Queued microtasks should be drained before executing macrotasks`);
promise_test(() => {
return new Promise((resolve, reject) => {
self.queueMicrotask(function () {
try {
assert_equals(arguments.length, 0);
assert_equals(this, self);
assert_equals(frames.length, 1);
assert_not_equals(frames[0], self);
var iframe = frames[0];
iframe.queueMicrotask(function () {
try {
assert_equals(this, self);
assert_not_equals(this, iframe);
self.queueMicrotask(function () {
'use strict';
try {
assert_equals(this, undefined);
resolve();
} catch (e) {
reject(e);
}
});
} catch (e) {
reject(e);
}
});
} catch (e) {
reject(e);
}
});
});
}, `queueMicrotask's callback has zero arguments and self as |this|`);
promise_test(() => {
return new Promise((resolve ,reject) => {
var counter = 0;
Promise.resolve().then(() => {
assert_equals(counter++, 1);
self.queueMicrotask(() => {
assert_equals(counter++, 3);
resolve();
});
});
self.queueMicrotask(() => {
assert_equals(counter++, 2);
});
assert_equals(counter++, 0);
});
}, `queueMicrotask and Promise uses the same Microtask queue`);
test(() => {
assert_throws_js(TypeError, () => {
self.queueMicrotask();
});
assert_throws_js(TypeError, () => {
self.queueMicrotask(null);
});
assert_throws_js(TypeError, () => {
self.queueMicrotask(undefined);
});
assert_throws_js(TypeError, () => {
self.queueMicrotask(42);
});
assert_throws_js(TypeError, () => {
self.queueMicrotask("42");
});
assert_throws_js(TypeError, () => {
self.queueMicrotask(true);
});
assert_throws_js(TypeError, () => {
self.queueMicrotask(Symbol("42"));
});
assert_throws_js(TypeError, () => {
self.queueMicrotask({});
});
assert_throws_js(TypeError, () => {
self.queueMicrotask({ handleEvent() { } });
});
}, `queueMicrotask should reject non-function arguments`);
</script>
</body>
</html>