mirror of
https://github.com/servo/servo.git
synced 2025-09-03 11:38:22 +01:00
Update web-platform-tests to revision 8a2ceb5f18911302b7a5c1cd2791f4ab50ad4326
This commit is contained in:
parent
462c272380
commit
1f531f66ea
5377 changed files with 174916 additions and 84369 deletions
|
@ -0,0 +1,38 @@
|
|||
<!doctype html>
|
||||
<head>
|
||||
<script src="./resizeTestHelper.js"></script>
|
||||
</head>
|
||||
<p>iframe test</p>
|
||||
<div id="itarget1" style="width:100px;height:100px;">t1</div>
|
||||
<script>
|
||||
'use strict';
|
||||
let t1 = document.querySelector('#itarget1');
|
||||
function test0() {
|
||||
let timeoutId = window.setTimeout( () => {
|
||||
window.parent.postMessage('fail', '*');
|
||||
}, ResizeTestHelper.TIMEOUT);
|
||||
let ro = new ResizeObserver(function(entries) {
|
||||
window.clearTimeout(timeoutId);
|
||||
window.parent.postMessage('success', '*');
|
||||
});
|
||||
ro.observe(t1);
|
||||
}
|
||||
let testStarted = false;
|
||||
window.addEventListener('message', function(ev) {
|
||||
switch(ev.data) {
|
||||
case 'startTest':
|
||||
testStarted = true;
|
||||
test0();
|
||||
break;
|
||||
}
|
||||
});
|
||||
// How does parent know we've loaded problem is solved by
|
||||
// broadcasting readyToTest message repeatedly until test starts.
|
||||
function broadcastReady() {
|
||||
if (!testStarted) {
|
||||
window.parent.postMessage('readyToTest', '*');
|
||||
window.requestAnimationFrame(broadcastReady);
|
||||
}
|
||||
}
|
||||
broadcastReady();
|
||||
</script>
|
|
@ -0,0 +1,148 @@
|
|||
'use strict';
|
||||
|
||||
/**
|
||||
ResizeTestHelper is a framework to test ResizeObserver
|
||||
notifications. Use it to make assertions about ResizeObserverEntries.
|
||||
This framework is needed because ResizeObservations are
|
||||
delivered asynchronously inside the event loop.
|
||||
|
||||
Features:
|
||||
- can queue multiple notification steps in a test
|
||||
- handles timeouts
|
||||
- returns Promise that is fullfilled when test completes.
|
||||
Use to chain tests (since parallel async ResizeObserver tests
|
||||
would conflict if reusing same DOM elements).
|
||||
|
||||
Usage:
|
||||
|
||||
create ResizeTestHelper for every test.
|
||||
Make assertions inside notify, timeout callbacks.
|
||||
Start tests with helper.start()
|
||||
Chain tests with Promises.
|
||||
Counts animation frames, see startCountingRaf
|
||||
*/
|
||||
|
||||
/*
|
||||
@param name: test name
|
||||
@param steps:
|
||||
{
|
||||
setup: function(ResizeObserver) {
|
||||
// called at the beginning of the test step
|
||||
// your observe/resize code goes here
|
||||
},
|
||||
notify: function(entries, observer) {
|
||||
// ResizeObserver callback.
|
||||
// Make assertions here.
|
||||
// Return true if next step should start on the next event loop.
|
||||
},
|
||||
timeout: function() {
|
||||
// Define this if your test expects to time out.
|
||||
// If undefined, timeout is assert_unreached.
|
||||
}
|
||||
}
|
||||
*/
|
||||
function ResizeTestHelper(name, steps)
|
||||
{
|
||||
this._name = name;
|
||||
this._steps = steps || [];
|
||||
this._stepIdx = -1;
|
||||
this._harnessTest = null;
|
||||
this._observer = new ResizeObserver(this._handleNotification.bind(this));
|
||||
this._timeoutBind = this._handleTimeout.bind(this);
|
||||
this._nextStepBind = this._nextStep.bind(this);
|
||||
}
|
||||
|
||||
ResizeTestHelper.TIMEOUT = 100;
|
||||
|
||||
ResizeTestHelper.prototype = {
|
||||
get _currentStep() {
|
||||
return this._steps[this._stepIdx];
|
||||
},
|
||||
|
||||
_nextStep: function() {
|
||||
if (++this._stepIdx == this._steps.length)
|
||||
return this._done();
|
||||
this._timeoutId = this._harnessTest.step_timeout(
|
||||
this._timeoutBind, ResizeTestHelper.TIMEOUT);
|
||||
try {
|
||||
this._steps[this._stepIdx].setup(this._observer);
|
||||
}
|
||||
catch(err) {
|
||||
this._harnessTest.step(() => {
|
||||
assert_unreached("Caught a throw, possible syntax error");
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_handleNotification: function(entries) {
|
||||
if (this._timeoutId) {
|
||||
window.clearTimeout(this._timeoutId);
|
||||
delete this._timeoutId;
|
||||
}
|
||||
this._harnessTest.step(() => {
|
||||
let rafDelay = this._currentStep.notify(entries, this._observer);
|
||||
if (rafDelay)
|
||||
window.requestAnimationFrame(this._nextStepBind);
|
||||
else
|
||||
this._nextStep();
|
||||
});
|
||||
},
|
||||
|
||||
_handleTimeout: function() {
|
||||
delete this._timeoutId;
|
||||
this._harnessTest.step(() => {
|
||||
if (this._currentStep.timeout) {
|
||||
this._currentStep.timeout();
|
||||
}
|
||||
else {
|
||||
assert_unreached("Timed out waiting for notification. (" + ResizeTestHelper.TIMEOUT + "ms)");
|
||||
}
|
||||
this._nextStep();
|
||||
});
|
||||
},
|
||||
|
||||
_done: function() {
|
||||
this._observer.disconnect();
|
||||
delete this._observer;
|
||||
this._harnessTest.done();
|
||||
if (this._rafCountRequest) {
|
||||
window.cancelAnimationFrame(this._rafCountRequest);
|
||||
delete this._rafCountRequest;
|
||||
}
|
||||
window.requestAnimationFrame(() => { this._resolvePromise(); });
|
||||
},
|
||||
|
||||
start: function() {
|
||||
this._harnessTest = async_test(this._name);
|
||||
this._harnessTest.step(() => {
|
||||
assert_equals(this._stepIdx, -1, "start can only be called once");
|
||||
this._nextStep();
|
||||
});
|
||||
return new Promise( (resolve, reject) => {
|
||||
this._resolvePromise = resolve;
|
||||
this._rejectPromise = reject;
|
||||
});
|
||||
},
|
||||
|
||||
get rafCount() {
|
||||
if (!this._rafCountRequest)
|
||||
throw "rAF count is not active";
|
||||
return this._rafCount;
|
||||
},
|
||||
|
||||
_incrementRaf: function() {
|
||||
if (this._rafCountRequest) {
|
||||
this._rafCount++;
|
||||
this._rafCountRequest = window.requestAnimationFrame(this._incrementRafBind);
|
||||
}
|
||||
},
|
||||
|
||||
startCountingRaf: function() {
|
||||
if (this._rafCountRequest)
|
||||
window.cancelAnimationFrame(this._rafCountRequest);
|
||||
if (!this._incrementRafBind)
|
||||
this._incrementRafBind = this._incrementRaf.bind(this);
|
||||
this._rafCount = 0;
|
||||
this._rafCountRequest = window.requestAnimationFrame(this._incrementRafBind);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue