aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
Commit message (Collapse)AuthorAgeFilesLines
* [webdriver] Implement get shadow root (#37280)HEADmainbatu_hoang4 hours2-0/+29
| | | | | | | | | | | | | Implement Get Element Shadow Root https://www.w3.org/TR/webdriver2/#dfn-get-element-shadow-root cc: @xiaochengh, @yezhizhen, @PotatoCP Testing: `\tests\wpt\tests\webdriver\tests\classic\get_element_shadow_root\get.py` is blocked by `no_browsing_context` and `closed_window` pass for other sub-tests. Signed-off-by: batu_hoang <longvatrong111@gmail.com>
* Change canvas/context/snapshot size from u64 -> u32 (#36827)Sam K11 hours9-40/+40
| | | | | | | | | | | | | | | | | | | | | Replaces uses of `euclid::default::Size2D<u64>` with `euclid::default::Size2D<u32>` for the canvas/context/snapshot. This PR includes changes to the following components: - canvas - pixels - script - script_bindings - shared/canvas - shared/snapshot Testing: https://github.com/hashcatHitman/servo/actions/runs/15426115391 (as of 892edc0048dfad28342e5e2ff247c963eb91ed11) Fixes: #36706 --------- Signed-off-by: hashcatHitman <155700084+hashcatHitman@users.noreply.github.com>
* feat(script): add `Supports()` to `htmlscriptelement` (#37313)Jason Tsai18 hours1-0/+8
| | | | | | | | Add static method `Supports` to `HTMLScriptElement`. Part of #37262 Testing: relative WPT tests should become `PASS` Signed-off-by: Jason Tsai <git@pews.dev>
* [#26499] Refactors HTMLMediaElement drop logic (#37310)Domenico Rizzo20 hours1-15/+38
| | | | | | Testing: No tests added Fixes: Partially #26488 Signed-off-by: Domenico Rizzo <domenico.rizzo@gmail.com>
* htmlmediaelement: Support seek requests for non seekable fetch context (#37264)Andrei Volykhin27 hours1-12/+49
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | According to specification the data:// URL protocol doesn't support range request so be able make any seek request to required content position let's allow for non seekable fetch context discard fetched content bytes until seek offset. https://fetch.spec.whatwg.org/#scheme-fetch Some scheme URLs (like data:// URL) doesn't expose "Content-Length" header in response so the total expected size of the stream is unknown and it causes some additional seek request (SeekData) from the media player. Try to post configure stream size after we reached fetch EOS response. Related source code which breaks WPT tests: [tests/wpt/tests/html/canvas/element/manual/imagebitmap/common.sub.js#L56-L78](https://github.com/servo/servo/tree/main/tests/wpt/tests/html/canvas/element/manual/imagebitmap/common.sub.js#L56-L78) Testing: Improvements in the following tests: - html/canvas/element/manual/imagebitmap/createImageBitmap* Fixes: https://github.com/servo/servo/issues/32645 Fixes: https://github.com/servo/servo/issues/32745 Fixes: https://github.com/servo/servo/issues/34119 Fixes: https://github.com/servo/servo/issues/34120 Fixes: https://github.com/servo/servo/issues/34151 Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
* Revert "Implement Input UA Shadow DOM (#37065)" (#37296)webbeef34 hours5-306/+35
| | | | | | | | This reverts commit 5580704438a81ffbd183c6e3deb5cbc479ad4d0a. Let's re-land that fix when a working solution is found. Keeping that regression makes it hard to evaluate other potential improvements. Signed-off-by: webbeef <me@webbeef.org>
* Add support for parsing and applying `viewport` `<meta>` (#35901)Shubham Gupta34 hours1-0/+30
| | | | | | | | | | | | | | | | | This patch comprises following steps: 1. Parses the `viewport` Attribute from `<meta>`. 2. Creates a `ViewportDescription` struct. 3. Populate values into Viewport struct. 4. Pass & Stash Viewport Description to Webview. 5. Process parsed values of `viewport <meta>` Testing: Tested locally. Fixes: #36159 --------- Signed-off-by: Shubham Gupta <shubham13297@gmail.com> Signed-off-by: Xiaocheng Hu <xiaochengh.work@gmail.com> Co-authored-by: Xiaocheng Hu <xiaochengh.work@gmail.com>
* HTMLScriptElement: add `ScriptType::ImportMap` (#37291)Ngo Iok Ui (Wu Yu Wei)35 hours1-27/+36
| | | | | | | | | | | | | HTMLScriptElement: add `ScriptType::ImportMap` Part of #37262 This covers most steps that are related to import map. Testing: Existing WPT on HTMLScriptElement should remain the same. --------- Signed-off-by: Yu Wei Wu <yuweiwu@YunoMacBook-Air.local> Co-authored-by: Yu Wei Wu <yuweiwu@YunoMacBook-Air.local>
* Fix timing of change events for `<select>` elements (#37293)Simon Wülker35 hours3-20/+61
| | | | | | | | | | | | | | | Fixes two silly bugs in the implementation of `<select>` elements. * We did not fire `input` events * We fired `change` events *before* updating the selected value Both of these are only relevant when the embedder selects a value, so due to our lack of webdriver support we can't test them. With these changes it is possible to switch the language on https://toolbox.googleapps.com/apps/main/. --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* Don't drain ranges across shadow boundaries (#37281)Simon Wülker41 hours2-41/+80
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The [live range pre remove steps](https://dom.spec.whatwg.org/#live-range-pre-remove-steps) state that: > For each [live range](https://dom.spec.whatwg.org/#concept-live-range) whose [start node](https://dom.spec.whatwg.org/#concept-range-start-node) is an [inclusive descendant](https://dom.spec.whatwg.org/#concept-tree-inclusive-descendant) of node, set its [start](https://dom.spec.whatwg.org/#concept-range-start) to (parent, index). Elements in a shadow tree are not inclusive descendants of their hosts - meaning we should not bubble ranges across shadow boundaries. Includes a small fix to `Node::ranges_is_empty` which makes servo do less work on DOM mutations, as well as some changes to `range.rs` to match the spec better. I made these changes during debugging and they don't feel like they're worth their own PR. Testing: Covered by WPT --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* script: Fix two issues in the XPath parser to pass all `xml_xpath_tests.xml` ↵Ville Lindholm42 hours3-59/+104
| | | | | | | | | | | | | | | | | | | tests (#37279) 1. Better handling of namespaces for element and attribute names in XML mode (read: non-HTML mode) 2. While parsing, pass along context on whether we are in an absolute (`/`) or descendant (`//`) part of the query, and use it to correctly enumerate descendants according to where we are in the evaluation of the AST. Testing: All 1024 tests in `xml_xpath_tests.xml` (actually `xml_xpath_runner.html`) pass, as well as some random tests in `text-html-attributes.html`. Fixes: #37278 --------- Signed-off-by: Ville Lindholm <ville@lindholm.dev>
* Fix ReadableStream cancel error message (#37282)Aokingo47 hours1-1/+1
| | | | | | | | | Align error message with WHATWG Streams spec by changing: - `'stream is not locked'` to `'stream is locked'` This will match the step 2 of the readablestream cancel method that requires the correct TypeError when the stream is locked. Signed-off-by: Alice Okingo <annekadiso@gmail.com>
* [#26488] Moves the FetchCanceller to a separate droppable struct, in Event ↵Domenico Rizzo2 days1-14/+33
| | | | | | | | Source (#37261) Testing: No tests added. Fixes: partially fixes #26488 Signed-off-by: Domenico Rizzo <domenico.rizzo@gmail.com>
* Use a VecDeque to manage timers (#37080)webbeef3 days1-8/+8
| | | | | | | | | | Profiling speedometer 2.1 on a quad core Intel N100, we spend quite some time in Vec::insert when adding new timers. This is mostly because one of the tests creates a large number of timers (> 10k). Switching to a VecDeque solves that and gets a ~2% score improvement on that device. Signed-off-by: webbeef <me@webbeef.org>
* Implement wb element send keys for file input (#37224)Kenzie Raditya Tirtarahardja3 days2-18/+65
| | | | | | | | | | | | | We can now send keys to file input, which results in uploading file with given filename. Needs `pref=dom_testing_html_input_element_select_files_enabled` flag to work. https://w3c.github.io/webdriver/#element-send-keys Testing: `tests/wpt/meta/webdriver/tests/classic/element_send_keys/{events, file_upload}.py.` Signed-off-by: PotatoCP <kenzieradityatirtarahardja18@gmail.com>
* Dom: Implement AbortSignal ThrowIfAborted method (#37245)Taym Haddadi4 days1-2/+12
| | | | | | Implement the ThrowIfAborted method of AbortSignal; part of https://github.com/servo/servo/issues/36935. Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com>
* Implement the `size` presentational hint for `<hr>` elements (#37211)Simon Wülker5 days2-1/+100
| | | | | | | | | | | | | | This presentational hint either sets the width values of all borders, removes the bottom border or sets the height of the element, depending on the context. This change also implements the corresponding idl attribute (and the `noshade` attribute, which does nothing in html5) Testing: Adds new web platform tests --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* dom: implement abort signal reason method (#37227)Gregory Terzian5 days1-2/+3
| | | | | | Implement the `reason` method of `AbortSignal`; part of https://github.com/servo/servo/issues/36935. Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* Consistently use `Dom` in native promise handlers (#37226)Euclid Ye5 days1-2/+3
| | | | | | | | | | Use `Dom` instead of `DomRoot` for fields of `TransmitBodyPromiseRejectionHandler` to reduce redundant work by GC, according to discussion in https://github.com/servo/servo/issues/33604#issuecomment-2931524400 Fixes: #33604 Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
* htmlmediaelement: Fix fetch request race on "seek-data" event (#37002)Andrei Volykhin5 days1-98/+193
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On execution media element load algorithm https://html.spec.whatwg.org/multipage/media.html#media-element-load-algorithm we can observe race condition between parallel running fetch requests: R1: (media element) initial request (see "resource_fetch_algorithm" function) R2: (gstreamer) duration "seek-data" request (see PlayerEvent::SeekData) R3: (gstreamer) continue on last interrupted time "seek-data" request At time there are only one current fetch context for media element but because resource fetch and cancellation are async operations need to identify (by request id) and skip processing outdated fetch request (fetch listener callbacks). Async load in background sequence (stream content length = 2757913): ``` R1 (seek-offset=0): [------------------------------X] R2 (seek-offset=2757866): [---------Y] AS-****-+++-AE R3 (seek-offset=98304): [----------------Z] BS-****-+++BE R1 (seek-offset=0): [------X] R2 (seek-offset=2757866): [--------Y] (discarded data) AS-****---------+++-AE - A*/B* performed seeks (*** seek lock, +++ flush buffer queue + reset EOS) (on Gstreamer streaming thread) - X/Y/Z "end-of-stream" events from fetch requests (on Servo script thread) ``` All incoming input data from different requests are mixed and pushed to active media player, plus abnormal behaviour due to intermixed X/Y/Z "end-of-stream" events. To handle it properly we will unblock seek lock on "seek-data" event (on script thread) as soon as possible (GStreamer will be able to flush buffer queue and reset EOS state) and introduce buffered data source to delay pushing input data/EOS event until media player will be actually ready. Testing: Improvements to the following tests: - /html/canvas/element/manual/imagebitmap/createImageBitmap-origin.sub.html - /html/semantics/embedded-content/the-canvas-element/security.pattern.fillStyle.sub.html Fixes: https://github.com/servo/servo/issues/31931 Fixes: https://github.com/servo/servo/issues/36989 Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
* XPath: implement lang() and id() core functions (#34594)Ville Lindholm5 days7-37/+222
| | | | | | | | | | | | | | | | | | | | XPath's `lang()` and `id()` functions were still unimplemented. Also: * Add WPT tests for `id()`. * Fix uniqueness check in `NodesetHelpers::document_order_unique`. * Tweak the AST a bit to make it clearer to express "no predicates". * Fix a parsing bug where "/" was attempted before "//", leaving the "//" branch as always unused. --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #34593 - [x] There are tests for these changes --------- Signed-off-by: Ville Lindholm <ville@lindholm.dev>
* dom: implement aborted method of abort signal (#37218)Gregory Terzian5 days1-2/+8
| | | | | | Implement the `aborted` member of `AbortSignal`. Part of https://github.com/servo/servo/issues/36935 Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* dom: implement signal method on abort controller (#37217)Gregory Terzian6 days1-0/+6
| | | | | | | Part of https://github.com/servo/servo/issues/34866 The "Finish current stub for AbortController" item. Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* script: Upgrade `node_ids` to `pipeline_to_node_ids` to track the owner ↵Euclid Ye6 days4-37/+61
| | | | | | | | | | | | | | | | | | | pipeline of the node (#37213) Upgrade `ScriptThread::node_ids` to `pipeline_to_node_ids` to track the owner pipeline of the node This will enable webdriver to know if it is requesting element from other origins and properly distinguish "stale element reference" from "no such element". Testing: [Action run](https://github.com/yezhizhen/servo/actions/runs/15385994907), no regression. We can now pass WebDriver "cross origin" tests. Fixes: #35749 --------- Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
* script: Set HTTP status code when aborting an `XMLHttpRequest` (#37190)Tunahan Karlibas6 days1-0/+3
| | | | | | | | | Correctly set status when aborting a XMLHttpRequest. Testing: WPT test xhr/abort-during-done.window.html --------- Signed-off-by: Tunahan Karlibas <dvt.tnhn.krlbs@icloud.com>
* Split handle_player_event into smaller functions (#37113)Michael Rees7 days1-354/+380
| | | | | | | | | | | | | | | | Split HTMLMediaElement::handle_player_event into smaller functions (#37109) As requested, I also did a quick pass over the entire file looking for if/else blocks that could be converted into early returns, but only found two. Both of those have been changed here. Testing: This doesn't require (new) tests because it is a reorganization of existing code. Fixes: #37109: HTMLMediaElement::handle_player_event is too big --------- Signed-off-by: Michael Rees <mrees@noeontheend.com>
* dom: implement signal abort on controller and signal (#37192)Gregory Terzian8 days2-9/+97
| | | | | | | Part of https://github.com/servo/servo/issues/34866 Implement signal abort, and part of running abort steps. Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* Implement Input `type=text` UA Shadow DOM (#37065)Steven Novaryo9 days5-35/+306
| | | | | | | | | | | | | | | | | | | | | | | | Implement Shadow Tree construction for input `type=text`, adding a text control inner editor container and placeholder container. Subsequently, due to the changes of the DOM tree structure, the changes will add a new NodeFlag `IS_TEXT_CONTROL_INNER_EDITOR` to handle the following cases. - If a mouse click button event hits a text control inner editor, it will redirect the focus target to its shadow host. - In text run's construction, the text control inner editor container queries the selection from its shadow host. This is later used to resolve caret and selection painting in the display list. This will be the first step of fixing input `type=text` and other single-line text input element widgets. Such as, implementing `::placeholder` selector. Testing: Existing WPT test and new Servo specific appearance WPT. Fixes: #36307 --------- Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Send synthetic keydown/keyup at ime_insert_text (#37175)Kenzie Raditya Tirtarahardja9 days1-0/+3
| | | | | | | | | | | | | | | | | | At `egl/app_state.rs`, send keydown and keyup with PROCESS KEY when inserting text. This fixes OHOS input event, but maybe also for Android in the future (if it implements `ime_insert_text`). We will get input event since keydown is dispatched (https://github.com/servo/servo/pull/37078). This implementation is similar to [Chromium's](https://source.chromium.org/chromium/chromium/src/+/main:content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java;drc=404e8d654e8b26336d2cb103b9c21faecbf7f73a;bpv=1;bpt=1;l=851?gsn=sendCompositionToNative&gs=KYTHE%3A%2F%2Fkythe%3A%2F%2Fchromium.googlesource.com%2Fcodesearch%2Fchromium%2Fsrc%2F%2Fmain%3Flang%3Djava%3Fpath%3Dorg.chromium.content.browser.input.ImeAdapterImpl%23d840961d441fd4bb569f9689c86da91fb714c0c153366e3198a85e9c7a098dce) Android key event. Testing: manually checked on OHOS device For: https://github.com/servo/servo/issues/36259, but only in OHOS Signed-off-by: PotatoCP <kenzieradityatirtarahardja.18@gmail.com> Co-authored-by: PotatoCP <kenzieradityatirtarahardja.18@gmail.com> Co-authored-by: stevennovaryo <steven.novaryo@gmail.com>
* script: Let canvas serialization to image fail gracefully (#37184)Martin Robinson9 days1-40/+62
| | | | | | | | | | | | Instead of panicking when serialization of canvas to image data (whether through `toBlob()` or via `toDataURL()`), properly handle failed serialization. This is an implementation of the appropriate error handling from the specification text. Testing: This change includes a new Serov-specific test, because it is impossible to know what the canvas size limits are of all browsers. Fixes: #36840. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
* Implement basics of link preloading (#37036)Tim van der Lippe10 days3-40/+362
| | | | | | | | | | | These changes allow a minimal set of checks for font-src CSP checks to pass. Part of #4577 Part of #35035 --------- Signed-off-by: Tim van der Lippe <tvanderlippe@gmail.com>
* pixels: Add limitation to max image total bytes length (#37172)Andrei Volykhin10 days4-27/+40
| | | | | | | | | | | | | | | | | | | Limit the maximum image allocation size to 2GB to minimize the possibility of out of memory errors on some `ImageBitmap`, `ImageData`, `Canvas`, and `OffscreenCanvas` operations such as construction, `toBlob`, and `toDataURL`. Other browsers have similar limits: - Chromium: 2^32-1 (~4GB) - Firefox: 2^31-1 (~2GB) Testing: Improvements to the following tests: - `html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.basics.html` assert_throws_dom("INDEX_SIZE_ERR", function() { new ImageData(1 << 31, 1 << 31); }); - `html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html` makeOversizedCanvas + makeOversizedOffscreenCanvas Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
* Refactoring `HTMLOptionElement::Text` into iterative style (#37167)Kingsley Yung10 days2-21/+26
| | | | | | | | | | | | | | | | | | | | | | | The original implementation of `HTMLOptionElement::Text` is recursive, and the program may run out of stack space for a sufficiently large number of iterations. The patch switches to an iterative implementation, with `TreeIterator`. Note that, instead of the usual `while let Some(node) = iterator.next()` approach, we use `while let Some(node) = iterator.peek()` with the newly added `TreeIterator::peek` function. This is because the choice of the next node depends on some checks performed inside the `while` block, whereas the `next` function determines the next node before entering the block. Moreover, the `TreeIterator::peek` function is added, instead of wrapping the iterator into `Peekable`. This is because we will lose access to the `TreeIterator::next_skipping_children` function if we wrap it into `Peekable`. Testing: This refactoring has to pass the existing tests. Fixes: #36959 Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
* canvas: Add HTMLVideoElement to CanvasImageSource union type (#37135)Andrei Volykhin11 days5-30/+176
| | | | | | | | | | | | | | | | | | | | | Follow to the specification and add HTMLVideoElement to CanvasImageSource union type to allow use it as image source for createPattern/drawImage operations. https://html.spec.whatwg.org/multipage/#canvasimagesource https://html.spec.whatwg.org/multipage/#dom-context-2d-createpattern https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage The HTMLVideoElement media resource has an associated origin: - media provider object (MediaStream/MediaSource/Blob): CORS-same-origin - URL record: CORS-cross-origin/CORS-same-origin https://html.spec.whatwg.org/multipage/media.html#media-resource Testing: - html/canvas/element/* - html/semantics/embedded-content/the-canvas-element/* Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
* Let `input` JS event be dispatched by `keydown` instead of `keypress` (#37078)Euclid Ye11 days4-28/+51
| | | | | | | | | | | | 1. Let `input` JS event be dispatched by `keydown` instead of `keypress`, according to spec 2. Fire `input` event for Backspace and Delete. But do so only when something is actually deleted Testing: Manually tested and compared with other browsers. Fixes: #37051 cc @xiaochengh Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
* Refactor the memory profiler code to return the struct. (#37155)Narfinger11 days1-1/+3
| | | | | | | | | | | | Refactor the memory profiler code to return the struct and handle the serializing in servointernal page. This allows other users of the memory profiler to see the whole report without parsing json. Testing: I do not know if the memory page is covered by tests. --------- Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
* [#26488] Moved Droppable code into a separate struct for ↵Domenico Rizzo11 days1-16/+28
| | | | | | | | | | | CanvasRenderingContext2D (#37136) This is part of incremental implementation of #26488 . The interface involved in this PR is CanvasRenderingContext2D. Testing: Test should be just implemented. Fixes: Partially #26488 Signed-off-by: Domenico Rizzo <domenico.rizzo@gmail.com>
* Add support for static SVG images using `resvg` crate (#36721)Mukilan Thiyagarajan12 days15-104/+215
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change adds support for rendering static SVG images using the `resvg` crate, allowing svg sources in the `img` tag and in CSS `background` and `content` properties. There are some limitations in using resvg: 1. There is no support for animations or interactivity as these would require implementing the full DOM layer of SVG specification. 2. Only system fonts can be used for text rendering. There is some mechanism to provide a custom font resolver to usvg, but that is not explored in this change. 3. resvg's handling of certain edge cases involving lack of explicit `width` and `height` on the root svg element deviates from what the specification expects from browsers. For example, resvg uses the values in `viewBox` to derive the missing width or height dimension, but without scaling that dimension to preserve the aspect ratio. It also doesn't allow overriding this behavior. Demo screenshot: ![servo - resvg img](https://github.com/user-attachments/assets/8ecb2de2-ab7c-48e2-9f08-2d09d2cb8791) <details> <summary>Source</summary> ``` <style> #svg1 { border: 1px solid red; } #svg2 { border: 1px solid red; width: 300px; } #svg3 { border: 1px solid red; width: 300px; height: 200px; object-fit: contain; } #svg4 { border: 1px solid red; width: 300px; height: 200px; object-fit: cover; } #svg5 { border: 1px solid red; width: 300px; height: 200px; object-fit: fill; } #svg6 { border: 1px solid red; width: 300px; height: 200px; object-fit: none; } </style> </head> <body> <div> <img id="svg1" src="https://raw.githubusercontent.com/servo/servo/refs/heads/main/resources/servo.svg" alt="Servo logo"> </div> <div> <img id="svg2" src="https://raw.githubusercontent.com/servo/servo/refs/heads/main/resources/servo.svg" alt="Servo logo"> <img id="svg3" src="https://raw.githubusercontent.com/servo/servo/refs/heads/main/resources/servo.svg" alt="Servo logo"> <img id="svg4" src="https://raw.githubusercontent.com/servo/servo/refs/heads/main/resources/servo.svg" alt="Servo logo"> </div> <div> <img id="svg5" src="https://raw.githubusercontent.com/servo/servo/refs/heads/main/resources/servo.svg" alt="Servo logo"> <img id="svg6" src="https://raw.githubusercontent.com/servo/servo/refs/heads/main/resources/servo.svg" alt="Servo logo"> </div> </body> ``` </details> --------- Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Martin Robinson <mrobinson@igalia.com>
* script: stub `AbortSignal` (#37033)Gregory Terzian12 days2-0/+72
| | | | | | | | | | | | This is a stub for `AbortSignal`, which we would like to merge first in order to work in parallel on https://github.com/servo/servo/issues/34866, and perhaps also https://github.com/servo/servo/issues/36936 --------- Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> Co-authored-by: Taym Haddadi <haddadi.taym@gmail.com>
* imagebitmap: Use snapshot::Snapshot as bitmap data (#37131)Andrei Volykhin12 days2-40/+37
| | | | | | | | | | | | | | | Replace the holder of actual pixel data of the ImageBitmap interface ([[BitmapData]] slot) from Vec<u8> to snapshot::Snapshot (image bitmap with metadata). https://html.spec.whatwg.org/multipage/#the-imagebitmap-interface It will allow to have all required information (e.g. size, pixel format, alpha mode) for further drawing processing to/from canvas2D output bitmap. Testing: No required tests Fixes: https://github.com/servo/servo/issues/34112 Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
* refactor: merge `cross_realm_transform_*` fields into one (#37102)Jason Tsai12 days2-61/+68
| | | | | | | | | | | | | | | | | In https://github.com/servo/servo/pull/36977, when transferring `TransformStream`, `CrossRealmTransform::Writable` and `CrossRealmTransform::Readable` are set to different message ports. The message port will not be readable and writable at the same time when transferring the stream, so we can now merge `cross_realm_transform_readable` and `cross_realm_transform_writable` into a single field `cross_realm_transform`. Testing: WPT ([passed on try branch](https://github.com/pewsheen/servo/actions/runs/15209389525/job/42784179519)) Fixes: https://github.com/servo/servo/issues/37084 --------- Signed-off-by: Jason Tsai <git@pews.dev>
* constellation: Pass system theme to new Pipelines (#37132)Martin Robinson13 days5-27/+37
| | | | | | | | | | | | Previously, when the theme was set it was only set on currently active `Window`s. This change makes setting the `Theme` stateful. Now the `Constellation` tracks what theme is applied to a `WebView` and properly passes that value to new `Pipeline`s when they are constructed. In addition, the value is passed to layout when that is constructed as well. Testing: this change adds a unit test. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
* Rename `Stylesheet::Type_` to `Stylesheet::Type` (#37126)Simon Wülker13 days1-2/+2
| | | | | | | | | | | | I'm not sure if `CodegenRust.py` was supposed to remove the underscore, but we end up exposing `type_` to javascript which is obviously wrong. There's no need to rename the method in the first place, because `Type` (with a capital T) is not a rust keyword. Testing: Covered by existing web platform tests --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* script: Return global objects for DOM objects in the relevant realm (#37120)Josh Matthews14 days1-2/+12
| | | | | | | | | | | | | | | | | | | DomObject::global is a tricky API because it's used pervasively but has subtle requirements that are not documented and not yet enforced by the type system (#36116). The method returns the relevant global object for a given DOM object, but that operation is only meaningful if there is an active realm. We usually, but not always, have an active realm. This change avoids a footgun by following the principle of least surprise. Rather than making every single caller of `something.global()` both prove that there is an active realm and think about which realm they want active, we implement the obvious behaviour: always activate the realm of the callee before obtaining the relevant global. Testing: Existing WPT coverage is sufficient; this method is called all over the codebase. Fixes: #37070 #27037 Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Implement `URLPattern::{text, exec}` (#37044)Simon Wülker2025-05-241-38/+144
| | | | | | | | | | | | With this change the URLPattern API is fully implemented. I'll look into the remaining failures and then enable the preference by default. Testing: Covered by web platform tests Depends on https://github.com/servo/servo/pull/37042 --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* script: Add support for polygons in `HtmlAreaElement::hit_test` (#37064)Ashwin Naren2025-05-241-2/+24
| | | | | | | | | | Uses raycasting to determine whether point is in polygon Testing: Added unittest Fixes: None to my knowledge --------- Signed-off-by: Ashwin Naren <arihant2math@gmail.com>
* ImageBitmap::new returns without Fallible (#37114)Kingsley Yung2025-05-242-11/+6
| | | | | | | | | | | ImageBitmap::new always returns Ok. Simplify it by changing to return DomRoot<ImageBitmap> directly. The #[allow(dead_code)] seems unnecessary. This patch also removes it. Testing: No test is needed. Fixes: #37105 Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
* imagebitmap: Make ImageBitmap serializable and transferable (#37101)Andrei Volykhin2025-05-232-5/+150
| | | | | | | | | | | | | | According to specification ImageBitmap objects are serializable objects and transferable objects. https://html.spec.whatwg.org/multipage/#the-imagebitmap-interface:imagebitmap-11 Testing: - html/canvas/element/manual/imagebitmap/* - html/infrastructure/safe-passing-of-structured-data/* - html/webappapis/structured-clone/* - workers/semantics/structured-clone/* Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
* Removing unused dependencies in crates. (#37096)Narfinger2025-05-231-1/+0
| | | | | | | | Removed unused dependencies in various crates using cargo-machete, grep and cargo-udeps. Testing: The CI tests if any dependencies were used that are removed. Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
* Animation: update image active frame when update the rendering (#36286)TIN TUN AUNG2025-05-235-2/+151
| | | | | | | | | | | | | | | | | | | | | When no CSS animation exist, register timer for image animation, update animated image active image frame as part of update_the_rendering, mark node as dirty if the corresponding image need update. Added unit test to test ImageAnimationState. Part of https://github.com/servo/servo/issues/36057, the last step to let the Animated Image "Move". Testing: Introduced new WPT RefTest for animated image, but fail because of https://github.com/servo/servo/issues/36931. New unit test for `ImageAnimationState`. Fixes: https://github.com/servo/servo/issues/22903 https://github.com/servo/servo/issues/36057 [Try](https://github.com/rayguo17/servo/actions/runs/14724729664) --------- Signed-off-by: rayguo17 <rayguo17@gmail.com>