[webkit-changes] [WebKit/WebKit] 374b4f: Event loop should attempt to run idle callbacks at...

Ryosuke Niwa noreply at github.com
Mon Aug 14 14:52:17 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 374b4feb0aeff3225da6e6f25579d7b460f1363e
      https://github.com/WebKit/WebKit/commit/374b4feb0aeff3225da6e6f25579d7b460f1363e
  Author: Ryosuke Niwa <rniwa at webkit.org>
  Date:   2023-08-14 (Mon, 14 Aug 2023)

  Changed paths:
    M LayoutTests/TestExpectations
    A LayoutTests/http/tests/eventloop/idle-callback-not-affected-by-timers-in-cross-origin-expected.txt
    A LayoutTests/http/tests/eventloop/idle-callback-not-affected-by-timers-in-cross-origin.html
    A LayoutTests/http/tests/eventloop/resources/idle-callback-timer-helper.html
    M LayoutTests/imported/w3c/web-platform-tests/requestidlecallback/deadline-max-expected.txt
    M LayoutTests/imported/w3c/web-platform-tests/requestidlecallback/deadline-max-rAF-dynamic-expected.txt
    M LayoutTests/imported/w3c/web-platform-tests/requestidlecallback/deadline-max-timeout-dynamic-expected.txt
    M LayoutTests/platform/ios-wk2/TestExpectations
    M LayoutTests/platform/mac-wk2/TestExpectations
    M LayoutTests/requestidlecallback/requestidlecallback-in-page-cache.html
    M Source/WebCore/dom/EventLoop.cpp
    M Source/WebCore/dom/EventLoop.h
    M Source/WebCore/dom/IdleCallbackController.h
    M Source/WebCore/dom/IdleDeadline.cpp
    M Source/WebCore/dom/WindowEventLoop.cpp
    M Source/WebCore/page/Page.cpp
    M Source/WebCore/platform/Timer.h

  Log Message:
  -----------
  Event loop should attempt to run idle callbacks at the end of each task
https://bugs.webkit.org/show_bug.cgi?id=260115

Reviewed by Wenson Hsieh.

This PR implements the step 8 in the HTML5 event loop processing model:
https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model

Specifically, after executing each task in WindowEventLoop, we check if there are any tasks or microtasks
scheduled in the event loop. If there are none, we attempt to run idle callbacks.

This PR also fixes IdleDeadline::timeRemaining to subtract the current time before reducing the resolution
as it turns out that reducing the resolution before subtraction can generate the remaining time that is
slightly longer than the actual time remaining. e.g. 50.000000002ms as opposed to 50ms.

In addition, this PR updates WindowEventLoop::computeIdleDeadline() to take into account the next time
a timer associated with this event loop fires. This is computed & cached by EventLoop::nextTimerFiringTime.

Finally, this PR also fixes a bug in Page::scheduleRenderingUpdateInternal() that it was sometimes calling
WindowEventLoop::didScheduleRenderingUpdate with a rendering update time in the past.

* LayoutTests/http/tests/eventloop/idle-callback-not-affected-by-timers-in-cross-origin-expected.txt: Added.
* LayoutTests/http/tests/eventloop/idle-callback-not-affected-by-timers-in-cross-origin.html: Added.
* LayoutTests/http/tests/eventloop/resources/idle-callback-timer-helper.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/requestidlecallback/deadline-max-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/requestidlecallback/deadline-max-rAF-dynamic-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/requestidlecallback/deadline-max-timeout-dynamic-expected.txt:
* LayoutTests/platform/ios-wk2/TestExpectations:
* LayoutTests/platform/mac-wk2/TestExpectations:
* LayoutTests/requestidlecallback/requestidlecallback-in-page-cache.html: This test was relying on the idle
callback in the main frame to be invoked after idle callbacks in subframes. Since this is not guaranteed,
* Source/WebCore/dom/EventLoop.cpp:
(WebCore::EventLoop::scheduleTask):
(WebCore::EventLoop::removeScheduledTimer):
(WebCore::EventLoop::scheduleRepeatingTask):
(WebCore::EventLoop::removeRepeatingTimer):
(WebCore::EventLoop::findMatchingAssociatedContext): Added.
(WebCore::EventLoop::nextTimerFiringTime const): Added.
(WebCore::EventLoopTaskGroup::suspend):
(WebCore::EventLoopTaskGroup::resume):
(WebCore::EventLoopTaskGroup::setTimerAlignment):
(WebCore::EventLoopTaskGroup::didChangeTimerAlignmentInterval):
(WebCore::EventLoopTaskGroup::setTimerHasReachedMaxNestingLevel):
(WebCore::EventLoopTaskGroup::adjustTimerNextFireTime):
(WebCore::EventLoopTaskGroup::adjustTimerRepeatInterval):
* Source/WebCore/dom/EventLoop.h:
(WebCore::EventLoop::invalidateNextTimerFiringTimeCache): Added.
* Source/WebCore/dom/IdleCallbackController.h:
(WebCore::IdleCallbackController::isEmpty):
* Source/WebCore/dom/IdleDeadline.cpp:
(WebCore::IdleDeadline::timeRemaining const):
* Source/WebCore/dom/WindowEventLoop.cpp:
(WebCore::WindowEventLoop::computeIdleDeadline):
(WebCore::WindowEventLoop::didReachTimeToRun):
* Source/WebCore/page/Page.cpp:
(WebCore::Page::scheduleRenderingUpdateInternal):
* Source/WebCore/platform/Timer.h:
(WebCore::TimerBase::nextFireTime const):

Canonical link: https://commits.webkit.org/266877@main




More information about the webkit-changes mailing list