mirror of
https://github.com/servo/servo.git
synced 2025-08-28 16:48:22 +01:00
Update web-platform-tests to revision de9a09ab7f605aed6a4b53ed96427412bab76463
This commit is contained in:
parent
f3f9303fc9
commit
73a776843f
225 changed files with 5750 additions and 2858 deletions
|
@ -0,0 +1,29 @@
|
|||
<!DOCType html>
|
||||
<html>
|
||||
<script src=event-timing-support.js></script>
|
||||
<button id='button_child_frame' onclick='2'>Generate a 'click' event</button>
|
||||
<img src=slow-image.py>
|
||||
<script>
|
||||
const clickTimeMin = performance.now();
|
||||
clickAndBlockMain('button_child_frame');
|
||||
const processingStartMin = performance.now();
|
||||
const observerPromise = new Promise((resolve, reject) => {
|
||||
new PerformanceObserver((entryList) => {
|
||||
resolve(entryList.getEntries());
|
||||
}).observe({ entryTypes: ['event'] });
|
||||
});
|
||||
window.addEventListener('load', e => {
|
||||
observerPromise.then((observedEntries) => {
|
||||
const onloadStart = performance.now();
|
||||
const bufferedEntries = performance.getEntriesByType('event');
|
||||
top.postMessage({
|
||||
"bufferedEntries" : bufferedEntries,
|
||||
"observedEntries": observedEntries,
|
||||
"clickTimeMin": clickTimeMin,
|
||||
"processingStartMin" : processingStartMin,
|
||||
"onloadStart" : onloadStart,
|
||||
}, '*');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</html>
|
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset=utf-8 />
|
||||
</head>
|
||||
<script src=./event-timing-support.js></script>
|
||||
<script>
|
||||
function log(message) {
|
||||
const timestamp = performance.now();
|
||||
const elem = document.createElement('div');
|
||||
elem.innerHTML = `${timestamp.toFixed(1)}: ${message}`;
|
||||
const timeline = document.getElementById('timeline');
|
||||
timeline.appendChild(elem);
|
||||
}
|
||||
|
||||
function run() {
|
||||
new PerformanceObserver((entryList) => {
|
||||
entryList.getEntries().forEach(e => {
|
||||
log(`entry observed: ${JSON.stringify(e)}`);
|
||||
});
|
||||
}).observe({ entryTypes: ['event'] });
|
||||
log("observer registered");
|
||||
top.postMessage('CHILD_FRAME_IS_READY', "*");
|
||||
}
|
||||
|
||||
function onMakeBusy() {
|
||||
log("busy start");
|
||||
step_timeout(()=>{
|
||||
mainThreadBusy(2000);
|
||||
log("busy end");
|
||||
}, 0);
|
||||
}
|
||||
</script>
|
||||
<body onload='run()'>
|
||||
<h3>Actions:</h3>
|
||||
<p>
|
||||
<button id='busy_button' onclick='onMakeBusy()'>Make busy</button>
|
||||
<button id='click_input_button' onclick='1'> click while busy </button>
|
||||
</p>
|
||||
<h3>Timeline:</h3>
|
||||
<p id='timeline'></p>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,66 @@
|
|||
// Clicks on the element with the given ID. It adds an event handler to the element
|
||||
// which ensures that the events have a long duration and reported by EventTiming
|
||||
// where appropriate. Calls |callback| during event handler.
|
||||
function clickOnElement(id, callback) {
|
||||
const element = document.getElementById(id);
|
||||
const rect = element.getBoundingClientRect();
|
||||
const xCenter = rect.x + rect.width / 2;
|
||||
const yCenter = rect.y + rect.height / 2;
|
||||
const leftButton = 0;
|
||||
const clickHandler = () => {
|
||||
mainThreadBusy(60);
|
||||
if (callback)
|
||||
callback();
|
||||
element.removeEventListener("click", clickHandler);
|
||||
};
|
||||
element.addEventListener("click", clickHandler);
|
||||
test_driver.click(element);
|
||||
}
|
||||
|
||||
function mainThreadBusy(duration) {
|
||||
const now = performance.now();
|
||||
while (performance.now() < now + duration);
|
||||
}
|
||||
|
||||
// This method should receive an entry of type 'event'. |is_first| is true only
|
||||
// when the event also happens to correspond to the first event. In this case,
|
||||
// the timings of the 'firstInput' entry should be equal to those of this entry.
|
||||
function verifyClickEvent(entry, is_first=false) {
|
||||
assert_true(entry.cancelable);
|
||||
assert_equals(entry.name, 'click');
|
||||
assert_equals(entry.entryType, 'event');
|
||||
assert_greater_than(entry.duration, 50,
|
||||
"The entry's duration should be greater than 50ms.");
|
||||
assert_greater_than(entry.processingStart, entry.startTime,
|
||||
"The entry's processingStart should be greater than startTime.");
|
||||
assert_greater_than_equal(entry.processingEnd, entry.processingStart,
|
||||
"The entry's processingEnd must be at least as large as processingStart.");
|
||||
assert_greater_than_equal(entry.duration, entry.processingEnd - entry.startTime,
|
||||
"The entry's duration must be at least as large as processingEnd - startTime.");
|
||||
if (is_first) {
|
||||
let firstInputs = performance.getEntriesByType('firstInput');
|
||||
assert_equals(firstInputs.length, 1, 'There should be a single firstInput entry');
|
||||
let firstInput = firstInputs[0];
|
||||
assert_equals(firstInput.name, entry.name);
|
||||
assert_equals(firstInput.entryType, 'firstInput');
|
||||
assert_equals(firstInput.startTime, entry.startTime);
|
||||
assert_equals(firstInput.duration, entry.duration);
|
||||
assert_equals(firstInput.processingStart, entry.processingStart);
|
||||
assert_equals(firstInput.processingEnd, entry.processingEnd);
|
||||
assert_equals(firstInput.cancelable, entry.cancelable);
|
||||
}
|
||||
}
|
||||
|
||||
function wait() {
|
||||
return new Promise((resolve, reject) => {
|
||||
step_timeout(() => {
|
||||
resolve();
|
||||
}, 0);
|
||||
});
|
||||
}
|
||||
|
||||
function clickAndBlockMain(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
clickOnElement(id, resolve);
|
||||
});
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
import time
|
||||
|
||||
def main(request, response):
|
||||
# Sleep for 500ms to delay onload.
|
||||
time.sleep(0.5)
|
||||
response.headers.set("Cache-Control", "no-cache, must-revalidate");
|
||||
response.headers.set("Location", "data:image/gif;base64,R0lGODlhAQABAJAAAMjIyAAAACwAAAAAAQABAAACAgQBADs%3D");
|
Loading…
Add table
Add a link
Reference in a new issue