| Index: third_party/WebKit/LayoutTests/resize-observer/resources/resizeTestHelper.js
|
| diff --git a/third_party/WebKit/LayoutTests/resize-observer/resources/resizeTestHelper.js b/third_party/WebKit/LayoutTests/resize-observer/resources/resizeTestHelper.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5d58af4d98dcd7cb169aaeead87bb9e015215f1b
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/resize-observer/resources/resizeTestHelper.js
|
| @@ -0,0 +1,117 @@
|
| +'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.
|
| +
|
| + It handles timeouts, and queueing of multiple steps in a test.
|
| +
|
| + Usage:
|
| +
|
| + Use createTest() to create tests.
|
| + Make assertions inside entries, timeout callbacks.
|
| + Every test should clean up after itself by calling helper.observer.disconnect();
|
| + Chain tests together with nextTest(), or nextTestRaf()
|
| +
|
| + Example:
|
| +
|
| + var helper = new ResizeTestHelper();
|
| +
|
| + function test0() {
|
| + helper.createTest(
|
| + "test0: test name here",
|
| + setup => { // setup gets called when test starts
|
| + helper.observer.observe(t3);
|
| + },
|
| + entries => { // This is ResizeObserver callback
|
| + // kick off next test by calling nextTestRaf
|
| + helper.nextTestRaf();
|
| + },
|
| + timeout => { // timeout gets called on timeout
|
| + // if timeout happens, and timeout is not defined, test will fail
|
| + }
|
| + );
|
| +*/
|
| +
|
| +function ResizeTestHelper() {
|
| + this._pendingTests = [];
|
| + this._observer = new ResizeObserver(this._handleNotification.bind(this));
|
| +}
|
| +ResizeTestHelper.TIMEOUT = 500;
|
| +
|
| +ResizeTestHelper.prototype = {
|
| +
|
| + // @return ResizeObserver
|
| + get observer() {
|
| + return this._observer;
|
| + },
|
| +
|
| + _handleNotification: function(entries) {
|
| + if (this._currentTest) {
|
| + // console.log("notification");
|
| + let current = this._currentTest;
|
| + delete this._currentTest;
|
| + window.clearTimeout(current.timeoutId);
|
| + current.test.step(_ => {
|
| + // console.log("step");
|
| + let caughtEx = false;
|
| + try {
|
| + current.completion(entries);
|
| + current.test.done();
|
| + }
|
| + catch(ex) {
|
| + caughtEx = ex;
|
| + }
|
| + if (caughtEx)
|
| + throw caughtEx;
|
| + });
|
| + }
|
| + },
|
| + _handleTimeout: function() {
|
| + if (this._currentTest) {
|
| + let current = this._currentTest;
|
| + delete this._currentTest;
|
| + if (current.timeout) { // timeout is not an error
|
| + current.timeout();
|
| + current.test.done();
|
| + }
|
| + else {
|
| + current.test.step(_ => {
|
| + assert_unreached("Timed out waiting for notification. (" + ResizeTestHelper.TIMEOUT + "ms)");
|
| + current.test.done();
|
| + });
|
| + }
|
| + }
|
| + },
|
| +
|
| + // Start the next test
|
| + nextTest: function() {
|
| + if (this._currentTest) // only one test at a time
|
| + return;
|
| + if (this._pendingTests.length > 0) {
|
| + this._currentTest = this._pendingTests.shift();
|
| + // console.log("executing ", this._currentTest.name);
|
| + this._currentTest.setup();
|
| + this._currentTest.timeoutId = this._currentTest.test.step_timeout(this._handleTimeout.bind(this), ResizeTestHelper.TIMEOUT);
|
| + }
|
| + },
|
| +
|
| + // Fires nextTest on rAF. Use it to trigger next test.
|
| + nextTestRaf: function() {
|
| + window.requestAnimationFrame( () => this.nextTest() );
|
| + },
|
| +
|
| + // Adds new test to _pendingTests.
|
| + createTest: function(name, setup, completion, timeoutCb) {
|
| + // console.log('setup ', name);
|
| + this._pendingTests.push( {
|
| + name: name,
|
| + test: async_test(name),
|
| + setup: setup,
|
| + completion: completion,
|
| + timeout: timeoutCb });
|
| + }
|
| +
|
| +}
|
|
|