| Index: third_party/WebKit/LayoutTests/intersection-observer/README
|
| diff --git a/third_party/WebKit/LayoutTests/intersection-observer/README b/third_party/WebKit/LayoutTests/intersection-observer/README
|
| index bc78b418df739bfcb6131da4f96037084554eb17..b1867cd654d804950dace2a55ca0d807015e3619 100644
|
| --- a/third_party/WebKit/LayoutTests/intersection-observer/README
|
| +++ b/third_party/WebKit/LayoutTests/intersection-observer/README
|
| @@ -8,71 +8,28 @@ function test_function() {
|
| }
|
| onload = function() {
|
| observer.observe(target);
|
| - requestAnimationFrame(() => { requestAnimationFrame(test_function) });
|
| + requestAnimationFrame(() => {
|
| + setTimeout(() => {
|
| + setTimeout(test_function);
|
| + });
|
| + });
|
| }
|
|
|
| -Subsequent steps in the test use a single RAF to give the observer a chance to
|
| -generate notifications, but the double RAF is required in the onload handler.
|
| Here's the chain of events:
|
|
|
| - onload
|
| - observer.observe()
|
| - - First RAF handler is registered
|
| + - RAF handler is registered
|
| - BeginFrame
|
| - - RAF handlers run
|
| - - Second RAF handler is registered
|
| + - RAF handler runs
|
| + - First setTimeout is registered
|
| - UpdateAllLifecyclePhases
|
| - IntersectionObserver generates notifications
|
| + - First setTimeout runs
|
| + - Second setTimeout is regsitered
|
| + - Notifications that haven't be taken via takeRecords are delivered
|
| + - Second setTimeout runs and queues another RAF handler
|
| - BeginFrame
|
| - - RAF handlers run
|
| - - Second RAF handler verifies observer notifications.
|
| -
|
| -#-------------------------------------------------------------------------------
|
| -
|
| -All of the IntersectionObserver tests are currently listed in LeakExpecations.
|
| -
|
| -To avoid leaking DOM objects, the tests must ensure that all posted tasks have
|
| -run before exiting. IntersectionObserverController requests an idle callback
|
| -through the document's ScriptedIdleTaskController with a timeout of 100ms. That
|
| -callback must be allowed to run before the test finishes to avoid a leak.
|
| -
|
| -ScriptedIdleTaskController posts two tasks to the WebScheduler: one to run at
|
| -the next idle time, and another to run when the timeout expires.
|
| -crbug.com/595155 explains that when one of those tasks runs, it does not release
|
| -its reference to the ScriptedIdleTaskController, which is needlessly kept alive
|
| -until the both tasks have fired. If a test exits before both tasks have fired,
|
| -it will have a DOM leak.
|
| -
|
| -crbug.com/595152 explains that when running without the threaded compositor --
|
| -as the layout tests do -- idle tasks are never serviced. They will still run
|
| -when their timeout expires, but the idle task posted by
|
| -ScriptedIdleTaskController will never run.
|
| -
|
| -Fixing the first bug means that requestIdleCallback will not leak as long as it
|
| -actually runs before exit. The second bug means that when running without the
|
| -threaded compositor, requestIdleCallback will only ever run when its timeout
|
| -expires.
|
| -
|
| -The upshot of all of this is that the only way to ensure that
|
| -IntersectionObserver tests don't leak is to ensure that their idle tasks all run
|
| -before the tests exit, and those idle tasks will only run when their 100ms
|
| -timeout expires.
|
| -
|
| -Note that all of this still holds when observer.takeRecords() is called before
|
| -the idle task runs. In that case, the idle task is not cancelled (because the
|
| -idle task needs to service all observers tracked by a given
|
| -IntersectionObserverController); when the idle task runs, it's simply a no-op.
|
| -There is no way in javascript to detect that such a no-op has occurred, but
|
| -using requestIdleCallback with a timeout of 100 should be guaranteed to run
|
| -after the IntersectionObserverController's idle task has run, as long as
|
| -ScriptedIdleTaskController honors first-in-first-out semantics.
|
| -
|
| -At the time of writing, there is a patch out to add testRunner.runIdleTasks():
|
| -
|
| -https://codereview.chromium.org/1806133002/
|
| -
|
| -With that patch, the tests can be removed from LeakExpectations as long as they
|
| -end with:
|
| -
|
| -if (window.testRunner)
|
| - testRunner.runIdleTasks(finishJSTest);
|
| + - RAF handler runs
|
| + - RAF handler verifies observer notifications via takeRecords or
|
| + does the setTimeout dance to respond after they've been delivered.
|
|
|