mirror of
https://github.com/servo/servo.git
synced 2025-07-12 01:43:43 +01:00
48 lines
2.2 KiB
JavaScript
48 lines
2.2 KiB
JavaScript
// META: script=/common/utils.js
|
|
// META: script=beacon-common.sub.js
|
|
|
|
"use strict";
|
|
|
|
test(function() {
|
|
// Payload that should cause sendBeacon to return false because it exceeds the maximum payload size.
|
|
var exceedPayload = Array(maxPayloadSize + 1).fill('z').join("");
|
|
|
|
var success = navigator.sendBeacon("http://{{hosts[][nonexistent]}}", exceedPayload);
|
|
assert_false(success, "calling 'navigator.sendBeacon()' with payload size exceeding the maximum size must fail");
|
|
}, "Verify calling 'navigator.sendBeacon()' with a large payload returns 'false'.");
|
|
|
|
test(function() {
|
|
var invalidUrl = "http://invalid:url";
|
|
assert_throws(new TypeError(), function() { navigator.sendBeacon(invalidUrl, smallPayload); },
|
|
`calling 'navigator.sendBeacon()' with an invalid URL '${invalidUrl}' must throw a TypeError`);
|
|
}, "Verify calling 'navigator.sendBeacon()' with an invalid URL throws an exception.");
|
|
|
|
test(function() {
|
|
var invalidUrl = "nothttp://invalid.url";
|
|
assert_throws(new TypeError(), function() { navigator.sendBeacon(invalidUrl, smallPayload); },
|
|
`calling 'navigator.sendBeacon()' with a non-http(s) URL '${invalidUrl}' must throw a TypeError`);
|
|
}, "Verify calling 'navigator.sendBeacon()' with a URL that is not a http(s) scheme throws an exception.");
|
|
|
|
// We'll validate that we can send one beacon that uses our entire Quota and then fail to send one that is just one char.
|
|
promise_test(async () => {
|
|
function wait(ms) {
|
|
return new Promise(res => step_timeout(res, ms));
|
|
}
|
|
const url = '/fetch/api/resources/trickle.py?count=1&ms=0';
|
|
assert_true(navigator.sendBeacon(url, maxPayload),
|
|
"calling 'navigator.sendBeacon()' with our max payload size should succeed.");
|
|
|
|
// Now we'll send just one character.
|
|
assert_false(navigator.sendBeacon(url, '1'),
|
|
"calling 'navigator.sendBeacon()' with just one char should fail while our Quota is used up.");
|
|
|
|
for (let i = 0; i < 20; ++i) {
|
|
await wait(100);
|
|
if (navigator.sendBeacon(url, maxPayload)) {
|
|
return;
|
|
}
|
|
}
|
|
assert_unreached('The quota should recover after fetching.');
|
|
}, "Verify the behavior after the quota is exhausted.");
|
|
|
|
done();
|