* Fix the HTML event-loop: add a update the rendering task
add rendering task source
sketch structure to update the rendering
resize steps
composition events
fix warnings in rendering task source
refactor handling of composition events: put window and doc for pipeline on top
set script as user interacting in update the rendering task
fmt
add todos for other steps, put all compositor handling logic in one place
update the rendering: evaluate media queries and report changes
update the rendering: update animations and send events
update the rendering: run animation frames
update the rendering: order docs
put rendering related info on documents map
tidy
update the rendering: add issue numbers to todos
update the rendering: reflow as last step
update the rendering: add todo for top layer removals
note rendering opportunity when ticking animations for testing
fix double borrow crash in css/basic-transition
fix faster reversing of transitions test
undo ordering of docs
bypass not fully-active pipeline task throttling for rendering tasks
ensure tasks are dequed from task queue
prioritize update the rendering task
remove servo media stuff from set activity
tidy
debug
update the rendering: perform microtask checkpoint after task
tidy-up
only run evaluate media queries if resized
re-add evaluation of media queries for each rendering task, re-prioritize rendering tasks, re-add microtask checkpoint for all sequential messages
re-structure resize steps, and their interaction with evaluating media queries and reacting to environment changes
update the rendering: remove reflow call at the end
update webmessaging expectations
update to FAIL /html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html
update to FAIL load-pageshow-events-window-open.html
add issue number for ordering of docs
nits
move batching of mouse move event to document info
nits
add doc for mouse move event index
reset mouse move event index when taking pending compositor events
fix replacing mouse move event
nits
* move update the rendering related data to document
* move re-taking of tasks to try_recv
* address nits
* change task queue try_recv into take_tasks_and_recv, with nits
* refactor process_pending_compositor_events
* when updating the rendering, return early if script cannot continue running
* use an instant for the last render opportunity time
* nits
* remove handle_tick_all_animations
* use a vec for pending resize and compositor events
* fix spec links
* Fix a few other nits before landing
---------
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
* Update wgpu to 0.20
* good expectations
* Throw TypeError in configure on unsupported format instead of panic
* Expect
* `into_command_buffer_id`,`into_command_encoder_id`
Instead of communicating with layout via messages, script can simply
call methods on the layout trait. This simplifies the way that script
communicates with layout and opens the path to sharing more data
structures between the two systems. This is part of a continuing
series of cleanups after removing the layout thread.
<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by
`[X]` when the step is complete, and replace `___` with appropriate
data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes do not require tests because they should not change
behavior.
<!-- Also, please make sure that "Allow edits from maintainers" checkbox
is checked, so that we can help you if you get stuck somewhere along the
way.-->
<!-- Pull requests that do not address these steps are welcome, but they
will require additional verification as part of the review process. -->
* Fixed some clippy warning by adding default implementations
* Updated PR that adds default implementation of structs
* Clean up and extend `Default` implementations
---------
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
* script: Do not run layout in a thread
Instead of spawning a thread for layout that almost always runs
synchronously with script, simply run layout in the script thread.
This is a resurrection of #28708, taking just the bits that remove the
layout thread. It's a complex change and thus is just a first step
toward cleaning up the interface between script and layout. Messages are
still passed from script to layout via a `process()` method and script
proxies some messages to layout from other threads as well.
Big changes:
1. Layout is created in the script thread on Document load, thus every
live document is guaranteed to have a layout. This isn't completely
hidden in the interface, but we can safely `unwrap()` on a Document's
layout.
2. Layout configuration is abstracted away into a LayoutConfig struct
and the LayoutFactory is a struct passed around by the Constellation.
This is to avoid having to monomorphize the entire script thread
for each layout.
3. Instead of having the Constellation block on the layout thread to
figure out the current epoch and whether there are pending web fonts
loading, updates are sent synchronously to the Constellation when
rendering to a screenshot. This practically only used by the WPT.
A couple tests start to fail, which is probably inevitable since removing
the layout thread has introduced timing changes in "exit after load" and
screenshot behavior.
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
* Update test expectations
* Fix some issues found during review
* Clarify some comments
* Address review comments
---------
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
* Create embedder event to send to constellation
* Handle gamepad message in constellation, send to script thread
* Handle GamepadEvent in script thread and dispatch event to document
* Add missing Clones, fix event
* Add gamepad task source
* Adjust GamepadIndex type, remove unused imports
* Add internal getter for gamepads list
* Update gamepad new methods
* Handle gamepad connect and disconnect events
* Proto will be none, no need for HandleObject
* Initialize buttons and axes to standard mapping
* Adjust update type index types
* Update GamepadButton update function
* Adjust Gamepad mapping comments to match spec, add update logic
* Amend comment
* Update button and axis inputs on Updated event
* Add GilRs as gamepad backend in servoshell
* Add spec links, queue gamepad updates on task source
* ./mach fmt
* Fix comment length
* Split out button init, update spec comments
* Move gamepad event handling from document to global
* Map and normalize axes/button values
* Use std::time for gamepad timestamp
* Adjust gamepad handling in event loop
* Move button press/touch check into map+normalize function
- Small change but is more in line with spec
* ./mach fmt
* Update comment spec links and warning messages
* Doc comments -> regular comments
* Add window event handlers for gamepad connect/disconnect
* Adjust gamepad disconnect behavior
* Add missing TODO's, adjust gamepad/gamepadbutton list methods and formatting
* Update button handling from gilrs, add comments
* Enable gamepad pref during WPT tests and update expectations
* Update WPT expectations in meta-legacy-layout
* Replace `time` with `chrono` in `script/animation_timeline`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/script_thread.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` and `chrono` in `script/script_thread.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/script_runtime.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/script_runtime.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/dom/workerglobalscope.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `chrono` in `script/dom/workerglobalscope.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/dom/htmlmedialelement.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/dom/htmlmedialelement.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/dom/globalscope.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `chrono` in `script/dom/globalscope.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/dom/htmlformelement.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Replace `time` with `std::time` in `script/dom/htmlformelement.rs`
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
* Increase precision of animation timeline
* Some fixes
Use Instant a bit more and stop using chrono. Do not transition
`navigation_start_precise` to Instant yet as we need to coordinate this
across all crates.
---------
Signed-off-by: Auguste Baum <auguste.apple@gmail.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
* Remove script_plugins
* Use crown instead of script_plugins
* crown_is_not_used
* Use crown in command base
* bootstrap crown
* tidy happy
* disable sccache
* Bring crown in tree
* Install crown from tree
* fix windows ci
* fix warning
* fix mac
libscript_plugins.dylib is not available anymore
* Update components/script/lib.rs
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
* Update for nightly-2023-03-18
Mostly just based off https://github.com/servo/servo/pull/30630
* Always install crown
it's slow only when there is new version
* Run crown test with `mach test-unit`
* Small fixups; better trace_in_no_trace tests
* Better doc
* crown in config.toml
* Fix tidy for real
* no sccache on rustc_wrapper
* document rustc overrides
* fixup of compiletest
* Make a few minor comment adjustments
* Fix a typo in python/servo/platform/base.py
Co-authored-by: Samson <16504129+sagudev@users.noreply.github.com>
* Proper test types
* Ignore tidy on crown/tests
---------
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
* constellation: crash to a new “sad tab” page
* check in resources/crash.html
* use a separate enum variant instead of keying on reason
* fmt + tidy
* rename Resource::Crash to Resource::CrashHTML
* clean up crash page and add details (reason + backtrace)
* avoid repeating crash errors in script::script_thread warn log
* make new LoadData init more idiomatic
* clarify comments and new fields
* fix doc comment style
* remove event_loop_waker that is always None
* remove None event_loop_waker form InitialScriptState
* fix formatting
* remove None event_loop_waker from ScriptThread
* remove None EventLoopWaker from Window
* remove None and use of wake_after_send in webgl code
* Add `no_trace` option to JSTraceable derive
* NoTrace wrapper
* Port some types to no_trace schematics
* Fixing my unsafe mistakes (not tracing traceables)
* Add docs & safety guards for no_trace
Safety guards (trait shenanigans) guarantees safety usage of `no_trace`
* Port canvas_traits to no_trace
* Port servo_media to no_trace
* Port net_traits to no_trace
* Port style to no_trace
* Port webgpu to no_trace
* Port script_traits to no_trace
* Port canvas_traits, devtools_traits, embedder_traits, profile_traits to no_trace
* unrooted_must_root lint in seperate file
* Add trace_in_no_trace_lint as script_plugin
* Composable types in must_not_have_traceable
* Introduced HashMapTracedValues wrapper
* `HashMap<NoTrace<K>,V>`->`HashMapTracedValues<K,V>`
* Port rest of servo's types to no_trace
* Port html5ever, euclid, mime and http to no_trace
* Port remaining externals to no_trace
* Port webxr and Arc<Mutex<_>>
* Fix spelling in notrace doc
Clean up how command-line options are passed around
<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix#29678
- [x] These changes do not require tests because they do not change behavior.
1. When updating the animation timeline, ensure that nodes that are
animating are marked dirty, if necessary, so any style queries will
force an layout flush.
2. Disable the problematic transition test suites, as they are in Gecko.
These suites often fail when Servo is so overloaded that it cannot
deliver frames fast enough to get more than two samples during the
animation lifecycle.
Fixes#28334.
Fixes#26435.
Fixes#21486.
Fixes the test case `/_mozilla/css/css-transition-cancel-event
.html`, which was failing under a specific circumstance.
The observed sequence of events during the failing test run looks like
this:
1. Transitions start in `div1` and `div2`.
2. `div1` generates a `transitionend` event.
3. The `transitionend` event handler removes `div2` from DOM, cancelling
its ongoing transition.
4. `div2` is supposed to generate a `transitioncancel` event in a timely
manner, which it does not. The test fails as a result.
What is going on here? Here's a possible explaination:
1. During one invocation of `ScriptThread::handle_msgs`...
2. In step 2, `ScriptThread::update_animations_send_events` -> `Document
::update_for_new_timeline_value` detects the completion of the
transition, and in response, pends the `transitionend` event.
3. In step 3, `ScriptThread::update_animations_send_events` ->
`Animations::send_pending_events` calls the `transitionend` handler.
4. The `transitionend` event handler removes `div2`, thereby cancelling
its ongoing transition and triggering a reflow.
5. Reflow takes place. During this, `Animations::do_post_reflow_update`
-> `Animations::handle_canceled_animations` pends the
`transitioncancel` event (precursor to step 4).
6. Having discovering that there was no running animation, `Animations::
do_post_reflow_update` calls `self.update_running_animation_presence
(_, false)`, which sends `AnimationState::NoAnimationsPresent`.
7. The invocation of `ScriptThread::handle_msgs` ends, and another
starts. It blocks waiting for events.
8. Meanwhile, the compositor receives `AnimationState::
NoAnimationsPresent` and stops further generation of animation ticks.
9. With no events to wake it up, the script thread is stuck waiting
despite having the pending `transitioncancel` event (step 4).
The HTML specification [says][1] that "an event loop must continually
run [...] as long as it exists" and does not say it can block if there
is nothing to do. Blocking is merely optimization in a user agent
implementation. Pending animation-related events must be processed every
time a "rendering opportunity" arises unless the user agent has a reason
to believe that it "would have no visible effect".
Skipping the processing of animation-related events would have visible
effect if such events are indeed present. The correct implementation in
Servo, therefore, would be to request more animation ticks so that such
events are processed in a subsequent tick.
[1]: https://html.spec.whatwg.org/multipage/#event-loop-processing-model
This commit reverses the order of the `send_pending_events` and
`update_animation_timeline` calls in `ScriptThread::update_animations_
send_events` so that animation-related events pended by the latter are
processed by the former.
The new calling order is more compliant with the "update animations and
send events" algorithm steps from [the Web Animations specification][1].
The old implementation was prone to blocking for an indefinite period
while holding pending events. Due to complex interaction with other
events and timing behavior, I was only able to reproduce the problem
under the following conditions:
- *The `maybe_observe_paint_time` call in `LayoutThread::compute_abs_
pos_and_build_display_list` is removed from the code*. While
performance events may seem irrelevant to the issue, they would
bombard the script thread with events. *Any* extra messages received
would unblock the event loop and prevent the manifestation of the
issue. (But, of course, we aren't supposed to count on that to avoid
the issue.)
- Servo is running in a headless mode, which somehow makes it less
likely for the script thread to receive a `TickAllAnimations` event
after sending `AnimationState::NoAnimationsPresent`.
With the above conditions met and the stars aligned, you can reproduce
the problem by running the WPT test `/css/css-transitions/events-001.
html`.
[1]: https://drafts.csswg.org/web-animations-1/#update-animations-and-send-events