diff options
571 files changed, 17282 insertions, 9003 deletions
diff --git a/Cargo.lock b/Cargo.lock index 791ee0bb967..2f8ab0361fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -713,9 +713,9 @@ checksum = "28346c117b50270785fbc123bd6e4ecad20d0c6d5f43d081dc80a3abcc62be64" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" dependencies = [ "bytemuck_derive", ] @@ -784,18 +784,13 @@ name = "canvas" version = "0.0.1" dependencies = [ "app_units", - "bitflags 2.9.0", - "byteorder", "canvas_traits", "compositing_traits", "crossbeam-channel", "cssparser", "euclid", - "fnv", "font-kit", "fonts", - "glow", - "half", "ipc-channel", "log", "lyon_geom", @@ -807,12 +802,8 @@ dependencies = [ "servo_arc", "snapshot", "stylo", - "surfman", "unicode-script", - "webrender", "webrender_api", - "webxr", - "webxr-api", ] [[package]] @@ -1074,7 +1065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -3103,9 +3094,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "foldhash", "serde", @@ -3430,7 +3421,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.57.0", + "windows-core 0.58.0", ] [[package]] @@ -4334,6 +4325,7 @@ dependencies = [ "tracing", "url", "webdriver_server", + "webgl", "webgpu", "webrender", "webrender_api", @@ -5475,7 +5467,7 @@ dependencies = [ [[package]] name = "peek-poke" version = "0.3.0" -source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71" +source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074" dependencies = [ "euclid", "peek-poke-derive", @@ -5484,13 +5476,12 @@ dependencies = [ [[package]] name = "peek-poke-derive" version = "0.3.0" -source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71" +source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", - "unicode-xid", ] [[package]] @@ -6090,14 +6081,15 @@ dependencies = [ [[package]] name = "ron" -version = "0.8.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.9.0", "serde", "serde_derive", + "unicode-ident", ] [[package]] @@ -6934,9 +6926,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -7420,9 +7412,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -7834,9 +7826,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.25" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10558ed0bd2a1562e630926a2d1f0b98c827da99fabd3fe20920a59642504485" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", "serde", @@ -8052,12 +8044,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] name = "universal-hash" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -8287,9 +8273,9 @@ checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" [[package]] name = "wayland-backend" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2bea670be0e24795f39416e5461ccef0185b47df2749ed2b226b8a7557ac871" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" dependencies = [ "cc", "downcast-rs", @@ -8301,9 +8287,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.8" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" dependencies = [ "bitflags 2.9.0", "rustix", @@ -8324,9 +8310,9 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.8" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" +checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" dependencies = [ "rustix", "wayland-client", @@ -8335,9 +8321,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.6" +version = "0.32.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" dependencies = [ "bitflags 2.9.0", "wayland-backend", @@ -8347,9 +8333,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" +checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" dependencies = [ "bitflags 2.9.0", "wayland-backend", @@ -8360,9 +8346,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" dependencies = [ "bitflags 2.9.0", "wayland-backend", @@ -8490,6 +8476,30 @@ dependencies = [ ] [[package]] +name = "webgl" +version = "0.0.1" +dependencies = [ + "bitflags 2.9.0", + "byteorder", + "canvas_traits", + "compositing_traits", + "crossbeam-channel", + "euclid", + "fnv", + "glow", + "half", + "ipc-channel", + "log", + "pixels", + "snapshot", + "surfman", + "webrender", + "webrender_api", + "webxr", + "webxr-api", +] + +[[package]] name = "webgpu" version = "0.0.1" dependencies = [ @@ -8527,9 +8537,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.9" +version = "0.26.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29aad86cec885cafd03e8305fd727c418e970a521322c91688414d5b8efba16b" +checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93" dependencies = [ "rustls-pki-types", ] @@ -8537,7 +8547,7 @@ dependencies = [ [[package]] name = "webrender" version = "0.66.0" -source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71" +source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074" dependencies = [ "allocator-api2", "bincode", @@ -8572,7 +8582,7 @@ dependencies = [ [[package]] name = "webrender_api" version = "0.66.0" -source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71" +source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074" dependencies = [ "app_units", "bitflags 2.9.0", @@ -8593,7 +8603,7 @@ dependencies = [ [[package]] name = "webrender_build" version = "0.0.2" -source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71" +source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074" dependencies = [ "bitflags 2.9.0", "lazy_static", @@ -8785,7 +8795,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -9133,9 +9143,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.9" +version = "0.30.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0" +checksum = "b0d05bd8908e14618c9609471db04007e644fd9cce6529756046cfc577f9155e" dependencies = [ "ahash", "android-activity", @@ -9185,9 +9195,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +checksum = "9e27d6ad3dac991091e4d35de9ba2d2d00647c5d0fc26c5496dee55984ae111b" dependencies = [ "memchr", ] @@ -9213,7 +9223,7 @@ dependencies = [ [[package]] name = "wr_glyph_rasterizer" version = "0.1.0" -source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71" +source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074" dependencies = [ "core-foundation 0.9.4", "core-graphics", @@ -9237,8 +9247,8 @@ dependencies = [ [[package]] name = "wr_malloc_size_of" -version = "0.0.3" -source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71" +version = "0.2.0" +source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074" dependencies = [ "app_units", "euclid", diff --git a/Cargo.toml b/Cargo.toml index 21bc94bcfda..b43c38b21b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -166,15 +166,15 @@ uuid = { version = "1.12.1", features = ["v4"] } webdriver = "0.51.0" webgpu_traits = { path = "components/shared/webgpu" } webpki-roots = "0.26" -webrender = { git = "https://github.com/servo/webrender", branch = "0.66", features = ["capture"] } -webrender_api = { git = "https://github.com/servo/webrender", branch = "0.66" } +webrender = { git = "https://github.com/servo/webrender", branch = "0.67", features = ["capture"] } +webrender_api = { git = "https://github.com/servo/webrender", branch = "0.67" } webxr-api = { path = "components/shared/webxr" } wgpu-core = "25" wgpu-types = "25" winapi = "0.3" windows-sys = "0.59" wio = "0.2" -wr_malloc_size_of = { git = "https://github.com/servo/webrender", branch = "0.66" } +wr_malloc_size_of = { git = "https://github.com/servo/webrender", branch = "0.67" } xi-unicode = "0.3.0" xml5ever = "0.22" diff --git a/components/canvas/Cargo.toml b/components/canvas/Cargo.toml index 7e7b00efe11..6084fc6e434 100644 --- a/components/canvas/Cargo.toml +++ b/components/canvas/Cargo.toml @@ -11,24 +11,15 @@ rust-version.workspace = true name = "canvas" path = "lib.rs" -[features] -webgl_backtrace = ["canvas_traits/webgl_backtrace"] -webxr = ["dep:webxr", "dep:webxr-api"] - [dependencies] app_units = { workspace = true } -bitflags = { workspace = true } -byteorder = { workspace = true } canvas_traits = { workspace = true } compositing_traits = { workspace = true } crossbeam-channel = { workspace = true } cssparser = { workspace = true } euclid = { workspace = true } -fnv = { workspace = true } font-kit = "0.14" fonts = { path = "../fonts" } -glow = { workspace = true } -half = "2" ipc-channel = { workspace = true } log = { workspace = true } lyon_geom = "1.0.4" @@ -40,9 +31,5 @@ raqote = "0.8.5" servo_arc = { workspace = true } snapshot = { workspace = true } stylo = { workspace = true } -surfman = { workspace = true } unicode-script = { workspace = true } -webrender = { workspace = true } webrender_api = { workspace = true } -webxr = { path = "../webxr", features = ["ipc"], optional = true } -webxr-api = { workspace = true, features = ["ipc"], optional = true } diff --git a/components/canvas/backend.rs b/components/canvas/backend.rs new file mode 100644 index 00000000000..53acbea8b8d --- /dev/null +++ b/components/canvas/backend.rs @@ -0,0 +1,243 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use canvas_traits::canvas::{ + CompositionOrBlending, FillOrStrokeStyle, LineCapStyle, LineJoinStyle, +}; +use euclid::Angle; +use euclid::default::{Point2D, Rect, Size2D, Transform2D, Vector2D}; +use lyon_geom::Arc; +use style::color::AbsoluteColor; + +use crate::canvas_data::{CanvasPaintState, Filter, TextRun}; + +pub(crate) trait Backend: Clone + Sized { + type Pattern<'a>: PatternHelpers + Clone; + type StrokeOptions: StrokeOptionsHelpers + Clone; + type Color: Clone; + type DrawOptions: DrawOptionsHelpers + Clone; + type CompositionOp; + type DrawTarget: GenericDrawTarget<Self>; + type PathBuilder: GenericPathBuilder<Self>; + type SourceSurface; + type Bytes<'a>: AsRef<[u8]>; + type Path: PathHelpers<Self> + Clone; + type GradientStop; + type GradientStops; + + fn get_composition_op(&self, opts: &Self::DrawOptions) -> Self::CompositionOp; + fn need_to_draw_shadow(&self, color: &Self::Color) -> bool; + fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_, Self>); + fn set_fill_style( + &mut self, + style: FillOrStrokeStyle, + state: &mut CanvasPaintState<'_, Self>, + drawtarget: &Self::DrawTarget, + ); + fn set_stroke_style( + &mut self, + style: FillOrStrokeStyle, + state: &mut CanvasPaintState<'_, Self>, + drawtarget: &Self::DrawTarget, + ); + fn set_global_composition( + &mut self, + op: CompositionOrBlending, + state: &mut CanvasPaintState<'_, Self>, + ); + fn create_drawtarget(&self, size: Size2D<u64>) -> Self::DrawTarget; + fn new_paint_state<'a>(&self) -> CanvasPaintState<'a, Self>; +} + +// This defines required methods for a DrawTarget (currently only implemented for raqote). The +// prototypes are derived from the now-removed Azure backend's methods. +pub(crate) trait GenericDrawTarget<B: Backend> { + fn clear_rect(&mut self, rect: &Rect<f32>); + fn copy_surface( + &mut self, + surface: B::SourceSurface, + source: Rect<i32>, + destination: Point2D<i32>, + ); + fn create_path_builder(&self) -> B::PathBuilder; + fn create_similar_draw_target(&self, size: &Size2D<i32>) -> Self; + fn create_source_surface_from_data(&self, data: &[u8]) -> Option<B::SourceSurface>; + fn draw_surface( + &mut self, + surface: B::SourceSurface, + dest: Rect<f64>, + source: Rect<f64>, + filter: Filter, + draw_options: &B::DrawOptions, + ); + fn draw_surface_with_shadow( + &self, + surface: B::SourceSurface, + dest: &Point2D<f32>, + color: &B::Color, + offset: &Vector2D<f32>, + sigma: f32, + operator: B::CompositionOp, + ); + fn fill(&mut self, path: &B::Path, pattern: B::Pattern<'_>, draw_options: &B::DrawOptions); + fn fill_text( + &mut self, + text_runs: Vec<TextRun>, + start: Point2D<f32>, + pattern: &B::Pattern<'_>, + draw_options: &B::DrawOptions, + ); + fn fill_rect( + &mut self, + rect: &Rect<f32>, + pattern: B::Pattern<'_>, + draw_options: Option<&B::DrawOptions>, + ); + fn get_size(&self) -> Size2D<i32>; + fn get_transform(&self) -> Transform2D<f32>; + fn pop_clip(&mut self); + fn push_clip(&mut self, path: &B::Path); + fn set_transform(&mut self, matrix: &Transform2D<f32>); + fn stroke( + &mut self, + path: &B::Path, + pattern: B::Pattern<'_>, + stroke_options: &B::StrokeOptions, + draw_options: &B::DrawOptions, + ); + fn stroke_line( + &mut self, + start: Point2D<f32>, + end: Point2D<f32>, + pattern: B::Pattern<'_>, + stroke_options: &B::StrokeOptions, + draw_options: &B::DrawOptions, + ); + fn stroke_rect( + &mut self, + rect: &Rect<f32>, + pattern: B::Pattern<'_>, + stroke_options: &B::StrokeOptions, + draw_options: &B::DrawOptions, + ); + fn surface(&self) -> B::SourceSurface; + fn bytes(&'_ self) -> B::Bytes<'_>; +} + +/// A generic PathBuilder that abstracts the interface for azure's and raqote's PathBuilder. +pub(crate) trait GenericPathBuilder<B: Backend> { + fn arc( + &mut self, + origin: Point2D<f32>, + radius: f32, + start_angle: f32, + end_angle: f32, + anticlockwise: bool, + ); + fn bezier_curve_to( + &mut self, + control_point1: &Point2D<f32>, + control_point2: &Point2D<f32>, + control_point3: &Point2D<f32>, + ); + fn close(&mut self); + #[allow(clippy::too_many_arguments)] + fn ellipse( + &mut self, + origin: Point2D<f32>, + radius_x: f32, + radius_y: f32, + rotation_angle: f32, + start_angle: f32, + end_angle: f32, + anticlockwise: bool, + ) { + let mut start = Angle::radians(start_angle); + let mut end = Angle::radians(end_angle); + + // Wrap angles mod 2 * PI if necessary + if !anticlockwise && start > end + Angle::two_pi() || + anticlockwise && end > start + Angle::two_pi() + { + start = start.positive(); + end = end.positive(); + } + + // Calculate the total arc we're going to sweep. + let sweep = match anticlockwise { + true => { + if end - start == Angle::two_pi() { + -Angle::two_pi() + } else if end > start { + -(Angle::two_pi() - (end - start)) + } else { + -(start - end) + } + }, + false => { + if start - end == Angle::two_pi() { + Angle::two_pi() + } else if start > end { + Angle::two_pi() - (start - end) + } else { + end - start + } + }, + }; + + let arc: Arc<f32> = Arc { + center: origin, + radii: Vector2D::new(radius_x, radius_y), + start_angle: start, + sweep_angle: sweep, + x_rotation: Angle::radians(rotation_angle), + }; + + self.line_to(arc.from()); + + arc.for_each_quadratic_bezier(&mut |q| { + self.quadratic_curve_to(&q.ctrl, &q.to); + }); + } + fn get_current_point(&mut self) -> Option<Point2D<f32>>; + fn line_to(&mut self, point: Point2D<f32>); + fn move_to(&mut self, point: Point2D<f32>); + fn quadratic_curve_to(&mut self, control_point: &Point2D<f32>, end_point: &Point2D<f32>); + fn svg_arc( + &mut self, + radius_x: f32, + radius_y: f32, + rotation_angle: f32, + large_arc: bool, + sweep: bool, + end_point: Point2D<f32>, + ); + fn finish(&mut self) -> B::Path; +} + +pub(crate) trait PatternHelpers { + fn is_zero_size_gradient(&self) -> bool; + fn draw_rect(&self, rect: &Rect<f32>) -> Rect<f32>; +} + +pub(crate) trait StrokeOptionsHelpers { + fn set_line_width(&mut self, _val: f32); + fn set_miter_limit(&mut self, _val: f32); + fn set_line_join(&mut self, val: LineJoinStyle); + fn set_line_cap(&mut self, val: LineCapStyle); + fn set_line_dash(&mut self, items: Vec<f32>); + fn set_line_dash_offset(&mut self, offset: f32); +} + +pub(crate) trait DrawOptionsHelpers { + fn set_alpha(&mut self, val: f32); +} + +pub(crate) trait PathHelpers<B: Backend> { + fn transformed_copy_to_builder(&self, transform: &Transform2D<f32>) -> B::PathBuilder; + + fn contains_point(&self, x: f64, y: f64, path_transform: &Transform2D<f32>) -> bool; + + fn copy_to_builder(&self) -> B::PathBuilder; +} diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs index 2667b7f6b44..ea30589d0af 100644 --- a/components/canvas/canvas_data.rs +++ b/components/canvas/canvas_data.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use std::marker::PhantomData; use std::mem; use std::sync::Arc; @@ -16,7 +17,6 @@ use fonts::{ }; use ipc_channel::ipc::{IpcSender, IpcSharedMemory}; use log::warn; -use num_traits::ToPrimitive; use range::Range; use servo_arc::Arc as ServoArc; use snapshot::Snapshot; @@ -26,14 +26,17 @@ use unicode_script::Script; use webrender_api::units::RectExt as RectExt_; use webrender_api::{ImageDescriptor, ImageDescriptorFlags, ImageFormat, ImageKey}; -use crate::raqote_backend::Repetition; +use crate::backend::{ + Backend, DrawOptionsHelpers as _, GenericDrawTarget as _, GenericPathBuilder, PathHelpers, + PatternHelpers, StrokeOptionsHelpers as _, +}; // Asserts on WR texture cache update for zero sized image with raw data. // https://github.com/servo/webrender/blob/main/webrender/src/texture_cache.rs#L1475 const MIN_WR_IMAGE_SIZE: Size2D<u64> = Size2D::new(1, 1); -fn to_path(path: &[PathSegment], mut builder: Box<dyn GenericPathBuilder>) -> Path { - let mut build_ref = PathBuilderRef { +fn to_path<B: Backend>(path: &[PathSegment], mut builder: B::PathBuilder) -> B::Path { + let mut build_ref = PathBuilderRef::<B> { builder: &mut builder, transform: Transform2D::identity(), }; @@ -112,20 +115,20 @@ fn to_path(path: &[PathSegment], mut builder: Box<dyn GenericPathBuilder>) -> Pa /// draw the path, we convert it back to userspace and draw it /// with the correct transform applied. /// TODO: De-abstract now that Azure is removed? -enum PathState { +enum PathState<B: Backend> { /// Path builder in user-space. If a transform has been applied /// but no further path operations have occurred, it is stored /// in the optional field. - UserSpacePathBuilder(Box<dyn GenericPathBuilder>, Option<Transform2D<f32>>), + UserSpacePathBuilder(B::PathBuilder, Option<Transform2D<f32>>), /// Path builder in device-space. - DeviceSpacePathBuilder(Box<dyn GenericPathBuilder>), + DeviceSpacePathBuilder(B::PathBuilder), /// Path in user-space. If a transform has been applied but /// but no further path operations have occurred, it is stored /// in the optional field. - UserSpacePath(Path, Option<Transform2D<f32>>), + UserSpacePath(B::Path, Option<Transform2D<f32>>), } -impl PathState { +impl<B: Backend> PathState<B> { fn is_path(&self) -> bool { match *self { PathState::UserSpacePath(..) => true, @@ -133,7 +136,7 @@ impl PathState { } } - fn path(&self) -> &Path { + fn path(&self) -> &B::Path { match *self { PathState::UserSpacePath(ref p, _) => p, PathState::UserSpacePathBuilder(..) | PathState::DeviceSpacePathBuilder(..) => { @@ -143,84 +146,14 @@ impl PathState { } } -pub trait Backend { - fn get_composition_op(&self, opts: &DrawOptions) -> CompositionOp; - fn need_to_draw_shadow(&self, color: &Color) -> bool; - fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_>); - fn set_fill_style( - &mut self, - style: FillOrStrokeStyle, - state: &mut CanvasPaintState<'_>, - drawtarget: &dyn GenericDrawTarget, - ); - fn set_stroke_style( - &mut self, - style: FillOrStrokeStyle, - state: &mut CanvasPaintState<'_>, - drawtarget: &dyn GenericDrawTarget, - ); - fn set_global_composition( - &mut self, - op: CompositionOrBlending, - state: &mut CanvasPaintState<'_>, - ); - fn create_drawtarget(&self, size: Size2D<u64>) -> Box<dyn GenericDrawTarget>; - fn recreate_paint_state<'a>(&self, state: &CanvasPaintState<'a>) -> CanvasPaintState<'a>; -} - -/// A generic PathBuilder that abstracts the interface for azure's and raqote's PathBuilder. -/// TODO: De-abstract now that Azure is removed? -pub trait GenericPathBuilder { - fn arc( - &mut self, - origin: Point2D<f32>, - radius: f32, - start_angle: f32, - end_angle: f32, - anticlockwise: bool, - ); - fn bezier_curve_to( - &mut self, - control_point1: &Point2D<f32>, - control_point2: &Point2D<f32>, - control_point3: &Point2D<f32>, - ); - fn close(&mut self); - #[allow(clippy::too_many_arguments)] - fn ellipse( - &mut self, - origin: Point2D<f32>, - radius_x: f32, - radius_y: f32, - rotation_angle: f32, - start_angle: f32, - end_angle: f32, - anticlockwise: bool, - ); - fn get_current_point(&mut self) -> Option<Point2D<f32>>; - fn line_to(&mut self, point: Point2D<f32>); - fn move_to(&mut self, point: Point2D<f32>); - fn quadratic_curve_to(&mut self, control_point: &Point2D<f32>, end_point: &Point2D<f32>); - fn svg_arc( - &mut self, - radius_x: f32, - radius_y: f32, - rotation_angle: f32, - large_arc: bool, - sweep: bool, - end_point: Point2D<f32>, - ); - fn finish(&mut self) -> Path; -} - /// A wrapper around a stored PathBuilder and an optional transformation that should be /// applied to any points to ensure they are in the matching device space. -struct PathBuilderRef<'a> { - builder: &'a mut Box<dyn GenericPathBuilder>, +struct PathBuilderRef<'a, B: Backend> { + builder: &'a mut B::PathBuilder, transform: Transform2D<f32>, } -impl PathBuilderRef<'_> { +impl<B: Backend> PathBuilderRef<'_, B> { fn line_to(&mut self, pt: &Point2D<f32>) { let pt = self.transform.transform_point(*pt); self.builder.line_to(pt); @@ -341,7 +274,7 @@ impl PathBuilderRef<'_> { } #[allow(clippy::too_many_arguments)] - pub fn ellipse( + pub(crate) fn ellipse( &mut self, center: &Point2D<f32>, radius_x: f32, @@ -430,9 +363,9 @@ impl UnshapedTextRun<'_> { } } -pub struct TextRun { - pub font: FontRef, - pub glyphs: Arc<GlyphStore>, +pub(crate) struct TextRun { + pub(crate) font: FontRef, + pub(crate) glyphs: Arc<GlyphStore>, } impl TextRun { @@ -458,149 +391,31 @@ impl TextRun { } } -// This defines required methods for a DrawTarget (currently only implemented for raqote). The -// prototypes are derived from the now-removed Azure backend's methods. -pub trait GenericDrawTarget { - fn clear_rect(&mut self, rect: &Rect<f32>); - fn copy_surface( - &mut self, - surface: SourceSurface, - source: Rect<i32>, - destination: Point2D<i32>, - ); - fn create_gradient_stops(&self, gradient_stops: Vec<GradientStop>) -> GradientStops; - fn create_path_builder(&self) -> Box<dyn GenericPathBuilder>; - fn create_similar_draw_target(&self, size: &Size2D<i32>) -> Box<dyn GenericDrawTarget>; - fn create_source_surface_from_data(&self, data: &[u8]) -> Option<SourceSurface>; - fn draw_surface( - &mut self, - surface: SourceSurface, - dest: Rect<f64>, - source: Rect<f64>, - filter: Filter, - draw_options: &DrawOptions, - ); - fn draw_surface_with_shadow( - &self, - surface: SourceSurface, - dest: &Point2D<f32>, - color: &Color, - offset: &Vector2D<f32>, - sigma: f32, - operator: CompositionOp, - ); - fn fill(&mut self, path: &Path, pattern: Pattern, draw_options: &DrawOptions); - fn fill_text( - &mut self, - text_runs: Vec<TextRun>, - start: Point2D<f32>, - pattern: &Pattern, - draw_options: &DrawOptions, - ); - fn fill_rect(&mut self, rect: &Rect<f32>, pattern: Pattern, draw_options: Option<&DrawOptions>); - fn get_size(&self) -> Size2D<i32>; - fn get_transform(&self) -> Transform2D<f32>; - fn pop_clip(&mut self); - fn push_clip(&mut self, path: &Path); - fn set_transform(&mut self, matrix: &Transform2D<f32>); - fn snapshot(&self) -> SourceSurface; - fn stroke( - &mut self, - path: &Path, - pattern: Pattern, - stroke_options: &StrokeOptions, - draw_options: &DrawOptions, - ); - fn stroke_line( - &mut self, - start: Point2D<f32>, - end: Point2D<f32>, - pattern: Pattern, - stroke_options: &StrokeOptions, - draw_options: &DrawOptions, - ); - fn stroke_rect( - &mut self, - rect: &Rect<f32>, - pattern: Pattern, - stroke_options: &StrokeOptions, - draw_options: &DrawOptions, - ); - fn snapshot_data(&self) -> &[u8]; -} - -pub enum GradientStop { - Raqote(raqote::GradientStop), -} - -pub enum GradientStops { - Raqote(Vec<raqote::GradientStop>), -} - -#[derive(Clone)] -pub enum Color { - Raqote(raqote::SolidSource), -} - -#[derive(Clone)] -pub enum CompositionOp { - Raqote(raqote::BlendMode), -} - -#[derive(Clone)] -pub enum SourceSurface { - Raqote(Vec<u8>), // TODO: See if we can avoid the alloc (probably?) -} - -#[derive(Clone)] -pub enum Path { - Raqote(raqote::Path), -} - -#[derive(Clone)] -pub enum Pattern<'a> { - Raqote(crate::raqote_backend::Pattern<'a>), -} - -#[derive(Clone)] -pub enum DrawOptions { - Raqote(raqote::DrawOptions), -} - -#[derive(Clone)] -pub enum StrokeOptions { - Raqote(raqote::StrokeStyle), -} - #[derive(Clone, Copy)] -pub enum Filter { +pub(crate) enum Filter { Bilinear, Nearest, } -pub struct CanvasData<'a> { - backend: Box<dyn Backend>, - drawtarget: Box<dyn GenericDrawTarget>, - path_state: Option<PathState>, - state: CanvasPaintState<'a>, - saved_states: Vec<CanvasPaintState<'a>>, +pub(crate) struct CanvasData<'a, B: Backend> { + backend: B, + drawtarget: B::DrawTarget, + path_state: Option<PathState<B>>, + state: CanvasPaintState<'a, B>, + saved_states: Vec<CanvasPaintState<'a, B>>, compositor_api: CrossProcessCompositorApi, image_key: ImageKey, font_context: Arc<FontContext>, } -fn create_backend() -> Box<dyn Backend> { - Box::new(crate::raqote_backend::RaqoteBackend) -} - -impl<'a> CanvasData<'a> { - pub fn new( +impl<'a, B: Backend> CanvasData<'a, B> { + pub(crate) fn new( size: Size2D<u64>, compositor_api: CrossProcessCompositorApi, font_context: Arc<FontContext>, - ) -> CanvasData<'a> { + backend: B, + ) -> CanvasData<'a, B> { let size = size.max(MIN_WR_IMAGE_SIZE); - let backend = create_backend(); let draw_target = backend.create_drawtarget(size); let image_key = compositor_api.generate_image_key().unwrap(); let descriptor = ImageDescriptor { @@ -611,13 +426,13 @@ impl<'a> CanvasData<'a> { flags: ImageDescriptorFlags::empty(), }; let data = - SerializableImageData::Raw(IpcSharedMemory::from_bytes(draw_target.snapshot_data())); + SerializableImageData::Raw(IpcSharedMemory::from_bytes(draw_target.bytes().as_ref())); compositor_api.update_images(vec![ImageUpdate::AddImage(image_key, descriptor, data)]); CanvasData { + state: backend.new_paint_state(), backend, drawtarget: draw_target, path_state: None, - state: CanvasPaintState::default(), saved_states: vec![], compositor_api, image_key, @@ -625,11 +440,11 @@ impl<'a> CanvasData<'a> { } } - pub fn image_key(&self) -> ImageKey { + pub(crate) fn image_key(&self) -> ImageKey { self.image_key } - pub fn draw_image( + pub(crate) fn draw_image( &mut self, image_data: &[u8], image_size: Size2D<u64>, @@ -648,8 +463,8 @@ impl<'a> CanvasData<'a> { }; let draw_options = self.state.draw_options.clone(); - let writer = |draw_target: &mut dyn GenericDrawTarget| { - write_image( + let writer = |draw_target: &mut B::DrawTarget| { + write_image::<B>( draw_target, image_data, source_rect.size, @@ -669,15 +484,15 @@ impl<'a> CanvasData<'a> { // TODO(pylbrecht) pass another closure for raqote self.draw_with_shadow(&rect, writer); } else { - writer(&mut *self.drawtarget); + writer(&mut self.drawtarget); } } - pub fn save_context_state(&mut self) { + pub(crate) fn save_context_state(&mut self) { self.saved_states.push(self.state.clone()); } - pub fn restore_context_state(&mut self) { + pub(crate) fn restore_context_state(&mut self) { if let Some(state) = self.saved_states.pop() { let _ = mem::replace(&mut self.state, state); self.drawtarget.set_transform(&self.state.transform); @@ -685,7 +500,7 @@ impl<'a> CanvasData<'a> { } } - pub fn fill_text_with_size( + pub(crate) fn fill_text_with_size( &mut self, text: String, x: f64, @@ -764,7 +579,7 @@ impl<'a> CanvasData<'a> { } /// <https://html.spec.whatwg.org/multipage/#text-preparation-algorithm> - pub fn fill_text( + pub(crate) fn fill_text( &mut self, text: String, x: f64, @@ -782,7 +597,7 @@ impl<'a> CanvasData<'a> { /// <https://html.spec.whatwg.org/multipage/#text-preparation-algorithm> /// <https://html.spec.whatwg.org/multipage/#dom-context-2d-measuretext> - pub fn measure_text(&mut self, text: String) -> TextMetrics { + pub(crate) fn measure_text(&mut self, text: String) -> TextMetrics { // > Step 2: Replace all ASCII whitespace in text with U+0020 SPACE characters. let text = replace_ascii_whitespace(text); let Some(ref font_style) = self.state.font_style else { @@ -934,49 +749,15 @@ impl<'a> CanvasData<'a> { point2(x + anchor_x, y + anchor_y) } - pub fn fill_rect(&mut self, rect: &Rect<f32>) { + pub(crate) fn fill_rect(&mut self, rect: &Rect<f32>) { if self.state.fill_style.is_zero_size_gradient() { return; // Paint nothing if gradient size is zero. } - let draw_rect = match &self.state.fill_style { - Pattern::Raqote(pattern) => match pattern { - crate::raqote_backend::Pattern::Surface(pattern) => { - let pattern_rect = Rect::new(Point2D::origin(), pattern.size()); - let mut draw_rect = rect.intersection(&pattern_rect).unwrap_or(Rect::zero()); - - match pattern.repetition() { - Repetition::NoRepeat => { - draw_rect.size.width = - draw_rect.size.width.min(pattern_rect.size.width); - draw_rect.size.height = - draw_rect.size.height.min(pattern_rect.size.height); - }, - Repetition::RepeatX => { - draw_rect.size.width = rect.size.width; - draw_rect.size.height = - draw_rect.size.height.min(pattern_rect.size.height); - }, - Repetition::RepeatY => { - draw_rect.size.height = rect.size.height; - draw_rect.size.width = - draw_rect.size.width.min(pattern_rect.size.width); - }, - Repetition::Repeat => { - draw_rect = *rect; - }, - } - - draw_rect - }, - crate::raqote_backend::Pattern::Color(..) | - crate::raqote_backend::Pattern::LinearGradient(..) | - crate::raqote_backend::Pattern::RadialGradient(..) => *rect, - }, - }; + let draw_rect = self.state.fill_style.draw_rect(rect); if self.need_to_draw_shadow() { - self.draw_with_shadow(&draw_rect, |new_draw_target: &mut dyn GenericDrawTarget| { + self.draw_with_shadow(&draw_rect, |new_draw_target: &mut B::DrawTarget| { new_draw_target.fill_rect( &draw_rect, self.state.fill_style.clone(), @@ -992,17 +773,17 @@ impl<'a> CanvasData<'a> { } } - pub fn clear_rect(&mut self, rect: &Rect<f32>) { + pub(crate) fn clear_rect(&mut self, rect: &Rect<f32>) { self.drawtarget.clear_rect(rect); } - pub fn stroke_rect(&mut self, rect: &Rect<f32>) { + pub(crate) fn stroke_rect(&mut self, rect: &Rect<f32>) { if self.state.stroke_style.is_zero_size_gradient() { return; // Paint nothing if gradient size is zero. } if self.need_to_draw_shadow() { - self.draw_with_shadow(rect, |new_draw_target: &mut dyn GenericDrawTarget| { + self.draw_with_shadow(rect, |new_draw_target: &mut B::DrawTarget| { new_draw_target.stroke_rect( rect, self.state.stroke_style.clone(), @@ -1030,12 +811,12 @@ impl<'a> CanvasData<'a> { } } - pub fn begin_path(&mut self) { + pub(crate) fn begin_path(&mut self) { // Erase any traces of previous paths that existed before this. self.path_state = None; } - pub fn close_path(&mut self) { + pub(crate) fn close_path(&mut self) { self.path_builder().close(); } @@ -1097,14 +878,14 @@ impl<'a> CanvasData<'a> { assert!(self.path_state.as_ref().unwrap().is_path()) } - fn path(&self) -> &Path { + fn path(&self) -> &B::Path { self.path_state .as_ref() .expect("Should have called ensure_path()") .path() } - pub fn fill(&mut self) { + pub(crate) fn fill(&mut self) { if self.state.fill_style.is_zero_size_gradient() { return; // Paint nothing if gradient size is zero. } @@ -1113,16 +894,16 @@ impl<'a> CanvasData<'a> { self.drawtarget.fill( &self.path().clone(), self.state.fill_style.clone(), - &self.state.draw_options, + &self.state.draw_options.clone(), ); } - pub fn fill_path(&mut self, path: &[PathSegment]) { + pub(crate) fn fill_path(&mut self, path: &[PathSegment]) { if self.state.fill_style.is_zero_size_gradient() { return; // Paint nothing if gradient size is zero. } - let path = to_path(path, self.drawtarget.create_path_builder()); + let path = to_path::<B>(path, self.drawtarget.create_path_builder()); self.drawtarget.fill( &path, @@ -1131,7 +912,7 @@ impl<'a> CanvasData<'a> { ); } - pub fn stroke(&mut self) { + pub(crate) fn stroke(&mut self) { if self.state.stroke_style.is_zero_size_gradient() { return; // Paint nothing if gradient size is zero. } @@ -1145,12 +926,12 @@ impl<'a> CanvasData<'a> { ); } - pub fn stroke_path(&mut self, path: &[PathSegment]) { + pub(crate) fn stroke_path(&mut self, path: &[PathSegment]) { if self.state.stroke_style.is_zero_size_gradient() { return; // Paint nothing if gradient size is zero. } - let path = to_path(path, self.drawtarget.create_path_builder()); + let path = to_path::<B>(path, self.drawtarget.create_path_builder()); self.drawtarget.stroke( &path, @@ -1160,18 +941,18 @@ impl<'a> CanvasData<'a> { ); } - pub fn clip(&mut self) { + pub(crate) fn clip(&mut self) { self.ensure_path(); let path = self.path().clone(); self.drawtarget.push_clip(&path); } - pub fn clip_path(&mut self, path: &[PathSegment]) { - let path = to_path(path, self.drawtarget.create_path_builder()); + pub(crate) fn clip_path(&mut self, path: &[PathSegment]) { + let path = to_path::<B>(path, self.drawtarget.create_path_builder()); self.drawtarget.push_clip(&path); } - pub fn is_point_in_path( + pub(crate) fn is_point_in_path( &mut self, x: f64, y: f64, @@ -1190,7 +971,7 @@ impl<'a> CanvasData<'a> { chan.send(result).unwrap(); } - pub fn is_point_in_path_( + pub(crate) fn is_point_in_path_( &mut self, path: &[PathSegment], x: f64, @@ -1202,7 +983,7 @@ impl<'a> CanvasData<'a> { Some(PathState::UserSpacePath(_, Some(transform))) => transform, Some(_) | None => &self.drawtarget.get_transform(), }; - let result = to_path(path, self.drawtarget.create_path_builder()).contains_point( + let result = to_path::<B>(path, self.drawtarget.create_path_builder()).contains_point( x, y, path_transform, @@ -1210,15 +991,15 @@ impl<'a> CanvasData<'a> { chan.send(result).unwrap(); } - pub fn move_to(&mut self, point: &Point2D<f32>) { + pub(crate) fn move_to(&mut self, point: &Point2D<f32>) { self.path_builder().move_to(point); } - pub fn line_to(&mut self, point: &Point2D<f32>) { + pub(crate) fn line_to(&mut self, point: &Point2D<f32>) { self.path_builder().line_to(point); } - fn path_builder(&mut self) -> PathBuilderRef { + fn path_builder(&mut self) -> PathBuilderRef<B> { if self.path_state.is_none() { self.path_state = Some(PathState::UserSpacePathBuilder( self.drawtarget.create_path_builder(), @@ -1283,18 +1064,18 @@ impl<'a> CanvasData<'a> { } } - pub fn rect(&mut self, rect: &Rect<f32>) { + pub(crate) fn rect(&mut self, rect: &Rect<f32>) { self.path_builder().rect(rect); } - pub fn quadratic_curve_to(&mut self, cp: &Point2D<f32>, endpoint: &Point2D<f32>) { + pub(crate) fn quadratic_curve_to(&mut self, cp: &Point2D<f32>, endpoint: &Point2D<f32>) { if self.path_state.is_none() { self.move_to(cp); } self.path_builder().quadratic_curve_to(cp, endpoint); } - pub fn bezier_curve_to( + pub(crate) fn bezier_curve_to( &mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, @@ -1306,7 +1087,7 @@ impl<'a> CanvasData<'a> { self.path_builder().bezier_curve_to(cp1, cp2, endpoint); } - pub fn arc( + pub(crate) fn arc( &mut self, center: &Point2D<f32>, radius: f32, @@ -1318,12 +1099,12 @@ impl<'a> CanvasData<'a> { .arc(center, radius, start_angle, end_angle, ccw); } - pub fn arc_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, radius: f32) { + pub(crate) fn arc_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, radius: f32) { self.path_builder().arc_to(cp1, cp2, radius); } #[allow(clippy::too_many_arguments)] - pub fn ellipse( + pub(crate) fn ellipse( &mut self, center: &Point2D<f32>, radius_x: f32, @@ -1344,45 +1125,45 @@ impl<'a> CanvasData<'a> { ); } - pub fn set_fill_style(&mut self, style: FillOrStrokeStyle) { + pub(crate) fn set_fill_style(&mut self, style: FillOrStrokeStyle) { self.backend - .set_fill_style(style, &mut self.state, &*self.drawtarget); + .set_fill_style(style, &mut self.state, &self.drawtarget); } - pub fn set_stroke_style(&mut self, style: FillOrStrokeStyle) { + pub(crate) fn set_stroke_style(&mut self, style: FillOrStrokeStyle) { self.backend - .set_stroke_style(style, &mut self.state, &*self.drawtarget); + .set_stroke_style(style, &mut self.state, &self.drawtarget); } - pub fn set_line_width(&mut self, width: f32) { + pub(crate) fn set_line_width(&mut self, width: f32) { self.state.stroke_opts.set_line_width(width); } - pub fn set_line_cap(&mut self, cap: LineCapStyle) { + pub(crate) fn set_line_cap(&mut self, cap: LineCapStyle) { self.state.stroke_opts.set_line_cap(cap); } - pub fn set_line_join(&mut self, join: LineJoinStyle) { + pub(crate) fn set_line_join(&mut self, join: LineJoinStyle) { self.state.stroke_opts.set_line_join(join); } - pub fn set_miter_limit(&mut self, limit: f32) { + pub(crate) fn set_miter_limit(&mut self, limit: f32) { self.state.stroke_opts.set_miter_limit(limit); } - pub fn set_line_dash(&mut self, items: Vec<f32>) { + pub(crate) fn set_line_dash(&mut self, items: Vec<f32>) { self.state.stroke_opts.set_line_dash(items); } - pub fn set_line_dash_offset(&mut self, offset: f32) { + pub(crate) fn set_line_dash_offset(&mut self, offset: f32) { self.state.stroke_opts.set_line_dash_offset(offset); } - pub fn get_transform(&self) -> Transform2D<f32> { + pub(crate) fn get_transform(&self) -> Transform2D<f32> { self.drawtarget.get_transform() } - pub fn set_transform(&mut self, transform: &Transform2D<f32>) { + pub(crate) fn set_transform(&mut self, transform: &Transform2D<f32>) { // If there is an in-progress path, store the existing transformation required // to move between device and user space. match self.path_state.as_mut() { @@ -1398,32 +1179,28 @@ impl<'a> CanvasData<'a> { self.drawtarget.set_transform(transform) } - pub fn set_global_alpha(&mut self, alpha: f32) { + pub(crate) fn set_global_alpha(&mut self, alpha: f32) { self.state.draw_options.set_alpha(alpha); } - pub fn set_global_composition(&mut self, op: CompositionOrBlending) { + pub(crate) fn set_global_composition(&mut self, op: CompositionOrBlending) { self.backend.set_global_composition(op, &mut self.state); } - pub fn recreate(&mut self, size: Option<Size2D<u64>>) { + pub(crate) fn recreate(&mut self, size: Option<Size2D<u64>>) { let size = size .unwrap_or_else(|| self.drawtarget.get_size().to_u64()) .max(MIN_WR_IMAGE_SIZE); self.drawtarget = self .backend .create_drawtarget(Size2D::new(size.width, size.height)); - self.state = self.backend.recreate_paint_state(&self.state); + self.state = self.backend.new_paint_state(); self.saved_states.clear(); self.update_image_rendering(); } - pub fn snapshot(&self) { - self.drawtarget.snapshot_data(); - } - /// Update image in WebRender - pub fn update_image_rendering(&mut self) { + pub(crate) fn update_image_rendering(&mut self) { let descriptor = ImageDescriptor { size: self.drawtarget.get_size().cast_unit(), stride: None, @@ -1432,7 +1209,7 @@ impl<'a> CanvasData<'a> { flags: ImageDescriptorFlags::empty(), }; let data = SerializableImageData::Raw(IpcSharedMemory::from_bytes( - self.drawtarget.snapshot_data(), + self.drawtarget.bytes().as_ref(), )); self.compositor_api @@ -1444,7 +1221,7 @@ impl<'a> CanvasData<'a> { } // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata - pub fn put_image_data(&mut self, mut imagedata: Vec<u8>, rect: Rect<u64>) { + pub(crate) fn put_image_data(&mut self, mut imagedata: Vec<u8>, rect: Rect<u64>) { assert_eq!(imagedata.len() % 4, 0); assert_eq!(rect.size.area() as usize, imagedata.len() / 4); pixels::rgba8_byte_swap_and_premultiply_inplace(&mut imagedata); @@ -1459,31 +1236,31 @@ impl<'a> CanvasData<'a> { ); } - pub fn set_shadow_offset_x(&mut self, value: f64) { + pub(crate) fn set_shadow_offset_x(&mut self, value: f64) { self.state.shadow_offset_x = value; } - pub fn set_shadow_offset_y(&mut self, value: f64) { + pub(crate) fn set_shadow_offset_y(&mut self, value: f64) { self.state.shadow_offset_y = value; } - pub fn set_shadow_blur(&mut self, value: f64) { + pub(crate) fn set_shadow_blur(&mut self, value: f64) { self.state.shadow_blur = value; } - pub fn set_shadow_color(&mut self, value: AbsoluteColor) { + pub(crate) fn set_shadow_color(&mut self, value: AbsoluteColor) { self.backend.set_shadow_color(value, &mut self.state); } - pub fn set_font(&mut self, font_style: FontStyleStruct) { + pub(crate) fn set_font(&mut self, font_style: FontStyleStruct) { self.state.font_style = Some(ServoArc::new(font_style)) } - pub fn set_text_align(&mut self, text_align: TextAlign) { + pub(crate) fn set_text_align(&mut self, text_align: TextAlign) { self.state.text_align = text_align; } - pub fn set_text_baseline(&mut self, text_baseline: TextBaseline) { + pub(crate) fn set_text_baseline(&mut self, text_baseline: TextBaseline) { self.state.text_baseline = text_baseline; } @@ -1495,7 +1272,7 @@ impl<'a> CanvasData<'a> { self.state.shadow_blur != 0.0f64) } - fn create_draw_target_for_shadow(&self, source_rect: &Rect<f32>) -> Box<dyn GenericDrawTarget> { + fn create_draw_target_for_shadow(&self, source_rect: &Rect<f32>) -> B::DrawTarget { let mut draw_target = self.drawtarget.create_similar_draw_target(&Size2D::new( source_rect.size.width as i32, source_rect.size.height as i32, @@ -1509,13 +1286,13 @@ impl<'a> CanvasData<'a> { fn draw_with_shadow<F>(&self, rect: &Rect<f32>, draw_shadow_source: F) where - F: FnOnce(&mut dyn GenericDrawTarget), + F: FnOnce(&mut B::DrawTarget), { let shadow_src_rect = self.state.transform.outer_transformed_rect(rect); let mut new_draw_target = self.create_draw_target_for_shadow(&shadow_src_rect); - draw_shadow_source(&mut *new_draw_target); + draw_shadow_source(&mut new_draw_target); self.drawtarget.draw_surface_with_shadow( - new_draw_target.snapshot(), + new_draw_target.surface(), &Point2D::new(shadow_src_rect.origin.x, shadow_src_rect.origin.y), &self.state.shadow_color, &Vector2D::new( @@ -1531,7 +1308,7 @@ impl<'a> CanvasData<'a> { /// canvas_size: The size of the canvas we're reading from /// read_rect: The area of the canvas we want to read from #[allow(unsafe_code)] - pub fn read_pixels( + pub(crate) fn read_pixels( &self, read_rect: Option<Rect<u64>>, canvas_size: Option<Size2D<u64>>, @@ -1546,11 +1323,11 @@ impl<'a> CanvasData<'a> { { vec![] } else { - let bytes = self.drawtarget.snapshot_data(); - pixels::rgba8_get_rect(bytes, canvas_size, read_rect).to_vec() + pixels::rgba8_get_rect(self.drawtarget.bytes().as_ref(), canvas_size, read_rect) + .to_vec() } } else { - self.drawtarget.snapshot_data().to_vec() + self.drawtarget.bytes().as_ref().to_vec() }; Snapshot::from_vec( @@ -1564,7 +1341,7 @@ impl<'a> CanvasData<'a> { } } -impl Drop for CanvasData<'_> { +impl<B: Backend> Drop for CanvasData<'_, B> { fn drop(&mut self) { self.compositor_api .update_images(vec![ImageUpdate::DeleteImage(self.image_key)]); @@ -1575,20 +1352,21 @@ const HANGING_BASELINE_DEFAULT: f32 = 0.8; const IDEOGRAPHIC_BASELINE_DEFAULT: f32 = 0.5; #[derive(Clone)] -pub struct CanvasPaintState<'a> { - pub draw_options: DrawOptions, - pub fill_style: Pattern<'a>, - pub stroke_style: Pattern<'a>, - pub stroke_opts: StrokeOptions, +pub(crate) struct CanvasPaintState<'a, B: Backend> { + pub(crate) draw_options: B::DrawOptions, + pub(crate) fill_style: B::Pattern<'a>, + pub(crate) stroke_style: B::Pattern<'a>, + pub(crate) stroke_opts: B::StrokeOptions, /// The current 2D transform matrix. - pub transform: Transform2D<f32>, - pub shadow_offset_x: f64, - pub shadow_offset_y: f64, - pub shadow_blur: f64, - pub shadow_color: Color, - pub font_style: Option<ServoArc<FontStyleStruct>>, - pub text_align: TextAlign, - pub text_baseline: TextBaseline, + pub(crate) transform: Transform2D<f32>, + pub(crate) shadow_offset_x: f64, + pub(crate) shadow_offset_y: f64, + pub(crate) shadow_blur: f64, + pub(crate) shadow_color: B::Color, + pub(crate) font_style: Option<ServoArc<FontStyleStruct>>, + pub(crate) text_align: TextAlign, + pub(crate) text_baseline: TextBaseline, + pub(crate) _backend: PhantomData<B>, } /// It writes an image to the destination target @@ -1598,14 +1376,14 @@ pub struct CanvasPaintState<'a> { /// dest_rect: Area of the destination target where the pixels will be copied /// smoothing_enabled: It determines if smoothing is applied to the image result /// premultiply: Determines whenever the image data should be premultiplied or not -fn write_image( - draw_target: &mut dyn GenericDrawTarget, +fn write_image<B: Backend>( + draw_target: &mut B::DrawTarget, mut image_data: Vec<u8>, image_size: Size2D<f64>, dest_rect: Rect<f64>, smoothing_enabled: bool, premultiply: bool, - draw_options: &DrawOptions, + draw_options: &B::DrawOptions, ) { if image_data.is_empty() { return; @@ -1634,25 +1412,11 @@ fn write_image( draw_target.draw_surface(source_surface, dest_rect, image_rect, filter, draw_options); } -pub trait RectToi32 { - fn to_i32(&self) -> Rect<i32>; +pub(crate) trait RectToi32 { fn ceil(&self) -> Rect<f64>; } impl RectToi32 for Rect<f64> { - fn to_i32(&self) -> Rect<i32> { - Rect::new( - Point2D::new( - self.origin.x.to_i32().unwrap(), - self.origin.y.to_i32().unwrap(), - ), - Size2D::new( - self.size.width.to_i32().unwrap(), - self.size.height.to_i32().unwrap(), - ), - ) - } - fn ceil(&self) -> Rect<f64> { Rect::new( Point2D::new(self.origin.x.ceil(), self.origin.y.ceil()), @@ -1661,22 +1425,6 @@ impl RectToi32 for Rect<f64> { } } -pub trait RectExt { - fn to_u64(&self) -> Rect<u64>; -} - -impl RectExt for Rect<f64> { - fn to_u64(&self) -> Rect<u64> { - self.cast() - } -} - -impl RectExt for Rect<u32> { - fn to_u64(&self) -> Rect<u64> { - self.cast() - } -} - fn replace_ascii_whitespace(text: String) -> String { text.chars() .map(|c| match c { diff --git a/components/canvas/canvas_paint_thread.rs b/components/canvas/canvas_paint_thread.rs index bb940d7ef81..82a221d560d 100644 --- a/components/canvas/canvas_paint_thread.rs +++ b/components/canvas/canvas_paint_thread.rs @@ -11,18 +11,21 @@ use canvas_traits::ConstellationCanvasMsg; use canvas_traits::canvas::*; use compositing_traits::CrossProcessCompositorApi; use crossbeam_channel::{Sender, select, unbounded}; -use euclid::default::Size2D; +use euclid::default::{Point2D, Rect, Size2D, Transform2D}; use fonts::{FontContext, SystemFontServiceProxy}; use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::router::ROUTER; use log::warn; use net_traits::ResourceThreads; +use style::color::AbsoluteColor; +use style::properties::style_structs::Font as FontStyleStruct; use webrender_api::ImageKey; use crate::canvas_data::*; +use crate::raqote_backend::RaqoteBackend; pub struct CanvasPaintThread<'a> { - canvases: HashMap<CanvasId, CanvasData<'a>>, + canvases: HashMap<CanvasId, Canvas<'a>>, next_canvas_id: CanvasId, compositor_api: CrossProcessCompositorApi, font_context: Arc<FontContext>, @@ -113,10 +116,14 @@ impl<'a> CanvasPaintThread<'a> { let canvas_id = self.next_canvas_id; self.next_canvas_id.0 += 1; - let canvas_data = - CanvasData::new(size, self.compositor_api.clone(), self.font_context.clone()); + let canvas_data = CanvasData::new( + size, + self.compositor_api.clone(), + self.font_context.clone(), + RaqoteBackend, + ); let image_key = canvas_data.image_key(); - self.canvases.insert(canvas_id, canvas_data); + self.canvases.insert(canvas_id, Canvas::Raqote(canvas_data)); (canvas_id, image_key) } @@ -276,7 +283,347 @@ impl<'a> CanvasPaintThread<'a> { } } - fn canvas(&mut self, canvas_id: CanvasId) -> &mut CanvasData<'a> { + fn canvas(&mut self, canvas_id: CanvasId) -> &mut Canvas<'a> { self.canvases.get_mut(&canvas_id).expect("Bogus canvas id") } } + +enum Canvas<'a> { + Raqote(CanvasData<'a, RaqoteBackend>), +} + +impl Canvas<'_> { + fn set_fill_style(&mut self, style: FillOrStrokeStyle) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_fill_style(style), + } + } + + fn fill(&mut self) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.fill(), + } + } + + fn fill_text(&mut self, text: String, x: f64, y: f64, max_width: Option<f64>, is_rtl: bool) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.fill_text(text, x, y, max_width, is_rtl), + } + } + + fn fill_rect(&mut self, rect: &Rect<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.fill_rect(rect), + } + } + + fn set_stroke_style(&mut self, style: FillOrStrokeStyle) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_stroke_style(style), + } + } + + fn stroke_rect(&mut self, rect: &Rect<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.stroke_rect(rect), + } + } + + fn begin_path(&mut self) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.begin_path(), + } + } + + fn close_path(&mut self) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.close_path(), + } + } + + fn fill_path(&mut self, path: &[PathSegment]) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.fill_path(path), + } + } + + fn stroke(&mut self) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.stroke(), + } + } + + fn stroke_path(&mut self, path: &[PathSegment]) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.stroke_path(path), + } + } + + fn clip(&mut self) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.clip(), + } + } + + fn is_point_in_path(&mut self, x: f64, y: f64, fill_rule: FillRule, chan: IpcSender<bool>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.is_point_in_path(x, y, fill_rule, chan), + } + } + + fn is_point_in_path_( + &mut self, + path: &[PathSegment], + x: f64, + y: f64, + fill_rule: FillRule, + chan: IpcSender<bool>, + ) { + match self { + Canvas::Raqote(canvas_data) => { + canvas_data.is_point_in_path_(path, x, y, fill_rule, chan) + }, + } + } + + fn clear_rect(&mut self, rect: &Rect<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.clear_rect(rect), + } + } + + fn draw_image( + &mut self, + data: &[u8], + size: Size2D<u64>, + dest_rect: Rect<f64>, + source_rect: Rect<f64>, + smoothing_enabled: bool, + is_premultiplied: bool, + ) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.draw_image( + data, + size, + dest_rect, + source_rect, + smoothing_enabled, + is_premultiplied, + ), + } + } + + fn read_pixels( + &mut self, + read_rect: Option<Rect<u64>>, + canvas_size: Option<Size2D<u64>>, + ) -> snapshot::Snapshot { + match self { + Canvas::Raqote(canvas_data) => canvas_data.read_pixels(read_rect, canvas_size), + } + } + + fn move_to(&mut self, point: &Point2D<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.move_to(point), + } + } + + fn line_to(&mut self, point: &Point2D<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.line_to(point), + } + } + + fn rect(&mut self, rect: &Rect<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.rect(rect), + } + } + + fn quadratic_curve_to(&mut self, cp: &Point2D<f32>, pt: &Point2D<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.quadratic_curve_to(cp, pt), + } + } + + fn bezier_curve_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, pt: &Point2D<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.bezier_curve_to(cp1, cp2, pt), + } + } + + fn arc(&mut self, center: &Point2D<f32>, radius: f32, start: f32, end: f32, ccw: bool) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.arc(center, radius, start, end, ccw), + } + } + + fn arc_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, radius: f32) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.arc_to(cp1, cp2, radius), + } + } + + #[allow(clippy::too_many_arguments)] + fn ellipse( + &mut self, + center: &Point2D<f32>, + radius_x: f32, + radius_y: f32, + rotation: f32, + start: f32, + end: f32, + ccw: bool, + ) { + match self { + Canvas::Raqote(canvas_data) => { + canvas_data.ellipse(center, radius_x, radius_y, rotation, start, end, ccw) + }, + } + } + + fn restore_context_state(&mut self) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.restore_context_state(), + } + } + + fn save_context_state(&mut self) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.save_context_state(), + } + } + + fn set_line_width(&mut self, width: f32) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_line_width(width), + } + } + + fn set_line_cap(&mut self, cap: LineCapStyle) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_line_cap(cap), + } + } + + fn set_line_join(&mut self, join: LineJoinStyle) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_line_join(join), + } + } + + fn set_miter_limit(&mut self, limit: f32) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_miter_limit(limit), + } + } + + fn set_line_dash(&mut self, items: Vec<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_line_dash(items), + } + } + + fn set_line_dash_offset(&mut self, offset: f32) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_line_dash_offset(offset), + } + } + + fn set_transform(&mut self, matrix: &Transform2D<f32>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_transform(matrix), + } + } + + fn set_global_alpha(&mut self, alpha: f32) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_global_alpha(alpha), + } + } + + fn set_global_composition(&mut self, op: CompositionOrBlending) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_global_composition(op), + } + } + + fn set_shadow_offset_x(&mut self, value: f64) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_shadow_offset_x(value), + } + } + + fn set_shadow_offset_y(&mut self, value: f64) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_shadow_offset_y(value), + } + } + + fn set_shadow_blur(&mut self, value: f64) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_shadow_blur(value), + } + } + + fn set_shadow_color(&mut self, color: AbsoluteColor) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_shadow_color(color), + } + } + + fn set_font(&mut self, font_style: FontStyleStruct) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_font(font_style), + } + } + + fn set_text_align(&mut self, text_align: TextAlign) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_text_align(text_align), + } + } + + fn set_text_baseline(&mut self, text_baseline: TextBaseline) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.set_text_baseline(text_baseline), + } + } + + fn measure_text(&mut self, text: String) -> TextMetrics { + match self { + Canvas::Raqote(canvas_data) => canvas_data.measure_text(text), + } + } + + fn clip_path(&mut self, path: &[PathSegment]) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.clip_path(path), + } + } + + fn get_transform(&self) -> Transform2D<f32> { + match self { + Canvas::Raqote(canvas_data) => canvas_data.get_transform(), + } + } + + fn put_image_data(&mut self, unwrap: Vec<u8>, rect: Rect<u64>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.put_image_data(unwrap, rect), + } + } + + fn update_image_rendering(&mut self) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.update_image_rendering(), + } + } + + fn recreate(&mut self, size: Option<Size2D<u64>>) { + match self { + Canvas::Raqote(canvas_data) => canvas_data.recreate(size), + } + } +} diff --git a/components/canvas/lib.rs b/components/canvas/lib.rs index d2c62c1d8b6..91ab58b0e8b 100644 --- a/components/canvas/lib.rs +++ b/components/canvas/lib.rs @@ -4,14 +4,8 @@ #![deny(unsafe_code)] +mod backend; mod raqote_backend; -pub use webgl_mode::WebGLComm; - pub mod canvas_data; pub mod canvas_paint_thread; -mod webgl_limits; -mod webgl_mode; -pub mod webgl_thread; -#[cfg(feature = "webxr")] -mod webxr; diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 12137e41f41..efe0ffd05b8 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -7,20 +7,19 @@ use std::collections::HashMap; use canvas_traits::canvas::*; use cssparser::color::clamp_unit_f32; -use euclid::Angle; use euclid::default::{Point2D, Rect, Size2D, Transform2D, Vector2D}; use font_kit::font::Font; use fonts::{ByteIndex, FontIdentifier, FontTemplateRefMethods}; use log::warn; -use lyon_geom::Arc; use range::Range; use raqote::PathOp; use style::color::AbsoluteColor; -use crate::canvas_data::{ - self, Backend, CanvasPaintState, Color, CompositionOp, DrawOptions, Filter, GenericDrawTarget, - GenericPathBuilder, GradientStop, GradientStops, Path, SourceSurface, StrokeOptions, TextRun, +use crate::backend::{ + Backend, DrawOptionsHelpers, GenericDrawTarget, GenericPathBuilder, PathHelpers, + PatternHelpers, StrokeOptionsHelpers, }; +use crate::canvas_data::{CanvasPaintState, Filter, TextRun}; thread_local! { /// The shared font cache used by all canvases that render on a thread. It would be nicer @@ -30,80 +29,85 @@ thread_local! { static SHARED_FONT_CACHE: RefCell<HashMap<FontIdentifier, Font>> = RefCell::default(); } -#[derive(Default)] -pub struct RaqoteBackend; +#[derive(Clone, Default)] +pub(crate) struct RaqoteBackend; impl Backend for RaqoteBackend { - fn get_composition_op(&self, opts: &DrawOptions) -> CompositionOp { - CompositionOp::Raqote(opts.as_raqote().blend_mode) + type Pattern<'a> = Pattern<'a>; + type StrokeOptions = raqote::StrokeStyle; + type Color = raqote::SolidSource; + type DrawOptions = raqote::DrawOptions; + type CompositionOp = raqote::BlendMode; + type DrawTarget = raqote::DrawTarget; + type PathBuilder = PathBuilder; + type SourceSurface = Vec<u8>; // TODO: See if we can avoid the alloc (probably?) + type Bytes<'a> = &'a [u8]; + type Path = raqote::Path; + type GradientStop = raqote::GradientStop; + type GradientStops = Vec<raqote::GradientStop>; + + fn get_composition_op(&self, opts: &Self::DrawOptions) -> Self::CompositionOp { + opts.blend_mode } - fn need_to_draw_shadow(&self, color: &Color) -> bool { - color.as_raqote().a != 0 + fn need_to_draw_shadow(&self, color: &Self::Color) -> bool { + color.a != 0 } - fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_>) { - state.shadow_color = Color::Raqote(color.to_raqote_style()); + fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_, Self>) { + state.shadow_color = color.to_raqote_style(); } fn set_fill_style( &mut self, style: FillOrStrokeStyle, - state: &mut CanvasPaintState<'_>, - _drawtarget: &dyn GenericDrawTarget, + state: &mut CanvasPaintState<'_, Self>, + _drawtarget: &Self::DrawTarget, ) { if let Some(pattern) = style.to_raqote_pattern() { - state.fill_style = canvas_data::Pattern::Raqote(pattern); + state.fill_style = pattern; } } fn set_stroke_style( &mut self, style: FillOrStrokeStyle, - state: &mut CanvasPaintState<'_>, - _drawtarget: &dyn GenericDrawTarget, + state: &mut CanvasPaintState<'_, Self>, + _drawtarget: &Self::DrawTarget, ) { if let Some(pattern) = style.to_raqote_pattern() { - state.stroke_style = canvas_data::Pattern::Raqote(pattern); + state.stroke_style = pattern; } } fn set_global_composition( &mut self, op: CompositionOrBlending, - state: &mut CanvasPaintState<'_>, + state: &mut CanvasPaintState<'_, Self>, ) { - state.draw_options.as_raqote_mut().blend_mode = op.to_raqote_style(); - } - - fn create_drawtarget(&self, size: Size2D<u64>) -> Box<dyn GenericDrawTarget> { - Box::new(raqote::DrawTarget::new( - size.width as i32, - size.height as i32, - )) + state.draw_options.blend_mode = op.to_raqote_style(); } - fn recreate_paint_state<'a>(&self, _state: &CanvasPaintState<'a>) -> CanvasPaintState<'a> { - CanvasPaintState::default() + fn create_drawtarget(&self, size: Size2D<u64>) -> Self::DrawTarget { + raqote::DrawTarget::new(size.width as i32, size.height as i32) } -} -impl Default for CanvasPaintState<'_> { - fn default() -> Self { + fn new_paint_state<'a>(&self) -> CanvasPaintState<'a, Self> { let pattern = Pattern::Color(255, 0, 0, 0); CanvasPaintState { - draw_options: DrawOptions::Raqote(raqote::DrawOptions::new()), - fill_style: canvas_data::Pattern::Raqote(pattern.clone()), - stroke_style: canvas_data::Pattern::Raqote(pattern), - stroke_opts: StrokeOptions::Raqote(Default::default()), + draw_options: raqote::DrawOptions::new(), + fill_style: pattern.clone(), + stroke_style: pattern, + stroke_opts: Default::default(), transform: Transform2D::identity(), shadow_offset_x: 0.0, shadow_offset_y: 0.0, shadow_blur: 0.0, - shadow_color: Color::Raqote(raqote::SolidSource::from_unpremultiplied_argb(0, 0, 0, 0)), + shadow_color: raqote::SolidSource::from_unpremultiplied_argb(0, 0, 0, 0), font_style: None, text_align: TextAlign::default(), text_baseline: TextBaseline::default(), + _backend: std::marker::PhantomData, } } } @@ -230,136 +234,122 @@ impl Repetition { } } -impl canvas_data::Pattern<'_> { - pub fn source(&self) -> raqote::Source { +pub fn source<'a>(pattern: &Pattern<'a>) -> raqote::Source<'a> { + match pattern { + Pattern::Color(a, r, g, b) => raqote::Source::Solid( + raqote::SolidSource::from_unpremultiplied_argb(*a, *r, *g, *b), + ), + Pattern::LinearGradient(pattern) => raqote::Source::new_linear_gradient( + pattern.gradient.clone(), + pattern.start, + pattern.end, + raqote::Spread::Pad, + ), + Pattern::RadialGradient(pattern) => raqote::Source::new_two_circle_radial_gradient( + pattern.gradient.clone(), + pattern.center1, + pattern.radius1, + pattern.center2, + pattern.radius2, + raqote::Spread::Pad, + ), + Pattern::Surface(pattern) => raqote::Source::Image( + pattern.image, + pattern.extend, + pattern.filter, + pattern.transform, + ), + } +} + +impl PatternHelpers for Pattern<'_> { + fn is_zero_size_gradient(&self) -> bool { match self { - canvas_data::Pattern::Raqote(pattern) => match pattern { - Pattern::Color(a, r, g, b) => raqote::Source::Solid( - raqote::SolidSource::from_unpremultiplied_argb(*a, *r, *g, *b), - ), - Pattern::LinearGradient(pattern) => raqote::Source::new_linear_gradient( - pattern.gradient.clone(), - pattern.start, - pattern.end, - raqote::Spread::Pad, - ), - Pattern::RadialGradient(pattern) => raqote::Source::new_two_circle_radial_gradient( - pattern.gradient.clone(), - pattern.center1, - pattern.radius1, - pattern.center2, - pattern.radius2, - raqote::Spread::Pad, - ), - Pattern::Surface(pattern) => raqote::Source::Image( - pattern.image, - pattern.extend, - pattern.filter, - pattern.transform, - ), + Pattern::RadialGradient(pattern) => { + let centers_equal = pattern.center1 == pattern.center2; + let radii_equal = pattern.radius1 == pattern.radius2; + (centers_equal && radii_equal) || pattern.gradient.stops.is_empty() }, + Pattern::LinearGradient(pattern) => { + (pattern.start == pattern.end) || pattern.gradient.stops.is_empty() + }, + Pattern::Color(..) | Pattern::Surface(..) => false, } } - pub fn is_zero_size_gradient(&self) -> bool { + + fn draw_rect(&self, rect: &Rect<f32>) -> Rect<f32> { match self { - canvas_data::Pattern::Raqote(pattern) => match pattern { - Pattern::RadialGradient(pattern) => { - let centers_equal = pattern.center1 == pattern.center2; - let radii_equal = pattern.radius1 == pattern.radius2; - (centers_equal && radii_equal) || pattern.gradient.stops.is_empty() - }, - Pattern::LinearGradient(pattern) => { - (pattern.start == pattern.end) || pattern.gradient.stops.is_empty() - }, - Pattern::Color(..) | Pattern::Surface(..) => false, + Pattern::Surface(pattern) => { + let pattern_rect = Rect::new(Point2D::origin(), pattern.size()); + let mut draw_rect = rect.intersection(&pattern_rect).unwrap_or(Rect::zero()); + + match pattern.repetition() { + Repetition::NoRepeat => { + draw_rect.size.width = draw_rect.size.width.min(pattern_rect.size.width); + draw_rect.size.height = draw_rect.size.height.min(pattern_rect.size.height); + }, + Repetition::RepeatX => { + draw_rect.size.width = rect.size.width; + draw_rect.size.height = draw_rect.size.height.min(pattern_rect.size.height); + }, + Repetition::RepeatY => { + draw_rect.size.height = rect.size.height; + draw_rect.size.width = draw_rect.size.width.min(pattern_rect.size.width); + }, + Repetition::Repeat => { + draw_rect = *rect; + }, + } + + draw_rect }, + Pattern::Color(..) | Pattern::LinearGradient(..) | Pattern::RadialGradient(..) => *rect, } } } -impl StrokeOptions { - pub fn set_line_width(&mut self, _val: f32) { - match self { - StrokeOptions::Raqote(options) => options.width = _val, - } - } - pub fn set_miter_limit(&mut self, _val: f32) { - match self { - StrokeOptions::Raqote(options) => options.miter_limit = _val, - } +impl StrokeOptionsHelpers for raqote::StrokeStyle { + fn set_line_width(&mut self, _val: f32) { + self.width = _val; } - pub fn set_line_join(&mut self, val: LineJoinStyle) { - match self { - StrokeOptions::Raqote(options) => options.join = val.to_raqote_style(), - } + fn set_miter_limit(&mut self, _val: f32) { + self.miter_limit = _val; } - pub fn set_line_cap(&mut self, val: LineCapStyle) { - match self { - StrokeOptions::Raqote(options) => options.cap = val.to_raqote_style(), - } + fn set_line_join(&mut self, val: LineJoinStyle) { + self.join = val.to_raqote_style(); } - pub fn set_line_dash(&mut self, items: Vec<f32>) { - match self { - StrokeOptions::Raqote(options) => options.dash_array = items, - } + fn set_line_cap(&mut self, val: LineCapStyle) { + self.cap = val.to_raqote_style(); } - pub fn set_line_dash_offset(&mut self, offset: f32) { - match self { - StrokeOptions::Raqote(options) => options.dash_offset = offset, - } + fn set_line_dash(&mut self, items: Vec<f32>) { + self.dash_array = items; } - pub fn as_raqote(&self) -> &raqote::StrokeStyle { - match self { - StrokeOptions::Raqote(options) => options, - } + fn set_line_dash_offset(&mut self, offset: f32) { + self.dash_offset = offset; } } -impl DrawOptions { - pub fn set_alpha(&mut self, val: f32) { - match self { - DrawOptions::Raqote(draw_options) => draw_options.alpha = val, - } - } - pub fn as_raqote(&self) -> &raqote::DrawOptions { - match self { - DrawOptions::Raqote(options) => options, - } - } - fn as_raqote_mut(&mut self) -> &mut raqote::DrawOptions { - match self { - DrawOptions::Raqote(options) => options, - } +impl DrawOptionsHelpers for raqote::DrawOptions { + fn set_alpha(&mut self, val: f32) { + self.alpha = val; } } -impl Path { - pub fn transformed_copy_to_builder( - &self, - transform: &Transform2D<f32>, - ) -> Box<dyn GenericPathBuilder> { - Box::new(PathBuilder(Some(raqote::PathBuilder::from( - self.as_raqote().clone().transform(transform), - )))) +impl PathHelpers<RaqoteBackend> for raqote::Path { + fn transformed_copy_to_builder(&self, transform: &Transform2D<f32>) -> PathBuilder { + PathBuilder(Some(raqote::PathBuilder::from( + self.clone().transform(transform), + ))) } - pub fn contains_point(&self, x: f64, y: f64, path_transform: &Transform2D<f32>) -> bool { - self.as_raqote() - .clone() + fn contains_point(&self, x: f64, y: f64, path_transform: &Transform2D<f32>) -> bool { + self.clone() .transform(path_transform) .contains_point(0.1, x as f32, y as f32) } - pub fn copy_to_builder(&self) -> Box<dyn GenericPathBuilder> { - Box::new(PathBuilder(Some(raqote::PathBuilder::from( - self.as_raqote().clone(), - )))) - } - - pub fn as_raqote(&self) -> &raqote::Path { - match self { - Path::Raqote(p) => p, - } + fn copy_to_builder(&self) -> PathBuilder { + PathBuilder(Some(raqote::PathBuilder::from(self.clone()))) } } @@ -373,7 +363,7 @@ fn create_gradient_stops(gradient_stops: Vec<CanvasGradientStop>) -> Vec<raqote: stops } -impl GenericDrawTarget for raqote::DrawTarget { +impl GenericDrawTarget<RaqoteBackend> for raqote::DrawTarget { fn clear_rect(&mut self, rect: &Rect<f32>) { let mut pb = raqote::PathBuilder::new(); pb.rect( @@ -385,59 +375,47 @@ impl GenericDrawTarget for raqote::DrawTarget { let mut options = raqote::DrawOptions::new(); options.blend_mode = raqote::BlendMode::Clear; let pattern = Pattern::Color(0, 0, 0, 0); - GenericDrawTarget::fill( - self, - &Path::Raqote(pb.finish()), - canvas_data::Pattern::Raqote(pattern), - &DrawOptions::Raqote(options), - ); + <Self as GenericDrawTarget<RaqoteBackend>>::fill(self, &pb.finish(), pattern, &options); } #[allow(unsafe_code)] fn copy_surface( &mut self, - surface: SourceSurface, + surface: <RaqoteBackend as Backend>::SourceSurface, source: Rect<i32>, destination: Point2D<i32>, ) { let mut dt = raqote::DrawTarget::new(source.size.width, source.size.height); - let data = surface.as_raqote(); + let data = surface; let s = unsafe { std::slice::from_raw_parts(data.as_ptr() as *const u32, data.len() / 4) }; dt.get_data_mut().copy_from_slice(s); raqote::DrawTarget::copy_surface(self, &dt, source.to_box2d(), destination); } - // TODO(pylbrecht) - // Somehow a duplicate of `create_gradient_stops()` with different types. - // It feels cumbersome to convert GradientStop back and forth just to use - // `create_gradient_stops()`, so I'll leave this here for now. - fn create_gradient_stops(&self, gradient_stops: Vec<GradientStop>) -> GradientStops { - let mut stops = gradient_stops - .into_iter() - .map(|item| *item.as_raqote()) - .collect::<Vec<raqote::GradientStop>>(); - // https://www.w3.org/html/test/results/2dcontext/annotated-spec/canvas.html#testrefs.2d.gradient.interpolate.overlap - stops.sort_by(|a, b| a.position.partial_cmp(&b.position).unwrap()); - GradientStops::Raqote(stops) - } - fn create_path_builder(&self) -> Box<dyn GenericPathBuilder> { - Box::new(PathBuilder::new()) + fn create_path_builder(&self) -> <RaqoteBackend as Backend>::PathBuilder { + PathBuilder::new() } - fn create_similar_draw_target(&self, size: &Size2D<i32>) -> Box<dyn GenericDrawTarget> { - Box::new(raqote::DrawTarget::new(size.width, size.height)) + fn create_similar_draw_target( + &self, + size: &Size2D<i32>, + ) -> <RaqoteBackend as Backend>::DrawTarget { + raqote::DrawTarget::new(size.width, size.height) } - fn create_source_surface_from_data(&self, data: &[u8]) -> Option<SourceSurface> { - Some(SourceSurface::Raqote(data.to_vec())) + fn create_source_surface_from_data( + &self, + data: &[u8], + ) -> Option<<RaqoteBackend as Backend>::SourceSurface> { + Some(data.to_vec()) } #[allow(unsafe_code)] fn draw_surface( &mut self, - surface: SourceSurface, + surface: <RaqoteBackend as Backend>::SourceSurface, dest: Rect<f64>, source: Rect<f64>, filter: Filter, - draw_options: &DrawOptions, + draw_options: &<RaqoteBackend as Backend>::DrawOptions, ) { - let surface_data = surface.as_raqote(); + let surface_data = surface; let image = raqote::Image { width: source.size.width as i32, height: source.size.height as i32, @@ -470,33 +448,29 @@ impl GenericDrawTarget for raqote::DrawTarget { dest.size.height as f32, ); - GenericDrawTarget::fill( - self, - &Path::Raqote(pb.finish()), - canvas_data::Pattern::Raqote(pattern), - draw_options, - ); + <Self as GenericDrawTarget<RaqoteBackend>>::fill(self, &pb.finish(), pattern, draw_options); } fn draw_surface_with_shadow( &self, - _surface: SourceSurface, + _surface: <RaqoteBackend as Backend>::SourceSurface, _dest: &Point2D<f32>, - _color: &Color, + _color: &<RaqoteBackend as Backend>::Color, _offset: &Vector2D<f32>, _sigma: f32, - _operator: CompositionOp, + _operator: <RaqoteBackend as Backend>::CompositionOp, ) { warn!("no support for drawing shadows"); } - fn fill(&mut self, path: &Path, pattern: canvas_data::Pattern, draw_options: &DrawOptions) { - match draw_options.as_raqote().blend_mode { + fn fill( + &mut self, + path: &<RaqoteBackend as Backend>::Path, + pattern: <RaqoteBackend as Backend>::Pattern<'_>, + draw_options: &<RaqoteBackend as Backend>::DrawOptions, + ) { + match draw_options.blend_mode { raqote::BlendMode::Src => { self.clear(raqote::SolidSource::from_unpremultiplied_argb(0, 0, 0, 0)); - self.fill( - path.as_raqote(), - &pattern.source(), - draw_options.as_raqote(), - ); + self.fill(path, &source(&pattern), draw_options); }, raqote::BlendMode::Clear | raqote::BlendMode::SrcAtop | @@ -505,26 +479,19 @@ impl GenericDrawTarget for raqote::DrawTarget { raqote::BlendMode::Xor | raqote::BlendMode::DstOver | raqote::BlendMode::SrcOver => { - self.fill( - path.as_raqote(), - &pattern.source(), - draw_options.as_raqote(), - ); + self.fill(path, &source(&pattern), draw_options); }, raqote::BlendMode::SrcIn | raqote::BlendMode::SrcOut | raqote::BlendMode::DstIn | raqote::BlendMode::DstAtop => { - let mut options = *draw_options.as_raqote(); + let mut options = *draw_options; self.push_layer_with_blend(1., options.blend_mode); options.blend_mode = raqote::BlendMode::SrcOver; - self.fill(path.as_raqote(), &pattern.source(), &options); + self.fill(path, &source(&pattern), &options); self.pop_layer(); }, - _ => warn!( - "unrecognized blend mode: {:?}", - draw_options.as_raqote().blend_mode - ), + _ => warn!("unrecognized blend mode: {:?}", draw_options.blend_mode), } } @@ -532,8 +499,8 @@ impl GenericDrawTarget for raqote::DrawTarget { &mut self, text_runs: Vec<TextRun>, start: Point2D<f32>, - pattern: &canvas_data::Pattern, - draw_options: &DrawOptions, + pattern: &<RaqoteBackend as Backend>::Pattern<'_>, + draw_options: &<RaqoteBackend as Backend>::DrawOptions, ) { let mut advance = 0.; for run in text_runs.iter() { @@ -581,8 +548,8 @@ impl GenericDrawTarget for raqote::DrawTarget { run.font.descriptor.pt_size.to_f32_px(), &ids, &positions, - &pattern.source(), - draw_options.as_raqote(), + &source(pattern), + draw_options, ); }) } @@ -591,8 +558,8 @@ impl GenericDrawTarget for raqote::DrawTarget { fn fill_rect( &mut self, rect: &Rect<f32>, - pattern: canvas_data::Pattern, - draw_options: Option<&DrawOptions>, + pattern: <RaqoteBackend as Backend>::Pattern<'_>, + draw_options: Option<&<RaqoteBackend as Backend>::DrawOptions>, ) { let mut pb = raqote::PathBuilder::new(); pb.rect( @@ -602,16 +569,16 @@ impl GenericDrawTarget for raqote::DrawTarget { rect.size.height, ); let draw_options = if let Some(options) = draw_options { - *options.as_raqote() + *options } else { raqote::DrawOptions::new() }; - GenericDrawTarget::fill( + <Self as GenericDrawTarget<RaqoteBackend>>::fill( self, - &Path::Raqote(pb.finish()), + &pb.finish(), pattern, - &DrawOptions::Raqote(draw_options), + &draw_options, ); } fn get_size(&self) -> Size2D<i32> { @@ -623,41 +590,36 @@ impl GenericDrawTarget for raqote::DrawTarget { fn pop_clip(&mut self) { self.pop_clip(); } - fn push_clip(&mut self, path: &Path) { - self.push_clip(path.as_raqote()); + fn push_clip(&mut self, path: &<RaqoteBackend as Backend>::Path) { + self.push_clip(path); } fn set_transform(&mut self, matrix: &Transform2D<f32>) { self.set_transform(matrix); } - fn snapshot(&self) -> SourceSurface { - SourceSurface::Raqote(self.snapshot_data().to_vec()) + fn surface(&self) -> <RaqoteBackend as Backend>::SourceSurface { + self.bytes().to_vec() } fn stroke( &mut self, - path: &Path, - pattern: canvas_data::Pattern, - stroke_options: &StrokeOptions, - draw_options: &DrawOptions, + path: &<RaqoteBackend as Backend>::Path, + pattern: Pattern<'_>, + stroke_options: &<RaqoteBackend as Backend>::StrokeOptions, + draw_options: &<RaqoteBackend as Backend>::DrawOptions, ) { - self.stroke( - path.as_raqote(), - &pattern.source(), - stroke_options.as_raqote(), - draw_options.as_raqote(), - ); + self.stroke(path, &source(&pattern), stroke_options, draw_options); } fn stroke_line( &mut self, start: Point2D<f32>, end: Point2D<f32>, - pattern: canvas_data::Pattern, - stroke_options: &StrokeOptions, - draw_options: &DrawOptions, + pattern: <RaqoteBackend as Backend>::Pattern<'_>, + stroke_options: &<RaqoteBackend as Backend>::StrokeOptions, + draw_options: &<RaqoteBackend as Backend>::DrawOptions, ) { let mut pb = raqote::PathBuilder::new(); pb.move_to(start.x, start.y); pb.line_to(end.x, end.y); - let mut stroke_options = stroke_options.as_raqote().clone(); + let mut stroke_options = stroke_options.clone(); let cap = match stroke_options.join { raqote::LineJoin::Round => raqote::LineCap::Round, _ => raqote::LineCap::Butt, @@ -666,17 +628,17 @@ impl GenericDrawTarget for raqote::DrawTarget { self.stroke( &pb.finish(), - &pattern.source(), + &source(&pattern), &stroke_options, - draw_options.as_raqote(), + draw_options, ); } fn stroke_rect( &mut self, rect: &Rect<f32>, - pattern: canvas_data::Pattern, - stroke_options: &StrokeOptions, - draw_options: &DrawOptions, + pattern: <RaqoteBackend as Backend>::Pattern<'_>, + stroke_options: &<RaqoteBackend as Backend>::StrokeOptions, + draw_options: &<RaqoteBackend as Backend>::DrawOptions, ) { let mut pb = raqote::PathBuilder::new(); pb.rect( @@ -688,13 +650,13 @@ impl GenericDrawTarget for raqote::DrawTarget { self.stroke( &pb.finish(), - &pattern.source(), - stroke_options.as_raqote(), - draw_options.as_raqote(), + &source(&pattern), + stroke_options, + draw_options, ); } #[allow(unsafe_code)] - fn snapshot_data(&self) -> &[u8] { + fn bytes(&self) -> &[u8] { let v = self.get_data(); unsafe { std::slice::from_raw_parts(v.as_ptr() as *const u8, std::mem::size_of_val(v)) } } @@ -709,7 +671,7 @@ impl Filter { } } -struct PathBuilder(Option<raqote::PathBuilder>); +pub(crate) struct PathBuilder(Option<raqote::PathBuilder>); impl PathBuilder { fn new() -> PathBuilder { @@ -717,7 +679,7 @@ impl PathBuilder { } } -impl GenericPathBuilder for PathBuilder { +impl GenericPathBuilder<RaqoteBackend> for PathBuilder { fn arc( &mut self, origin: Point2D<f32>, @@ -726,7 +688,8 @@ impl GenericPathBuilder for PathBuilder { end_angle: f32, anticlockwise: bool, ) { - self.ellipse( + <PathBuilder as GenericPathBuilder<RaqoteBackend>>::ellipse( + self, origin, radius, radius, @@ -736,6 +699,7 @@ impl GenericPathBuilder for PathBuilder { anticlockwise, ); } + fn bezier_curve_to( &mut self, control_point1: &Point2D<f32>, @@ -751,66 +715,10 @@ impl GenericPathBuilder for PathBuilder { control_point3.y, ); } + fn close(&mut self) { self.0.as_mut().unwrap().close(); } - fn ellipse( - &mut self, - origin: Point2D<f32>, - radius_x: f32, - radius_y: f32, - rotation_angle: f32, - start_angle: f32, - end_angle: f32, - anticlockwise: bool, - ) { - let mut start = Angle::radians(start_angle); - let mut end = Angle::radians(end_angle); - - // Wrap angles mod 2 * PI if necessary - if !anticlockwise && start > end + Angle::two_pi() || - anticlockwise && end > start + Angle::two_pi() - { - start = start.positive(); - end = end.positive(); - } - - // Calculate the total arc we're going to sweep. - let sweep = match anticlockwise { - true => { - if end - start == Angle::two_pi() { - -Angle::two_pi() - } else if end > start { - -(Angle::two_pi() - (end - start)) - } else { - -(start - end) - } - }, - false => { - if start - end == Angle::two_pi() { - Angle::two_pi() - } else if start > end { - Angle::two_pi() - (start - end) - } else { - end - start - } - }, - }; - - let arc: Arc<f32> = Arc { - center: origin, - radii: Vector2D::new(radius_x, radius_y), - start_angle: start, - sweep_angle: sweep, - x_rotation: Angle::radians(rotation_angle), - }; - - self.line_to(arc.from()); - - arc.for_each_quadratic_bezier(&mut |q| { - self.quadratic_curve_to(&q.ctrl, &q.to); - }); - } fn svg_arc( &mut self, @@ -840,9 +748,9 @@ impl GenericPathBuilder for PathBuilder { fn get_current_point(&mut self) -> Option<Point2D<f32>> { let path = self.finish(); - self.0 = Some(path.as_raqote().clone().into()); + self.0 = Some(path.clone().into()); - path.as_raqote().ops.iter().last().and_then(|op| match op { + path.ops.iter().last().and_then(|op| match op { PathOp::MoveTo(point) | PathOp::LineTo(point) => Some(Point2D::new(point.x, point.y)), PathOp::CubicTo(_, _, point) => Some(Point2D::new(point.x, point.y)), PathOp::QuadTo(_, point) => Some(Point2D::new(point.x, point.y)), @@ -864,8 +772,8 @@ impl GenericPathBuilder for PathBuilder { end_point.y, ); } - fn finish(&mut self) -> Path { - Path::Raqote(self.0.take().unwrap().finish()) + fn finish(&mut self) -> raqote::Path { + self.0.take().unwrap().finish() } } @@ -977,14 +885,6 @@ impl ToRaqotePattern<'_> for FillOrStrokeStyle { } } -impl Color { - fn as_raqote(&self) -> &raqote::SolidSource { - match self { - Color::Raqote(s) => s, - } - } -} - impl ToRaqoteStyle for AbsoluteColor { type Target = raqote::SolidSource; @@ -1054,19 +954,3 @@ impl ToRaqoteStyle for CompositionStyle { } } } - -impl SourceSurface { - fn as_raqote(&self) -> &Vec<u8> { - match self { - SourceSurface::Raqote(s) => s, - } - } -} - -impl GradientStop { - fn as_raqote(&self) -> &raqote::GradientStop { - match self { - GradientStop::Raqote(s) => s, - } - } -} diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 2175028a81b..ad89c435717 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -115,9 +115,10 @@ use constellation_traits::{ AuxiliaryWebViewCreationRequest, AuxiliaryWebViewCreationResponse, BroadcastMsg, DocumentState, EmbedderToConstellationMessage, IFrameLoadInfo, IFrameLoadInfoWithData, IFrameSandboxState, IFrameSizeMsg, Job, LoadData, LoadOrigin, LogEntry, MessagePortMsg, NavigationHistoryBehavior, - PaintMetricEvent, PortMessageTask, SWManagerMsg, SWManagerSenders, ScriptToConstellationChan, - ScriptToConstellationMessage, ScrollState, ServiceWorkerManagerFactory, ServiceWorkerMsg, - StructuredSerializedData, TraversalDirection, WindowSizeType, + PaintMetricEvent, PortMessageTask, PortTransferInfo, SWManagerMsg, SWManagerSenders, + ScriptToConstellationChan, ScriptToConstellationMessage, ScrollState, + ServiceWorkerManagerFactory, ServiceWorkerMsg, StructuredSerializedData, TraversalDirection, + WindowSizeType, }; use crossbeam_channel::{Receiver, Select, Sender, unbounded}; use devtools_traits::{ @@ -127,10 +128,10 @@ use devtools_traits::{ use embedder_traits::resources::{self, Resource}; use embedder_traits::user_content_manager::UserContentManager; use embedder_traits::{ - AnimationState, CompositorHitTestResult, Cursor, EmbedderMsg, EmbedderProxy, ImeEvent, - InputEvent, MediaSessionActionType, MediaSessionEvent, MediaSessionPlaybackState, MouseButton, - MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, WebDriverCommandMsg, - WebDriverLoadStatus, + AnimationState, CompositorHitTestResult, Cursor, EmbedderMsg, EmbedderProxy, + FocusSequenceNumber, ImeEvent, InputEvent, MediaSessionActionType, MediaSessionEvent, + MediaSessionPlaybackState, MouseButton, MouseButtonAction, MouseButtonEvent, Theme, + ViewportDetails, WebDriverCommandMsg, WebDriverLoadStatus, }; use euclid::Size2D; use euclid::default::Size2D as UntypedSize2D; @@ -202,9 +203,6 @@ enum TransferState { /// While a completion failed, another global requested to complete the transfer. /// We are still buffering messages, and awaiting the return of the buffer from the global who failed. CompletionRequested(MessagePortRouterId, VecDeque<PortMessageTask>), - /// The entangled port has been removed while the port was in-transfer, - /// the current port should be removed as well once it is managed again. - EntangledRemoved, } #[derive(Debug)] @@ -1043,6 +1041,44 @@ where } } + /// Enumerate the specified browsing context's ancestor pipelines up to + /// the top-level pipeline. + fn ancestor_pipelines_of_browsing_context_iter( + &self, + browsing_context_id: BrowsingContextId, + ) -> impl Iterator<Item = &Pipeline> + '_ { + let mut state: Option<PipelineId> = self + .browsing_contexts + .get(&browsing_context_id) + .and_then(|browsing_context| browsing_context.parent_pipeline_id); + std::iter::from_fn(move || { + if let Some(pipeline_id) = state { + let pipeline = self.pipelines.get(&pipeline_id)?; + let browsing_context = self.browsing_contexts.get(&pipeline.browsing_context_id)?; + state = browsing_context.parent_pipeline_id; + Some(pipeline) + } else { + None + } + }) + } + + /// Enumerate the specified browsing context's ancestor-or-self pipelines up + /// to the top-level pipeline. + fn ancestor_or_self_pipelines_of_browsing_context_iter( + &self, + browsing_context_id: BrowsingContextId, + ) -> impl Iterator<Item = &Pipeline> + '_ { + let this_pipeline = self + .browsing_contexts + .get(&browsing_context_id) + .map(|browsing_context| browsing_context.pipeline_id) + .and_then(|pipeline_id| self.pipelines.get(&pipeline_id)); + this_pipeline + .into_iter() + .chain(self.ancestor_pipelines_of_browsing_context_iter(browsing_context_id)) + } + /// Create a new browsing context and update the internal bookkeeping. #[allow(clippy::too_many_arguments)] fn new_browsing_context( @@ -1486,12 +1522,12 @@ where ScriptToConstellationMessage::NewMessagePort(router_id, port_id) => { self.handle_new_messageport(router_id, port_id); }, - ScriptToConstellationMessage::RemoveMessagePort(port_id) => { - self.handle_remove_messageport(port_id); - }, ScriptToConstellationMessage::EntanglePorts(port1, port2) => { self.handle_entangle_messageports(port1, port2); }, + ScriptToConstellationMessage::DisentanglePorts(port1, port2) => { + self.handle_disentangle_messageports(port1, port2); + }, ScriptToConstellationMessage::NewBroadcastChannelRouter( router_id, response_sender, @@ -1621,8 +1657,15 @@ where data, ); }, - ScriptToConstellationMessage::Focus => { - self.handle_focus_msg(source_pipeline_id); + ScriptToConstellationMessage::Focus(focused_child_browsing_context_id, sequence) => { + self.handle_focus_msg( + source_pipeline_id, + focused_child_browsing_context_id, + sequence, + ); + }, + ScriptToConstellationMessage::FocusRemoteDocument(focused_browsing_context_id) => { + self.handle_focus_remote_document_msg(focused_browsing_context_id); }, ScriptToConstellationMessage::SetThrottledComplete(throttled) => { self.handle_set_throttled_complete(source_pipeline_id, throttled); @@ -2072,17 +2115,6 @@ where Entry::Occupied(entry) => entry, }; match entry.get().state { - TransferState::EntangledRemoved => { - // If the entangled port has been removed while this one was in-transfer, - // remove it now. - if let Some(ipc_sender) = self.message_port_routers.get(&router_id) { - let _ = ipc_sender.send(MessagePortMsg::RemoveMessagePort(port_id)); - } else { - warn!("No message-port sender for {:?}", router_id); - } - entry.remove_entry(); - continue; - }, TransferState::CompletionInProgress(expected_router_id) => { // Here, the transfer was normally completed. @@ -2106,9 +2138,9 @@ where fn handle_message_port_transfer_failed( &mut self, - ports: HashMap<MessagePortId, VecDeque<PortMessageTask>>, + ports: HashMap<MessagePortId, PortTransferInfo>, ) { - for (port_id, mut previous_buffer) in ports.into_iter() { + for (port_id, mut transfer_info) in ports.into_iter() { let entry = match self.message_ports.remove(&port_id) { None => { warn!( @@ -2120,11 +2152,6 @@ where Some(entry) => entry, }; let new_info = match entry.state { - TransferState::EntangledRemoved => { - // If the entangled port has been removed while this one was in-transfer, - // just drop it. - continue; - }, TransferState::CompletionFailed(mut current_buffer) => { // The transfer failed, // and now the global has returned us the buffer we previously sent. @@ -2132,7 +2159,7 @@ where // Tasks in the previous buffer are older, // hence need to be added to the front of the current one. - while let Some(task) = previous_buffer.pop_back() { + while let Some(task) = transfer_info.port_message_queue.pop_back() { current_buffer.push_front(task); } // Update the state to transfer-in-progress. @@ -2151,7 +2178,7 @@ where // Tasks in the previous buffer are older, // hence need to be added to the front of the current one. - while let Some(task) = previous_buffer.pop_back() { + while let Some(task) = transfer_info.port_message_queue.pop_back() { current_buffer.push_front(task); } // Forward the buffered message-queue to complete the current transfer. @@ -2159,7 +2186,10 @@ where if ipc_sender .send(MessagePortMsg::CompletePendingTransfer( port_id, - current_buffer, + PortTransferInfo { + port_message_queue: current_buffer, + disentangled: entry.entangled_with.is_none(), + }, )) .is_err() { @@ -2206,18 +2236,14 @@ where Some(entry) => entry, }; let new_info = match entry.state { - TransferState::EntangledRemoved => { - // If the entangled port has been removed while this one was in-transfer, - // remove it now. - if let Some(ipc_sender) = self.message_port_routers.get(&router_id) { - let _ = ipc_sender.send(MessagePortMsg::RemoveMessagePort(port_id)); - } else { - warn!("No message-port sender for {:?}", router_id); - } - continue; - }, TransferState::TransferInProgress(buffer) => { - response.insert(port_id, buffer); + response.insert( + port_id, + PortTransferInfo { + port_message_queue: buffer, + disentangled: entry.entangled_with.is_none(), + }, + ); // If the port was in transfer, and a global is requesting completion, // we note the start of the completion. @@ -2296,10 +2322,6 @@ where TransferState::TransferInProgress(queue) => queue.push_back(task), TransferState::CompletionFailed(queue) => queue.push_back(task), TransferState::CompletionRequested(_, queue) => queue.push_back(task), - TransferState::EntangledRemoved => warn!( - "Messageport received a message, but entangled has alread been removed {:?}", - port_id - ), } } @@ -2365,59 +2387,6 @@ where feature = "tracing", tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace") )] - fn handle_remove_messageport(&mut self, port_id: MessagePortId) { - let entangled = match self.message_ports.remove(&port_id) { - Some(info) => info.entangled_with, - None => { - return warn!( - "Constellation asked to remove unknown messageport {:?}", - port_id - ); - }, - }; - let entangled_id = match entangled { - Some(id) => id, - None => return, - }; - let info = match self.message_ports.get_mut(&entangled_id) { - Some(info) => info, - None => { - return warn!( - "Constellation asked to remove unknown entangled messageport {:?}", - entangled_id - ); - }, - }; - let router_id = match info.state { - TransferState::EntangledRemoved => { - return warn!( - "Constellation asked to remove entangled messageport by a port that was already removed {:?}", - port_id - ); - }, - TransferState::TransferInProgress(_) | - TransferState::CompletionInProgress(_) | - TransferState::CompletionFailed(_) | - TransferState::CompletionRequested(_, _) => { - // Note: since the port is in-transer, we don't have a router to send it a message - // to let it know that its entangled port has been removed. - // Hence we mark it so that it will be messaged and removed once the transfer completes. - info.state = TransferState::EntangledRemoved; - return; - }, - TransferState::Managed(router_id) => router_id, - }; - if let Some(sender) = self.message_port_routers.get(&router_id) { - let _ = sender.send(MessagePortMsg::RemoveMessagePort(entangled_id)); - } else { - warn!("No message-port sender for {:?}", router_id); - } - } - - #[cfg_attr( - feature = "tracing", - tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace") - )] fn handle_entangle_messageports(&mut self, port1: MessagePortId, port2: MessagePortId) { if let Some(info) = self.message_ports.get_mut(&port1) { info.entangled_with = Some(port2); @@ -2437,6 +2406,57 @@ where } } + #[cfg_attr( + feature = "tracing", + tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace") + )] + /// <https://html.spec.whatwg.org/multipage/#disentangle> + fn handle_disentangle_messageports( + &mut self, + port1: MessagePortId, + port2: Option<MessagePortId>, + ) { + // Disentangle initiatorPort and otherPort, + // so that they are no longer entangled or associated with each other. + // Note: If `port2` is some, then this is the first message + // and `port1` is the initiatorPort, `port2` is the otherPort. + // We can immediately remove the initiator. + let _ = self.message_ports.remove(&port1); + + // Note: the none case is when otherPort sent this message + // in response to completing its own local disentanglement. + let Some(port2) = port2 else { + return; + }; + + // Start disentanglement of the other port. + if let Some(info) = self.message_ports.get_mut(&port2) { + info.entangled_with = None; + match &mut info.state { + TransferState::Managed(router_id) | + TransferState::CompletionInProgress(router_id) => { + // We try to disentangle the other port now, + // and if it has been transfered out by the time the message is received, + // it will be ignored, + // and disentanglement will be completed as part of the transfer. + if let Some(ipc_sender) = self.message_port_routers.get(router_id) { + let _ = ipc_sender.send(MessagePortMsg::CompleteDisentanglement(port2)); + } else { + warn!("No message-port sender for {:?}", router_id); + } + }, + _ => { + // Note: the port is in transfer, disentanglement will complete along with it. + }, + } + } else { + warn!( + "Constellation asked to disentangle unknown messageport: {:?}", + port2 + ); + } + } + /// <https://w3c.github.io/ServiceWorker/#schedule-job-algorithm> /// and /// <https://w3c.github.io/ServiceWorker/#dfn-job-queue> @@ -4070,6 +4090,7 @@ where } new_pipeline.set_throttled(false); + self.notify_focus_state(new_pipeline_id); } self.update_activity(old_pipeline_id); @@ -4275,66 +4296,231 @@ where feature = "tracing", tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace") )] - fn handle_focus_msg(&mut self, pipeline_id: PipelineId) { - let (browsing_context_id, webview_id) = match self.pipelines.get(&pipeline_id) { - Some(pipeline) => (pipeline.browsing_context_id, pipeline.webview_id), + fn handle_focus_msg( + &mut self, + pipeline_id: PipelineId, + focused_child_browsing_context_id: Option<BrowsingContextId>, + sequence: FocusSequenceNumber, + ) { + let (browsing_context_id, webview_id) = match self.pipelines.get_mut(&pipeline_id) { + Some(pipeline) => { + pipeline.focus_sequence = sequence; + (pipeline.browsing_context_id, pipeline.webview_id) + }, None => return warn!("{}: Focus parent after closure", pipeline_id), }; + // Ignore if the pipeline isn't fully active. + if self.get_activity(pipeline_id) != DocumentActivity::FullyActive { + debug!( + "Ignoring the focus request because pipeline {} is not \ + fully active", + pipeline_id + ); + return; + } + // Focus the top-level browsing context. self.webviews.focus(webview_id); self.embedder_proxy .send(EmbedderMsg::WebViewFocused(webview_id)); - // Update the webview’s focused browsing context. - match self.webviews.get_mut(webview_id) { - Some(webview) => { - webview.focused_browsing_context_id = browsing_context_id; - }, - None => { - return warn!( - "{}: Browsing context for focus msg does not exist", - webview_id - ); - }, + // If a container with a non-null nested browsing context is focused, + // the nested browsing context's active document becomes the focused + // area of the top-level browsing context instead. + let focused_browsing_context_id = + focused_child_browsing_context_id.unwrap_or(browsing_context_id); + + // Send focus messages to the affected pipelines, except + // `pipeline_id`, which has already its local focus state + // updated. + self.focus_browsing_context(Some(pipeline_id), focused_browsing_context_id); + } + + fn handle_focus_remote_document_msg(&mut self, focused_browsing_context_id: BrowsingContextId) { + let pipeline_id = match self.browsing_contexts.get(&focused_browsing_context_id) { + Some(browsing_context) => browsing_context.pipeline_id, + None => return warn!("Browsing context {} not found", focused_browsing_context_id), }; - // Focus parent iframes recursively - self.focus_parent_pipeline(browsing_context_id); + // Ignore if its active document isn't fully active. + if self.get_activity(pipeline_id) != DocumentActivity::FullyActive { + debug!( + "Ignoring the remote focus request because pipeline {} of \ + browsing context {} is not fully active", + pipeline_id, focused_browsing_context_id, + ); + return; + } + + self.focus_browsing_context(None, focused_browsing_context_id); } + /// Perform [the focusing steps][1] for the active document of + /// `focused_browsing_context_id`. + /// + /// If `initiator_pipeline_id` is specified, this method avoids sending + /// a message to `initiator_pipeline_id`, assuming its local focus state has + /// already been updated. This is necessary for performing the focusing + /// steps for an object that is not the document itself but something that + /// belongs to the document. + /// + /// [1]: https://html.spec.whatwg.org/multipage/#focusing-steps #[cfg_attr( feature = "tracing", tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace") )] - fn focus_parent_pipeline(&mut self, browsing_context_id: BrowsingContextId) { - let parent_pipeline_id = match self.browsing_contexts.get(&browsing_context_id) { - Some(ctx) => ctx.parent_pipeline_id, - None => { - return warn!("{}: Focus parent after closure", browsing_context_id); - }, + fn focus_browsing_context( + &mut self, + initiator_pipeline_id: Option<PipelineId>, + focused_browsing_context_id: BrowsingContextId, + ) { + let webview_id = match self.browsing_contexts.get(&focused_browsing_context_id) { + Some(browsing_context) => browsing_context.top_level_id, + None => return warn!("Browsing context {} not found", focused_browsing_context_id), }; - let parent_pipeline_id = match parent_pipeline_id { - Some(parent_id) => parent_id, + + // Update the webview’s focused browsing context. + let old_focused_browsing_context_id = match self.webviews.get_mut(webview_id) { + Some(browser) => replace( + &mut browser.focused_browsing_context_id, + focused_browsing_context_id, + ), None => { - return debug!("{}: Focus has no parent", browsing_context_id); + return warn!( + "{}: Browsing context for focus msg does not exist", + webview_id + ); }, }; - // Send a message to the parent of the provided browsing context (if it - // exists) telling it to mark the iframe element as focused. - let msg = ScriptThreadMessage::FocusIFrame(parent_pipeline_id, browsing_context_id); - let (result, parent_browsing_context_id) = match self.pipelines.get(&parent_pipeline_id) { - Some(pipeline) => { - let result = pipeline.event_loop.send(msg); - (result, pipeline.browsing_context_id) + // The following part is similar to [the focus update steps][1] except + // that only `Document`s in the given focus chains are considered. It's + // ultimately up to the script threads to fire focus events at the + // affected objects. + // + // [1]: https://html.spec.whatwg.org/multipage/#focus-update-steps + let mut old_focus_chain_pipelines: Vec<&Pipeline> = self + .ancestor_or_self_pipelines_of_browsing_context_iter(old_focused_browsing_context_id) + .collect(); + let mut new_focus_chain_pipelines: Vec<&Pipeline> = self + .ancestor_or_self_pipelines_of_browsing_context_iter(focused_browsing_context_id) + .collect(); + + debug!( + "old_focus_chain_pipelines = {:?}", + old_focus_chain_pipelines + .iter() + .map(|p| p.id.to_string()) + .collect::<Vec<_>>() + ); + debug!( + "new_focus_chain_pipelines = {:?}", + new_focus_chain_pipelines + .iter() + .map(|p| p.id.to_string()) + .collect::<Vec<_>>() + ); + + // At least the last entries should match. Otherwise something is wrong, + // and we don't want to proceed and crash the top-level pipeline by + // sending an impossible `Unfocus` message to it. + match ( + &old_focus_chain_pipelines[..], + &new_focus_chain_pipelines[..], + ) { + ([.., p1], [.., p2]) if p1.id == p2.id => {}, + _ => { + warn!("Aborting the focus operation - focus chain sanity check failed"); + return; }, - None => return warn!("{}: Focus after closure", parent_pipeline_id), - }; - if let Err(e) = result { - self.handle_send_error(parent_pipeline_id, e); } - self.focus_parent_pipeline(parent_browsing_context_id); + + // > If the last entry in `old chain` and the last entry in `new chain` + // > are the same, pop the last entry from `old chain` and the last + // > entry from `new chain` and redo this step. + let mut first_common_pipeline_in_chain = None; + while let ([.., p1], [.., p2]) = ( + &old_focus_chain_pipelines[..], + &new_focus_chain_pipelines[..], + ) { + if p1.id != p2.id { + break; + } + old_focus_chain_pipelines.pop(); + first_common_pipeline_in_chain = new_focus_chain_pipelines.pop(); + } + + let mut send_errors = Vec::new(); + + // > For each entry `entry` in `old chain`, in order, run these + // > substeps: [...] + for &pipeline in old_focus_chain_pipelines.iter() { + if Some(pipeline.id) != initiator_pipeline_id { + let msg = ScriptThreadMessage::Unfocus(pipeline.id, pipeline.focus_sequence); + trace!("Sending {:?} to {}", msg, pipeline.id); + if let Err(e) = pipeline.event_loop.send(msg) { + send_errors.push((pipeline.id, e)); + } + } else { + trace!( + "Not notifying {} - it's the initiator of this focus operation", + pipeline.id + ); + } + } + + // > For each entry entry in `new chain`, in reverse order, run these + // > substeps: [...] + let mut child_browsing_context_id = None; + for &pipeline in new_focus_chain_pipelines.iter().rev() { + // Don't send a message to the browsing context that initiated this + // focus operation. It already knows that it has gotten focus. + if Some(pipeline.id) != initiator_pipeline_id { + let msg = if let Some(child_browsing_context_id) = child_browsing_context_id { + // Focus the container element of `child_browsing_context_id`. + ScriptThreadMessage::FocusIFrame( + pipeline.id, + child_browsing_context_id, + pipeline.focus_sequence, + ) + } else { + // Focus the document. + ScriptThreadMessage::FocusDocument(pipeline.id, pipeline.focus_sequence) + }; + trace!("Sending {:?} to {}", msg, pipeline.id); + if let Err(e) = pipeline.event_loop.send(msg) { + send_errors.push((pipeline.id, e)); + } + } else { + trace!( + "Not notifying {} - it's the initiator of this focus operation", + pipeline.id + ); + } + child_browsing_context_id = Some(pipeline.browsing_context_id); + } + + if let (Some(pipeline), Some(child_browsing_context_id)) = + (first_common_pipeline_in_chain, child_browsing_context_id) + { + if Some(pipeline.id) != initiator_pipeline_id { + // Focus the container element of `child_browsing_context_id`. + let msg = ScriptThreadMessage::FocusIFrame( + pipeline.id, + child_browsing_context_id, + pipeline.focus_sequence, + ); + trace!("Sending {:?} to {}", msg, pipeline.id); + if let Err(e) = pipeline.event_loop.send(msg) { + send_errors.push((pipeline.id, e)); + } + } + } + + for (pipeline_id, e) in send_errors { + self.handle_send_error(pipeline_id, e); + } } #[cfg_attr( @@ -4929,10 +5115,42 @@ where self.trim_history(top_level_id); } + self.notify_focus_state(change.new_pipeline_id); + self.notify_history_changed(change.webview_id); self.update_webview_in_compositor(change.webview_id); } + /// Update the focus state of the specified pipeline that recently became + /// active (thus doesn't have a focused container element) and may have + /// out-dated information. + fn notify_focus_state(&mut self, pipeline_id: PipelineId) { + let pipeline = match self.pipelines.get(&pipeline_id) { + Some(pipeline) => pipeline, + None => return warn!("Pipeline {} is closed", pipeline_id), + }; + + let is_focused = match self.webviews.get(pipeline.webview_id) { + Some(webview) => webview.focused_browsing_context_id == pipeline.browsing_context_id, + None => { + return warn!( + "Pipeline {}'s top-level browsing context {} is closed", + pipeline_id, pipeline.webview_id + ); + }, + }; + + // If the browsing context is focused, focus the document + let msg = if is_focused { + ScriptThreadMessage::FocusDocument(pipeline_id, pipeline.focus_sequence) + } else { + ScriptThreadMessage::Unfocus(pipeline_id, pipeline.focus_sequence) + }; + if let Err(e) = pipeline.event_loop.send(msg) { + self.handle_send_error(pipeline_id, e); + } + } + #[cfg_attr( feature = "tracing", tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace") @@ -5382,7 +5600,29 @@ where None => { warn!("{parent_pipeline_id}: Child closed after parent"); }, - Some(parent_pipeline) => parent_pipeline.remove_child(browsing_context_id), + Some(parent_pipeline) => { + parent_pipeline.remove_child(browsing_context_id); + + // If `browsing_context_id` has focus, focus the parent + // browsing context + if let Some(webview) = self.webviews.get_mut(browsing_context.top_level_id) { + if webview.focused_browsing_context_id == browsing_context_id { + trace!( + "About-to-be-closed browsing context {} is currently focused, so \ + focusing its parent {}", + browsing_context_id, parent_pipeline.browsing_context_id + ); + webview.focused_browsing_context_id = + parent_pipeline.browsing_context_id; + } + } else { + warn!( + "Browsing context {} contains a reference to \ + a non-existent top-level browsing context {}", + browsing_context_id, browsing_context.top_level_id + ); + } + }, }; } debug!("{}: Closed", browsing_context_id); diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs index 2e139578ffe..556ef9bd60f 100644 --- a/components/constellation/pipeline.rs +++ b/components/constellation/pipeline.rs @@ -25,7 +25,7 @@ use constellation_traits::{LoadData, SWManagerMsg, ScriptToConstellationChan}; use crossbeam_channel::{Sender, unbounded}; use devtools_traits::{DevtoolsControlMsg, ScriptToDevtoolsControlMsg}; use embedder_traits::user_content_manager::UserContentManager; -use embedder_traits::{AnimationState, ViewportDetails}; +use embedder_traits::{AnimationState, FocusSequenceNumber, ViewportDetails}; use fonts::{SystemFontServiceProxy, SystemFontServiceProxySender}; use ipc_channel::Error; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; @@ -102,6 +102,8 @@ pub struct Pipeline { /// The last compositor [`Epoch`] that was laid out in this pipeline if "exit after load" is /// enabled. pub layout_epoch: Epoch, + + pub focus_sequence: FocusSequenceNumber, } /// Initial setup data needed to construct a pipeline. @@ -370,6 +372,7 @@ impl Pipeline { completely_loaded: false, title: String::new(), layout_epoch: Epoch(0), + focus_sequence: FocusSequenceNumber::default(), }; pipeline.set_throttled(throttled); diff --git a/components/constellation/tracing.rs b/components/constellation/tracing.rs index a939bbafc48..eff7f755c6b 100644 --- a/components/constellation/tracing.rs +++ b/components/constellation/tracing.rs @@ -123,8 +123,8 @@ mod from_script { Self::RemoveMessagePortRouter(..) => target!("RemoveMessagePortRouter"), Self::RerouteMessagePort(..) => target!("RerouteMessagePort"), Self::MessagePortShipped(..) => target!("MessagePortShipped"), - Self::RemoveMessagePort(..) => target!("RemoveMessagePort"), Self::EntanglePorts(..) => target!("EntanglePorts"), + Self::DisentanglePorts(..) => target!("DisentanglePorts"), Self::NewBroadcastChannelRouter(..) => target!("NewBroadcastChannelRouter"), Self::RemoveBroadcastChannelRouter(..) => target!("RemoveBroadcastChannelRouter"), Self::NewBroadcastChannelNameInRouter(..) => { @@ -138,7 +138,8 @@ mod from_script { Self::BroadcastStorageEvent(..) => target!("BroadcastStorageEvent"), Self::ChangeRunningAnimationsState(..) => target!("ChangeRunningAnimationsState"), Self::CreateCanvasPaintThread(..) => target!("CreateCanvasPaintThread"), - Self::Focus => target!("Focus"), + Self::Focus(..) => target!("Focus"), + Self::FocusRemoteDocument(..) => target!("FocusRemoteDocument"), Self::GetTopForBrowsingContext(..) => target!("GetTopForBrowsingContext"), Self::GetBrowsingContextInfo(..) => target!("GetBrowsingContextInfo"), Self::GetChildBrowsingContextId(..) => target!("GetChildBrowsingContextId"), diff --git a/components/devtools/actors/inspector/node.rs b/components/devtools/actors/inspector/node.rs index 10ff9801844..a731f15b2d8 100644 --- a/components/devtools/actors/inspector/node.rs +++ b/components/devtools/actors/inspector/node.rs @@ -78,6 +78,18 @@ pub struct NodeActorMsg { shadow_root_mode: Option<String>, traits: HashMap<String, ()>, attrs: Vec<AttrMsg>, + + /// The `DOCTYPE` name if this is a `DocumentType` node, `None` otherwise + #[serde(skip_serializing_if = "Option::is_none")] + name: Option<String>, + + /// The `DOCTYPE` public identifier if this is a `DocumentType` node, `None` otherwise + #[serde(skip_serializing_if = "Option::is_none")] + public_id: Option<String>, + + /// The `DOCTYPE` system identifier if this is a `DocumentType` node, `None` otherwise + #[serde(skip_serializing_if = "Option::is_none")] + system_id: Option<String>, } pub struct NodeActor { @@ -276,6 +288,9 @@ impl NodeInfoToProtocol for NodeInfo { value: attr.value, }) .collect(), + name: self.doctype_name, + public_id: self.doctype_public_identifier, + system_id: self.doctype_system_identifier, } } } diff --git a/components/layout/dom.rs b/components/layout/dom.rs index add4b3ac2d5..8f2697e670a 100644 --- a/components/layout/dom.rs +++ b/components/layout/dom.rs @@ -15,8 +15,7 @@ use script_layout_interface::wrapper_traits::{ LayoutDataTrait, LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode, }; use script_layout_interface::{ - GenericLayoutDataTrait, HTMLCanvasDataSource, LayoutElementType, - LayoutNodeType as ScriptLayoutNodeType, + GenericLayoutDataTrait, LayoutElementType, LayoutNodeType as ScriptLayoutNodeType, }; use servo_arc::Arc as ServoArc; use style::properties::ComputedValues; @@ -29,7 +28,7 @@ use crate::flow::BlockLevelBox; use crate::flow::inline::InlineItem; use crate::fragment_tree::Fragment; use crate::geom::PhysicalSize; -use crate::replaced::{CanvasInfo, CanvasSource}; +use crate::replaced::CanvasInfo; use crate::table::TableLevelBox; use crate::taffy::TaffyItemBox; @@ -220,12 +219,7 @@ where fn as_canvas(self) -> Option<(CanvasInfo, PhysicalSize<f64>)> { let node = self.to_threadsafe(); let canvas_data = node.canvas_data()?; - let source = match canvas_data.source { - HTMLCanvasDataSource::WebGL(texture_id) => CanvasSource::WebGL(texture_id), - HTMLCanvasDataSource::Image(image_key) => CanvasSource::Image(image_key), - HTMLCanvasDataSource::WebGPU(image_key) => CanvasSource::WebGPU(image_key), - HTMLCanvasDataSource::Empty => CanvasSource::Empty, - }; + let source = canvas_data.source; Some(( CanvasInfo { source }, PhysicalSize::new(canvas_data.width.into(), canvas_data.height.into()), diff --git a/components/layout/flexbox/layout.rs b/components/layout/flexbox/layout.rs index 77069236787..a5540123681 100644 --- a/components/layout/flexbox/layout.rs +++ b/components/layout/flexbox/layout.rs @@ -1774,7 +1774,9 @@ impl FlexItem<'_> { non_stretch_layout_result: Option<&mut FlexItemLayoutResult>, ) -> Option<FlexItemLayoutResult> { let containing_block = flex_context.containing_block; - let mut positioning_context = PositioningContext::new_for_style(self.box_.style()) + let independent_formatting_context = &self.box_.independent_formatting_context; + let mut positioning_context = independent_formatting_context + .new_positioning_context() .unwrap_or_else(|| { PositioningContext::new_for_subtree( flex_context @@ -1783,7 +1785,6 @@ impl FlexItem<'_> { ) }); - let independent_formatting_context = &self.box_.independent_formatting_context; let item_writing_mode = independent_formatting_context.style().writing_mode; let item_is_horizontal = item_writing_mode.is_horizontal(); let flex_axis = flex_context.config.flex_axis; @@ -2616,7 +2617,9 @@ impl FlexItemBox { cross_size_stretches_to_container_size: bool, intrinsic_sizing_mode: IntrinsicSizingMode, ) -> Au { - let mut positioning_context = PositioningContext::new_for_style(self.style()) + let mut positioning_context = self + .independent_formatting_context + .new_positioning_context() .unwrap_or_else(|| { PositioningContext::new_for_subtree( flex_context diff --git a/components/layout/flow/float.rs b/components/layout/flow/float.rs index 0570ce0d0f4..dbc50c07603 100644 --- a/components/layout/flow/float.rs +++ b/components/layout/flow/float.rs @@ -913,11 +913,10 @@ impl FloatBox { positioning_context: &mut PositioningContext, containing_block: &ContainingBlock, ) -> BoxFragment { - let style = self.contents.style().clone(); positioning_context.layout_maybe_position_relative_fragment( layout_context, containing_block, - &style, + &self.contents.base, |positioning_context| { self.contents .layout_float_or_atomic_inline( diff --git a/components/layout/flow/inline/line.rs b/components/layout/flow/inline/line.rs index c42f32c9242..e65eaed2367 100644 --- a/components/layout/flow/inline/line.rs +++ b/components/layout/flow/inline/line.rs @@ -326,13 +326,12 @@ impl LineItemLayout<'_, '_> { let inline_box = self.layout.ifc.inline_boxes.get(identifier); let inline_box = &*(inline_box.borrow()); - let style = &inline_box.base.style; let space_above_baseline = inline_box_state.calculate_space_above_baseline(); let block_start_offset = self.calculate_inline_box_block_start(inline_box_state, space_above_baseline); let positioning_context_or_start_offset_in_parent = - match PositioningContext::new_for_style(style) { + match inline_box.base.new_positioning_context() { Some(positioning_context) => Either::Left(positioning_context), None => Either::Right(self.current_positioning_context_mut().len()), }; diff --git a/components/layout/flow/inline/mod.rs b/components/layout/flow/inline/mod.rs index dabb9773410..25fbaa324b1 100644 --- a/components/layout/flow/inline/mod.rs +++ b/components/layout/flow/inline/mod.rs @@ -2004,7 +2004,8 @@ impl IndependentFormattingContext { bidi_level: Level, ) { // We need to know the inline size of the atomic before deciding whether to do the line break. - let mut child_positioning_context = PositioningContext::new_for_style(self.style()) + let mut child_positioning_context = self + .new_positioning_context() .unwrap_or_else(|| PositioningContext::new_for_subtree(true)); let IndependentFloatOrAtomicLayoutResult { mut fragment, diff --git a/components/layout/flow/mod.rs b/components/layout/flow/mod.rs index d983e8592c4..983282dc389 100644 --- a/components/layout/flow/mod.rs +++ b/components/layout/flow/mod.rs @@ -779,7 +779,7 @@ impl BlockLevelBox { ArcRefCell::new(positioning_context.layout_maybe_position_relative_fragment( layout_context, containing_block, - &base.style, + base, |positioning_context| { layout_in_flow_non_replaced_block_level_same_formatting_context( layout_context, @@ -798,7 +798,7 @@ impl BlockLevelBox { positioning_context.layout_maybe_position_relative_fragment( layout_context, containing_block, - independent.style(), + &independent.base, |positioning_context| { independent.layout_in_flow_block_level( layout_context, diff --git a/components/layout/positioned.rs b/components/layout/positioned.rs index 5f08e4e86c5..6bfe2af87ef 100644 --- a/components/layout/positioned.rs +++ b/components/layout/positioned.rs @@ -29,6 +29,7 @@ use crate::geom::{ PhysicalPoint, PhysicalRect, PhysicalSides, PhysicalSize, PhysicalVec, Size, Sizes, ToLogical, ToLogicalWithContainingBlock, }; +use crate::layout_box_base::LayoutBoxBase; use crate::sizing::ContentSizes; use crate::style_ext::{Clamp, ComputedValuesExt, ContentBoxSizesAndPBM, DisplayInside}; use crate::{ @@ -103,6 +104,20 @@ impl AbsolutelyPositionedBox { } } +impl IndependentFormattingContext { + #[inline] + pub(crate) fn new_positioning_context(&self) -> Option<PositioningContext> { + self.base.new_positioning_context() + } +} + +impl LayoutBoxBase { + #[inline] + pub(crate) fn new_positioning_context(&self) -> Option<PositioningContext> { + PositioningContext::new_for_style(&self.style, &self.base_fragment_info.flags) + } +} + impl PositioningContext { pub(crate) fn new_for_containing_block_for_all_descendants() -> Self { Self { @@ -130,14 +145,10 @@ impl PositioningContext { self.for_nearest_positioned_ancestor.is_some() } - pub(crate) fn new_for_style(style: &ComputedValues) -> Option<Self> { - // NB: We never make PositioningContexts for replaced elements, which is why we always - // pass false here. - if style.establishes_containing_block_for_all_descendants(FragmentFlags::empty()) { + fn new_for_style(style: &ComputedValues, flags: &FragmentFlags) -> Option<Self> { + if style.establishes_containing_block_for_all_descendants(*flags) { Some(Self::new_for_containing_block_for_all_descendants()) - } else if style - .establishes_containing_block_for_absolute_descendants(FragmentFlags::empty()) - { + } else if style.establishes_containing_block_for_absolute_descendants(*flags) { Some(Self { for_nearest_positioned_ancestor: Some(Vec::new()), for_nearest_containing_block_for_all_descendants: Vec::new(), @@ -213,12 +224,12 @@ impl PositioningContext { &mut self, layout_context: &LayoutContext, containing_block: &ContainingBlock, - style: &ComputedValues, + base: &LayoutBoxBase, fragment_layout_fn: impl FnOnce(&mut Self) -> BoxFragment, ) -> BoxFragment { // Try to create a context, but if one isn't necessary, simply create the fragment // using the given closure and the current `PositioningContext`. - let mut new_context = match Self::new_for_style(style) { + let mut new_context = match base.new_positioning_context() { Some(new_context) => new_context, None => return fragment_layout_fn(self), }; @@ -229,9 +240,8 @@ impl PositioningContext { // If the new context has any hoisted boxes for the nearest containing block for // pass them up the tree. self.append(new_context); - - if style.clone_position() == Position::Relative { - new_fragment.content_rect.origin += relative_adjustement(style, containing_block) + if base.style.clone_position() == Position::Relative { + new_fragment.content_rect.origin += relative_adjustement(&base.style, containing_block) .to_physical_vector(containing_block.style.writing_mode) } @@ -586,7 +596,7 @@ impl HoistedAbsolutelyPositionedBox { .sizes })); - let mut positioning_context = PositioningContext::new_for_style(&style).unwrap(); + let mut positioning_context = context.new_positioning_context().unwrap(); let mut new_fragment = { let content_size: LogicalVec2<Au>; let fragments; diff --git a/components/layout/replaced.rs b/components/layout/replaced.rs index b82fb947074..bbebc57aa97 100644 --- a/components/layout/replaced.rs +++ b/components/layout/replaced.rs @@ -3,7 +3,6 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use std::cell::LazyCell; -use std::fmt; use std::sync::Arc; use app_units::Au; @@ -96,33 +95,9 @@ impl NaturalSizes { } } -#[derive(MallocSizeOf)] -pub(crate) enum CanvasSource { - WebGL(ImageKey), - Image(ImageKey), - WebGPU(ImageKey), - /// transparent black - Empty, -} - -impl fmt::Debug for CanvasSource { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!( - f, - "{}", - match *self { - CanvasSource::WebGL(_) => "WebGL", - CanvasSource::Image(_) => "Image", - CanvasSource::WebGPU(_) => "WebGPU", - CanvasSource::Empty => "Empty", - } - ) - } -} - #[derive(Debug, MallocSizeOf)] pub(crate) struct CanvasInfo { - pub source: CanvasSource, + pub source: Option<ImageKey>, } #[derive(Debug, MallocSizeOf)] @@ -388,12 +363,10 @@ impl ReplacedContents { return vec![]; } - let image_key = match canvas_info.source { - CanvasSource::WebGL(image_key) => image_key, - CanvasSource::WebGPU(image_key) => image_key, - CanvasSource::Image(image_key) => image_key, - CanvasSource::Empty => return vec![], + let Some(image_key) = canvas_info.source else { + return vec![]; }; + vec![Fragment::Image(ArcRefCell::new(ImageFragment { base: self.base_fragment_info.into(), style: style.clone(), diff --git a/components/layout/style_ext.rs b/components/layout/style_ext.rs index 33a22cdf438..023db6b07f1 100644 --- a/components/layout/style_ext.rs +++ b/components/layout/style_ext.rs @@ -845,9 +845,9 @@ impl ComputedValuesExt for ComputedValues { // > A value other than none for the filter property results in the creation of a containing // > block for absolute and fixed positioned descendants unless the element it applies to is // > a document root element in the current browsing context. - // FIXME(#35391): Need to check if this is the root element. - if !self.get_effects().filter.0.is_empty() || - will_change_bits.intersects(WillChangeBits::FIXPOS_CB_NON_SVG) + if !fragment_flags.contains(FragmentFlags::IS_ROOT_ELEMENT) && + (!self.get_effects().filter.0.is_empty() || + will_change_bits.intersects(WillChangeBits::FIXPOS_CB_NON_SVG)) { return true; } diff --git a/components/layout/table/construct.rs b/components/layout/table/construct.rs index f20360d3b56..56e11320be4 100644 --- a/components/layout/table/construct.rs +++ b/components/layout/table/construct.rs @@ -1019,15 +1019,16 @@ where DisplayLayoutInternal::TableCell => { // This value will already have filtered out rowspan=0 // in quirks mode, so we don't have to worry about that. - // - // The HTML specification limits the parsed value of `rowspan` to - // 65534 and `colspan` to 1000, so we also enforce the same limits - // when dealing with arbitrary DOM elements (perhaps created via - // script). let (rowspan, colspan) = if info.pseudo_element_type.is_none() { let node = info.node.to_threadsafe(); - let rowspan = node.get_rowspan().unwrap_or(1).min(65534) as usize; - let colspan = node.get_colspan().unwrap_or(1).min(1000) as usize; + let rowspan = node.get_rowspan().unwrap_or(1) as usize; + let colspan = node.get_colspan().unwrap_or(1) as usize; + + // The HTML specification clamps value of `rowspan` to [0, 65534] and + // `colspan` to [1, 1000]. + assert!((1..=1000).contains(&colspan)); + assert!((0..=65534).contains(&rowspan)); + (rowspan, colspan) } else { (1, 1) @@ -1140,21 +1141,19 @@ fn add_column<'dom, Node: NodeExt<'dom>>( is_anonymous: bool, ) -> ArcRefCell<TableTrack> { let span = if column_info.pseudo_element_type.is_none() { - column_info - .node - .to_threadsafe() - .get_span() - .unwrap_or(1) - .min(1000) as usize + column_info.node.to_threadsafe().get_span().unwrap_or(1) } else { 1 }; + // The HTML specification clamps value of `span` for `<col>` to [1, 1000]. + assert!((1..=1000).contains(&span)); + let column = ArcRefCell::new(TableTrack { base: LayoutBoxBase::new(column_info.into(), column_info.style.clone()), group_index, is_anonymous, }); - collection.extend(repeat(column.clone()).take(span)); + collection.extend(repeat(column.clone()).take(span as usize)); column } diff --git a/components/layout/table/layout.rs b/components/layout/table/layout.rs index 2261f7d165c..0cbe3e9ca76 100644 --- a/components/layout/table/layout.rs +++ b/components/layout/table/layout.rs @@ -1503,7 +1503,7 @@ impl<'a> TableLayout<'a> { layout_context: &LayoutContext, parent_positioning_context: &mut PositioningContext, ) -> BoxFragment { - let mut positioning_context = PositioningContext::new_for_style(caption.context.style()); + let mut positioning_context = caption.context.new_positioning_context(); let containing_block = &ContainingBlock { size: ContainingBlockSize { inline: self.table_width + self.pbm.padding_border_sums.inline, @@ -2325,7 +2325,7 @@ impl<'a> RowFragmentLayout<'a> { Self { row: table_row, rect, - positioning_context: PositioningContext::new_for_style(&table_row.base.style), + positioning_context: table_row.base.new_positioning_context(), containing_block, fragments: Vec::new(), } @@ -2410,7 +2410,7 @@ impl RowGroupFragmentLayout { let row_group = row_group.borrow(); ( dimensions.get_row_group_rect(&row_group), - PositioningContext::new_for_style(&row_group.base.style), + row_group.base.new_positioning_context(), ) }; Self { diff --git a/components/layout/taffy/layout.rs b/components/layout/taffy/layout.rs index a7581136bf2..3777c902053 100644 --- a/components/layout/taffy/layout.rs +++ b/components/layout/taffy/layout.rs @@ -251,8 +251,9 @@ impl taffy::LayoutPartialTree for TaffyContainerContext<'_> { style, }; let layout = { - let mut child_positioning_context = - PositioningContext::new_for_style(style).unwrap_or_else(|| { + let mut child_positioning_context = independent_context + .new_positioning_context() + .unwrap_or_else(|| { PositioningContext::new_for_subtree( self.positioning_context .collects_for_nearest_positioned_ancestor(), diff --git a/components/net/async_runtime.rs b/components/net/async_runtime.rs index c99068b1076..909bdef8fb0 100644 --- a/components/net/async_runtime.rs +++ b/components/net/async_runtime.rs @@ -2,31 +2,27 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use std::cmp::Ord; +use std::sync::LazyLock; use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::{LazyLock, Mutex}; use std::thread; use tokio::runtime::{Builder, Runtime}; -pub static HANDLE: LazyLock<Mutex<Option<Runtime>>> = LazyLock::new(|| { - Mutex::new(Some( - Builder::new_multi_thread() - .thread_name_fn(|| { - static ATOMIC_ID: AtomicUsize = AtomicUsize::new(0); - let id = ATOMIC_ID.fetch_add(1, Ordering::Relaxed); - format!("tokio-runtime-{}", id) - }) - .worker_threads( - thread::available_parallelism() - .map(|i| i.get()) - .unwrap_or(servo_config::pref!(threadpools_fallback_worker_num) as usize) - .min( - servo_config::pref!(threadpools_async_runtime_workers_max).max(1) as usize, - ), - ) - .enable_io() - .enable_time() - .build() - .unwrap(), - )) +pub static HANDLE: LazyLock<Runtime> = LazyLock::new(|| { + Builder::new_multi_thread() + .thread_name_fn(|| { + static ATOMIC_ID: AtomicUsize = AtomicUsize::new(0); + let id = ATOMIC_ID.fetch_add(1, Ordering::Relaxed); + format!("tokio-runtime-{}", id) + }) + .worker_threads( + thread::available_parallelism() + .map(|i| i.get()) + .unwrap_or(servo_config::pref!(threadpools_fallback_worker_num) as usize) + .min(servo_config::pref!(threadpools_async_runtime_workers_max).max(1) as usize), + ) + .enable_io() + .enable_time() + .build() + .expect("Unable to build tokio-runtime runtime") }); diff --git a/components/net/connector.rs b/components/net/connector.rs index 12d0638d84d..e02ff8971e3 100644 --- a/components/net/connector.rs +++ b/components/net/connector.rs @@ -165,7 +165,7 @@ where F: Future<Output = ()> + 'static + std::marker::Send, { fn execute(&self, fut: F) { - HANDLE.lock().unwrap().as_ref().unwrap().spawn(fut); + HANDLE.spawn(fut); } } diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index 35624bb8645..e0867b8d07f 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -493,7 +493,7 @@ impl BodySink { match self { BodySink::Chunked(sender) => { let sender = sender.clone(); - HANDLE.lock().unwrap().as_mut().unwrap().spawn(async move { + HANDLE.spawn(async move { let _ = sender.send(Ok(Frame::data(bytes.into()))).await; }); }, @@ -2016,7 +2016,7 @@ async fn http_network_fetch( let url1 = request.url(); let url2 = url1.clone(); - HANDLE.lock().unwrap().as_ref().unwrap().spawn( + HANDLE.spawn( res.into_body() .map_err(|e| { warn!("Error streaming response body: {:?}", e); diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index b6f885f29b7..5d1ede28c32 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -771,7 +771,7 @@ impl CoreResourceManager { _ => (FileTokenCheck::NotRequired, None), }; - HANDLE.lock().unwrap().as_ref().unwrap().spawn(async move { + HANDLE.spawn(async move { // XXXManishearth: Check origin against pipeline id (also ensure that the mode is allowed) // todo load context / mimesniff in fetch // todo referrer policy? diff --git a/components/net/websocket_loader.rs b/components/net/websocket_loader.rs index 95f66558482..128436ac47c 100644 --- a/components/net/websocket_loader.rs +++ b/components/net/websocket_loader.rs @@ -418,24 +418,21 @@ fn connect( tls_config.alpn_protocols = vec!["http/1.1".to_string().into()]; let resource_event_sender2 = resource_event_sender.clone(); - match HANDLE.lock().unwrap().as_mut() { - Some(handle) => handle.spawn( - start_websocket( - http_state, - req_url.clone(), - resource_event_sender, - protocols, - client, - tls_config, - dom_action_receiver, - ) - .map_err(move |e| { - warn!("Failed to establish a WebSocket connection: {:?}", e); - let _ = resource_event_sender2.send(WebSocketNetworkEvent::Fail); - }), - ), - None => return Err("No runtime available".to_string()), - }; + HANDLE.spawn( + start_websocket( + http_state, + req_url.clone(), + resource_event_sender, + protocols, + client, + tls_config, + dom_action_receiver, + ) + .map_err(move |e| { + warn!("Failed to establish a WebSocket connection: {:?}", e); + let _ = resource_event_sender2.send(WebSocketNetworkEvent::Fail); + }), + ); Ok(()) } diff --git a/components/script/canvas_context.rs b/components/script/canvas_context.rs index d49d31997e1..0a7545e9594 100644 --- a/components/script/canvas_context.rs +++ b/components/script/canvas_context.rs @@ -5,16 +5,23 @@ //! Common interfaces for Canvas Contexts use euclid::default::Size2D; -use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource}; +use script_bindings::root::Dom; +use script_layout_interface::HTMLCanvasData; use snapshot::Snapshot; +use webrender_api::ImageKey; use crate::dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrOffscreenCanvas; use crate::dom::bindings::inheritance::Castable; use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::node::{Node, NodeDamage}; +use crate::dom::types::{ + CanvasRenderingContext2D, GPUCanvasContext, OffscreenCanvas, OffscreenCanvasRenderingContext2D, + WebGL2RenderingContext, WebGLRenderingContext, +}; pub(crate) trait LayoutCanvasRenderingContextHelpers { - fn canvas_data_source(self) -> HTMLCanvasDataSource; + /// `None` is rendered as transparent black (cleared canvas) + fn canvas_data_source(self) -> Option<ImageKey>; } pub(crate) trait LayoutHTMLCanvasElementHelpers { @@ -85,3 +92,180 @@ impl CanvasHelpers for HTMLCanvasElementOrOffscreenCanvas { } } } + +/// Non rooted variant of [`crate::dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::RenderingContext`] +#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] +#[derive(Clone, JSTraceable, MallocSizeOf)] +pub(crate) enum RenderingContext { + Placeholder(Dom<OffscreenCanvas>), + Context2d(Dom<CanvasRenderingContext2D>), + WebGL(Dom<WebGLRenderingContext>), + WebGL2(Dom<WebGL2RenderingContext>), + #[cfg(feature = "webgpu")] + WebGPU(Dom<GPUCanvasContext>), +} + +impl CanvasContext for RenderingContext { + type ID = (); + + fn context_id(&self) -> Self::ID {} + + fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas { + match self { + RenderingContext::Placeholder(context) => (*context.context().unwrap()).canvas(), + RenderingContext::Context2d(context) => context.canvas(), + RenderingContext::WebGL(context) => context.canvas(), + RenderingContext::WebGL2(context) => context.canvas(), + #[cfg(feature = "webgpu")] + RenderingContext::WebGPU(context) => context.canvas(), + } + } + + fn resize(&self) { + match self { + RenderingContext::Placeholder(context) => (*context.context().unwrap()).resize(), + RenderingContext::Context2d(context) => context.resize(), + RenderingContext::WebGL(context) => context.resize(), + RenderingContext::WebGL2(context) => context.resize(), + #[cfg(feature = "webgpu")] + RenderingContext::WebGPU(context) => context.resize(), + } + } + + fn get_image_data(&self) -> Option<Snapshot> { + match self { + RenderingContext::Placeholder(context) => { + (*context.context().unwrap()).get_image_data() + }, + RenderingContext::Context2d(context) => context.get_image_data(), + RenderingContext::WebGL(context) => context.get_image_data(), + RenderingContext::WebGL2(context) => context.get_image_data(), + #[cfg(feature = "webgpu")] + RenderingContext::WebGPU(context) => context.get_image_data(), + } + } + + fn origin_is_clean(&self) -> bool { + match self { + RenderingContext::Placeholder(context) => { + (*context.context().unwrap()).origin_is_clean() + }, + RenderingContext::Context2d(context) => context.origin_is_clean(), + RenderingContext::WebGL(context) => context.origin_is_clean(), + RenderingContext::WebGL2(context) => context.origin_is_clean(), + #[cfg(feature = "webgpu")] + RenderingContext::WebGPU(context) => context.origin_is_clean(), + } + } + + fn size(&self) -> Size2D<u64> { + match self { + RenderingContext::Placeholder(context) => (*context.context().unwrap()).size(), + RenderingContext::Context2d(context) => context.size(), + RenderingContext::WebGL(context) => context.size(), + RenderingContext::WebGL2(context) => context.size(), + #[cfg(feature = "webgpu")] + RenderingContext::WebGPU(context) => context.size(), + } + } + + fn mark_as_dirty(&self) { + match self { + RenderingContext::Placeholder(context) => (*context.context().unwrap()).mark_as_dirty(), + RenderingContext::Context2d(context) => context.mark_as_dirty(), + RenderingContext::WebGL(context) => context.mark_as_dirty(), + RenderingContext::WebGL2(context) => context.mark_as_dirty(), + #[cfg(feature = "webgpu")] + RenderingContext::WebGPU(context) => context.mark_as_dirty(), + } + } + + fn update_rendering(&self) { + match self { + RenderingContext::Placeholder(context) => { + (*context.context().unwrap()).update_rendering() + }, + RenderingContext::Context2d(context) => context.update_rendering(), + RenderingContext::WebGL(context) => context.update_rendering(), + RenderingContext::WebGL2(context) => context.update_rendering(), + #[cfg(feature = "webgpu")] + RenderingContext::WebGPU(context) => context.update_rendering(), + } + } + + fn onscreen(&self) -> bool { + match self { + RenderingContext::Placeholder(context) => (*context.context().unwrap()).onscreen(), + RenderingContext::Context2d(context) => context.onscreen(), + RenderingContext::WebGL(context) => context.onscreen(), + RenderingContext::WebGL2(context) => context.onscreen(), + #[cfg(feature = "webgpu")] + RenderingContext::WebGPU(context) => context.onscreen(), + } + } +} + +/// Non rooted variant of [`crate::dom::bindings::codegen::Bindings::OffscreenCanvasBinding::OffscreenRenderingContext`] +#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] +#[derive(Clone, JSTraceable, MallocSizeOf)] +pub(crate) enum OffscreenRenderingContext { + Context2d(Dom<OffscreenCanvasRenderingContext2D>), + //WebGL(Dom<WebGLRenderingContext>), + //WebGL2(Dom<WebGL2RenderingContext>), + //#[cfg(feature = "webgpu")] + //WebGPU(Dom<GPUCanvasContext>), +} + +impl CanvasContext for OffscreenRenderingContext { + type ID = (); + + fn context_id(&self) -> Self::ID {} + + fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas { + match self { + OffscreenRenderingContext::Context2d(context) => context.canvas(), + } + } + + fn resize(&self) { + match self { + OffscreenRenderingContext::Context2d(context) => context.resize(), + } + } + + fn get_image_data(&self) -> Option<Snapshot> { + match self { + OffscreenRenderingContext::Context2d(context) => context.get_image_data(), + } + } + + fn origin_is_clean(&self) -> bool { + match self { + OffscreenRenderingContext::Context2d(context) => context.origin_is_clean(), + } + } + + fn size(&self) -> Size2D<u64> { + match self { + OffscreenRenderingContext::Context2d(context) => context.size(), + } + } + + fn mark_as_dirty(&self) { + match self { + OffscreenRenderingContext::Context2d(context) => context.mark_as_dirty(), + } + } + + fn update_rendering(&self) { + match self { + OffscreenRenderingContext::Context2d(context) => context.update_rendering(), + } + } + + fn onscreen(&self) -> bool { + match self { + OffscreenRenderingContext::Context2d(context) => context.onscreen(), + } + } +} diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs index e9892818e92..dabe6a5728b 100644 --- a/components/script/canvas_state.rs +++ b/components/script/canvas_state.rs @@ -36,6 +36,7 @@ use style_traits::{CssWriter, ParsingMode}; use url::Url; use webrender_api::ImageKey; +use crate::canvas_context::{OffscreenRenderingContext, RenderingContext}; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::{ CanvasDirection, CanvasFillRule, CanvasImageSource, CanvasLineCap, CanvasLineJoin, @@ -52,10 +53,10 @@ use crate::dom::canvaspattern::CanvasPattern; use crate::dom::dommatrix::DOMMatrix; use crate::dom::element::{Element, cors_setting_for_element}; use crate::dom::globalscope::GlobalScope; -use crate::dom::htmlcanvaselement::{CanvasContext, HTMLCanvasElement}; +use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::imagedata::ImageData; use crate::dom::node::{Node, NodeTraits}; -use crate::dom::offscreencanvas::{OffscreenCanvas, OffscreenCanvasContext}; +use crate::dom::offscreencanvas::OffscreenCanvas; use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope; use crate::dom::textmetrics::TextMetrics; use crate::script_runtime::CanGc; @@ -522,7 +523,7 @@ impl CanvasState { if let Some(context) = canvas.context() { match *context { - OffscreenCanvasContext::OffscreenContext2d(ref context) => { + OffscreenRenderingContext::Context2d(ref context) => { context.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther( self.get_canvas_id(), image_size, @@ -577,7 +578,7 @@ impl CanvasState { if let Some(context) = canvas.context() { match *context { - CanvasContext::Context2d(ref context) => { + RenderingContext::Context2d(ref context) => { context.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther( self.get_canvas_id(), image_size, @@ -586,12 +587,12 @@ impl CanvasState { smoothing_enabled, )); }, - CanvasContext::Placeholder(ref context) => { + RenderingContext::Placeholder(ref context) => { let Some(context) = context.context() else { return Err(Error::InvalidState); }; match *context { - OffscreenCanvasContext::OffscreenContext2d(ref context) => context + OffscreenRenderingContext::Context2d(ref context) => context .send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther( self.get_canvas_id(), image_size, diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 38bd38ad511..046d478e49d 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -7,9 +7,9 @@ use dom_struct::dom_struct; use euclid::default::Size2D; use profile_traits::ipc; use script_bindings::inheritance::Castable; -use script_layout_interface::HTMLCanvasDataSource; use servo_url::ServoUrl; use snapshot::Snapshot; +use webrender_api::ImageKey; use crate::canvas_context::{CanvasContext, CanvasHelpers, LayoutCanvasRenderingContextHelpers}; use crate::canvas_state::CanvasState; @@ -98,13 +98,13 @@ impl CanvasRenderingContext2D { } impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, CanvasRenderingContext2D> { - fn canvas_data_source(self) -> HTMLCanvasDataSource { + fn canvas_data_source(self) -> Option<ImageKey> { let canvas_state = &self.unsafe_get().canvas_state; if canvas_state.is_paintable() { - HTMLCanvasDataSource::Image(canvas_state.image_key()) + Some(canvas_state.image_key()) } else { - HTMLCanvasDataSource::Empty + None } } } diff --git a/components/script/dom/dissimilaroriginwindow.rs b/components/script/dom/dissimilaroriginwindow.rs index b7fbe0855fe..70c384db822 100644 --- a/components/script/dom/dissimilaroriginwindow.rs +++ b/components/script/dom/dissimilaroriginwindow.rs @@ -181,12 +181,13 @@ impl DissimilarOriginWindowMethods<crate::DomTypeHolder> for DissimilarOriginWin // https://html.spec.whatwg.org/multipage/#dom-window-blur fn Blur(&self) { - // TODO: Implement x-origin blur + // > User agents are encouraged to ignore calls to this `blur()` method + // > entirely. } - // https://html.spec.whatwg.org/multipage/#dom-focus + // https://html.spec.whatwg.org/multipage/#dom-window-focus fn Focus(&self) { - // TODO: Implement x-origin focus + self.window_proxy().focus(); } // https://html.spec.whatwg.org/multipage/#dom-location diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 1e2a3747751..2baab15e1b8 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -30,8 +30,8 @@ use devtools_traits::ScriptToDevtoolsControlMsg; use dom_struct::dom_struct; use embedder_traits::{ AllowOrDeny, AnimationState, CompositorHitTestResult, ContextMenuResult, EditingActionEvent, - EmbedderMsg, ImeEvent, InputEvent, LoadStatus, MouseButton, MouseButtonAction, - MouseButtonEvent, TouchEvent, TouchEventType, TouchId, WheelEvent, + EmbedderMsg, FocusSequenceNumber, ImeEvent, InputEvent, LoadStatus, MouseButton, + MouseButtonAction, MouseButtonEvent, TouchEvent, TouchEventType, TouchId, WheelEvent, }; use encoding_rs::{Encoding, UTF_8}; use euclid::default::{Point2D, Rect, Size2D}; @@ -270,12 +270,11 @@ pub(crate) enum IsHTMLDocument { #[derive(JSTraceable, MallocSizeOf)] #[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] -enum FocusTransaction { - /// No focus operation is in effect. - NotInTransaction, - /// A focus operation is in effect. - /// Contains the element that has most recently requested focus for itself. - InTransaction(Option<Dom<Element>>), +struct FocusTransaction { + /// The focused element of this document. + element: Option<Dom<Element>>, + /// See [`Document::has_focus`]. + has_focus: bool, } /// Information about a declarative refresh @@ -341,9 +340,16 @@ pub(crate) struct Document { /// Whether the DOMContentLoaded event has already been dispatched. domcontentloaded_dispatched: Cell<bool>, /// The state of this document's focus transaction. - focus_transaction: DomRefCell<FocusTransaction>, + focus_transaction: DomRefCell<Option<FocusTransaction>>, /// The element that currently has the document focus context. focused: MutNullableDom<Element>, + /// The last sequence number sent to the constellation. + #[no_trace] + focus_sequence: Cell<FocusSequenceNumber>, + /// Indicates whether the container is included in the top-level browsing + /// context's focus chain (not considering system focus). Permanently `true` + /// for a top-level document. + has_focus: Cell<bool>, /// The script element that is currently executing. current_script: MutNullableDom<HTMLScriptElement>, /// <https://html.spec.whatwg.org/multipage/#pending-parsing-blocking-script> @@ -1120,122 +1126,318 @@ impl Document { self.focused.get() } + /// Get the last sequence number sent to the constellation. + /// + /// Received focus-related messages with sequence numbers less than the one + /// returned by this method must be discarded. + pub fn get_focus_sequence(&self) -> FocusSequenceNumber { + self.focus_sequence.get() + } + + /// Generate the next sequence number for focus-related messages. + fn increment_fetch_focus_sequence(&self) -> FocusSequenceNumber { + self.focus_sequence.set(FocusSequenceNumber( + self.focus_sequence + .get() + .0 + .checked_add(1) + .expect("too many focus messages have been sent"), + )); + self.focus_sequence.get() + } + /// Initiate a new round of checking for elements requesting focus. The last element to call /// `request_focus` before `commit_focus_transaction` is called will receive focus. fn begin_focus_transaction(&self) { - *self.focus_transaction.borrow_mut() = FocusTransaction::InTransaction(Default::default()); + // Initialize it with the current state + *self.focus_transaction.borrow_mut() = Some(FocusTransaction { + element: self.focused.get().as_deref().map(Dom::from_ref), + has_focus: self.has_focus.get(), + }); } /// <https://html.spec.whatwg.org/multipage/#focus-fixup-rule> pub(crate) fn perform_focus_fixup_rule(&self, not_focusable: &Element, can_gc: CanGc) { + // Return if `not_focusable` is not the designated focused area of the + // `Document`. if Some(not_focusable) != self.focused.get().as_deref() { return; } - self.request_focus( - self.GetBody().as_ref().map(|e| e.upcast()), - FocusType::Element, - can_gc, - ) + + let implicit_transaction = self.focus_transaction.borrow().is_none(); + + if implicit_transaction { + self.begin_focus_transaction(); + } + + // Designate the viewport as the new focused area of the `Document`, but + // do not run the focusing steps. + { + let mut focus_transaction = self.focus_transaction.borrow_mut(); + focus_transaction.as_mut().unwrap().element = None; + } + + if implicit_transaction { + self.commit_focus_transaction(FocusInitiator::Local, can_gc); + } } - /// Request that the given element receive focus once the current transaction is complete. - /// If None is passed, then whatever element is currently focused will no longer be focused - /// once the transaction is complete. + /// Request that the given element receive focus once the current + /// transaction is complete. `None` specifies to focus the document. + /// + /// If there's no ongoing transaction, this method automatically starts and + /// commits an implicit transaction. pub(crate) fn request_focus( &self, elem: Option<&Element>, - focus_type: FocusType, + focus_initiator: FocusInitiator, can_gc: CanGc, ) { - let implicit_transaction = matches!( - *self.focus_transaction.borrow(), - FocusTransaction::NotInTransaction - ); + // If an element is specified, and it's non-focusable, ignore the + // request. + if elem.is_some_and(|e| !e.is_focusable_area()) { + return; + } + + let implicit_transaction = self.focus_transaction.borrow().is_none(); + if implicit_transaction { self.begin_focus_transaction(); } - if elem.is_none_or(|e| e.is_focusable_area()) { - *self.focus_transaction.borrow_mut() = - FocusTransaction::InTransaction(elem.map(Dom::from_ref)); + + { + let mut focus_transaction = self.focus_transaction.borrow_mut(); + let focus_transaction = focus_transaction.as_mut().unwrap(); + focus_transaction.element = elem.map(Dom::from_ref); + focus_transaction.has_focus = true; } + if implicit_transaction { - self.commit_focus_transaction(focus_type, can_gc); + self.commit_focus_transaction(focus_initiator, can_gc); + } + } + + /// Update the local focus state accordingly after being notified that the + /// document's container is removed from the top-level browsing context's + /// focus chain (not considering system focus). + pub(crate) fn handle_container_unfocus(&self, can_gc: CanGc) { + assert!( + self.window().parent_info().is_some(), + "top-level document cannot be unfocused", + ); + + // Since this method is called from an event loop, there mustn't be + // an in-progress focus transaction + assert!( + self.focus_transaction.borrow().is_none(), + "there mustn't be an in-progress focus transaction at this point" + ); + + // Start an implicit focus transaction + self.begin_focus_transaction(); + + // Update the transaction + { + let mut focus_transaction = self.focus_transaction.borrow_mut(); + focus_transaction.as_mut().unwrap().has_focus = false; } + + // Commit the implicit focus transaction + self.commit_focus_transaction(FocusInitiator::Remote, can_gc); } /// Reassign the focus context to the element that last requested focus during this - /// transaction, or none if no elements requested it. - fn commit_focus_transaction(&self, focus_type: FocusType, can_gc: CanGc) { - let possibly_focused = match *self.focus_transaction.borrow() { - FocusTransaction::NotInTransaction => unreachable!(), - FocusTransaction::InTransaction(ref elem) => { - elem.as_ref().map(|e| DomRoot::from_ref(&**e)) - }, + /// transaction, or the document if no elements requested it. + fn commit_focus_transaction(&self, focus_initiator: FocusInitiator, can_gc: CanGc) { + let (mut new_focused, new_focus_state) = { + let focus_transaction = self.focus_transaction.borrow(); + let focus_transaction = focus_transaction + .as_ref() + .expect("no focus transaction in progress"); + ( + focus_transaction + .element + .as_ref() + .map(|e| DomRoot::from_ref(&**e)), + focus_transaction.has_focus, + ) }; - *self.focus_transaction.borrow_mut() = FocusTransaction::NotInTransaction; - if self.focused == possibly_focused.as_deref() { - return; + *self.focus_transaction.borrow_mut() = None; + + if !new_focus_state { + // In many browsers, a document forgets its focused area when the + // document is removed from the top-level BC's focus chain + if new_focused.take().is_some() { + trace!( + "Forgetting the document's focused area because the \ + document's container was removed from the top-level BC's \ + focus chain" + ); + } } - if let Some(ref elem) = self.focused.get() { - let node = elem.upcast::<Node>(); - elem.set_focus_state(false); - // FIXME: pass appropriate relatedTarget - self.fire_focus_event(FocusEventType::Blur, node, None, can_gc); - // Notify the embedder to hide the input method. - if elem.input_method_type().is_some() { - self.send_to_embedder(EmbedderMsg::HideIME(self.webview_id())); + let old_focused = self.focused.get(); + let old_focus_state = self.has_focus.get(); + + debug!( + "Committing focus transaction: {:?} → {:?}", + (&old_focused, old_focus_state), + (&new_focused, new_focus_state), + ); + + // `*_focused_filtered` indicates the local element (if any) included in + // the top-level BC's focus chain. + let old_focused_filtered = old_focused.as_ref().filter(|_| old_focus_state); + let new_focused_filtered = new_focused.as_ref().filter(|_| new_focus_state); + + let trace_focus_chain = |name, element, doc| { + trace!( + "{} local focus chain: {}", + name, + match (element, doc) { + (Some(e), _) => format!("[{:?}, document]", e), + (None, true) => "[document]".to_owned(), + (None, false) => "[]".to_owned(), + } + ); + }; + + trace_focus_chain("Old", old_focused_filtered, old_focus_state); + trace_focus_chain("New", new_focused_filtered, new_focus_state); + + if old_focused_filtered != new_focused_filtered { + if let Some(elem) = &old_focused_filtered { + let node = elem.upcast::<Node>(); + elem.set_focus_state(false); + // FIXME: pass appropriate relatedTarget + if node.is_connected() { + self.fire_focus_event(FocusEventType::Blur, node.upcast(), None, can_gc); + } + + // Notify the embedder to hide the input method. + if elem.input_method_type().is_some() { + self.send_to_embedder(EmbedderMsg::HideIME(self.webview_id())); + } } } - self.focused.set(possibly_focused.as_deref()); + if old_focus_state != new_focus_state && !new_focus_state { + self.fire_focus_event(FocusEventType::Blur, self.global().upcast(), None, can_gc); + } - if let Some(ref elem) = self.focused.get() { - elem.set_focus_state(true); - let node = elem.upcast::<Node>(); - // FIXME: pass appropriate relatedTarget - self.fire_focus_event(FocusEventType::Focus, node, None, can_gc); - // Update the focus state for all elements in the focus chain. - // https://html.spec.whatwg.org/multipage/#focus-chain - if focus_type == FocusType::Element { - self.window() - .send_to_constellation(ScriptToConstellationMessage::Focus); + self.focused.set(new_focused.as_deref()); + self.has_focus.set(new_focus_state); + + if old_focus_state != new_focus_state && new_focus_state { + self.fire_focus_event(FocusEventType::Focus, self.global().upcast(), None, can_gc); + } + + if old_focused_filtered != new_focused_filtered { + if let Some(elem) = &new_focused_filtered { + elem.set_focus_state(true); + let node = elem.upcast::<Node>(); + // FIXME: pass appropriate relatedTarget + self.fire_focus_event(FocusEventType::Focus, node.upcast(), None, can_gc); + + // Notify the embedder to display an input method. + if let Some(kind) = elem.input_method_type() { + let rect = elem.upcast::<Node>().bounding_content_box_or_zero(can_gc); + let rect = Rect::new( + Point2D::new(rect.origin.x.to_px(), rect.origin.y.to_px()), + Size2D::new(rect.size.width.to_px(), rect.size.height.to_px()), + ); + let (text, multiline) = if let Some(input) = elem.downcast::<HTMLInputElement>() + { + ( + Some(( + (input.Value()).to_string(), + input.GetSelectionEnd().unwrap_or(0) as i32, + )), + false, + ) + } else if let Some(textarea) = elem.downcast::<HTMLTextAreaElement>() { + ( + Some(( + (textarea.Value()).to_string(), + textarea.GetSelectionEnd().unwrap_or(0) as i32, + )), + true, + ) + } else { + (None, false) + }; + self.send_to_embedder(EmbedderMsg::ShowIME( + self.webview_id(), + kind, + text, + multiline, + DeviceIntRect::from_untyped(&rect.to_box2d()), + )); + } } + } + + if focus_initiator != FocusInitiator::Local { + return; + } - // Notify the embedder to display an input method. - if let Some(kind) = elem.input_method_type() { - let rect = elem.upcast::<Node>().bounding_content_box_or_zero(can_gc); - let rect = Rect::new( - Point2D::new(rect.origin.x.to_px(), rect.origin.y.to_px()), - Size2D::new(rect.size.width.to_px(), rect.size.height.to_px()), + // We are the initiator of the focus operation, so we must broadcast + // the change we intend to make. + match (old_focus_state, new_focus_state) { + (_, true) => { + // Advertise the change in the focus chain. + // <https://html.spec.whatwg.org/multipage/#focus-chain> + // <https://html.spec.whatwg.org/multipage/#focusing-steps> + // + // If the top-level BC doesn't have system focus, this won't + // have an immediate effect, but it will when we gain system + // focus again. Therefore we still have to send `ScriptMsg:: + // Focus`. + // + // When a container with a non-null nested browsing context is + // focused, its active document becomes the focused area of the + // top-level browsing context instead. Therefore we need to let + // the constellation know if such a container is focused. + // + // > The focusing steps for an object `new focus target` [...] + // > + // > 3. If `new focus target` is a browsing context container + // > with non-null nested browsing context, then set + // > `new focus target` to the nested browsing context's + // > active document. + let child_browsing_context_id = new_focused + .as_ref() + .and_then(|elem| elem.downcast::<HTMLIFrameElement>()) + .and_then(|iframe| iframe.browsing_context_id()); + + let sequence = self.increment_fetch_focus_sequence(); + + debug!( + "Advertising the focus request to the constellation \ + with sequence number {} and child BC ID {}", + sequence, + child_browsing_context_id + .as_ref() + .map(|id| id as &dyn std::fmt::Display) + .unwrap_or(&"(none)"), ); - let (text, multiline) = if let Some(input) = elem.downcast::<HTMLInputElement>() { - ( - Some(( - input.Value().to_string(), - input.GetSelectionEnd().unwrap_or(0) as i32, - )), - false, - ) - } else if let Some(textarea) = elem.downcast::<HTMLTextAreaElement>() { - ( - Some(( - textarea.Value().to_string(), - textarea.GetSelectionEnd().unwrap_or(0) as i32, - )), - true, - ) - } else { - (None, false) - }; - self.send_to_embedder(EmbedderMsg::ShowIME( - self.webview_id(), - kind, - text, - multiline, - DeviceIntRect::from_untyped(&rect.to_box2d()), - )); - } + + self.window() + .send_to_constellation(ScriptToConstellationMessage::Focus( + child_browsing_context_id, + sequence, + )); + }, + (false, false) => { + // Our `Document` doesn't have focus, and we intend to keep it + // this way. + }, + (true, false) => { + unreachable!( + "Can't lose the document's focus without specifying \ + another one to focus" + ); + }, } } @@ -1350,7 +1552,10 @@ impl Document { } self.begin_focus_transaction(); - self.request_focus(Some(&*el), FocusType::Element, can_gc); + // Try to focus `el`. If it's not focusable, focus the document + // instead. + self.request_focus(None, FocusInitiator::Local, can_gc); + self.request_focus(Some(&*el), FocusInitiator::Local, can_gc); } let dom_event = DomRoot::upcast::<Event>(MouseEvent::for_platform_mouse_event( @@ -1388,7 +1593,9 @@ impl Document { } if let MouseButtonAction::Click = event.action { - self.commit_focus_transaction(FocusType::Element, can_gc); + if self.focus_transaction.borrow().is_some() { + self.commit_focus_transaction(FocusInitiator::Local, can_gc); + } self.maybe_fire_dblclick( hit_test_result.point_in_viewport, node, @@ -2215,7 +2422,7 @@ impl Document { ImeEvent::Dismissed => { self.request_focus( self.GetBody().as_ref().map(|e| e.upcast()), - FocusType::Element, + FocusInitiator::Local, can_gc, ); return; @@ -3194,7 +3401,7 @@ impl Document { fn fire_focus_event( &self, focus_event_type: FocusEventType, - node: &Node, + event_target: &EventTarget, related_target: Option<&EventTarget>, can_gc: CanGc, ) { @@ -3214,8 +3421,7 @@ impl Document { ); let event = event.upcast::<Event>(); event.set_trusted(true); - let target = node.upcast(); - event.fire(target, can_gc); + event.fire(event_target, can_gc); } /// <https://html.spec.whatwg.org/multipage/#cookie-averse-document-object> @@ -3795,6 +4001,8 @@ impl Document { .and_then(|charset| Encoding::for_label(charset.as_bytes())) .unwrap_or(UTF_8); + let has_focus = window.parent_info().is_none(); + let has_browsing_context = has_browsing_context == HasBrowsingContext::Yes; Document { @@ -3842,8 +4050,10 @@ impl Document { stylesheet_list: MutNullableDom::new(None), ready_state: Cell::new(ready_state), domcontentloaded_dispatched: Cell::new(domcontentloaded_dispatched), - focus_transaction: DomRefCell::new(FocusTransaction::NotInTransaction), + focus_transaction: DomRefCell::new(None), focused: Default::default(), + focus_sequence: Cell::new(FocusSequenceNumber::default()), + has_focus: Cell::new(has_focus), current_script: Default::default(), pending_parsing_blocking_script: Default::default(), script_blocking_stylesheets_count: Cell::new(0u32), @@ -4989,12 +5199,34 @@ impl DocumentMethods<crate::DomTypeHolder> for Document { // https://html.spec.whatwg.org/multipage/#dom-document-hasfocus fn HasFocus(&self) -> bool { - // Step 1-2. - if self.window().parent_info().is_none() && self.is_fully_active() { - return true; + // <https://html.spec.whatwg.org/multipage/#has-focus-steps> + // + // > The has focus steps, given a `Document` object `target`, are as + // > follows: + // > + // > 1. If `target`'s browsing context's top-level browsing context does + // > not have system focus, then return false. + + // > 2. Let `candidate` be `target`'s browsing context's top-level + // > browsing context's active document. + // > + // > 3. While true: + // > + // > 3.1. If `candidate` is target, then return true. + // > + // > 3.2. If the focused area of `candidate` is a browsing context + // > container with a non-null nested browsing context, then set + // > `candidate` to the active document of that browsing context + // > container's nested browsing context. + // > + // > 3.3. Otherwise, return false. + if self.window().parent_info().is_none() { + // 2 → 3 → (3.1 || ⋯ → 3.3) + self.is_fully_active() + } else { + // 2 → 3 → 3.2 → (⋯ → 3.1 || ⋯ → 3.3) + self.is_fully_active() && self.has_focus.get() } - // TODO Step 3. - false } // https://html.spec.whatwg.org/multipage/#dom-document-domain @@ -6397,6 +6629,17 @@ pub(crate) enum FocusType { Parent, // Focusing a parent element (an iframe) } +/// Specifies the initiator of a focus operation. +#[derive(Clone, Copy, PartialEq)] +pub enum FocusInitiator { + /// The operation is initiated by this document and to be broadcasted + /// through the constellation. + Local, + /// The operation is initiated somewhere else, and we are updating our + /// internal state accordingly. + Remote, +} + /// Focus events pub(crate) enum FocusEventType { Focus, // Element gained focus. Doesn't bubble. diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 3a8ac8f0cd8..c040078f707 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -327,7 +327,21 @@ impl Element { ) } - impl_rare_data!(ElementRareData); + fn rare_data(&self) -> Ref<Option<Box<ElementRareData>>> { + self.rare_data.borrow() + } + + fn rare_data_mut(&self) -> RefMut<Option<Box<ElementRareData>>> { + self.rare_data.borrow_mut() + } + + fn ensure_rare_data(&self) -> RefMut<Box<ElementRareData>> { + let mut rare_data = self.rare_data.borrow_mut(); + if rare_data.is_none() { + *rare_data = Some(Default::default()); + } + RefMut::map(rare_data, |rare_data| rare_data.as_mut().unwrap()) + } pub(crate) fn restyle(&self, damage: NodeDamage) { let doc = self.node.owner_doc(); @@ -3011,28 +3025,8 @@ impl ElementMethods<crate::DomTypeHolder> for Element { DomRoot::from_ref(self.upcast()) }; - // Step 3. Unsafely set HTML given target, this, and compliantHTML. - // Let newChildren be the result of the HTML fragment parsing algorithm. - let new_children = ServoParser::parse_html_fragment(self, html, true, can_gc); - - let context_document = { - if let Some(template) = self.downcast::<HTMLTemplateElement>() { - template.Content(can_gc).upcast::<Node>().owner_doc() - } else { - self.owner_document() - } - }; - - // Let fragment be a new DocumentFragment whose node document is contextElement's node document. - let frag = DocumentFragment::new(&context_document, can_gc); - - // For each node in newChildren, append node to fragment. - for child in new_children { - frag.upcast::<Node>().AppendChild(&child, can_gc).unwrap(); - } - - // Replace all with fragment within target. - Node::replace_all(Some(frag.upcast()), &target, can_gc); + // Step 3. Unsafely set HTML given target, this, and compliantHTML + Node::unsafely_set_html(&target, self, html, can_gc); } /// <https://html.spec.whatwg.org/multipage/#dom-element-gethtml> diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index b3345b90fc0..efa9a9a97ab 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -457,8 +457,9 @@ pub(crate) struct ManagedMessagePort { /// and only add them, and ask the constellation to complete the transfer, /// in a subsequent task if the port hasn't been re-transfered. pending: bool, - /// Has the port been closed? If closed, it can be dropped and later GC'ed. - closed: bool, + /// Whether the port has been closed by script in this global, + /// so it can be removed. + explicitly_closed: bool, /// Note: it may seem strange to use a pair of options, versus for example an enum. /// But it looks like tranform streams will require both of those in their transfer. /// This will be resolved when we reach that point of the implementation. @@ -546,12 +547,17 @@ impl MessageListener { let mut succeeded = vec![]; let mut failed = HashMap::new(); - for (id, buffer) in ports.into_iter() { + for (id, info) in ports.into_iter() { if global.is_managing_port(&id) { succeeded.push(id); - global.complete_port_transfer(id, buffer); + global.complete_port_transfer( + id, + info.port_message_queue, + info.disentangled, + CanGc::note() + ); } else { - failed.insert(id, buffer); + failed.insert(id, info); } } let _ = global.script_to_constellation_chan().send( @@ -560,13 +566,21 @@ impl MessageListener { }) ); }, - MessagePortMsg::CompletePendingTransfer(port_id, buffer) => { + MessagePortMsg::CompletePendingTransfer(port_id, info) => { let context = self.context.clone(); self.task_source.queue(task!(complete_pending: move || { let global = context.root(); - global.complete_port_transfer(port_id, buffer); + global.complete_port_transfer(port_id, info.port_message_queue, info.disentangled, CanGc::note()); })); }, + MessagePortMsg::CompleteDisentanglement(port_id) => { + let context = self.context.clone(); + self.task_source + .queue(task!(try_complete_disentanglement: move || { + let global = context.root(); + global.try_complete_disentanglement(port_id, CanGc::note()); + })); + }, MessagePortMsg::NewTask(port_id, task) => { let context = self.context.clone(); self.task_source.queue(task!(process_new_task: move || { @@ -574,14 +588,6 @@ impl MessageListener { global.route_task_to_port(port_id, task, CanGc::note()); })); }, - MessagePortMsg::RemoveMessagePort(port_id) => { - let context = self.context.clone(); - self.task_source - .queue(task!(process_remove_message_port: move || { - let global = context.root(); - global.note_entangled_port_removed(&port_id); - })); - }, } } } @@ -871,7 +877,13 @@ impl GlobalScope { } /// Complete the transfer of a message-port. - fn complete_port_transfer(&self, port_id: MessagePortId, tasks: VecDeque<PortMessageTask>) { + fn complete_port_transfer( + &self, + port_id: MessagePortId, + tasks: VecDeque<PortMessageTask>, + disentangled: bool, + can_gc: CanGc, + ) { let should_start = if let MessagePortState::Managed(_id, message_ports) = &mut *self.message_port_state.borrow_mut() { @@ -885,6 +897,10 @@ impl GlobalScope { } if let Some(port_impl) = managed_port.port_impl.as_mut() { port_impl.complete_transfer(tasks); + if disentangled { + port_impl.disentangle(); + managed_port.dom_port.disentangle(); + } port_impl.enabled() } else { panic!("managed-port has no port-impl."); @@ -895,7 +911,45 @@ impl GlobalScope { panic!("complete_port_transfer called for an unknown port."); }; if should_start { - self.start_message_port(&port_id); + self.start_message_port(&port_id, can_gc); + } + } + + /// The closing of `otherPort`, if it is in a different global. + /// <https://html.spec.whatwg.org/multipage/#disentangle> + fn try_complete_disentanglement(&self, port_id: MessagePortId, can_gc: CanGc) { + let dom_port = if let MessagePortState::Managed(_id, message_ports) = + &mut *self.message_port_state.borrow_mut() + { + let dom_port = if let Some(managed_port) = message_ports.get_mut(&port_id) { + if managed_port.pending { + unreachable!("CompleteDisentanglement msg received for a pending port."); + } + let port_impl = managed_port + .port_impl + .as_mut() + .expect("managed-port has no port-impl."); + port_impl.disentangle(); + managed_port.dom_port.as_rooted() + } else { + // Note: this, and the other return below, + // can happen if the port has already been transferred out of this global, + // in which case the disentanglement will complete along with the transfer. + return; + }; + dom_port + } else { + return; + }; + + // Fire an event named close at otherPort. + dom_port.upcast().fire_event(atom!("close"), can_gc); + + let res = self.script_to_constellation_chan().send( + ScriptToConstellationMessage::DisentanglePorts(port_id, None), + ); + if res.is_err() { + warn!("Sending DisentanglePorts failed"); } } @@ -951,8 +1005,64 @@ impl GlobalScope { } /// <https://html.spec.whatwg.org/multipage/#disentangle> - pub(crate) fn disentangle_port(&self, _port: &MessagePort) { - // TODO: #36465 + pub(crate) fn disentangle_port(&self, port: &MessagePort, can_gc: CanGc) { + let initiator_port = port.message_port_id(); + // Let otherPort be the MessagePort which initiatorPort was entangled with. + let Some(other_port) = port.disentangle() else { + // Assert: otherPort exists. + // Note: ignoring the assert, + // because the streams spec seems to disentangle ports that are disentangled already. + return; + }; + + // Disentangle initiatorPort and otherPort, so that they are no longer entangled or associated with each other. + // Note: this is done in part here, and in part at the constellation(if otherPort is in another global). + let dom_port = if let MessagePortState::Managed(_id, message_ports) = + &mut *self.message_port_state.borrow_mut() + { + let mut dom_port = None; + for port_id in &[initiator_port, &other_port] { + match message_ports.get_mut(port_id) { + None => { + continue; + }, + Some(managed_port) => { + let port_impl = managed_port + .port_impl + .as_mut() + .expect("managed-port has no port-impl."); + managed_port.dom_port.disentangle(); + port_impl.disentangle(); + + if **port_id == other_port { + dom_port = Some(managed_port.dom_port.as_rooted()) + } + }, + } + } + dom_port + } else { + panic!("disentangle_port called on a global not managing any ports."); + }; + + // Fire an event named close at `otherPort`. + // Note: done here if the port is managed by the same global as `initialPort`. + if let Some(dom_port) = dom_port { + dom_port.upcast().fire_event(atom!("close"), can_gc); + } + + let chan = self.script_to_constellation_chan().clone(); + let initiator_port = *initiator_port; + self.task_manager() + .port_message_queue() + .queue(task!(post_message: move || { + // Note: we do this in a task to ensure it doesn't affect messages that are still to be routed, + // see the task queueing in `post_messageport_msg`. + let res = chan.send(ScriptToConstellationMessage::DisentanglePorts(initiator_port, Some(other_port))); + if res.is_err() { + warn!("Sending DisentanglePorts failed"); + } + })); } /// <https://html.spec.whatwg.org/multipage/#entangle> @@ -984,18 +1094,6 @@ impl GlobalScope { .send(ScriptToConstellationMessage::EntanglePorts(port1, port2)); } - /// Note that the entangled port of `port_id` has been removed in another global. - pub(crate) fn note_entangled_port_removed(&self, port_id: &MessagePortId) { - // Note: currently this is a no-op, - // as we only use the `close` method to manage the local lifecyle of a port. - // This could be used as part of lifecyle management to determine a port can be GC'ed. - // See https://github.com/servo/servo/issues/25772 - warn!( - "Entangled port of {:?} has been removed in another global", - port_id - ); - } - /// Handle the transfer of a port in the current task. pub(crate) fn mark_port_as_transferred(&self, port_id: &MessagePortId) -> MessagePortImpl { if let MessagePortState::Managed(_id, message_ports) = @@ -1021,20 +1119,21 @@ impl GlobalScope { } /// <https://html.spec.whatwg.org/multipage/#dom-messageport-start> - pub(crate) fn start_message_port(&self, port_id: &MessagePortId) { - let message_buffer = if let MessagePortState::Managed(_id, message_ports) = + pub(crate) fn start_message_port(&self, port_id: &MessagePortId, can_gc: CanGc) { + let (message_buffer, dom_port) = if let MessagePortState::Managed(_id, message_ports) = &mut *self.message_port_state.borrow_mut() { - match message_ports.get_mut(port_id) { + let (message_buffer, dom_port) = match message_ports.get_mut(port_id) { None => panic!("start_message_port called on a unknown port."), Some(managed_port) => { if let Some(port_impl) = managed_port.port_impl.as_mut() { - port_impl.start() + (port_impl.start(), managed_port.dom_port.as_rooted()) } else { panic!("managed-port has no port-impl."); } }, - } + }; + (message_buffer, dom_port) } else { return warn!("start_message_port called on a global not managing any ports."); }; @@ -1042,6 +1141,18 @@ impl GlobalScope { for task in message_buffer { self.route_task_to_port(*port_id, task, CanGc::note()); } + if dom_port.disentangled() { + // <https://html.spec.whatwg.org/multipage/#disentangle> + // Fire an event named close at otherPort. + dom_port.upcast().fire_event(atom!("close"), can_gc); + + let res = self.script_to_constellation_chan().send( + ScriptToConstellationMessage::DisentanglePorts(*port_id, None), + ); + if res.is_err() { + warn!("Sending DisentanglePorts failed"); + } + } } } @@ -1055,7 +1166,7 @@ impl GlobalScope { Some(managed_port) => { if let Some(port_impl) = managed_port.port_impl.as_mut() { port_impl.close(); - managed_port.closed = true; + managed_port.explicitly_closed = true; } else { panic!("managed-port has no port-impl."); } @@ -1436,12 +1547,7 @@ impl GlobalScope { let to_be_removed: Vec<MessagePortId> = message_ports .iter() .filter_map(|(id, managed_port)| { - if managed_port.closed { - // Let the constellation know to drop this port and the one it is entangled with, - // and to forward this message to the script-process where the entangled is found. - let _ = self - .script_to_constellation_chan() - .send(ScriptToConstellationMessage::RemoveMessagePort(*id)); + if managed_port.explicitly_closed { Some(*id) } else { None @@ -1451,6 +1557,9 @@ impl GlobalScope { for id in to_be_removed { message_ports.remove(&id); } + // Note: ports are only removed throught explicit closure by script in this global. + // TODO: #25772 + // TODO: remove ports when we can be sure their port message queue is empty(via the constellation). message_ports.is_empty() } else { false @@ -1581,7 +1690,7 @@ impl GlobalScope { port_impl: Some(port_impl), dom_port: Dom::from_ref(dom_port), pending: true, - closed: false, + explicitly_closed: false, cross_realm_transform_readable: None, cross_realm_transform_writable: None, }, @@ -1605,7 +1714,7 @@ impl GlobalScope { port_impl: Some(port_impl), dom_port: Dom::from_ref(dom_port), pending: false, - closed: false, + explicitly_closed: false, cross_realm_transform_readable: None, cross_realm_transform_writable: None, }, diff --git a/components/script/dom/gpucanvascontext.rs b/components/script/dom/gpucanvascontext.rs index 5304d0f5d3b..2bdabf3e0ab 100644 --- a/components/script/dom/gpucanvascontext.rs +++ b/components/script/dom/gpucanvascontext.rs @@ -3,7 +3,6 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use dom_struct::dom_struct; -use script_layout_interface::HTMLCanvasDataSource; use crate::dom::bindings::codegen::Bindings::GPUCanvasContextBinding::GPUCanvasContextMethods; use crate::dom::bindings::codegen::UnionTypes; @@ -31,7 +30,7 @@ impl GPUCanvasContextMethods<crate::DomTypeHolder> for GPUCanvasContext { } impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, GPUCanvasContext> { - fn canvas_data_source(self) -> HTMLCanvasDataSource { + fn canvas_data_source(self) -> Option<ImageKey> { unimplemented!() } } diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index bb27d28cea8..56e008839ba 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -21,20 +21,19 @@ use image::{ColorType, ImageEncoder}; use ipc_channel::ipc::{self as ipcchan}; use js::error::throw_type_error; use js::rust::{HandleObject, HandleValue}; -use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource}; +use script_layout_interface::HTMLCanvasData; use servo_media::streams::MediaStreamType; use servo_media::streams::registry::MediaStreamId; use snapshot::Snapshot; use style::attr::AttrValue; -use crate::canvas_context::CanvasContext as _; pub(crate) use crate::canvas_context::*; use crate::conversions::Convert; use crate::dom::attr::Attr; use crate::dom::bindings::callback::ExceptionHandling; use crate::dom::bindings::cell::{DomRefCell, Ref, ref_filter_map}; use crate::dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::{ - BlobCallback, HTMLCanvasElementMethods, RenderingContext, + BlobCallback, HTMLCanvasElementMethods, RenderingContext as RootedRenderingContext, }; use crate::dom::bindings::codegen::Bindings::MediaStreamBinding::MediaStreamMethods; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; @@ -104,21 +103,10 @@ impl EncodedImageType { } } -#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] -#[derive(Clone, JSTraceable, MallocSizeOf)] -pub(crate) enum CanvasContext { - Placeholder(Dom<OffscreenCanvas>), - Context2d(Dom<CanvasRenderingContext2D>), - WebGL(Dom<WebGLRenderingContext>), - WebGL2(Dom<WebGL2RenderingContext>), - #[cfg(feature = "webgpu")] - WebGPU(Dom<GPUCanvasContext>), -} - #[dom_struct] pub(crate) struct HTMLCanvasElement { htmlelement: HTMLElement, - context: DomRefCell<Option<CanvasContext>>, + context: DomRefCell<Option<RenderingContext>>, // This id and hashmap are used to keep track of ongoing toBlob() calls. callback_id: Cell<u32>, #[ignore_malloc_size_of = "not implemented for webidl callbacks"] @@ -159,14 +147,7 @@ impl HTMLCanvasElement { fn recreate_contexts_after_resize(&self) { if let Some(ref context) = *self.context.borrow() { - match *context { - CanvasContext::Context2d(ref context) => context.resize(), - CanvasContext::WebGL(ref context) => context.resize(), - CanvasContext::WebGL2(ref context) => context.resize(), - #[cfg(feature = "webgpu")] - CanvasContext::WebGPU(ref context) => context.resize(), - CanvasContext::Placeholder(ref context) => context.resize(self.get_size().cast()), - } + context.resize() } } @@ -176,23 +157,14 @@ impl HTMLCanvasElement { pub(crate) fn origin_is_clean(&self) -> bool { match *self.context.borrow() { - Some(CanvasContext::Context2d(ref context)) => context.origin_is_clean(), + Some(ref context) => context.origin_is_clean(), _ => true, } } pub(crate) fn mark_as_dirty(&self) { if let Some(ref context) = *self.context.borrow() { - match *context { - CanvasContext::Context2d(ref context) => context.mark_as_dirty(), - CanvasContext::WebGL(ref context) => context.mark_as_dirty(), - CanvasContext::WebGL2(ref context) => context.mark_as_dirty(), - #[cfg(feature = "webgpu")] - CanvasContext::WebGPU(ref context) => context.mark_as_dirty(), - CanvasContext::Placeholder(ref _context) => { - // TODO: Should this be marked as dirty? - }, - } + context.mark_as_dirty() } } @@ -222,12 +194,14 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom<'_, HTMLCanvasElement> { fn data(self) -> HTMLCanvasData { let source = unsafe { match self.unsafe_get().context.borrow_for_layout().as_ref() { - Some(CanvasContext::Context2d(context)) => context.to_layout().canvas_data_source(), - Some(CanvasContext::WebGL(context)) => context.to_layout().canvas_data_source(), - Some(CanvasContext::WebGL2(context)) => context.to_layout().canvas_data_source(), + Some(RenderingContext::Context2d(context)) => { + context.to_layout().canvas_data_source() + }, + Some(RenderingContext::WebGL(context)) => context.to_layout().canvas_data_source(), + Some(RenderingContext::WebGL2(context)) => context.to_layout().canvas_data_source(), #[cfg(feature = "webgpu")] - Some(CanvasContext::WebGPU(context)) => context.to_layout().canvas_data_source(), - Some(CanvasContext::Placeholder(_)) | None => HTMLCanvasDataSource::Empty, + Some(RenderingContext::WebGPU(context)) => context.to_layout().canvas_data_source(), + Some(RenderingContext::Placeholder(_)) | None => None, } }; @@ -246,14 +220,14 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom<'_, HTMLCanvasElement> { } impl HTMLCanvasElement { - pub(crate) fn context(&self) -> Option<Ref<CanvasContext>> { + pub(crate) fn context(&self) -> Option<Ref<RenderingContext>> { ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref()) } fn get_or_init_2d_context(&self, can_gc: CanGc) -> Option<DomRoot<CanvasRenderingContext2D>> { if let Some(ctx) = self.context() { return match *ctx { - CanvasContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)), + RenderingContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)), _ => None, }; } @@ -261,7 +235,7 @@ impl HTMLCanvasElement { let window = self.owner_window(); let size = self.get_size(); let context = CanvasRenderingContext2D::new(window.as_global_scope(), self, size, can_gc); - *self.context.borrow_mut() = Some(CanvasContext::Context2d(Dom::from_ref(&*context))); + *self.context.borrow_mut() = Some(RenderingContext::Context2d(Dom::from_ref(&*context))); Some(context) } @@ -273,7 +247,7 @@ impl HTMLCanvasElement { ) -> Option<DomRoot<WebGLRenderingContext>> { if let Some(ctx) = self.context() { return match *ctx { - CanvasContext::WebGL(ref ctx) => Some(DomRoot::from_ref(ctx)), + RenderingContext::WebGL(ref ctx) => Some(DomRoot::from_ref(ctx)), _ => None, }; } @@ -289,7 +263,7 @@ impl HTMLCanvasElement { attrs, can_gc, )?; - *self.context.borrow_mut() = Some(CanvasContext::WebGL(Dom::from_ref(&*context))); + *self.context.borrow_mut() = Some(RenderingContext::WebGL(Dom::from_ref(&*context))); Some(context) } @@ -305,7 +279,7 @@ impl HTMLCanvasElement { } if let Some(ctx) = self.context() { return match *ctx { - CanvasContext::WebGL2(ref ctx) => Some(DomRoot::from_ref(ctx)), + RenderingContext::WebGL2(ref ctx) => Some(DomRoot::from_ref(ctx)), _ => None, }; } @@ -314,7 +288,7 @@ impl HTMLCanvasElement { let attrs = Self::get_gl_attributes(cx, options)?; let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self)); let context = WebGL2RenderingContext::new(&window, &canvas, size, attrs, can_gc)?; - *self.context.borrow_mut() = Some(CanvasContext::WebGL2(Dom::from_ref(&*context))); + *self.context.borrow_mut() = Some(RenderingContext::WebGL2(Dom::from_ref(&*context))); Some(context) } @@ -327,7 +301,7 @@ impl HTMLCanvasElement { fn get_or_init_webgpu_context(&self, can_gc: CanGc) -> Option<DomRoot<GPUCanvasContext>> { if let Some(ctx) = self.context() { return match *ctx { - CanvasContext::WebGPU(ref ctx) => Some(DomRoot::from_ref(ctx)), + RenderingContext::WebGPU(ref ctx) => Some(DomRoot::from_ref(ctx)), _ => None, }; } @@ -341,7 +315,8 @@ impl HTMLCanvasElement { .expect("Failed to get WebGPU channel") .map(|channel| { let context = GPUCanvasContext::new(&global_scope, self, channel, can_gc); - *self.context.borrow_mut() = Some(CanvasContext::WebGPU(Dom::from_ref(&*context))); + *self.context.borrow_mut() = + Some(RenderingContext::WebGPU(Dom::from_ref(&*context))); context }) } @@ -349,8 +324,8 @@ impl HTMLCanvasElement { /// Gets the base WebGLRenderingContext for WebGL or WebGL 2, if exists. pub(crate) fn get_base_webgl_context(&self) -> Option<DomRoot<WebGLRenderingContext>> { match *self.context.borrow() { - Some(CanvasContext::WebGL(ref context)) => Some(DomRoot::from_ref(context)), - Some(CanvasContext::WebGL2(ref context)) => Some(context.base_context()), + Some(RenderingContext::WebGL(ref context)) => Some(DomRoot::from_ref(context)), + Some(RenderingContext::WebGL2(ref context)) => Some(context.base_context()), _ => None, } } @@ -378,12 +353,7 @@ impl HTMLCanvasElement { pub(crate) fn get_image_data(&self) -> Option<Snapshot> { match self.context.borrow().as_ref() { - Some(CanvasContext::Context2d(context)) => context.get_image_data(), - Some(CanvasContext::WebGL(context)) => context.get_image_data(), - Some(CanvasContext::WebGL2(context)) => context.get_image_data(), - #[cfg(feature = "webgpu")] - Some(CanvasContext::WebGPU(context)) => context.get_image_data(), - Some(CanvasContext::Placeholder(context)) => context.get_image_data(), + Some(context) => context.get_image_data(), None => { let size = self.get_size(); if size.width == 0 || size.height == 0 { @@ -466,7 +436,7 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement { // is set to placeholder, the user agent must throw an "InvalidStateError" DOMException and leave the // attribute's value unchanged. fn SetWidth(&self, value: u32, can_gc: CanGc) -> Fallible<()> { - if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() { + if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() { return Err(Error::InvalidState); } @@ -485,7 +455,7 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement { // https://html.spec.whatwg.org/multipage/#dom-canvas-height fn SetHeight(&self, value: u32, can_gc: CanGc) -> Fallible<()> { - if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() { + if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() { return Err(Error::InvalidState); } @@ -506,26 +476,26 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement { id: DOMString, options: HandleValue, can_gc: CanGc, - ) -> Fallible<Option<RenderingContext>> { + ) -> Fallible<Option<RootedRenderingContext>> { // Always throw an InvalidState exception when the canvas is in Placeholder mode (See table in the spec). - if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() { + if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() { return Err(Error::InvalidState); } Ok(match &*id { "2d" => self .get_or_init_2d_context(can_gc) - .map(RenderingContext::CanvasRenderingContext2D), + .map(RootedRenderingContext::CanvasRenderingContext2D), "webgl" | "experimental-webgl" => self .get_or_init_webgl_context(cx, options, can_gc) - .map(RenderingContext::WebGLRenderingContext), + .map(RootedRenderingContext::WebGLRenderingContext), "webgl2" | "experimental-webgl2" => self .get_or_init_webgl2_context(cx, options, can_gc) - .map(RenderingContext::WebGL2RenderingContext), + .map(RootedRenderingContext::WebGL2RenderingContext), #[cfg(feature = "webgpu")] "webgpu" => self .get_or_init_webgpu_context(can_gc) - .map(RenderingContext::GPUCanvasContext), + .map(RootedRenderingContext::GPUCanvasContext), _ => None, }) } @@ -672,7 +642,8 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement { can_gc, ); // Step 4. Set this canvas element's context mode to placeholder. - *self.context.borrow_mut() = Some(CanvasContext::Placeholder(offscreen_canvas.as_traced())); + *self.context.borrow_mut() = + Some(RenderingContext::Placeholder(offscreen_canvas.as_traced())); // Step 5. Return offscreenCanvas. Ok(offscreen_canvas) diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs index a3e2a05af32..1d48b8e7a97 100644 --- a/components/script/dom/htmldetailselement.rs +++ b/components/script/dom/htmldetailselement.rs @@ -178,8 +178,6 @@ impl HTMLDetailsElement { } } shadow_tree.descendants.Assign(slottable_children); - - self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); } fn update_shadow_tree_styles(&self, can_gc: CanGc) { @@ -214,8 +212,6 @@ impl HTMLDetailsElement { .implicit_summary .upcast::<Element>() .set_string_attribute(&local_name!("style"), implicit_summary_style.into(), can_gc); - - self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); } } diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 9505d5182c7..e7efbde9b1d 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -32,7 +32,7 @@ use crate::dom::bindings::str::DOMString; use crate::dom::characterdata::CharacterData; use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner}; use crate::dom::customelementregistry::CallbackReaction; -use crate::dom::document::{Document, FocusType}; +use crate::dom::document::{Document, FocusInitiator}; use crate::dom::documentfragment::DocumentFragment; use crate::dom::domstringmap::DOMStringMap; use crate::dom::element::{AttributeMutation, Element}; @@ -415,18 +415,19 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement { // TODO: Mark the element as locked for focus and run the focusing steps. // https://html.spec.whatwg.org/multipage/#focusing-steps let document = self.owner_document(); - document.request_focus(Some(self.upcast()), FocusType::Element, can_gc); + document.request_focus(Some(self.upcast()), FocusInitiator::Local, can_gc); } // https://html.spec.whatwg.org/multipage/#dom-blur fn Blur(&self, can_gc: CanGc) { - // TODO: Run the unfocusing steps. + // TODO: Run the unfocusing steps. Focus the top-level document, not + // the current document. if !self.as_element().focus_state() { return; } // https://html.spec.whatwg.org/multipage/#unfocusing-steps let document = self.owner_document(); - document.request_focus(None, FocusType::Element, can_gc); + document.request_focus(None, FocusInitiator::Local, can_gc); } // https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index ce6dcca66f3..2421b683bf7 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -1270,8 +1270,14 @@ impl HTMLFormElement { return; } - let controls = self.controls.borrow(); - for child in controls.iter() { + let controls: Vec<_> = self + .controls + .borrow() + .iter() + .map(|c| c.as_rooted()) + .collect(); + + for child in controls { let child = child.upcast::<Node>(); match child.type_id() { diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 4f312e928c4..8b553923230 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -70,13 +70,17 @@ impl HTMLTableCellElementMethods<crate::DomTypeHolder> for HTMLTableCellElement make_uint_getter!(ColSpan, "colspan", DEFAULT_COLSPAN); // https://html.spec.whatwg.org/multipage/#dom-tdth-colspan - make_uint_setter!(SetColSpan, "colspan", DEFAULT_COLSPAN); + // > The colSpan IDL attribute must reflect the colspan content attribute. It is clamped to + // > the range [1, 1000], and its default value is 1. + make_clamped_uint_setter!(SetColSpan, "colspan", 1, 1000, 1); // https://html.spec.whatwg.org/multipage/#dom-tdth-rowspan make_uint_getter!(RowSpan, "rowspan", DEFAULT_ROWSPAN); // https://html.spec.whatwg.org/multipage/#dom-tdth-rowspan - make_uint_setter!(SetRowSpan, "rowspan", DEFAULT_ROWSPAN); + // > The rowSpan IDL attribute must reflect the rowspan content attribute. It is clamped to + // > the range [0, 65534], and its default value is 1. + make_clamped_uint_setter!(SetRowSpan, "rowspan", 0, 65534, 1); // https://html.spec.whatwg.org/multipage/#dom-tdth-bgcolor make_getter!(BgColor, "bgcolor"); @@ -174,23 +178,26 @@ impl VirtualMethods for HTMLTableCellElement { match *local_name { local_name!("colspan") => { let mut attr = AttrValue::from_u32(value.into(), DEFAULT_COLSPAN); - if let AttrValue::UInt(_, ref mut val) = attr { - if *val == 0 { - *val = 1; - } + if let AttrValue::UInt(_, ref mut value) = attr { + // From <https://html.spec.whatwg.org/multipage/#dom-tdth-colspan>: + // > The colSpan IDL attribute must reflect the colspan content attribute. It is clamped to + // > the range [1, 1000], and its default value is 1. + *value = (*value).clamp(1, 1000); } attr }, local_name!("rowspan") => { let mut attr = AttrValue::from_u32(value.into(), DEFAULT_ROWSPAN); - if let AttrValue::UInt(_, ref mut val) = attr { - if *val == 0 { - let node = self.upcast::<Node>(); - let doc = node.owner_doc(); - // rowspan = 0 is not supported in quirks mode - if doc.quirks_mode() != QuirksMode::NoQuirks { - *val = 1; - } + if let AttrValue::UInt(_, ref mut value) = attr { + // From <https://html.spec.whatwg.org/multipage/#dom-tdth-rowspan>: + // > The rowSpan IDL attribute must reflect the rowspan content attribute. It is clamped to + // > the range [0, 65534], and its default value is 1. + // Note that rowspan = 0 is not supported in quirks mode. + let document = self.upcast::<Node>().owner_doc(); + if document.quirks_mode() != QuirksMode::NoQuirks { + *value = (*value).clamp(1, 65534); + } else { + *value = (*value).clamp(0, 65534); } } attr diff --git a/components/script/dom/htmltablecolelement.rs b/components/script/dom/htmltablecolelement.rs index c7ad4afd944..9e8eecf1147 100644 --- a/components/script/dom/htmltablecolelement.rs +++ b/components/script/dom/htmltablecolelement.rs @@ -20,8 +20,6 @@ use crate::dom::node::Node; use crate::dom::virtualmethods::VirtualMethods; use crate::script_runtime::CanGc; -const DEFAULT_SPAN: u32 = 1; - #[dom_struct] pub(crate) struct HTMLTableColElement { htmlelement: HTMLElement, @@ -62,9 +60,11 @@ impl HTMLTableColElement { impl HTMLTableColElementMethods<crate::DomTypeHolder> for HTMLTableColElement { // <https://html.spec.whatwg.org/multipage/#attr-col-span> - make_uint_getter!(Span, "span", DEFAULT_SPAN); + make_uint_getter!(Span, "span", 1); // <https://html.spec.whatwg.org/multipage/#attr-col-span> - make_uint_setter!(SetSpan, "span", DEFAULT_SPAN); + // > The span IDL attribute must reflect the content attribute of the same name. It is clamped + // > to the range [1, 1000], and its default value is 1. + make_clamped_uint_setter!(SetSpan, "span", 1, 1000, 1); } pub(crate) trait HTMLTableColElementLayoutHelpers<'dom> { @@ -96,11 +96,12 @@ impl VirtualMethods for HTMLTableColElement { fn parse_plain_attribute(&self, local_name: &LocalName, value: DOMString) -> AttrValue { match *local_name { local_name!("span") => { - let mut attr = AttrValue::from_u32(value.into(), DEFAULT_SPAN); + let mut attr = AttrValue::from_u32(value.into(), 1); if let AttrValue::UInt(_, ref mut val) = attr { - if *val == 0 { - *val = 1; - } + // From <https://html.spec.whatwg.org/multipage/#attr-col-span>: + // > The span IDL attribute must reflect the content attribute of the same name. + // > It is clamped to the range [1, 1000], and its default value is 1. + *val = (*val).clamp(1, 1000); } attr }, diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index b3f222af0da..997341984c6 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -318,6 +318,26 @@ macro_rules! make_uint_setter( ); #[macro_export] +macro_rules! make_clamped_uint_setter( + ($attr:ident, $htmlname:tt, $min:expr, $max:expr, $default:expr) => ( + fn $attr(&self, value: u32) { + use $crate::dom::bindings::inheritance::Castable; + use $crate::dom::element::Element; + use $crate::dom::values::UNSIGNED_LONG_MAX; + use $crate::script_runtime::CanGc; + let value = if value > UNSIGNED_LONG_MAX { + $default + } else { + value.clamp($min, $max) + }; + + let element = self.upcast::<Element>(); + element.set_uint_attribute(&html5ever::local_name!($htmlname), value, CanGc::note()) + } + ); +); + +#[macro_export] macro_rules! make_limited_uint_setter( ($attr:ident, $htmlname:tt, $default:expr) => ( fn $attr(&self, value: u32) -> $crate::dom::bindings::error::ErrorResult { @@ -719,26 +739,3 @@ macro_rules! handle_potential_webgl_error { handle_potential_webgl_error!($context, $call, ()) }; } - -macro_rules! impl_rare_data ( - ($type:ty) => ( - fn rare_data(&self) -> Ref<Option<Box<$type>>> { - self.rare_data.borrow() - } - - #[allow(dead_code)] - fn rare_data_mut(&self) -> RefMut<Option<Box<$type>>> { - self.rare_data.borrow_mut() - } - - fn ensure_rare_data(&self) -> RefMut<Box<$type>> { - let mut rare_data = self.rare_data.borrow_mut(); - if rare_data.is_none() { - *rare_data = Some(Default::default()); - } - RefMut::map(rare_data, |rare_data| { - rare_data.as_mut().unwrap() - }) - } - ); -); diff --git a/components/script/dom/messageport.rs b/components/script/dom/messageport.rs index 85d94c1aa7a..d70d3139b96 100644 --- a/components/script/dom/messageport.rs +++ b/components/script/dom/messageport.rs @@ -83,6 +83,20 @@ impl MessagePort { *self.entangled_port.borrow_mut() = Some(other_id); } + /// <https://html.spec.whatwg.org/multipage/#disentangle> + pub(crate) fn disentangle(&self) -> Option<MessagePortId> { + // Disentangle initiatorPort and otherPort, so that they are no longer entangled or associated with each other. + // Note: called from `disentangle_port` in the global, where the rest happens. + self.entangled_port.borrow_mut().take() + } + + /// Has the port been disentangled? + /// Used when starting the port to fire the `close` event, + /// to cover the case of a disentanglement while in transfer. + pub(crate) fn disentangled(&self) -> bool { + self.entangled_port.borrow().is_none() + } + pub(crate) fn message_port_id(&self) -> &MessagePortId { &self.message_port_id } @@ -314,20 +328,28 @@ impl MessagePortMethods<crate::DomTypeHolder> for MessagePort { } /// <https://html.spec.whatwg.org/multipage/#dom-messageport-start> - fn Start(&self) { + fn Start(&self, can_gc: CanGc) { if self.detached.get() { return; } - self.global().start_message_port(self.message_port_id()); + self.global() + .start_message_port(self.message_port_id(), can_gc); } /// <https://html.spec.whatwg.org/multipage/#dom-messageport-close> - fn Close(&self) { + fn Close(&self, can_gc: CanGc) { if self.detached.get() { return; } + + // Set this's [[Detached]] internal slot value to true. self.detached.set(true); - self.global().close_message_port(self.message_port_id()); + + let global = self.global(); + global.close_message_port(self.message_port_id()); + + // If this is entangled, disentangle it. + global.disentangle_port(self, can_gc); } /// <https://html.spec.whatwg.org/multipage/#handler-messageport-onmessage> @@ -340,15 +362,19 @@ impl MessagePortMethods<crate::DomTypeHolder> for MessagePort { } /// <https://html.spec.whatwg.org/multipage/#handler-messageport-onmessage> - fn SetOnmessage(&self, listener: Option<Rc<EventHandlerNonNull>>) { + fn SetOnmessage(&self, listener: Option<Rc<EventHandlerNonNull>>, can_gc: CanGc) { if self.detached.get() { return; } self.set_onmessage(listener); // Note: we cannot use the event_handler macro, due to the need to start the port. - self.global().start_message_port(self.message_port_id()); + self.global() + .start_message_port(self.message_port_id(), can_gc); } // <https://html.spec.whatwg.org/multipage/#handler-messageport-onmessageerror> event_handler!(messageerror, GetOnmessageerror, SetOnmessageerror); + + // <https://html.spec.whatwg.org/multipage/#handler-messageport-onclose> + event_handler!(close, GetOnclose, SetOnclose); } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index b56126076da..e9d36a01426 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -110,7 +110,7 @@ use crate::dom::pointerevent::{PointerEvent, PointerId}; use crate::dom::processinginstruction::ProcessingInstruction; use crate::dom::range::WeakRangeVec; use crate::dom::raredata::NodeRareData; -use crate::dom::servoparser::serialize_html_fragment; +use crate::dom::servoparser::{ServoParser, serialize_html_fragment}; use crate::dom::shadowroot::{IsUserAgentWidget, LayoutShadowRootHelpers, ShadowRoot}; use crate::dom::stylesheetlist::StyleSheetListOwner; use crate::dom::svgsvgelement::{LayoutSVGSVGElementHelpers, SVGSVGElement}; @@ -316,6 +316,34 @@ impl Node { } } + /// Implements the "unsafely set HTML" algorithm as specified in: + /// <https://html.spec.whatwg.org/multipage/#concept-unsafely-set-html> + pub fn unsafely_set_html( + target: &Node, + context_element: &Element, + html: DOMString, + can_gc: CanGc, + ) { + // Step 1. Let newChildren be the result of the HTML fragment parsing algorithm. + let new_children = ServoParser::parse_html_fragment(context_element, html, true, can_gc); + + // Step 2. Let fragment be a new DocumentFragment whose node document is contextElement's node document. + + let context_document = context_element.owner_document(); + let fragment = DocumentFragment::new(&context_document, can_gc); + + // Step 3. For each node in newChildren, append node to fragment. + for child in new_children { + fragment + .upcast::<Node>() + .AppendChild(&child, can_gc) + .unwrap(); + } + + // Step 4. Replace all with fragment within target. + Node::replace_all(Some(fragment.upcast()), target, can_gc); + } + pub(crate) fn clean_up_style_and_layout_data(&self) { self.owner_doc().cancel_animations_for_node(self); self.style_data.borrow_mut().take(); @@ -564,7 +592,17 @@ impl Iterator for QuerySelectorIterator { } impl Node { - impl_rare_data!(NodeRareData); + fn rare_data(&self) -> Ref<Option<Box<NodeRareData>>> { + self.rare_data.borrow() + } + + fn ensure_rare_data(&self) -> RefMut<Box<NodeRareData>> { + let mut rare_data = self.rare_data.borrow_mut(); + if rare_data.is_none() { + *rare_data = Some(Default::default()); + } + RefMut::map(rare_data, |rare_data| rare_data.as_mut().unwrap()) + } /// Returns true if this node is before `other` in the same connected DOM /// tree. @@ -1007,24 +1045,25 @@ impl Node { /// <https://dom.spec.whatwg.org/#dom-childnode-replacewith> pub(crate) fn replace_with(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult { - // Step 1. - let parent = if let Some(parent) = self.GetParentNode() { - parent - } else { - // Step 2. + // Step 1. Let parent be this’s parent. + let Some(parent) = self.GetParentNode() else { + // Step 2. If parent is null, then return. return Ok(()); }; - // Step 3. + + // Step 3. Let viableNextSibling be this’s first following sibling not in nodes; otherwise null. let viable_next_sibling = first_node_not_in(self.following_siblings(), &nodes); - // Step 4. + + // Step 4. Let node be the result of converting nodes into a node, given nodes and this’s node document. let node = self .owner_doc() .node_from_nodes_and_strings(nodes, can_gc)?; + if self.parent_node == Some(&*parent) { - // Step 5. + // Step 5. If this’s parent is parent, replace this with node within parent. parent.ReplaceChild(&node, self, can_gc)?; } else { - // Step 6. + // Step 6. Otherwise, pre-insert node into parent before viableNextSibling. Node::pre_insert(&node, &parent, viable_next_sibling.as_deref(), can_gc)?; } Ok(()) @@ -1272,6 +1311,21 @@ impl Node { is_shadow_host, shadow_root_mode, display, + doctype_name: self + .downcast::<DocumentType>() + .map(DocumentType::name) + .cloned() + .map(String::from), + doctype_public_identifier: self + .downcast::<DocumentType>() + .map(DocumentType::public_id) + .cloned() + .map(String::from), + doctype_system_identifier: self + .downcast::<DocumentType>() + .map(DocumentType::system_id) + .cloned() + .map(String::from), } } @@ -3172,24 +3226,29 @@ impl NodeMethods<crate::DomTypeHolder> for Node { /// <https://dom.spec.whatwg.org/#concept-node-replace> fn ReplaceChild(&self, node: &Node, child: &Node, can_gc: CanGc) -> Fallible<DomRoot<Node>> { - // Step 1. + // Step 1. If parent is not a Document, DocumentFragment, or Element node, + // then throw a "HierarchyRequestError" DOMException. match self.type_id() { NodeTypeId::Document(_) | NodeTypeId::DocumentFragment(_) | NodeTypeId::Element(..) => { }, _ => return Err(Error::HierarchyRequest), } - // Step 2. + // Step 2. If node is a host-including inclusive ancestor of parent, + // then throw a "HierarchyRequestError" DOMException. if node.is_inclusive_ancestor_of(self) { return Err(Error::HierarchyRequest); } - // Step 3. + // Step 3. If child’s parent is not parent, then throw a "NotFoundError" DOMException. if !self.is_parent_of(child) { return Err(Error::NotFound); } - // Step 4-5. + // Step 4. If node is not a DocumentFragment, DocumentType, Element, or CharacterData node, + // then throw a "HierarchyRequestError" DOMException. + // Step 5. If either node is a Text node and parent is a document, + // or node is a doctype and parent is not a document, then throw a "HierarchyRequestError" DOMException. match node.type_id() { NodeTypeId::CharacterData(CharacterDataTypeId::Text(_)) if self.is::<Document>() => { return Err(Error::HierarchyRequest); @@ -3201,7 +3260,8 @@ impl NodeMethods<crate::DomTypeHolder> for Node { _ => (), } - // Step 6. + // Step 6. If parent is a document, and any of the statements below, switched on the interface node implements, + // are true, then throw a "HierarchyRequestError" DOMException. if self.is::<Document>() { match node.type_id() { // Step 6.1 @@ -3255,7 +3315,8 @@ impl NodeMethods<crate::DomTypeHolder> for Node { } } - // Step 7-8. + // Step 7. Let referenceChild be child’s next sibling. + // Step 8. If referenceChild is node, then set referenceChild to node’s next sibling. let child_next_sibling = child.GetNextSibling(); let node_next_sibling = node.GetNextSibling(); let reference_child = if child_next_sibling.as_deref() == Some(node) { @@ -3264,7 +3325,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node { child_next_sibling.as_deref() }; - // Step 9. + // Step 9. Let previousSibling be child’s previous sibling. let previous_sibling = child.GetPreviousSibling(); // NOTE: All existing browsers assume that adoption is performed here, which does not follow the DOM spec. @@ -3285,7 +3346,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node { None }; - // Step 12. + // Step 12. Let nodes be node’s children if node is a DocumentFragment node; otherwise « node ». rooted_vec!(let mut nodes); let nodes = if node.type_id() == NodeTypeId::DocumentFragment(DocumentFragmentTypeId::DocumentFragment) || @@ -3297,7 +3358,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node { from_ref(&node) }; - // Step 13. + // Step 13. Insert node into parent before referenceChild with the suppress observers flag set. Node::insert( node, self, @@ -3306,13 +3367,15 @@ impl NodeMethods<crate::DomTypeHolder> for Node { can_gc, ); - // Step 14. vtable_for(self).children_changed(&ChildrenMutation::replace( previous_sibling.as_deref(), &removed_child, nodes, reference_child, )); + + // Step 14. Queue a tree mutation record for parent with nodes, removedNodes, + // previousSibling, and referenceChild. let removed = removed_child.map(|r| [r]); let mutation = LazyCell::new(|| Mutation::ChildList { added: Some(nodes), @@ -3323,7 +3386,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node { MutationObserver::queue_a_mutation_record(self, mutation); - // Step 15. + // Step 15. Return child. Ok(DomRoot::from_ref(child)) } diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index b349f16a986..1ec2dc3f78b 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -175,7 +175,6 @@ impl NodeList { #[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] pub(crate) struct ChildrenList { node: Dom<Node>, - #[ignore_malloc_size_of = "Defined in rust-mozjs"] last_visited: MutNullableDom<Node>, last_index: Cell<u32>, } diff --git a/components/script/dom/offscreencanvas.rs b/components/script/dom/offscreencanvas.rs index aabe5955e12..9947d35f4e0 100644 --- a/components/script/dom/offscreencanvas.rs +++ b/components/script/dom/offscreencanvas.rs @@ -9,9 +9,10 @@ use euclid::default::Size2D; use js::rust::{HandleObject, HandleValue}; use snapshot::Snapshot; +use crate::canvas_context::{CanvasContext, OffscreenRenderingContext}; use crate::dom::bindings::cell::{DomRefCell, Ref, ref_filter_map}; use crate::dom::bindings::codegen::Bindings::OffscreenCanvasBinding::{ - OffscreenCanvasMethods, OffscreenRenderingContext, + OffscreenCanvasMethods, OffscreenRenderingContext as RootedOffscreenRenderingContext, }; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::reflector::{DomGlobal, reflect_dom_object_with_proto}; @@ -23,20 +24,12 @@ use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::offscreencanvasrenderingcontext2d::OffscreenCanvasRenderingContext2D; use crate::script_runtime::{CanGc, JSContext}; -#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] -#[derive(Clone, JSTraceable, MallocSizeOf)] -pub(crate) enum OffscreenCanvasContext { - OffscreenContext2d(Dom<OffscreenCanvasRenderingContext2D>), - //WebGL(Dom<WebGLRenderingContext>), - //WebGL2(Dom<WebGL2RenderingContext>), -} - #[dom_struct] pub(crate) struct OffscreenCanvas { eventtarget: EventTarget, width: Cell<u64>, height: Cell<u64>, - context: DomRefCell<Option<OffscreenCanvasContext>>, + context: DomRefCell<Option<OffscreenRenderingContext>>, placeholder: Option<Dom<HTMLCanvasElement>>, } @@ -77,20 +70,18 @@ impl OffscreenCanvas { pub(crate) fn origin_is_clean(&self) -> bool { match *self.context.borrow() { - Some(OffscreenCanvasContext::OffscreenContext2d(ref context)) => { - context.origin_is_clean() - }, + Some(ref context) => context.origin_is_clean(), _ => true, } } - pub(crate) fn context(&self) -> Option<Ref<OffscreenCanvasContext>> { + pub(crate) fn context(&self) -> Option<Ref<OffscreenRenderingContext>> { ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref()) } pub(crate) fn get_image_data(&self) -> Option<Snapshot> { match self.context.borrow().as_ref() { - Some(OffscreenCanvasContext::OffscreenContext2d(context)) => context.get_image_data(), + Some(context) => context.get_image_data(), None => { let size = self.get_size(); if size.width == 0 || size.height == 0 { @@ -108,13 +99,13 @@ impl OffscreenCanvas { ) -> Option<DomRoot<OffscreenCanvasRenderingContext2D>> { if let Some(ctx) = self.context() { return match *ctx { - OffscreenCanvasContext::OffscreenContext2d(ref ctx) => Some(DomRoot::from_ref(ctx)), + OffscreenRenderingContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)), }; } let context = OffscreenCanvasRenderingContext2D::new(&self.global(), self, can_gc); - *self.context.borrow_mut() = Some(OffscreenCanvasContext::OffscreenContext2d( - Dom::from_ref(&*context), - )); + *self.context.borrow_mut() = Some(OffscreenRenderingContext::Context2d(Dom::from_ref( + &*context, + ))); Some(context) } @@ -125,19 +116,6 @@ impl OffscreenCanvas { pub(crate) fn placeholder(&self) -> Option<&HTMLCanvasElement> { self.placeholder.as_deref() } - - pub(crate) fn resize(&self, size: Size2D<u64>) { - self.width.set(size.width); - self.height.set(size.height); - - if let Some(canvas_context) = self.context() { - match &*canvas_context { - OffscreenCanvasContext::OffscreenContext2d(rendering_context) => { - rendering_context.set_canvas_bitmap_dimensions(self.get_size()); - }, - } - } - } } impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas { @@ -160,11 +138,11 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas { id: DOMString, _options: HandleValue, can_gc: CanGc, - ) -> Fallible<Option<OffscreenRenderingContext>> { + ) -> Fallible<Option<RootedOffscreenRenderingContext>> { match &*id { "2d" => Ok(self .get_or_init_2d_context(can_gc) - .map(OffscreenRenderingContext::OffscreenCanvasRenderingContext2D)), + .map(RootedOffscreenRenderingContext::OffscreenCanvasRenderingContext2D)), /*"webgl" | "experimental-webgl" => self .get_or_init_webgl_context(cx, options) .map(OffscreenRenderingContext::WebGLRenderingContext), @@ -187,11 +165,7 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas { self.width.set(value); if let Some(canvas_context) = self.context() { - match &*canvas_context { - OffscreenCanvasContext::OffscreenContext2d(rendering_context) => { - rendering_context.set_canvas_bitmap_dimensions(self.get_size()); - }, - } + canvas_context.resize(); } if let Some(canvas) = &self.placeholder { @@ -209,11 +183,7 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas { self.height.set(value); if let Some(canvas_context) = self.context() { - match &*canvas_context { - OffscreenCanvasContext::OffscreenContext2d(rendering_context) => { - rendering_context.set_canvas_bitmap_dimensions(self.get_size()); - }, - } + canvas_context.resize(); } if let Some(canvas) = &self.placeholder { diff --git a/components/script/dom/offscreencanvasrenderingcontext2d.rs b/components/script/dom/offscreencanvasrenderingcontext2d.rs index b2d0f3201ca..d7ca0e9dc4d 100644 --- a/components/script/dom/offscreencanvasrenderingcontext2d.rs +++ b/components/script/dom/offscreencanvasrenderingcontext2d.rs @@ -3,11 +3,10 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::GenericBindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2D_Binding::CanvasRenderingContext2DMethods; -use crate::canvas_context::CanvasContext as _; +use crate::canvas_context::CanvasContext; use crate::dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrOffscreenCanvas; use canvas_traits::canvas::Canvas2dMsg; use dom_struct::dom_struct; -use euclid::default::Size2D; use snapshot::Snapshot; use crate::dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::{ @@ -64,21 +63,33 @@ impl OffscreenCanvasRenderingContext2D { reflect_dom_object(boxed, global, can_gc) } - pub(crate) fn set_canvas_bitmap_dimensions(&self, size: Size2D<u64>) { - self.context.set_canvas_bitmap_dimensions(size.cast()); - } - pub(crate) fn send_canvas_2d_msg(&self, msg: Canvas2dMsg) { self.context.send_canvas_2d_msg(msg) } +} - pub(crate) fn origin_is_clean(&self) -> bool { - self.context.origin_is_clean() +impl CanvasContext for OffscreenCanvasRenderingContext2D { + type ID = <CanvasRenderingContext2D as CanvasContext>::ID; + + fn context_id(&self) -> Self::ID { + self.context.context_id() + } + + fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas { + self.context.canvas() + } + + fn resize(&self) { + self.context.resize() } - pub(crate) fn get_image_data(&self) -> Option<Snapshot> { + fn get_image_data(&self) -> Option<Snapshot> { self.context.get_image_data() } + + fn origin_is_clean(&self) -> bool { + self.context.origin_is_clean() + } } impl OffscreenCanvasRenderingContext2DMethods<crate::DomTypeHolder> diff --git a/components/script/dom/readablestream.rs b/components/script/dom/readablestream.rs index 51393ab33ae..4982bfa32e3 100644 --- a/components/script/dom/readablestream.rs +++ b/components/script/dom/readablestream.rs @@ -1825,7 +1825,7 @@ impl ReadableStream { global.note_cross_realm_transform_readable(&cross_realm_transform_readable, port_id); // Enable port’s port message queue. - port.Start(); + port.Start(can_gc); // Perform ! SetUpReadableStreamDefaultController controller @@ -2093,7 +2093,7 @@ impl CrossRealmTransformReadable { self.controller.close(can_gc); // Disentangle port. - global.disentangle_port(port); + global.disentangle_port(port, can_gc); } // Otherwise, if type is "error", @@ -2102,7 +2102,7 @@ impl CrossRealmTransformReadable { self.controller.error(value.handle(), can_gc); // Disentangle port. - global.disentangle_port(port); + global.disentangle_port(port, can_gc); } } @@ -2129,7 +2129,7 @@ impl CrossRealmTransformReadable { self.controller.error(rooted_error.handle(), can_gc); // Disentangle port. - global.disentangle_port(port); + global.disentangle_port(port, can_gc); } } diff --git a/components/script/dom/shadowroot.rs b/components/script/dom/shadowroot.rs index 72b074ed6f4..14d9c24b10e 100644 --- a/components/script/dom/shadowroot.rs +++ b/components/script/dom/shadowroot.rs @@ -453,6 +453,15 @@ impl ShadowRootMethods<crate::DomTypeHolder> for ShadowRoot { self.slot_assignment_mode } + /// <https://html.spec.whatwg.org/multipage/#dom-shadowroot-sethtmlunsafe> + fn SetHTMLUnsafe(&self, html: DOMString, can_gc: CanGc) { + // Step 2. Unsafely set HTMl given this, this's shadow host, and complaintHTML + let target = self.upcast::<Node>(); + let context_element = self.Host(); + + Node::unsafely_set_html(target, &context_element, html, can_gc); + } + // https://dom.spec.whatwg.org/#dom-shadowroot-onslotchange event_handler!(onslotchange, GetOnslotchange, SetOnslotchange); } diff --git a/components/script/dom/underlyingsourcecontainer.rs b/components/script/dom/underlyingsourcecontainer.rs index 541a831693a..4acb58bafef 100644 --- a/components/script/dom/underlyingsourcecontainer.rs +++ b/components/script/dom/underlyingsourcecontainer.rs @@ -151,7 +151,7 @@ impl UnderlyingSourceContainer { let result = port.pack_and_post_message_handling_error("error", reason, can_gc); // Disentangle port. - self.global().disentangle_port(port); + self.global().disentangle_port(port, can_gc); let promise = Promise::new(&self.global(), can_gc); diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 416454d8719..5e538b53b5f 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -22,10 +22,10 @@ use js::jsval::{BooleanValue, DoubleValue, Int32Value, NullValue, ObjectValue, U use js::rust::{CustomAutoRooterGuard, HandleObject, MutableHandleValue}; use js::typedarray::{ArrayBufferView, CreateWith, Float32, Int32Array, Uint32, Uint32Array}; use script_bindings::interfaces::WebGL2RenderingContextHelpers; -use script_layout_interface::HTMLCanvasDataSource; use servo_config::pref; use snapshot::Snapshot; use url::Host; +use webrender_api::ImageKey; use crate::canvas_context::CanvasContext; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::{ @@ -4702,7 +4702,7 @@ impl WebGL2RenderingContextMethods<crate::DomTypeHolder> for WebGL2RenderingCont impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, WebGL2RenderingContext> { #[allow(unsafe_code)] - fn canvas_data_source(self) -> HTMLCanvasDataSource { + fn canvas_data_source(self) -> Option<ImageKey> { let this = self.unsafe_get(); unsafe { (*this.base.to_layout().unsafe_get()).layout_handle() } } diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 9996a3cf504..98170f9655b 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -31,7 +31,6 @@ use js::typedarray::{ }; use net_traits::image_cache::ImageResponse; use pixels::{self, PixelFormat}; -use script_layout_interface::HTMLCanvasDataSource; use serde::{Deserialize, Serialize}; use servo_config::pref; use snapshot::Snapshot; @@ -875,9 +874,8 @@ impl WebGLRenderingContext { receiver.recv().unwrap() } - pub(crate) fn layout_handle(&self) -> HTMLCanvasDataSource { - let image_key = self.webrender_image; - HTMLCanvasDataSource::WebGL(image_key) + pub(crate) fn layout_handle(&self) -> Option<ImageKey> { + Some(self.webrender_image) } // https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/ @@ -4829,7 +4827,7 @@ impl WebGLRenderingContextMethods<crate::DomTypeHolder> for WebGLRenderingContex } impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, WebGLRenderingContext> { - fn canvas_data_source(self) -> HTMLCanvasDataSource { + fn canvas_data_source(self) -> Option<ImageKey> { (*self.unsafe_get()).layout_handle() } } diff --git a/components/script/dom/webgpu/gpucanvascontext.rs b/components/script/dom/webgpu/gpucanvascontext.rs index c81f96f651f..359b1b14003 100644 --- a/components/script/dom/webgpu/gpucanvascontext.rs +++ b/components/script/dom/webgpu/gpucanvascontext.rs @@ -8,7 +8,6 @@ use std::cell::RefCell; use arrayvec::ArrayVec; use dom_struct::dom_struct; use ipc_channel::ipc::{self}; -use script_layout_interface::HTMLCanvasDataSource; use snapshot::Snapshot; use webgpu_traits::{ ContextConfiguration, PRESENTATION_BUFFER_COUNT, WebGPU, WebGPUContextId, WebGPURequest, @@ -227,11 +226,11 @@ impl GPUCanvasContext { // Internal helper methods impl GPUCanvasContext { - fn layout_handle(&self) -> HTMLCanvasDataSource { + fn layout_handle(&self) -> Option<ImageKey> { if self.drawing_buffer.borrow().cleared { - HTMLCanvasDataSource::Empty + None } else { - HTMLCanvasDataSource::WebGPU(self.webrender_image) + Some(self.webrender_image) } } @@ -301,7 +300,7 @@ impl CanvasContext for GPUCanvasContext { } impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, GPUCanvasContext> { - fn canvas_data_source(self) -> HTMLCanvasDataSource { + fn canvas_data_source(self) -> Option<ImageKey> { (*self.unsafe_get()).layout_handle() } } diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index e210476a5df..90782e217b7 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -787,6 +787,32 @@ impl WindowMethods<crate::DomTypeHolder> for Window { doc.abort(can_gc); } + /// <https://html.spec.whatwg.org/multipage/#dom-window-focus> + fn Focus(&self) { + // > 1. Let `current` be this `Window` object's browsing context. + // > + // > 2. If `current` is null, then return. + let current = match self.undiscarded_window_proxy() { + Some(proxy) => proxy, + None => return, + }; + + // > 3. Run the focusing steps with `current`. + current.focus(); + + // > 4. If current is a top-level browsing context, user agents are + // > encouraged to trigger some sort of notification to indicate to + // > the user that the page is attempting to gain focus. + // + // TODO: Step 4 + } + + // https://html.spec.whatwg.org/multipage/#dom-window-blur + fn Blur(&self) { + // > User agents are encouraged to ignore calls to this `blur()` method + // > entirely. + } + // https://html.spec.whatwg.org/multipage/#dom-open fn Open( &self, @@ -1220,7 +1246,7 @@ impl WindowMethods<crate::DomTypeHolder> for Window { let rv = jsval_to_webdriver(cx, &self.globalscope, val, realm, can_gc); let opt_chan = self.webdriver_script_chan.borrow_mut().take(); if let Some(chan) = opt_chan { - chan.send(rv).unwrap(); + let _ = chan.send(rv); } } @@ -1229,9 +1255,9 @@ impl WindowMethods<crate::DomTypeHolder> for Window { let opt_chan = self.webdriver_script_chan.borrow_mut().take(); if let Some(chan) = opt_chan { if let Ok(rv) = rv { - chan.send(Err(WebDriverJSError::JSException(rv))).unwrap(); + let _ = chan.send(Err(WebDriverJSError::JSException(rv))); } else { - chan.send(rv).unwrap(); + let _ = chan.send(rv); } } } @@ -1239,7 +1265,7 @@ impl WindowMethods<crate::DomTypeHolder> for Window { fn WebdriverTimeout(&self) { let opt_chan = self.webdriver_script_chan.borrow_mut().take(); if let Some(chan) = opt_chan { - chan.send(Err(WebDriverJSError::Timeout)).unwrap(); + let _ = chan.send(Err(WebDriverJSError::Timeout)); } } diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index e3fc81bf7ec..dc02f9feb49 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -620,6 +620,23 @@ impl WindowProxy { result } + /// Run [the focusing steps] with this browsing context. + /// + /// [the focusing steps]: https://html.spec.whatwg.org/multipage/#focusing-steps + pub fn focus(&self) { + debug!( + "Requesting the constellation to initiate a focus operation for \ + browsing context {}", + self.browsing_context_id() + ); + self.global() + .script_to_constellation_chan() + .send(ScriptToConstellationMessage::FocusRemoteDocument( + self.browsing_context_id(), + )) + .unwrap(); + } + #[allow(unsafe_code)] /// Change the Window that this WindowProxy resolves to. // TODO: support setting the window proxy to a dummy value, diff --git a/components/script/dom/writablestream.rs b/components/script/dom/writablestream.rs index 8c2b2434cd2..1b029f592de 100644 --- a/components/script/dom/writablestream.rs +++ b/components/script/dom/writablestream.rs @@ -893,7 +893,7 @@ impl WritableStream { global.note_cross_realm_transform_writable(&cross_realm_transform_writable, port_id); // Enable port’s port message queue. - port.Start(); + port.Start(can_gc); // Perform ! SetUpWritableStreamDefaultController controller @@ -1202,7 +1202,7 @@ impl CrossRealmTransformWritable { .error_if_needed(cx, rooted_error.handle(), global, can_gc); // Disentangle port. - global.disentangle_port(port); + global.disentangle_port(port, can_gc); } } diff --git a/components/script/dom/writablestreamdefaultcontroller.rs b/components/script/dom/writablestreamdefaultcontroller.rs index 301404ffdb2..084165a6892 100644 --- a/components/script/dom/writablestreamdefaultcontroller.rs +++ b/components/script/dom/writablestreamdefaultcontroller.rs @@ -173,11 +173,11 @@ impl Callback for TransferBackPressurePromiseReaction { self.port .pack_and_post_message_handling_error("chunk", chunk.handle(), can_gc); - // Disentangle port. - global.disentangle_port(&self.port); - // If result is an abrupt completion, if let Err(error) = result { + // Disentangle port. + global.disentangle_port(&self.port, can_gc); + // Return a promise rejected with result.[[Value]]. self.result_promise.reject_error(error, can_gc); } else { @@ -609,7 +609,7 @@ impl WritableStreamDefaultController { let result = port.pack_and_post_message_handling_error("error", reason, can_gc); // Disentangle port. - global.disentangle_port(port); + global.disentangle_port(port, can_gc); let promise = Promise::new(global, can_gc); @@ -752,7 +752,7 @@ impl WritableStreamDefaultController { .expect("Sending close should not fail."); // Disentangle port. - global.disentangle_port(port); + global.disentangle_port(port, can_gc); // Return a promise resolved with undefined. Promise::new_resolved(global, cx, (), can_gc) diff --git a/components/script/messaging.rs b/components/script/messaging.rs index 7d0b7aabe05..e0ea9e30af2 100644 --- a/components/script/messaging.rs +++ b/components/script/messaging.rs @@ -72,6 +72,8 @@ impl MixedMessage { ScriptThreadMessage::UpdateHistoryState(id, ..) => Some(*id), ScriptThreadMessage::RemoveHistoryStates(id, ..) => Some(*id), ScriptThreadMessage::FocusIFrame(id, ..) => Some(*id), + ScriptThreadMessage::FocusDocument(id, ..) => Some(*id), + ScriptThreadMessage::Unfocus(id, ..) => Some(*id), ScriptThreadMessage::WebDriverScriptCommand(id, ..) => Some(*id), ScriptThreadMessage::TickAllAnimations(..) => None, ScriptThreadMessage::WebFontLoaded(id, ..) => Some(*id), diff --git a/components/script/script_module.rs b/components/script/script_module.rs index c7697adeea6..0aa35a2eda8 100644 --- a/components/script/script_module.rs +++ b/components/script/script_module.rs @@ -1369,7 +1369,7 @@ pub(crate) unsafe extern "C" fn host_import_module_dynamically( true } -#[derive(Clone, JSTraceable, MallocSizeOf)] +#[derive(Clone, Debug, JSTraceable, MallocSizeOf)] /// <https://html.spec.whatwg.org/multipage/#script-fetch-options> pub(crate) struct ScriptFetchOptions { #[no_trace] @@ -1763,7 +1763,8 @@ fn fetch_single_module_script( .mode(mode) .insecure_requests_policy(global.insecure_requests_policy()) .has_trustworthy_ancestor_origin(global.has_trustworthy_ancestor_origin()) - .policy_container(global.policy_container().to_owned()); + .policy_container(global.policy_container().to_owned()) + .cryptographic_nonce_metadata(options.cryptographic_nonce.clone()); let context = Arc::new(Mutex::new(ModuleContext { owner, diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index f78b5bf281b..2129979ad42 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -50,8 +50,9 @@ use devtools_traits::{ }; use embedder_traits::user_content_manager::UserContentManager; use embedder_traits::{ - CompositorHitTestResult, EmbedderMsg, InputEvent, MediaSessionActionType, MouseButton, - MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, WebDriverScriptCommand, + CompositorHitTestResult, EmbedderMsg, FocusSequenceNumber, InputEvent, MediaSessionActionType, + MouseButton, MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, + WebDriverScriptCommand, }; use euclid::Point2D; use euclid::default::Rect; @@ -124,7 +125,7 @@ use crate::dom::customelementregistry::{ CallbackReaction, CustomElementDefinition, CustomElementReactionStack, }; use crate::dom::document::{ - Document, DocumentSource, FocusType, HasBrowsingContext, IsHTMLDocument, TouchEventResult, + Document, DocumentSource, FocusInitiator, HasBrowsingContext, IsHTMLDocument, TouchEventResult, }; use crate::dom::element::Element; use crate::dom::globalscope::GlobalScope; @@ -331,8 +332,7 @@ pub struct ScriptThread { #[no_trace] layout_factory: Arc<dyn LayoutFactory>, - // Mouse down point. - // In future, this shall be mouse_down_point for primary button + /// The screen coordinates where the primary mouse button was pressed. #[no_trace] relative_mouse_down_point: Cell<Point2D<f32, DevicePixel>>, } @@ -1804,8 +1804,14 @@ impl ScriptThread { ScriptThreadMessage::RemoveHistoryStates(pipeline_id, history_states) => { self.handle_remove_history_states(pipeline_id, history_states) }, - ScriptThreadMessage::FocusIFrame(parent_pipeline_id, frame_id) => { - self.handle_focus_iframe_msg(parent_pipeline_id, frame_id, can_gc) + ScriptThreadMessage::FocusIFrame(parent_pipeline_id, frame_id, sequence) => { + self.handle_focus_iframe_msg(parent_pipeline_id, frame_id, sequence, can_gc) + }, + ScriptThreadMessage::FocusDocument(pipeline_id, sequence) => { + self.handle_focus_document_msg(pipeline_id, sequence, can_gc) + }, + ScriptThreadMessage::Unfocus(pipeline_id, sequence) => { + self.handle_unfocus_msg(pipeline_id, sequence, can_gc) }, ScriptThreadMessage::WebDriverScriptCommand(pipeline_id, msg) => { self.handle_webdriver_msg(pipeline_id, msg, can_gc) @@ -2514,6 +2520,7 @@ impl ScriptThread { &self, parent_pipeline_id: PipelineId, browsing_context_id: BrowsingContextId, + sequence: FocusSequenceNumber, can_gc: CanGc, ) { let document = self @@ -2533,7 +2540,65 @@ impl ScriptThread { return; }; - document.request_focus(Some(&iframe_element_root), FocusType::Parent, can_gc); + if document.get_focus_sequence() > sequence { + debug!( + "Disregarding the FocusIFrame message because the contained sequence number is \ + too old ({:?} < {:?})", + sequence, + document.get_focus_sequence() + ); + return; + } + + document.request_focus(Some(&iframe_element_root), FocusInitiator::Remote, can_gc); + } + + fn handle_focus_document_msg( + &self, + pipeline_id: PipelineId, + sequence: FocusSequenceNumber, + can_gc: CanGc, + ) { + if let Some(doc) = self.documents.borrow().find_document(pipeline_id) { + if doc.get_focus_sequence() > sequence { + debug!( + "Disregarding the FocusDocument message because the contained sequence number is \ + too old ({:?} < {:?})", + sequence, + doc.get_focus_sequence() + ); + return; + } + doc.request_focus(None, FocusInitiator::Remote, can_gc); + } else { + warn!( + "Couldn't find document by pipleline_id:{pipeline_id:?} when handle_focus_document_msg." + ); + } + } + + fn handle_unfocus_msg( + &self, + pipeline_id: PipelineId, + sequence: FocusSequenceNumber, + can_gc: CanGc, + ) { + if let Some(doc) = self.documents.borrow().find_document(pipeline_id) { + if doc.get_focus_sequence() > sequence { + debug!( + "Disregarding the Unfocus message because the contained sequence number is \ + too old ({:?} < {:?})", + sequence, + doc.get_focus_sequence() + ); + return; + } + doc.handle_container_unfocus(can_gc); + } else { + warn!( + "Couldn't find document by pipleline_id:{pipeline_id:?} when handle_unfocus_msg." + ); + } } fn handle_post_message_msg( diff --git a/components/script_bindings/codegen/Bindings.conf b/components/script_bindings/codegen/Bindings.conf index c50bc31a7f5..6396e3ced0c 100644 --- a/components/script_bindings/codegen/Bindings.conf +++ b/components/script_bindings/codegen/Bindings.conf @@ -474,7 +474,7 @@ DOMInterfaces = { 'MessagePort': { 'weakReferenceable': True, - 'canGc': ['GetOnmessage'], + 'canGc': ['Close', 'GetOnmessage', 'SetOnmessage', 'Start'], }, 'MessageEvent': { @@ -579,7 +579,7 @@ DOMInterfaces = { }, 'ShadowRoot': { - 'canGc': ['ElementFromPoint', 'ElementsFromPoint', 'SetInnerHTML', 'GetHTML', 'InnerHTML'], + 'canGc': ['SetHTMLUnsafe', 'ElementFromPoint', 'ElementsFromPoint', 'SetInnerHTML', 'GetHTML', 'InnerHTML'], }, 'StaticRange': { diff --git a/components/script_bindings/webidls/MessagePort.webidl b/components/script_bindings/webidls/MessagePort.webidl index 6fc1f432b38..b7082fc7fc3 100644 --- a/components/script_bindings/webidls/MessagePort.webidl +++ b/components/script_bindings/webidls/MessagePort.webidl @@ -16,6 +16,7 @@ interface MessagePort : EventTarget { // event handlers attribute EventHandler onmessage; attribute EventHandler onmessageerror; + attribute EventHandler onclose; }; dictionary StructuredSerializeOptions { diff --git a/components/script_bindings/webidls/ShadowRoot.webidl b/components/script_bindings/webidls/ShadowRoot.webidl index 6e3f2032294..cb0926afc10 100644 --- a/components/script_bindings/webidls/ShadowRoot.webidl +++ b/components/script_bindings/webidls/ShadowRoot.webidl @@ -25,7 +25,7 @@ ShadowRoot includes DocumentOrShadowRoot; // https://html.spec.whatwg.org/multipage/#dom-parsing-and-serialization partial interface ShadowRoot { - // [CEReactions] undefined setHTMLUnsafe((TrustedHTML or DOMString) html); + [CEReactions] undefined setHTMLUnsafe(DOMString html); DOMString getHTML(optional GetHTMLOptions options = {}); // [CEReactions] attribute (TrustedHTML or [LegacyNullToEmptyString] DOMString) innerHTML; diff --git a/components/script_bindings/webidls/Window.webidl b/components/script_bindings/webidls/Window.webidl index 81c442b119f..eb7c3e1d03d 100644 --- a/components/script_bindings/webidls/Window.webidl +++ b/components/script_bindings/webidls/Window.webidl @@ -27,8 +27,8 @@ [CrossOriginCallable] undefined close(); [CrossOriginReadable] readonly attribute boolean closed; undefined stop(); - //[CrossOriginCallable] void focus(); - //[CrossOriginCallable] void blur(); + [CrossOriginCallable] undefined focus(); + [CrossOriginCallable] undefined blur(); // other browsing contexts [Replaceable, CrossOriginReadable] readonly attribute WindowProxy frames; diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index 498d170492d..b49f60e742a 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -46,14 +46,14 @@ tracing = [ webdriver = ["webdriver_server"] webgl_backtrace = [ "script/webgl_backtrace", - "canvas/webgl_backtrace", + "webgl/webgl_backtrace", "canvas_traits/webgl_backtrace", ] webxr = [ "dep:webxr", "dep:webxr-api", "compositing/webxr", - "canvas/webxr", + "webgl/webxr", "script/webxr", ] webgpu = [ @@ -68,7 +68,8 @@ base = { workspace = true } bincode = { workspace = true } bluetooth = { path = "../bluetooth", optional = true } bluetooth_traits = { workspace = true, optional = true } -canvas = { path = "../canvas", default-features = false } +canvas = { path = "../canvas" } +webgl = { path = "../webgl", default-features = false } canvas_traits = { workspace = true } cfg-if = { workspace = true } compositing = { path = "../compositing" } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 7fb990527ec..366685e1123 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -38,7 +38,6 @@ use base::id::{PipelineNamespace, PipelineNamespaceId}; use bluetooth::BluetoothThreadFactory; #[cfg(feature = "bluetooth")] use bluetooth_traits::BluetoothRequest; -use canvas::WebGLComm; use canvas::canvas_paint_thread::CanvasPaintThread; use canvas_traits::webgl::{GlType, WebGLThreads}; use clipboard_delegate::StringRequest; @@ -99,6 +98,7 @@ use servo_delegate::DefaultServoDelegate; use servo_media::ServoMedia; use servo_media::player::context::GlContext; use servo_url::ServoUrl; +use webgl::WebGLComm; #[cfg(feature = "webgpu")] pub use webgpu; #[cfg(feature = "webgpu")] @@ -120,6 +120,7 @@ pub use {bluetooth, bluetooth_traits}; use crate::proxies::ConstellationProxy; use crate::responders::ServoErrorChannel; pub use crate::servo_delegate::{ServoDelegate, ServoError}; +use crate::webrender_api::FrameReadyParams; pub use crate::webview::{WebView, WebViewBuilder}; pub use crate::webview_delegate::{ AllowOrDenyRequest, AuthenticationRequest, FormControl, NavigationRequest, PermissionRequest, @@ -233,14 +234,13 @@ impl webrender_api::RenderNotifier for RenderNotifier { fn new_frame_ready( &self, document_id: DocumentId, - _scrolled: bool, - composite_needed: bool, - _frame_publish_id: FramePublishId, + _: FramePublishId, + frame_ready_params: &FrameReadyParams, ) { self.compositor_proxy .send(CompositorMsg::NewWebRenderFrameReady( document_id, - composite_needed, + frame_ready_params.render, )); } } diff --git a/components/shared/constellation/from_script_message.rs b/components/shared/constellation/from_script_message.rs index 8346551fd15..ddc9f788617 100644 --- a/components/shared/constellation/from_script_message.rs +++ b/components/shared/constellation/from_script_message.rs @@ -4,7 +4,7 @@ //! Messages send from the ScriptThread to the Constellation. -use std::collections::{HashMap, VecDeque}; +use std::collections::HashMap; use std::fmt; use base::Epoch; @@ -15,7 +15,8 @@ use base::id::{ use canvas_traits::canvas::{CanvasId, CanvasMsg}; use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg, WorkerId}; use embedder_traits::{ - AnimationState, EmbedderMsg, MediaSessionEvent, TouchEventResult, ViewportDetails, + AnimationState, EmbedderMsg, FocusSequenceNumber, MediaSessionEvent, TouchEventResult, + ViewportDetails, }; use euclid::default::Size2D as UntypedSize2D; use http::{HeaderMap, Method}; @@ -34,7 +35,9 @@ use webgpu_traits::{WebGPU, WebGPUAdapterResponse}; use webrender_api::ImageKey; use crate::structured_data::{BroadcastMsg, StructuredSerializedData}; -use crate::{LogEntry, MessagePortMsg, PortMessageTask, TraversalDirection, WindowSizeType}; +use crate::{ + LogEntry, MessagePortMsg, PortMessageTask, PortTransferInfo, TraversalDirection, WindowSizeType, +}; /// A Script to Constellation channel. #[derive(Clone, Debug, Deserialize, Serialize)] @@ -469,7 +472,7 @@ pub enum ScriptToConstellationMessage { /* The ids of ports transferred successfully */ Vec<MessagePortId>, /* The ids, and buffers, of ports whose transfer failed */ - HashMap<MessagePortId, VecDeque<PortMessageTask>>, + HashMap<MessagePortId, PortTransferInfo>, ), /// A new message-port was created or transferred, with corresponding control-sender. NewMessagePort(MessagePortRouterId, MessagePortId), @@ -481,10 +484,14 @@ pub enum ScriptToConstellationMessage { RerouteMessagePort(MessagePortId, PortMessageTask), /// A message-port was shipped, let the entangled port know. MessagePortShipped(MessagePortId), - /// A message-port has been discarded by script. - RemoveMessagePort(MessagePortId), /// Entangle two message-ports. EntanglePorts(MessagePortId, MessagePortId), + /// Disentangle two message-ports. + /// The first is the initiator, the second the other port, + /// unless the message is sent to complete a disentanglement, + /// in which case the first one is the other port, + /// and the second is none. + DisentanglePorts(MessagePortId, Option<MessagePortId>), /// A global has started managing broadcast-channels. NewBroadcastChannelRouter( BroadcastChannelRouterId, @@ -519,8 +526,21 @@ pub enum ScriptToConstellationMessage { UntypedSize2D<u64>, IpcSender<(IpcSender<CanvasMsg>, CanvasId, ImageKey)>, ), - /// Notifies the constellation that this frame has received focus. - Focus, + /// Notifies the constellation that this pipeline is requesting focus. + /// + /// When this message is sent, the sender pipeline has already its local + /// focus state updated. The constellation, after receiving this message, + /// will broadcast messages to other pipelines that are affected by this + /// focus operation. + /// + /// The first field contains the browsing context ID of the container + /// element if one was focused. + /// + /// The second field is a sequence number that the constellation should use + /// when sending a focus-related message to the sender pipeline next time. + Focus(Option<BrowsingContextId>, FocusSequenceNumber), + /// Requests the constellation to focus the specified browsing context. + FocusRemoteDocument(BrowsingContextId), /// Get the top-level browsing context info for a given browsing context. GetTopForBrowsingContext(BrowsingContextId, IpcSender<Option<WebViewId>>), /// Get the browsing context id of the browsing context in which pipeline is diff --git a/components/shared/constellation/lib.rs b/components/shared/constellation/lib.rs index b3d4fe525a1..559bc2dd2d1 100644 --- a/components/shared/constellation/lib.rs +++ b/components/shared/constellation/lib.rs @@ -157,18 +157,29 @@ pub struct PortMessageTask { pub data: StructuredSerializedData, } +/// The information needed by a global to process the transfer of a port. +#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] +pub struct PortTransferInfo { + /// <https://html.spec.whatwg.org/multipage/#port-message-queue> + pub port_message_queue: VecDeque<PortMessageTask>, + /// A boolean indicating whether the port has been disentangled while in transfer, + /// if so, the disentanglement should be completed along with the transfer. + /// <https://html.spec.whatwg.org/multipage/#disentangle> + pub disentangled: bool, +} + /// Messages for communication between the constellation and a global managing ports. #[derive(Debug, Deserialize, Serialize)] #[allow(clippy::large_enum_variant)] pub enum MessagePortMsg { /// Complete the transfer for a batch of ports. - CompleteTransfer(HashMap<MessagePortId, VecDeque<PortMessageTask>>), + CompleteTransfer(HashMap<MessagePortId, PortTransferInfo>), /// Complete the transfer of a single port, /// whose transfer was pending because it had been requested /// while a previous failed transfer was being rolled-back. - CompletePendingTransfer(MessagePortId, VecDeque<PortMessageTask>), - /// Remove a port, the entangled one doesn't exists anymore. - RemoveMessagePort(MessagePortId), + CompletePendingTransfer(MessagePortId, PortTransferInfo), + /// <https://html.spec.whatwg.org/multipage/#disentangle> + CompleteDisentanglement(MessagePortId), /// Handle a new port-message-task. NewTask(MessagePortId, PortMessageTask), } diff --git a/components/shared/constellation/structured_data/transferable.rs b/components/shared/constellation/structured_data/transferable.rs index cd6388f5f34..7e4fe0e6d2d 100644 --- a/components/shared/constellation/structured_data/transferable.rs +++ b/components/shared/constellation/structured_data/transferable.rs @@ -77,7 +77,12 @@ impl MessagePortImpl { self.entangled_port } - /// Entanged this port with another. + /// <https://html.spec.whatwg.org/multipage/#disentangle> + pub fn disentangle(&mut self) -> Option<MessagePortId> { + self.entangled_port.take() + } + + /// <https://html.spec.whatwg.org/multipage/#entangle> pub fn entangle(&mut self, other_id: MessagePortId) { self.entangled_port = Some(other_id); } diff --git a/components/shared/devtools/lib.rs b/components/shared/devtools/lib.rs index 0cf99d22658..c07f4529073 100644 --- a/components/shared/devtools/lib.rs +++ b/components/shared/devtools/lib.rs @@ -144,6 +144,15 @@ pub struct NodeInfo { pub shadow_root_mode: Option<ShadowRootMode>, pub is_shadow_host: bool, pub display: Option<String>, + + /// The `DOCTYPE` name if this is a `DocumentType` node, `None` otherwise + pub doctype_name: Option<String>, + + /// The `DOCTYPE` public identifier if this is a `DocumentType` node , `None` otherwise + pub doctype_public_identifier: Option<String>, + + /// The `DOCTYPE` system identifier if this is a `DocumentType` node, `None` otherwise + pub doctype_system_identifier: Option<String>, } pub struct StartedTimelineMarker { diff --git a/components/shared/embedder/lib.rs b/components/shared/embedder/lib.rs index 5f1171859dc..c87fa9019ef 100644 --- a/components/shared/embedder/lib.rs +++ b/components/shared/embedder/lib.rs @@ -14,7 +14,7 @@ pub mod user_content_manager; mod webdriver; use std::ffi::c_void; -use std::fmt::{Debug, Error, Formatter}; +use std::fmt::{Debug, Display, Error, Formatter}; use std::path::PathBuf; use std::sync::Arc; @@ -784,3 +784,76 @@ pub enum AnimationState { /// No animations are active but callbacks are queued NoAnimationCallbacksPresent, } + +/// A sequence number generated by a script thread for its pipelines. The +/// constellation attaches the target pipeline's last seen `FocusSequenceNumber` +/// to every focus-related message it sends. +/// +/// This is used to resolve the inconsistency that occurs due to bidirectional +/// focus state synchronization and provide eventual consistency. Example: +/// +/// ```text +/// script constellation +/// ----------------------------------------------------------------------- +/// send ActivateDocument ----------> receive ActivateDocument +/// ,---- send FocusDocument +/// | +/// focus an iframe | +/// send Focus -----------------|---> receive Focus +/// | focus the iframe's content document +/// receive FocusDocument <-----' send FocusDocument to the content pipeline --> ... +/// unfocus the iframe +/// focus the document +/// +/// Final state: Final state: +/// the iframe is not focused the iframe is focused +/// ``` +/// +/// When the above sequence completes, from the script thread's point of view, +/// the iframe is unfocused, but from the constellation's point of view, the +/// iframe is still focused. +/// +/// This inconsistency can be resolved by associating a sequence number to each +/// message. Whenever a script thread initiates a focus operation, it generates +/// and sends a brand new sequence number. The constellation attaches the +/// last-received sequence number to each message it sends. This way, the script +/// thread can discard out-dated incoming focus messages, and eventually, all +/// actors converge to the consistent state which is determined based on the +/// last focus message received by the constellation. +/// +/// ```text +/// script constellation +/// ----------------------------------------------------------------------- +/// send ActivateDocument ----------> receive ActivateDocument +/// ,---- send FocusDocument (0) +/// | +/// seq_number += 1 | +/// focus an iframe | +/// send Focus (1) -------------|---> receive Focus (1) +/// | focus the iframe's content document +/// receive FocusDocument (0) <-' send FocusDocument to the content pipeline --> ... +/// ignore it because 0 < 1 +/// +/// Final state: Final state: +/// the iframe is focused the iframe is focused +/// ``` +#[derive( + Clone, + Copy, + Debug, + Default, + Deserialize, + Eq, + Hash, + MallocSizeOf, + PartialEq, + Serialize, + PartialOrd, +)] +pub struct FocusSequenceNumber(pub u64); + +impl Display for FocusSequenceNumber { + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { + Display::fmt(&self.0, f) + } +} diff --git a/components/shared/script/lib.rs b/components/shared/script/lib.rs index 7323907cba3..748c42400a8 100644 --- a/components/shared/script/lib.rs +++ b/components/shared/script/lib.rs @@ -27,8 +27,8 @@ use crossbeam_channel::{RecvTimeoutError, Sender}; use devtools_traits::ScriptToDevtoolsControlMsg; use embedder_traits::user_content_manager::UserContentManager; use embedder_traits::{ - CompositorHitTestResult, InputEvent, MediaSessionActionType, Theme, ViewportDetails, - WebDriverScriptCommand, + CompositorHitTestResult, FocusSequenceNumber, InputEvent, MediaSessionActionType, Theme, + ViewportDetails, WebDriverScriptCommand, }; use euclid::{Rect, Scale, Size2D, UnknownUnit}; use ipc_channel::ipc::{IpcReceiver, IpcSender}; @@ -191,7 +191,15 @@ pub enum ScriptThreadMessage { RemoveHistoryStates(PipelineId, Vec<HistoryStateId>), /// Set an iframe to be focused. Used when an element in an iframe gains focus. /// PipelineId is for the parent, BrowsingContextId is for the nested browsing context - FocusIFrame(PipelineId, BrowsingContextId), + FocusIFrame(PipelineId, BrowsingContextId, FocusSequenceNumber), + /// Focus the document. Used when the container gains focus. + FocusDocument(PipelineId, FocusSequenceNumber), + /// Notifies that the document's container (e.g., an iframe) is not included + /// in the top-level browsing context's focus chain (not considering system + /// focus) anymore. + /// + /// Obviously, this message is invalid for a top-level document. + Unfocus(PipelineId, FocusSequenceNumber), /// Passes a webdriver command to the script thread for execution WebDriverScriptCommand(PipelineId, WebDriverScriptCommand), /// Notifies script thread that all animations are done diff --git a/components/shared/script_layout/lib.rs b/components/shared/script_layout/lib.rs index a40b8c403c1..66baccd5147 100644 --- a/components/shared/script_layout/lib.rs +++ b/components/shared/script_layout/lib.rs @@ -117,16 +117,8 @@ pub enum LayoutElementType { SVGSVGElement, } -pub enum HTMLCanvasDataSource { - WebGL(ImageKey), - Image(ImageKey), - WebGPU(ImageKey), - /// transparent black - Empty, -} - pub struct HTMLCanvasData { - pub source: HTMLCanvasDataSource, + pub source: Option<ImageKey>, pub width: u32, pub height: u32, } diff --git a/components/webdriver_server/actions.rs b/components/webdriver_server/actions.rs index f69a09a2577..fbede5b5887 100644 --- a/components/webdriver_server/actions.rs +++ b/components/webdriver_server/actions.rs @@ -76,7 +76,7 @@ fn compute_tick_duration(tick_actions: &ActionSequence) -> u64 { } }, ActionsType::Key { actions: _ } => (), - ActionsType::Wheel { .. } => todo!("Not implemented."), + ActionsType::Wheel { .. } => log::error!("not implemented"), } duration } @@ -176,7 +176,10 @@ impl Handler { } } }, - ActionsType::Wheel { .. } => todo!("Not implemented."), + ActionsType::Wheel { .. } => { + log::error!("not yet implemented"); + return Err(ErrorStatus::UnsupportedOperation); + }, } Ok(()) diff --git a/components/webdriver_server/capabilities.rs b/components/webdriver_server/capabilities.rs index 477a3bfd34c..32596f5275a 100644 --- a/components/webdriver_server/capabilities.rs +++ b/components/webdriver_server/capabilities.rs @@ -4,7 +4,7 @@ use serde_json::{Map, Value}; use webdriver::capabilities::{BrowserCapabilities, Capabilities}; -use webdriver::error::{WebDriverError, WebDriverResult}; +use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult}; pub struct ServoCapabilities { pub browser_name: String, @@ -79,42 +79,42 @@ impl BrowserCapabilities for ServoCapabilities { &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - todo!() + Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) } fn webauthn_virtual_authenticators( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - todo!() + Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) } fn webauthn_extension_uvm( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - todo!() + Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) } fn webauthn_extension_prf( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - todo!() + Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) } fn webauthn_extension_large_blob( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - todo!() + Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) } fn webauthn_extension_cred_blob( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - todo!() + Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) } } diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index ce83a8f3cc1..d003ebf8adb 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -29,7 +29,7 @@ use embedder_traits::{ use euclid::{Rect, Size2D}; use http::method::Method; use image::{DynamicImage, ImageFormat, RgbaImage}; -use ipc_channel::ipc::{self, IpcSender}; +use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; use keyboard_types::webdriver::send_keys; use log::{debug, info}; @@ -678,7 +678,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); self.top_level_script_command(WebDriverScriptCommand::GetUrl(sender))?; - let url = receiver.recv().unwrap(); + let url = wait_for_script_response(receiver)?; Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(url.as_str())?, @@ -694,7 +694,7 @@ impl Handler { .send(EmbedderToConstellationMessage::WebDriverCommand(cmd_msg)) .unwrap(); - let window_size = receiver.recv().unwrap(); + let window_size = wait_for_script_response(receiver)?; let window_size_response = WindowRectResponse { x: 0, y: 0, @@ -738,7 +738,7 @@ impl Handler { .unwrap(); }); - let window_size = receiver.recv().unwrap(); + let window_size = wait_for_script_response(receiver)?; let window_size_response = WindowRectResponse { x: 0, y: 0, @@ -756,7 +756,7 @@ impl Handler { sender, ))?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(is_enabled) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(is_enabled)?, ))), @@ -772,7 +772,7 @@ impl Handler { sender, ))?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(is_selected) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(is_selected)?, ))), @@ -812,7 +812,7 @@ impl Handler { self.top_level_script_command(WebDriverScriptCommand::GetTitle(sender))?; - let value = receiver.recv().unwrap(); + let value = wait_for_script_response(receiver)?; Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))) @@ -874,7 +874,7 @@ impl Handler { }, } - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => { let value_resp = serde_json::to_value( value.map(|x| serde_json::to_value(WebElement(x)).unwrap()), @@ -1005,7 +1005,7 @@ impl Handler { let cmd = WebDriverScriptCommand::GetBrowsingContextId(frame_id, sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(browsing_context_id) => { self.session_mut()?.browsing_context_id = browsing_context_id; Ok(WebDriverResponse::Void) @@ -1047,7 +1047,7 @@ impl Handler { }, } - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => { let resp_value: Vec<Value> = value .into_iter() @@ -1103,7 +1103,7 @@ impl Handler { }, } - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => { let value_resp = serde_json::to_value( value.map(|x| serde_json::to_value(WebElement(x)).unwrap()), @@ -1156,7 +1156,7 @@ impl Handler { }, } - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => { let resp_value: Vec<Value> = value .into_iter() @@ -1175,7 +1175,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetElementRect(element.to_string(), sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(rect) => { let response = ElementRectResponse { x: rect.origin.x, @@ -1193,7 +1193,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetElementText(element.to_string(), sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1205,9 +1205,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetActiveElement(sender); self.browsing_context_script_command(cmd)?; - let value = receiver - .recv() - .unwrap() + let value = wait_for_script_response(receiver)? .map(|x| serde_json::to_value(WebElement(x)).unwrap()); Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, @@ -1218,7 +1216,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetComputedRole(element.to_string(), sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1230,7 +1228,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetElementTagName(element.to_string(), sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1250,7 +1248,7 @@ impl Handler { sender, ); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1272,7 +1270,7 @@ impl Handler { ); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(SendableWebDriverJSValue(value))?, ))), @@ -1289,7 +1287,7 @@ impl Handler { let cmd = WebDriverScriptCommand::GetElementCSS(element.to_string(), name.to_owned(), sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1301,7 +1299,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetCookies(sender); self.browsing_context_script_command(cmd)?; - let cookies = receiver.recv().unwrap(); + let cookies = wait_for_script_response(receiver)?; let response = cookies .into_iter() .map(|cookie| cookie_msg_to_cookie(cookie.into_inner())) @@ -1313,12 +1311,14 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetCookie(name, sender); self.browsing_context_script_command(cmd)?; - let cookies = receiver.recv().unwrap(); - let response = cookies + let cookies = wait_for_script_response(receiver)?; + let Some(response) = cookies .into_iter() .map(|cookie| cookie_msg_to_cookie(cookie.into_inner())) .next() - .unwrap(); + else { + return Err(WebDriverError::new(ErrorStatus::NoSuchCookie, "")); + }; Ok(WebDriverResponse::Cookie(CookieResponse(response))) } @@ -1342,7 +1342,7 @@ impl Handler { let cmd = WebDriverScriptCommand::AddCookie(cookie_builder.build(), sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(_) => Ok(WebDriverResponse::Void), Err(response) => match response { WebDriverCookieError::InvalidDomain => Err(WebDriverError::new( @@ -1361,7 +1361,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::DeleteCookie(name, sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(_) => Ok(WebDriverResponse::Void), Err(error) => Err(WebDriverError::new(error, "")), } @@ -1371,7 +1371,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::DeleteCookies(sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(_) => Ok(WebDriverResponse::Void), Err(error) => Err(WebDriverError::new(error, "")), } @@ -1426,7 +1426,7 @@ impl Handler { let cmd = WebDriverScriptCommand::GetPageSource(sender); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(source) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(source)?, ))), @@ -1487,9 +1487,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let command = WebDriverScriptCommand::ExecuteScript(script, sender); self.browsing_context_script_command(command)?; - let result = receiver - .recv() - .unwrap_or(Err(WebDriverJSError::BrowsingContextNotFound)); + let result = wait_for_script_response(receiver)?; self.postprocess_js_result(result) } @@ -1533,9 +1531,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let command = WebDriverScriptCommand::ExecuteAsyncScript(script, sender); self.browsing_context_script_command(command)?; - let result = receiver - .recv() - .unwrap_or(Err(WebDriverJSError::BrowsingContextNotFound)); + let result = wait_for_script_response(receiver)?; self.postprocess_js_result(result) } @@ -1589,10 +1585,7 @@ impl Handler { .unwrap(); // TODO: distinguish the not found and not focusable cases - receiver - .recv() - .unwrap() - .map_err(|error| WebDriverError::new(error, ""))?; + wait_for_script_response(receiver)?.map_err(|error| WebDriverError::new(error, ""))?; let input_events = send_keys(&keys.text); @@ -1615,7 +1608,7 @@ impl Handler { let command = WebDriverScriptCommand::ElementClick(element.to_string(), sender); self.browsing_context_script_command(command)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(element_id) => match element_id { Some(element_id) => { let id = Uuid::new_v4().to_string(); @@ -1688,7 +1681,7 @@ impl Handler { .send(EmbedderToConstellationMessage::WebDriverCommand(cmd_msg)) .unwrap(); - if let Some(x) = receiver.recv().unwrap() { + if let Some(x) = wait_for_script_response(receiver)? { img = Some(x); break; }; @@ -1739,7 +1732,7 @@ impl Handler { let command = WebDriverScriptCommand::GetBoundingClientRect(element.to_string(), sender); self.browsing_context_script_command(command)?; - match receiver.recv().unwrap() { + match wait_for_script_response(receiver)? { Ok(rect) => { let encoded = self.take_screenshot(Some(Rect::from_untyped(&rect)))?; @@ -1944,3 +1937,12 @@ fn webdriver_value_to_js_argument(v: &Value) -> String { }, } } + +fn wait_for_script_response<T>(receiver: IpcReceiver<T>) -> Result<T, WebDriverError> +where + T: for<'de> Deserialize<'de> + Serialize, +{ + receiver + .recv() + .map_err(|_| WebDriverError::new(ErrorStatus::NoSuchWindow, "")) +} diff --git a/components/webgl/Cargo.toml b/components/webgl/Cargo.toml new file mode 100644 index 00000000000..b0c1c0ceb29 --- /dev/null +++ b/components/webgl/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "webgl" +version.workspace = true +authors.workspace = true +license.workspace = true +edition.workspace = true +publish.workspace = true +rust-version.workspace = true + +[lib] +name = "webgl" +path = "lib.rs" + +[features] +webgl_backtrace = ["canvas_traits/webgl_backtrace"] +webxr = ["dep:webxr", "dep:webxr-api"] + +[dependencies] +bitflags = { workspace = true } +byteorder = { workspace = true } +canvas_traits = { workspace = true } +compositing_traits = { workspace = true } +crossbeam-channel = { workspace = true } +euclid = { workspace = true } +fnv = { workspace = true } +glow = { workspace = true } +half = "2" +ipc-channel = { workspace = true } +log = { workspace = true } +pixels = { path = "../pixels" } +snapshot = { workspace = true } +surfman = { workspace = true } +webrender = { workspace = true } +webrender_api = { workspace = true } +webxr = { path = "../webxr", features = ["ipc"], optional = true } +webxr-api = { workspace = true, features = ["ipc"], optional = true } diff --git a/components/webgl/lib.rs b/components/webgl/lib.rs new file mode 100644 index 00000000000..923e7faad24 --- /dev/null +++ b/components/webgl/lib.rs @@ -0,0 +1,13 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#![deny(unsafe_code)] + +pub use webgl_mode::WebGLComm; + +mod webgl_limits; +mod webgl_mode; +pub mod webgl_thread; +#[cfg(feature = "webxr")] +mod webxr; diff --git a/components/canvas/webgl_limits.rs b/components/webgl/webgl_limits.rs index f683b6efff6..f683b6efff6 100644 --- a/components/canvas/webgl_limits.rs +++ b/components/webgl/webgl_limits.rs diff --git a/components/canvas/webgl_mode/inprocess.rs b/components/webgl/webgl_mode/inprocess.rs index 566da2c58c8..566da2c58c8 100644 --- a/components/canvas/webgl_mode/inprocess.rs +++ b/components/webgl/webgl_mode/inprocess.rs diff --git a/components/canvas/webgl_mode/mod.rs b/components/webgl/webgl_mode/mod.rs index 8bc74f6e244..8bc74f6e244 100644 --- a/components/canvas/webgl_mode/mod.rs +++ b/components/webgl/webgl_mode/mod.rs diff --git a/components/canvas/webgl_thread.rs b/components/webgl/webgl_thread.rs index b1ac2b2d3c4..b1ac2b2d3c4 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/webgl/webgl_thread.rs diff --git a/components/canvas/webxr.rs b/components/webgl/webxr.rs index d43303e7393..d43303e7393 100644 --- a/components/canvas/webxr.rs +++ b/components/webgl/webxr.rs diff --git a/ports/servoshell/Cargo.toml b/ports/servoshell/Cargo.toml index c77ea06fa15..e000900e4ea 100644 --- a/ports/servoshell/Cargo.toml +++ b/ports/servoshell/Cargo.toml @@ -121,7 +121,7 @@ serde_json = { workspace = true } servo_allocator = { path = "../../components/allocator" } shellwords = "1.0.0" surfman = { workspace = true, features = ["sm-raw-window-handle-06", "sm-x11"] } -winit = "0.30.9" +winit = "0.30.10" [target.'cfg(any(all(target_os = "linux", not(target_env = "ohos")), target_os = "macos"))'.dependencies] sig = "1.0" diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py index 845b09b622a..860217d062a 100644 --- a/python/servo/testing_commands.py +++ b/python/servo/testing_commands.py @@ -432,9 +432,9 @@ class MachCommands(CommandBase): return [py, avd, apk] @Command('test-jquery', description='Run the jQuery test suite', category='testing') - @CommandBase.common_command_arguments(build_configuration=False, build_type=True) - def test_jquery(self, build_type: BuildType): - return self.jquery_test_runner("test", build_type) + @CommandBase.common_command_arguments(binary_selection=True) + def test_jquery(self, servo_binary: str): + return self.jquery_test_runner("test", servo_binary) @Command('test-dromaeo', description='Run the Dromaeo test suite', category='testing') @CommandArgument('tests', default=["recommended"], nargs="...", help="Specific tests to run") diff --git a/python/wpt/run.py b/python/wpt/run.py index 97639ff34b6..b40287cbd96 100644 --- a/python/wpt/run.py +++ b/python/wpt/run.py @@ -51,6 +51,11 @@ def run_tests(default_binary_path: str, **kwargs): os.environ["RUST_BACKTRACE"] = "1" os.environ["HOST_FILE"] = os.path.join(SERVO_ROOT, "tests", "wpt", "hosts") + # The pytest framework used in the webdriver conformance tests dumps the + # environment variables when unexpected results occur, and this variable + # makes CI logs unreadable. + github_context = os.environ.pop("GITHUB_CONTEXT", None) + set_if_none(kwargs, "product", "servo") set_if_none(kwargs, "config", os.path.join(WPT_PATH, "config.ini")) set_if_none(kwargs, "include_manifest", os.path.join(WPT_PATH, "include.ini")) @@ -142,6 +147,9 @@ def run_tests(default_binary_path: str, **kwargs): kwargs["pause_after_test"] = False wptrunner.run_tests(**kwargs) + if github_context: + os.environ["GITHUB_CONTEXT"] = github_context + # Use the second run to mark tests from the first run as flaky, but # discard the results otherwise. # TODO: It might be a good idea to send the new results to the diff --git a/tests/wpt/include.ini b/tests/wpt/include.ini index fdbd71b9ee6..ba81ab64b83 100644 --- a/tests/wpt/include.ini +++ b/tests/wpt/include.ini @@ -278,10 +278,26 @@ skip: true skip: false [WebCryptoAPI] skip: false +[webdriver] + skip: false + [tests] + skip: false + [bidi] + skip: true + [classic] + skip: true + [interop] + skip: true [webgl] skip: false [webidl] skip: false +[webmessaging] + skip: false +[websockets] + skip: false +[webstorage] + skip: false [webvr] skip: false [webvtt] @@ -292,12 +308,6 @@ skip: true skip: false [dom-overlay] skip: true -[webmessaging] - skip: false -[websockets] - skip: false -[webstorage] - skip: false [workers] skip: false [modules] diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 8ba5d8b0ff6..5385c0403b4 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -411,10 +411,12 @@ "ai": { "language_detection": { "availability-detached-crash.https.html": [ - "5f76d59eb3540048bc0586f2a1ac5b3b313a147e", + "ee5e27e35b60e89f17f8008d809f4d6040e4eb5b", [ null, - {} + { + "testdriver": true + } ] ] } @@ -790,6 +792,13 @@ {} ] ], + "chrome-bug-405795970.html": [ + "5b45527fd9ccb2038fdd3f459bcf10a9514f199c", + [ + null, + {} + ] + ], "pseudo-element-animation-with-marker.html": [ "ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5", [ @@ -4907,6 +4916,13 @@ {} ] ], + "colspan-zero-crash.html": [ + "a50586a5bfa7551724b838a0438339a34b4930fb", + [ + null, + {} + ] + ], "crashtests": { "caption-repaint-crash.html": [ "6a024d0c1d7ef58da06a489d80d187bcb2a3e350", @@ -7459,6 +7475,15 @@ } } }, + "focus": { + "focus-element-crash.html": [ + "27df1c0b13081827685fa96e0cba2f7b9b03c89a", + [ + null, + {} + ] + ] + }, "fullscreen": { "crashtests": { "backdrop-list-item.html": [ @@ -7815,6 +7840,13 @@ {} ] ], + "iframe-hit-test-during-load-event-crash.html": [ + "f668fc51573647e633fc3ac6430735d6fb4dfea7", + [ + null, + {} + ] + ], "iframe-loading-lazy-simple-crash.html": [ "b0b251438f73811ce2ec4d82fe47ffb3a2445c93", [ @@ -9884,6 +9916,13 @@ ] }, "styling": { + "cx-sibling-index-crash.html": [ + "9fe97b12d774a547a2cb3bf65f9a9ad8f1af8a58", + [ + null, + {} + ] + ], "font-size-number-calc-crash.svg": [ "6b56d9df2b426e2376f87668a98f5e21ee56e37b", [ @@ -10046,6 +10085,13 @@ null, {} ] + ], + "sibling-index-offset-crash.html": [ + "812a7952738231f4c1bc2bf22c0d87f9a39c86cd", + [ + null, + {} + ] ] }, "interfaces": { @@ -124253,6 +124299,32 @@ }, "css-align": { "abspos": { + "align-items-static-position-001.tentative.html": [ + "06c11e6cdb61a519fdbc77d377fb0ace0e92f6b1", + [ + null, + [ + [ + "/css/css-align/abspos/align-items-static-position-001-ref.tentative.html", + "==" + ] + ], + {} + ] + ], + "align-items-static-position-002.tentative.html": [ + "f90004b5672a1fef9f42cf32ae13b06fc085e0ec", + [ + null, + [ + [ + "/css/css-align/abspos/align-items-static-position-002-ref.tentative.html", + "==" + ] + ], + {} + ] + ], "align-items-static-position.html": [ "0b653ca5d6c2bbaf29b3834aec7d806169c8de55", [ @@ -124292,6 +124364,110 @@ {} ] ], + "align-self-static-position-003.html": [ + "39f871f4c2b837dc67b30d615e9c8ad0e4392d24", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-003-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-004.html": [ + "afba7215b116506138434da5fa3c13ec832fb393", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-004-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-005.html": [ + "e148f0ebda37797d5573f4c3a2d4b7c52e5a2f2e", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-005-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-006.html": [ + "253b2a52f618a82fcf13b82bd61075bc2dcee8be", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-006-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-007.html": [ + "ebe872aaab909e29abf3eed33840a577a616b34b", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-007-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-008.html": [ + "187974884b4aded9a031c0c2fdc9d2caafd9ef5b", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-008-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-stretch-auto-margins-aspect-ratio.html": [ + "4eaa9d2f3a6dbab63d3d931d4c58a427bc11976f", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "align-self-stretch-auto-margins.html": [ + "9d1b6454c848c02b7fef360fb447d4d6b46ee8c0", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "align-self-stretch-auto-size.tentative.html": [ "74091feacfe63813aa4a6bbc3ef1b4d3e4e8a59c", [ @@ -124317,6 +124493,32 @@ ], {} ] + ], + "justify-self-stretch-auto-margins-aspect-ratio.html": [ + "c50b32f089b1b0043ac5d9dbd0f79906d82827f3", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "justify-self-stretch-auto-margins.html": [ + "7d7b4bfc8570d3dde59fc903de7cb173b0b5baf8", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] ] }, "baseline-of-scrollable-1a.html": [ @@ -186622,6 +186824,192 @@ {} ] ] + }, + "tentative": { + "multicol": { + "multicol-gap-decorations-001.html": [ + "c3752156c7d54f6620ade9715b4562582c6135f6", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-002.html": [ + "0b632fa94ace20a253f5f56079d29adbb7997135", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-003.html": [ + "2f2473fd04686283e120abd29b5f273da40c3ef3", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-004.html": [ + "0dcbeef4df82f4d9dc6e2ed2215ee2fa39773052", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-005.html": [ + "daa65e904e71ee62c83ba2a16933d13311328539", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-006.html": [ + "64b3b007ab5f6282c95bb79a39a3bcf89d10de88", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-007.html": [ + "1f23ed7f7ca34602f4310627edb5ae96885028b8", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-008.html": [ + "ed299b5d9f68e8560d99cdd58fcc9b3830929117", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-009.html": [ + "b00c6a70f8abf9894e548d9e40882e396ed5b1f0", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-010.html": [ + "61bb4a9b93314bb7d96a90b98f67b175a4cf86c6", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-011.html": [ + "cf588ded41ea3e811c241984ec8909e5fbcf14be", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-012.html": [ + "078b810cf8e608b16dd2a898136f4ce757325ed9", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-013.html": [ + "d4170084f066688fd136b2abeb40da03b1243816", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-014.html": [ + "1dcd393d99aa19021684e42e9f835e17281fc6a4", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html", + "==" + ] + ], + {} + ] + ] + } } }, "css-grid": { @@ -192723,6 +193111,32 @@ {} ] ], + "replaced-element-016.tentative.html": [ + "2d5b401b8d20ac682675b3eeb23f264239b83d49", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], + "replaced-element-017.tentative.html": [ + "575fa8c78179d3741948e0d987fc446534bb6a86", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "table-with-infinite-max-intrinsic-width.html": [ "877e982cd4c5987f131587da33a23f3b7a49d538", [ @@ -249632,6 +250046,32 @@ {} ] ], + "intrinsic-percent-replaced-029.tentative.html": [ + "feff03bbe2e1a1e18a22429a58a9d20cc0f9987b", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], + "intrinsic-percent-replaced-030.tentative.html": [ + "5a6b103c22e20d23aa842e72ac6ffe6c9948156f", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "intrinsic-percent-replaced-dynamic-001.html": [ "1128ffa1759f26011c0639d8b5f498322c6396ac", [ @@ -324185,6 +324625,19 @@ {} ] ], + "table-cell-align-006.html": [ + "a8d33f281fda76603ea312601933fdf170ddf64b", + [ + null, + [ + [ + "/css/css-writing-modes/reference/table-cell-align-006-ref.html", + "==" + ] + ], + {} + ] + ], "table-cell-valign-001.html": [ "f3026810dd58cd04f87df5f3ae2ad474d5c289db", [ @@ -347922,7 +348375,7 @@ ] ], "marquee-with-trusted-types.html": [ - "57f4985032165e989ba261c32c11c9acf0491908", + "f16c58bb85d71b011e4ee524dfb63184a5fca81a", [ null, [ @@ -353314,19 +353767,6 @@ } ] ], - "select-multiple-base-appearance.html": [ - "48673b446bc8e6e6cce72e6c4d29671bed313779", - [ - null, - [ - [ - "/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html", - "==" - ] - ], - {} - ] - ], "select-only-button-opt-in.tentative.html": [ "b010d15e8adab1ebfe448842e195e29b24d332fb", [ @@ -353559,6 +353999,21 @@ ] ] }, + "customizable-select-in-page": { + "customizable-select-in-page-appearance.tentative.html": [ + "b3bf75eb0ff25df6d4737326940a498a11d264d2", + [ + null, + [ + [ + "/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html", + "==" + ] + ], + {} + ] + ] + }, "reset-algorithm-rendering.html": [ "67da173ff2eb0d90c063294db486eaa34ea8878a", [ @@ -361578,7 +362033,7 @@ ] ], "animation-with-transform.html": [ - "f741cc634d732624186d8d0a034822bef831c872", + "323d984c98938fbb5bd224560d7adf0711149430", [ null, [ @@ -361643,7 +362098,7 @@ ] ], "two-animations-attach-to-same-scroll-timeline-cancel-one.html": [ - "ed8e8337a65af3033e3df4e158333d225d88a56d", + "28973d2d1858421ff53bae1d667c160152d6ecda", [ null, [ @@ -361656,7 +362111,7 @@ ] ], "two-animations-attach-to-same-scroll-timeline.html": [ - "de50599fbafb634e44ccd9546e18bea8ba7f7f7e", + "45ba3f99ccdbf9ef64f915c1c124d7f946a1f74f", [ null, [ @@ -370753,7 +371208,7 @@ [] ], "docker.yml": [ - "66794b69aba0f2ee5984c269434cdab2ee9a6cfc", + "5de0cc4bcb1faf6c919d41998bd9ec035e8594cf", [] ], "documentation.yml": [ @@ -371496,6 +371951,10 @@ "iframe-helper.html": [ "fe07de3f8abac59ddbd6ccfd706a5e69c5b8b4c4", [] + ], + "util.js": [ + "7cb3e7c2e13cb0415be019580ccfcc339cd7bd8f", + [] ] } }, @@ -374126,6 +374585,14 @@ "eb50cb54ef867844ea741fe1fdb01df970e4deea", [] ], + "clear-site-data-prefetchCache.py": [ + "3a332dd58b2012154b6a193410be34dc3f92a172", + [] + ], + "clear-site-data-prerenderCache.py": [ + "bf845cfb699c311c145357ad12a5b4b056d2c986", + [] + ], "controlled-endpoint.py": [ "bb4f464088e46438f993d66ae0da134bb4410c7b", [] @@ -413745,6 +414212,14 @@ [] ], "abspos": { + "align-items-static-position-001-ref.tentative.html": [ + "22c1fd03e38792a3d697659c1e087178c453f1ed", + [] + ], + "align-items-static-position-002-ref.tentative.html": [ + "6f53b04178707a83eb2822e5807cf42d3c547ca6", + [] + ], "align-items-static-position-ref.html": [ "fd7093f98748709d0f6d03c9dc9993a7a1447446", [] @@ -413757,6 +414232,30 @@ "d8bef63aa292aecd1ce6628e27abbc2c196f8a29", [] ], + "align-self-static-position-003-ref.html": [ + "132bbb7360fb5a40130e0a7af9ffb3a9d2baf753", + [] + ], + "align-self-static-position-004-ref.html": [ + "68130ee1d7e723a6b5c4c8a7e3b78d7bdb2f35da", + [] + ], + "align-self-static-position-005-ref.html": [ + "947bd2704481f757f3d1f4bf51105483978cc7ff", + [] + ], + "align-self-static-position-006-ref.html": [ + "5bbafc6484585ad25223cf1b5825214e90705836", + [] + ], + "align-self-static-position-007-ref.html": [ + "bc9b5f4f6502f647e97332401308a87a64c339f0", + [] + ], + "align-self-static-position-008-ref.html": [ + "79cf612b8f846920af1d2d7b188376693c789b3f", + [] + ], "align-self-with-flex-grid-parent-ref.html": [ "c87289d450e9ec95677c17a6d72d3e34dec4d05d", [] @@ -430713,6 +431212,66 @@ "7e0d9cbcd6ff64b17bc8fe57616a37ba29a9fd8e", [] ] + }, + "tentative": { + "multicol": { + "multicol-gap-decorations-001-ref.html": [ + "834c96ccd397fbc41abcfb80dbd298094cb929b1", + [] + ], + "multicol-gap-decorations-002-ref.html": [ + "d132f0ca6770be13d87ee66fb033f2f498d0e37b", + [] + ], + "multicol-gap-decorations-003-ref.html": [ + "cd26da243891f05c83c5d1eea17c747dcf390f05", + [] + ], + "multicol-gap-decorations-004-ref.html": [ + "002b1f2b594cf791b6d66613f48128e915517e01", + [] + ], + "multicol-gap-decorations-005-ref.html": [ + "6543021c97934a217568e567ac005166f7a9c0a0", + [] + ], + "multicol-gap-decorations-006-ref.html": [ + "4cb56d207fef4f801ec2063828103712267c030e", + [] + ], + "multicol-gap-decorations-007-ref.html": [ + "09973ddc690a899be9fb321e603b7831bfeb22a7", + [] + ], + "multicol-gap-decorations-008-ref.html": [ + "d49c2f50f1909d5b04be07798e62448d9b82ab72", + [] + ], + "multicol-gap-decorations-009-ref.html": [ + "124bf7eaeb1779d067d84f1c30560f45763add7c", + [] + ], + "multicol-gap-decorations-010-ref.html": [ + "9582ab4103d197d25823ed75dc8cafa83e0b1a7c", + [] + ], + "multicol-gap-decorations-011-ref.html": [ + "3387918d399cdbd3b39364ebe954a2a204a5145c", + [] + ], + "multicol-gap-decorations-012-ref.html": [ + "9fb5e85e920812d259e057c7538d35db56659b05", + [] + ], + "multicol-gap-decorations-013-ref.html": [ + "8e426d8ed32b25248e602e063e69678ca94b5e09", + [] + ], + "multicol-gap-decorations-014-ref.html": [ + "9d9674bd476896f0f1b03ec6835b069c97d9c8e5", + [] + ] + } } }, "css-gcpm": { @@ -454347,6 +454906,10 @@ "c5cd6fe28a97343b94989193c4583ddd2393538a", [] ], + "table-cell-align-006-ref.html": [ + "c5b52346fc0ad931aedb40339150146e067bc268", + [] + ], "table-cell-valign-001-ref.html": [ "03cb9ec9e4c6b1d7b6e0973b57f3c93ce293b1e4", [] @@ -460247,7 +460810,7 @@ }, "include": { "editor-test-utils.js": [ - "9c5600af77bf22c936cbe383a9667790d2cd8c10", + "f0c4f58399263a453b11a37e54d7152d935adec5", [] ], "implementation.js": [ @@ -464908,7 +465471,7 @@ [] ], "fledge-util.sub.js": [ - "0a18ea40d3d25e22acef6a7c32f0e644989294cf", + "49ebfd1c596c102970f0062592284b14da3841f9", [] ], "fledge_http_server_util.py": [ @@ -464927,6 +465490,14 @@ "54873674eb58783731237dde5ef299ce15947638", [] ], + "record-click.py": [ + "b4e76873d9b12227e350e2d4d01321cab05a44ce", + [] + ], + "record-view.py": [ + "d423b2d9c72930a1302738418eef197f28dfb661", + [] + ], "redirect-to-trusted-signals.py": [ "7da27cd6872f9119c8647be939aecc4452526e50", [] @@ -469611,6 +470182,10 @@ "2d.gradient.object.current.png": [ "d638d033868afd3aab0a7b26d5b2a0a2b95da010", [] + ], + "WEB_FEATURES.yml": [ + "319b5b8e04cb32161be0d8eb36cc4ba99eb6459c", + [] ] }, "filters": { @@ -470031,6 +470606,10 @@ ] }, "fill-and-stroke-styles": { + "WEB_FEATURES.yml": [ + "5d9106c1cd63b77005e44a30177d9e623f4e98df", + [] + ], "conic-gradient-expected.html": [ "f347abc9d3939fb52c4fe08d949f8d96c4de3386", [] @@ -470941,6 +471520,10 @@ "2d.gradient.hueInterpolationMethod-expected.html": [ "13ae67ad970eb6bc6a94d837d3f2c01c2ad9c3ba", [] + ], + "WEB_FEATURES.yml": [ + "319b5b8e04cb32161be0d8eb36cc4ba99eb6459c", + [] ] }, "filters": { @@ -472307,82 +472890,6 @@ "244167937219cfd784f13d8ed37eedead64665e9", [] ] - }, - "tentative": { - "restrict-properties": { - "README.md": [ - "b3c24c3f82d2dbf07eefa9fa2e88fcf3817473d2", - [] - ], - "coop-rp-in-navigation-chain.https.html.headers": [ - "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c", - [] - ], - "iframe-popup-about-blank.https.window.js.headers": [ - "19d0dbe4e18df8ba52c2a564853f5614a0469b95", - [] - ], - "iframe-popup-to-so.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "iframe-popup-to-soap.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "iframe-popup-to-un.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "iframe-popup.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "popup-so.https.html.headers": [ - "46ad58d83bf6e98913ca4c564b7acb8f19fa0093", - [] - ], - "popup-soap.https.html.headers": [ - "d83ed86fb9b5d159b9f380424887402edc96cb75", - [] - ], - "popup-un.https.html.headers": [ - "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c", - [] - ], - "popup-with-cross-origin.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "popup-with-same-origin.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "popup-with-same-site.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "reporting-bcg-reuse.https.html.sub.headers": [ - "33abadd83dd9187bfa5ecf811f9fef7058412780", - [] - ], - "reporting-from-rp-ro.https.html.sub.headers": [ - "07ecad96f2493c7ddc70cc5f37d242c07f0cabb1", - [] - ], - "reporting-from-rp.https.html.sub.headers": [ - "a61e2919c8acb6be886ef16e764f1ba5dcabe9bc", - [] - ], - "reporting-to-rp-ro.https.html.headers": [ - "16903320bb50789e0a64f9620540f1cc8c0902fd", - [] - ], - "reporting-to-rp.https.html.headers": [ - "16903320bb50789e0a64f9620540f1cc8c0902fd", - [] - ] - } } }, "document-isolation-policy": { @@ -476378,6 +476885,12 @@ [] ] } + }, + "writing-suggestions": { + "WEB_FEATURES.yml": [ + "4700eca4a12b8b607c16d85ff987a8ef42ac81a3", + [] + ] } }, "the-hidden-attribute": { @@ -476989,7 +477502,7 @@ [] ], "marquee-with-trusted-types-ref.html": [ - "b177f47b757cc278abe79f5b59d9063f6911dbd3", + "5042557212e58741859ad6750543540cff563493", [] ] } @@ -479765,10 +480278,6 @@ "b351c80c273940c8422db8f66da959fb36e962cb", [] ], - "select-multiple-base-appearance-ref.html": [ - "45a74da7559c72ee5840c00842aef4fc23915e0e", - [] - ], "select-only-picker-opt-in-ref.html": [ "67a0abe43f2d1aad0b1d82da8b8cdfc77a25b549", [] @@ -479806,6 +480315,22 @@ [] ] }, + "customizable-select-in-page": { + "customizable-select-in-page-appearance-ref.html": [ + "57ea51e367cfad284ed80e71870698dfed0b26e4", + [] + ], + "resources": { + "customizable-select-in-page.css": [ + "deb080b4756cf51d2ece9d2b132e9fff6ccd6f7c", + [] + ], + "customizable-select-in-page.js": [ + "1323094332135c46297a1df5c9fed1922efe8f4a", + [] + ] + } + }, "reset-algorithm-rendering-ref.html": [ "acf192d1d55b7da110d04651093e3ebe0cd48214", [] @@ -483754,6 +484279,10 @@ }, "system-state-and-capabilities": { "the-navigator-object": { + "WEB_FEATURES.yml": [ + "a1af3e21a48f5941a078209963d1ae7bc379dd59", + [] + ], "resources": { "handler-sw.js": [ "5fd915d17f98d8fa9c3c81451f46d71bc6cd024e", @@ -484797,6 +485326,12 @@ [] ] }, + "emulation": { + "set_geolocation_override.https.html.ini": [ + "7de34991442711cd389fe324dabd6005605268af", + [] + ] + }, "permissions": { "set_permission.https.html.ini": [ "2101196fa2fe436c3f94c5f84451f1746501c84d", @@ -485259,10 +485794,6 @@ "035e1d233d6f5646768b78e878c9db43b84a0068", [] ], - "WebCryptoAPI.idl": [ - "ff7a89cd0d51be01760b9bfdb709393f4db5fd31", - [] - ], "accelerometer.idl": [ "a082224dc88e10e043d86d09cbf981616f6bb9a7", [] @@ -485588,7 +486119,7 @@ [] ], "fedcm.idl": [ - "215f375432e930afb63c26fb9bdc42365ca8c61d", + "5ce2d260f114ddcc25210905ee010a9b96b47410", [] ], "fenced-frame.idl": [ @@ -485680,7 +486211,7 @@ [] ], "image-capture.idl": [ - "21e03d4db8248d469671d8286be877e3ad7dc7b5", + "26cc7fab5cdf1f3209057cf159171961b779dcd5", [] ], "image-resource.idl": [ @@ -485820,7 +486351,7 @@ [] ], "mediastream-recording.idl": [ - "496bfcf2e27da7a7da6c653b8e7f27b702f7386f", + "68c891cdc918e7468de8add96acce35d6d63102f", [] ], "model-element.idl": [ @@ -486112,7 +486643,7 @@ [] ], "turtledove.idl": [ - "b9f50d47885cf9186c9a2dd3c2d08e1dc4054431", + "7f11cdc37908f411280ea6f79eeb759c85acbe62", [] ], "ua-client-hints.idl": [ @@ -486236,13 +486767,17 @@ [] ], "webcodecs.idl": [ - "274ef96578a3d16b9fcda6e817c25e12373ec824", + "3d4db1ed49d316c31005a5be857ad7d48eca378d", [] ], "webcrypto-secure-curves.idl": [ "01bb290b747827bb4e45ea6d0c8f6146e59b01ee", [] ], + "webcrypto.idl": [ + "ff7a89cd0d51be01760b9bfdb709393f4db5fd31", + [] + ], "webdriver.idl": [ "194e2d806adb2131f7cdc56a70a46d7784cb7d75", [] @@ -486256,7 +486791,7 @@ [] ], "webgpu.idl": [ - "de1f7c1e52bc401fed112469595f281736213027", + "4fec46a2557033a941b5da7a7481aa8125696ed2", [] ], "webhid.idl": [ @@ -486272,7 +486807,7 @@ [] ], "webnn.idl": [ - "57f2a4a9890147e24f10e91537a626732db1f617", + "37fcc32501efbeb38c9686a8fc96e1ce062eb30a", [] ], "webrtc-encoded-transform.idl": [ @@ -486328,7 +486863,7 @@ [] ], "webxr-depth-sensing.idl": [ - "9befd640646a132bff680de5f5b0d2edbe199e91", + "7ddbec7cc975dfd1c5be6f05f1a854fffe653e79", [] ], "webxr-dom-overlays.idl": [ @@ -486356,7 +486891,7 @@ [] ], "webxr.idl": [ - "1098000d6c2edae1a36f8e6a035f0c53432207c8", + "874994086a250df0f3c0a0eed03375d9429aeaa9", [] ], "webxrlayers.idl": [ @@ -486371,6 +486906,10 @@ "527c41deb6cda2de79780899d15bc43f02b281db", [] ], + "writing-assistance-apis.idl": [ + "916daee754e3ef992ad8fa282882c88dd9aa0734", + [] + ], "xhr.idl": [ "6ff75fd27741369f9671509998a21aeb9de3761a", [] @@ -494077,7 +494616,7 @@ [] ], "webxr-test.js": [ - "0885b559e6335d7bcd8a539b7d7e03f5843c74a5", + "ce2503b1bbcfbd5c4318c08b49020e9453c4b3a6", [] ], "webxr-test.js.headers": [ @@ -494566,7 +495105,7 @@ [] ], "testdriver.js": [ - "f127e2b2c8d9091a767b1ead849af1d18167070f", + "6e8410b7ea46064438c8d276274b6fbb689f81d2", [] ], "testdriver.js.headers": [ @@ -501383,7 +501922,7 @@ [] ], "requirements_tc.txt": [ - "cb4ba1947784f9b9ba39b3e43237640c7d1e802d", + "ada75c2f761904412048f3525f3010b658d174f9", [] ], "run_tc.py": [ @@ -502002,7 +502541,7 @@ [] ], "requirements_tests.txt": [ - "833fdb3b8761b3d790fcd9bf70ba536bd8dd3251", + "ca00b8f1f9835eea866a0462962b705a63366de6", [] ], "runner": { @@ -512773,7 +513312,7 @@ [] ], "asyncactions.py": [ - "71187ee76d7a1aff4803903a8506cb4dac4a8a04", + "9925a4b511def24fda82522acb5c5f0f9f3e80a1", [] ], "base.py": [ @@ -512805,7 +513344,7 @@ [] ], "executorwebdriver.py": [ - "123c89c98b21e9ec2616c6bfad3d91c5069ee89c", + "87403c2944d57e31c2612871262af9b77ce73235", [] ], "executorwktr.py": [ @@ -512821,7 +513360,7 @@ [] ], "protocol.py": [ - "7630fe1f3580f6cbb3554e89e05ab34c2fa3ee8e", + "833dff45636c7e22697e47cfe692ebecfcf2d76f", [] ], "pytestrunner": { @@ -512936,7 +513475,7 @@ [] ], "testdriver-extra.js": [ - "d83ba4192eb52487bf9265a5c2eea22f21e49c64", + "ab8b04ba3cdfc3d7c351ce99c6289de6e99b8f3e", [] ], "testdriver-vendor.js": [ @@ -515979,7 +516518,7 @@ [] ], "keyframe-tests.js": [ - "2bcce1ecf47f180d7f91a8160ad548e2ad06f5b9", + "34a84f45b20dea524016a6f479e9e0d0f5b7b2e7", [] ], "keyframe-utils.js": [ @@ -518793,7 +519332,7 @@ "close-event": { "resources": { "helper.js": [ - "cb9ea9fe981e95374b836255c752a42de788fc7b", + "48744ac1c5b530ef8d46c3d9a0378c698353a5bc", [] ] } @@ -518911,7 +519450,7 @@ }, "resources": { "utils.js": [ - "d19cb7cf760f63d60b26f008af7329fad0a568a1", + "50d7911a9181a5139d9e16f7c866112dc54d6d01", [] ], "utils_validation.js": [ @@ -521784,6 +522323,10 @@ "0cc425955374e214cd5dd9bdb75a654c7c69faa9", [] ], + "matchDepthViewValues.js": [ + "597f9734d3fe66c2600c291a643a6d70ec908a25", + [] + ], "pauseResumeTests.js": [ "e7513ef61c13b856ea9e49ff93ad9088e57163b3", [] @@ -550196,14 +550739,14 @@ "ai": { "language_detection": { "detector-iframe.https.html": [ - "3e90d36b5aa63a556b82337cdf7a26410b80ac36", + "ddcf82bec684024f855217c649bb2da6cbd1f577", [ null, {} ] ], "detector-locale.https.window.js": [ - "a1c67db912961d8850bb4a430f92f7be4b450c87", + "80cbfa485e3944ba13de2aec3ba317e2cc84026f", [ "ai/language_detection/detector-locale.https.window.html", { @@ -550217,6 +550760,18 @@ "window" ], [ + "timeout", + "long" + ], + [ + "script", + "resources/util.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ "script", "../resources/util.js" ], @@ -550224,12 +550779,13 @@ "script", "../resources/locale-util.js" ] - ] + ], + "timeout": "long" } ] ], "detector.https.window.js": [ - "e85ea6d249b17d3ed1505f206f5ac6659b6dfd94", + "b0255bc552b0d2f7c71f8567bab9e0102702cd4c", [ "ai/language_detection/detector.https.window.html", { @@ -550243,6 +550799,18 @@ "window" ], [ + "timeout", + "long" + ], + [ + "script", + "resources/util.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ "script", "../resources/util.js" ], @@ -550250,12 +550818,13 @@ "script", "../resources/locale-util.js" ] - ] + ], + "timeout": "long" } ] ], "detector.optional.https.window.js": [ - "7ffa1362dd5f97b68e7c678463dd5afa186d10dc", + "1dd248a9ecab667355702d00e865341122a2ebe2", [ "ai/language_detection/detector.optional.https.window.html", { @@ -550269,10 +550838,23 @@ "window" ], [ + "timeout", + "long" + ], + [ + "script", + "resources/util.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ "script", "../resources/util.js" ] - ] + ], + "timeout": "long" } ] ] @@ -551295,7 +551877,7 @@ ] ], "setSinkId.https.html": [ - "be65f0ac81bc41a89e5085a43124f7ee991fea7b", + "662596910ee9adf94f83d536fe9c67a49db67f4b", [ null, { @@ -571982,7 +572564,7 @@ }, "cookie-store": { "change_eventhandler_for_already_expired.https.window.js": [ - "89d84b13d1b53ec4d424b363ace9b26ed9685685", + "f3bbe0ea560974e9486941384e75a58d2d6a4637", [ "cookie-store/change_eventhandler_for_already_expired.https.window.html", { @@ -572000,7 +572582,7 @@ ] ], "change_eventhandler_for_document_cookie.https.window.js": [ - "82b0f2baa2bb72f51d944e2138ad56f7a170ba7a", + "1937ebdae35942840dc3b641b5907f334048f3fb", [ "cookie-store/change_eventhandler_for_document_cookie.https.window.html", { @@ -572018,7 +572600,7 @@ ] ], "change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js": [ - "8f5ef1cabbe7a742115ba81328e40ee789496edd", + "8517995acfe746bbff09243597d6d319e3af1bc2", [ "cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.html", { @@ -572035,6 +572617,24 @@ } ] ], + "change_eventhandler_for_no_change.https.window.js": [ + "5f9c2927433fc408c70c005789dc0bcc34d46caa", + [ + "cookie-store/change_eventhandler_for_no_change.https.window.html", + { + "script_metadata": [ + [ + "title", + "Cookie Store API: Test that setting a duplicate cookie does not fire a second event." + ], + [ + "script", + "resources/cookie-test-helpers.js" + ] + ] + } + ] + ], "change_eventhandler_for_no_name_and_no_value.https.window.js": [ "4498caf59689cc3da875d1c56937f6d2a235cb5d", [ @@ -580266,14 +580866,14 @@ ] ], "margin-trim-computed.html": [ - "ad2d17f2ef01d2f870a4f07cd3eccb226e4de0f2", + "c38adea9a68e1eeee53e8a42ba9d745546624f88", [ null, {} ] ], "margin-trim.html": [ - "0d92f80b9b96ee409b141487f26cb664ce67f8df", + "e8679f9cbf3fb606c542ae8ccc653e0b90b96bbc", [ null, {} @@ -584160,7 +584760,7 @@ ] ], "linear-timing-functions-syntax.html": [ - "0c949e9ea7dc50c86cd6877da1a10f7b2ba01625", + "408264b58dfe41dd7744d20419bae3a5fc7fd3eb", [ null, {} @@ -584174,7 +584774,7 @@ ] ], "step-timing-functions-syntax.html": [ - "4e8b21e4413f8000ae584396355ed7df1c44a447", + "e8465ff7a3304184046f7eb81f93d51a61c19dad", [ null, {} @@ -587326,7 +587926,7 @@ ] ], "font-palette-values-invalid.html": [ - "a3a0a88ba68c8fcc1f8b00054d7b12bc08d4b7af", + "32c9c4c5efeec345c24261b7bb0aa237f11d25e0", [ null, {} @@ -587747,7 +588347,7 @@ ] ], "test_font_feature_values_parsing.html": [ - "7a5844d56008eae798652b59a335d08d24b34032", + "08c20142449646123ebdecde6f023511b45feed4", [ null, {} @@ -595352,6 +595952,15 @@ } ] ], + "scroll-button-display-none.html": [ + "8b3068be6dad6d1ccbe1134b9833ecc1c8b0f594", + [ + null, + { + "testdriver": true + } + ] + ], "scroll-button-hover-remove.html": [ "af000012b4ec605fb0e30a34e50bc02119a9b925", [ @@ -595950,7 +596559,7 @@ ] ], "overscroll-behavior-root.html": [ - "a116ead01b71db7b72bfd483b10b35b2e83ea1b8", + "71c5f6573d6f31f1ef872c09302063919597d8da", [ null, { @@ -600428,6 +601037,13 @@ {} ] ], + "host-part-nesting.html": [ + "c0dc8e20eee9ab3fda124ef99cb7623146b8a321", + [ + null, + {} + ] + ], "host-stylesheet.html": [ "2e65c4b1b57bd9959c68e85e11b442c67f2c5a42", [ @@ -613586,6 +614202,13 @@ {} ] ], + "run_in_parallel.html": [ + "1afdae2be9d8092953746d360d2a77ea1a538ba1", + [ + null, + {} + ] + ], "start-view-transition.html": [ "a1bc95891956e6678c8ee2ecd51be7d6e94b70ca", [ @@ -622655,6 +623278,13 @@ ] ], "non-cancelable-when-passive": { + "generic-events-stay-cancelable.html": [ + "961794728d3799a2096bad18dd60e79f619533a4", + [ + null, + {} + ] + ], "non-passive-mousewheel-event-listener-on-body.html": [ "5574fe0acbcccb64ff05213fa518c49d4149e7e4", [ @@ -626762,7 +627392,7 @@ ] ], "XMLSerializer-serializeToString.html": [ - "c3b704bf18825c27e74c5db8177fa178925c9b26", + "6c294e464a5dc787abd4d10281ab2fe0555a0a3c", [ null, {} @@ -626866,6 +627496,13 @@ {} ] ], + "xml-parse-serialize-roundtrip.html": [ + "5195b9f04b5dd9f47937a5d11d2e82f09fdb9204", + [ + null, + {} + ] + ], "xml-serialization.xhtml": [ "852bbcc9fd1b1c91fd544dfc2fc462efc1195a4a", [ @@ -630424,7 +631061,7 @@ ] ], "selection-change-not-fired-if-selection-set-to-root.html": [ - "39e8b46e69b2c469b4b5d4ed40314bd67a2b3524", + "cac621ad3cdd3b1b8c9fcbbdf09cac739f9756ff", [ null, { @@ -669018,7 +669655,7 @@ ] ], "generate-bid-browser-signals.https.window.js": [ - "e472fccdc4da37c1a2cebb80921809cab5788b54", + "ee0cdd84efa4a3307bb674015c3eb5a8211fe962", [ "fledge/tentative/generate-bid-browser-signals.https.window.html?1-4", { @@ -669077,7 +669714,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669141,7 +669786,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669205,7 +669858,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669269,7 +669930,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669333,14 +670002,22 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" } ], [ - "fledge/tentative/generate-bid-browser-signals.https.window.html?29-last", + "fledge/tentative/generate-bid-browser-signals.https.window.html?29-32", { "script_metadata": [ [ @@ -669397,7 +670074,159 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/generate-bid-browser-signals.https.window.html?33-36", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-4" + ], + [ + "variant", + "?5-8" + ], + [ + "variant", + "?9-12" + ], + [ + "variant", + "?13-16" + ], + [ + "variant", + "?17-20" + ], + [ + "variant", + "?21-24" + ], + [ + "variant", + "?25-28" + ], + [ + "variant", + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/generate-bid-browser-signals.https.window.html?37-last", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-4" + ], + [ + "variant", + "?5-8" + ], + [ + "variant", + "?9-12" + ], + [ + "variant", + "?13-16" + ], + [ + "variant", + "?17-20" + ], + [ + "variant", + "?21-24" + ], + [ + "variant", + "?25-28" + ], + [ + "variant", + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669461,7 +670290,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669525,7 +670362,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -717280,342 +718125,6 @@ } ] ] - }, - "restrict-properties": { - "access-reporting-closed.https.html": [ - "1c315b35d7fa81188aabf59c1c3196a5d5d2a2ea", - [ - null, - {} - ] - ], - "access-reporting-openee-rp-ro.https.html": [ - "7a96f4f5762721378036b47d248c3ae1ef21dd2f", - [ - null, - { - "timeout": "long" - } - ] - ], - "access-reporting-opener-rp-ro.https.html": [ - "9e1e85b16a5876c3e78656b8300c2fcc9e3e3ab1", - [ - null, - { - "timeout": "long" - } - ] - ], - "access-reporting-post-message.https.html": [ - "5bc718e2a89a28a6867e83c0d85bc0cedefe39f6", - [ - null, - {} - ] - ], - "coop-rp-in-navigation-chain.https.html": [ - "e5c877517488f755e08f69233439a817dd444164", - [ - null, - { - "timeout": "long" - } - ] - ], - "iframe-popup-about-blank.https.window.js": [ - "1247400a4e37d2f6bd52b2731c2a3eb7f84a7185", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.html", - { - "script_metadata": [ - [ - "script", - "/common/get-host-info.sub.js" - ], - [ - "script", - "/common/utils.js" - ], - [ - "script", - "/common/dispatcher/dispatcher.js" - ] - ] - } - ] - ], - "iframe-popup-to-so.https.html": [ - "8cf2679e190129e91de8e2af4ceef5b064fedba4", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?1-1", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?2-2", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?3-3", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?4-4", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?5-5", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?6-6", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?7-7", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?8-8", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?9-last", - { - "timeout": "long" - } - ] - ], - "iframe-popup-to-soap.https.html": [ - "f3af3ca7db1bad6506fef6b519c8f244d2080d0e", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?1-2", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?3-4", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?5-6", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?7-8", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?9-last", - { - "timeout": "long" - } - ] - ], - "iframe-popup-to-un.https.html": [ - "560dfd90511dca11a8b5f4fb30d88beb093c538a", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?1-2", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?3-4", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?5-6", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?7-8", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?9-last", - { - "timeout": "long" - } - ] - ], - "iframe-popup.https.html": [ - "17840724d9e342aa52cdcc474356b25d554dfd63", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?1-2", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?3-4", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?5-6", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?7-8", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?9-last", - { - "timeout": "long" - } - ] - ], - "named_targeting.https.html": [ - "10929847ee64d1f47e78b1c34af55c963871c055", - [ - null, - {} - ] - ], - "popup-so.https.html": [ - "e5313a6e222d5b7671747516b8d056fda7e9db8b", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-soap.https.html": [ - "595a10a84bbc9c23ba609411e84f5e0bf107e6ac", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-u.https.html": [ - "595a10a84bbc9c23ba609411e84f5e0bf107e6ac", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-un.https.html": [ - "595a10a84bbc9c23ba609411e84f5e0bf107e6ac", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-with-cross-origin.https.html": [ - "a84d52584e9b4fbd6a9a35e5472c5a990fdf2351", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-with-same-origin.https.html": [ - "c0020fa23a478fd75aa27b69edb95c84f3e3789a", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-with-same-site.https.html": [ - "7d115ac7e639a53c76f6bc1b7b7c9210d8d6bf89", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-bcg-reuse.https.html": [ - "9bc171a269c5284de80cad871baafd58fb297da0", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-from-rp-ro.https.html": [ - "b89030f218ffeb79da7269f70a3432f79700e95a", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-from-rp.https.html": [ - "6b31f7e0098da78db34e91ba179ac1ef86e3035d", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-to-rp-ro.https.html": [ - "c47e59cd8f1aeac7ee6b1dbe2177595730148a38", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-to-rp.https.html": [ - "ff60e8c5afda67ff3ca1573dab5405769b2b2cc3", - [ - null, - { - "timeout": "long" - } - ] - ] } } }, @@ -732955,6 +733464,26 @@ ] ] }, + "customizable-select-in-page": { + "customizable-select-in-page-keyboard-behavior.tentative.html": [ + "24e6e39ea48236fc7b72604860913247b5f5f05c", + [ + null, + { + "testdriver": true + } + ] + ], + "customizable-select-in-page-mouse-behavior.tentative.html": [ + "d5b93693cf7d65b1202f459223a8cf6b8cff581a", + [ + null, + { + "testdriver": true + } + ] + ] + }, "inserted-or-removed.html": [ "0db2bf0e77a4a8a76ebcef1b0879cac9bb8c3fea", [ @@ -733676,7 +734205,7 @@ ] ], "dialog-focusability.html": [ - "1e000866099c7044ce07fc812229293f645c2f27", + "5afb407640b7d2ee1487454464df9adb41419a8a", [ null, { @@ -733786,7 +734315,7 @@ ] ], "dialog-requestclose.html": [ - "9a9c87167d5eaf93bd31c1f979450415dd9fba0d", + "6555f1b43bd399cc4e885f80a3a9cbee1dd752dc", [ null, { @@ -739187,14 +739716,14 @@ ], "processing-model-1": { "col-span-limits.html": [ - "a4a425b9c1f70926c77ad3eb1b8a8a87a4655de9", + "2a1ac80e65ad37a0e15ca383e67889b79f2308d0", [ null, {} ] ], "span-limits.html": [ - "cdfa61bbcdc06ea62b80d042440d55fb0c89a186", + "798639b387562a54965d5283673a50773c2a3c49", [ null, { @@ -741565,6 +742094,13 @@ {} ] ], + "serializing-cdata-in-html-document.html": [ + "b2366285a41d946324981e771bfbfe2b157606f5", + [ + null, + {} + ] + ], "serializing-lt-gt.tentative.html": [ "6c74b443a838267be7f0d2ad8a8a80964c57209f", [ @@ -747373,6 +747909,20 @@ ] ] }, + "emulation": { + "set_geolocation_override.https.html": [ + "5cbcf546423c772a98fd3725531754c366ab7b91", + [ + null, + { + "testdriver": true, + "testdriver_features": [ + "bidi" + ] + } + ] + ] + }, "permissions": { "set_permission.https.html": [ "5b05e2374e2b4b451a0f98eabd36a6e72a03f933", @@ -756018,7 +756568,7 @@ ] ], "MediaDevices-enumerateDevices-per-origin-ids.sub.https.html": [ - "714355f5c1c0b2fe37cff162c7be6240540cc0e2", + "467cf5d50c71c28675e87445ec311df53815a100", [ null, { @@ -768920,7 +769470,7 @@ ] ], "pointerevent_pointerout_no_pointer_movement.html": [ - "856f2ce37cec59f70dc1a9ad4d3fe0436da3e4cd", + "1af166593266f671b1b4705e1911e46eb4c4b990", [ null, { @@ -787708,7 +788258,7 @@ ] ], "fieldset-source.html": [ - "d75f30e664e325f4e43277b4036da0cbb157a990", + "cdd2e0be40c87d0cb932a341c9f2f9bf842f96b8", [ null, {} @@ -793934,7 +794484,7 @@ ] ], "form.html": [ - "a4a5f37283848efcdb99b50b3aebb23df3235fe5", + "5ab144b05ed130409a09c116fcceecfc57cfaab5", [ null, { @@ -796388,8 +796938,8 @@ {} ] ], - "clear-prefetch-cache-after-clear-site-data-cache.https.html": [ - "c5796e48b768868f084ae5ad97a63fca5abf6992", + "clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html": [ + "48f6264e852b0e32e6be06367e16b27f7cc6d14b", [ null, {} @@ -797355,8 +797905,8 @@ } ] ], - "cancel-prerendering-after-clear-site-data-cache-different-origins.https.html": [ - "34b77f8bc47346ecaac9e6f42856d2c5dcd66daf", + "cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html": [ + "db52e758750f2757f722c025e3accf6fce13a9cc", [ null, { @@ -797364,8 +797914,8 @@ } ] ], - "cancel-prerendering-after-clear-site-data-cache-same-origin.https.html": [ - "cb253d45eaa8f70da33b3bfb13f222280058e9b7", + "cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html": [ + "23d862c5130139bc5e20242e73cb8d2e4a93e332", [ null, { @@ -806064,7 +806614,7 @@ ], "crashtests": { "garbage-collection.any.js": [ - "b2ba5cd4c27e9120a9e69c358e6ff5be31b107fd", + "cf10f7f2e8317ed16dd5fe3a967c6f26efd0a335", [ "streams/readable-streams/crashtests/garbage-collection.any.html", { @@ -814616,6 +815166,13 @@ ] }, "embedded": { + "attr-image-fetchpriority.html": [ + "b083538a8b8ba723347860dda97afecadd1283ee", + [ + null, + {} + ] + ], "image-crossorigin.sub.html": [ "531512ec168003a55bd687b1b8db010e161f1b0e", [ @@ -814919,6 +815476,33 @@ ] ], "interact": { + "focus-inside-hidden-svg-containers-01.html": [ + "25765c5b93e66b597c3e66a3083e40e298491cb2", + [ + null, + { + "testdriver": true + } + ] + ], + "focus-inside-hidden-svg-containers-02.html": [ + "fd9fd34275d0784d82ec0ef847b295c3ad93bcca", + [ + null, + { + "testdriver": true + } + ] + ], + "focus-inside-hidden-svg-containers-03.html": [ + "097cff57b5ac8296f2e528f96e5333a7370e9722", + [ + null, + { + "testdriver": true + } + ] + ], "inheritance.svg": [ "e67f19ed43529af5e34683b6853ae870435be014", [ @@ -815796,6 +816380,13 @@ ] }, "scripted": { + "attr-script-fetchpriority.html": [ + "2f73e1e59a8a450d0a1ad74e45cbb6d25c70bf4a", + [ + null, + {} + ] + ], "script-invalid-script-type.html": [ "9602dd525bd4d2b77b8d4ffadebef9e568a98c77", [ @@ -822770,7 +823361,7 @@ }, "viewport": { "viewport-segments.html": [ - "64f0eb9caefb0b862faabcfe0ab23df52c00735d", + "cd24f2bd230b6ce60da9fd230554856ae43d6b64", [ null, {} @@ -822797,7 +823388,7 @@ ] ], "viewport-segments-segments-property.https.html": [ - "852e49fa7fecea5badf92dfafb6befa49800dd39", + "e6c9d8b4e169ad061ae7aef5ca270894dbb1db2c", [ null, { @@ -848528,7 +849119,7 @@ ] ], "explicitly-closed.tentative.window.js": [ - "612003d58eaea908ad93294a7bbf777184356a28", + "12bfa0bd73e9278e39b825d4fa81437f943cbd02", [ "webmessaging/message-channels/close-event/explicitly-closed.tentative.window.html", { @@ -849405,7 +849996,7 @@ "webnn": { "conformance_tests": { "abs.https.any.js": [ - "fcf144200f665b7f9370c2c3f0867f6cfc80a059", + "de6a5761df443ab6977ee3a61afc764eedd31c2c", [ "webnn/conformance_tests/abs.https.any.html?cpu", { @@ -850665,7 +851256,7 @@ ] ], "concat.https.any.js": [ - "0208e2ec605387a8d4dac040b64a1465b61d6848", + "d41921720463d388eeb0e152b30e04d8246b40b0", [ "webnn/conformance_tests/concat.https.any.html?cpu", { @@ -856308,7 +856899,7 @@ ] ], "neg.https.any.js": [ - "c03afc52516e3e59bd84c500afbbefe6ef7ce7cf", + "8bc10475453e24ce6e7d4049d5470b21d8e7b147", [ "webnn/conformance_tests/neg.https.any.html?cpu", { @@ -857409,7 +858000,7 @@ ] ], "qdq_subgraph.https.any.js": [ - "8f6f2246b04f8a6fc9570eced30b31b841da5a06", + "3b59c3bb49d6441a77e83309f48a97dd982aea74", [ "webnn/conformance_tests/qdq_subgraph.https.any.html?cpu", { @@ -859176,7 +859767,7 @@ ] ], "relu.https.any.js": [ - "16cc2a3fa67b4ffa77f2555b94e91d8d398e87ff", + "63ef9fa9ff09d41d60a228b79b20fd29ff911a21", [ "webnn/conformance_tests/relu.https.any.html?cpu", { @@ -861639,7 +862230,7 @@ ] ], "sub.https.any.js": [ - "2f2fadf7282185eb92cbd7961ab3f1e9d35fd5a3", + "85b15f5a00051c0ece94f6202150c0b93b23260f", [ "webnn/conformance_tests/sub.https.any.html?cpu", { @@ -878581,7 +879172,7 @@ ] ], "RTCConfiguration-iceServers.html": [ - "aa66bfbb2bfff0febc9404e4b73e0637a3226a70", + "bc7831361ab5f417b46a507b0e5977bef9bedd49", [ null, {} @@ -878832,7 +879423,7 @@ ] ], "RTCPeerConnection-addTransceiver.https.html": [ - "3fd83a76fe2f687114de006bc877bc915a1809be", + "62df4293067e554dee9328f3f4f03556dedcdb10", [ null, {} @@ -880805,7 +881396,7 @@ ] ], "supported-stats.https.html": [ - "677736f3cd8f33963c53d4fa9bee0c52f4826a5f", + "81aef5f94b90da1ee83de617ecabf0d3e11ad21d", [ null, { @@ -897000,6 +897591,13 @@ {} ] ], + "depth_sensing_cpu_matchDepthViewIdentity.https.html": [ + "f3256106e904b2b66291834197a80a4537c3c682", + [ + null, + {} + ] + ], "depth_sensing_cpu_pauseResume.https.html": [ "47469f4a0ea186e981843db8c00a1d72bc938907", [ @@ -897065,6 +897663,13 @@ {} ] ], + "depth_sensing_gpu_matchDepthViewIdentity.https.html": [ + "1813ddd449ec40a9722d38795b23c3397e02dc16", + [ + null, + {} + ] + ], "depth_sensing_gpu_pauseResume.https.html": [ "d51edb8cd3b85192fc5904df9f488e7c32356080", [ @@ -926316,7 +926921,7 @@ ] ], "user_prompt_closed.py": [ - "fdb9e8b3ca7d5cc642ec69517f065887b16cdc24", + "8322829ebaf078152fd1874773ce0d110a0aac8e", [ null, {} @@ -926339,7 +926944,7 @@ ] ], "user_prompt_opened.py": [ - "c24128004f73a8b09a61991837b1dad103f91789", + "a9051f662c8124b6ee4a8c1fc657a5a1aaf2a2b9", [ null, {} @@ -926364,7 +926969,7 @@ ] ], "invalid.py": [ - "79241287fbc2b9a0dbd3c48e455d938e6bce7ad0", + "e804848e0be6c483340dcd8b3b4def10dddedce9", [ null, {} @@ -926816,7 +927421,7 @@ ] ], "before_request_sent_cached.py": [ - "9483a707eab1d4caa561a193d641611cf92ffa2e", + "e8119d29d9e259208a11bed7c330a9ecbca49886", [ null, {} diff --git a/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini new file mode 100644 index 00000000000..88bb87548ec --- /dev/null +++ b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini @@ -0,0 +1,8 @@ +[idlharness.https.any.html] + [idl_test setup] + expected: FAIL + + +[idlharness.https.any.worker.html] + [idl_test setup] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini new file mode 100644 index 00000000000..2f9fddf138a --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-003.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini new file mode 100644 index 00000000000..f268ef7e7a6 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-004.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini new file mode 100644 index 00000000000..07f1806f326 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-006.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini new file mode 100644 index 00000000000..d5abf6545c2 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-007.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini new file mode 100644 index 00000000000..bfeba12b70e --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-008.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini new file mode 100644 index 00000000000..6094b40bf56 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini @@ -0,0 +1,2 @@ +[align-self-stretch-auto-margins-aspect-ratio.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini new file mode 100644 index 00000000000..cfef366e7b3 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini @@ -0,0 +1,2 @@ +[align-self-stretch-auto-margins.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini new file mode 100644 index 00000000000..bfba165e645 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini @@ -0,0 +1,2 @@ +[justify-self-stretch-auto-margins-aspect-ratio.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini new file mode 100644 index 00000000000..75934b08795 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini @@ -0,0 +1,2 @@ +[justify-self-stretch-auto-margins.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini b/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini index 790872b29d0..ee2b86f6368 100644 --- a/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini +++ b/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini @@ -46,3 +46,21 @@ [Property margin-trim value 'inline-start inline-end block-start'] expected: FAIL + + [Property margin-trim value 'block-start inline-start block-end inline-end'] + expected: FAIL + + [Property margin-trim value 'block-start block-end inline-end inline-start'] + expected: FAIL + + [Property margin-trim value 'block-start block-end inline-start inline-end'] + expected: FAIL + + [Property margin-trim value 'inline-start block-end block-start inline-end'] + expected: FAIL + + [Property margin-trim value 'inline-start inline-end block-start block-end'] + expected: FAIL + + [Property margin-trim value 'inline-end block-end inline-start block-start'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini b/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini index cd977b53207..b75bfe7845a 100644 --- a/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini +++ b/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini @@ -43,3 +43,21 @@ [e.style['margin-trim'\] = "inline-end block-end inline-start block-start" should set the property value] expected: FAIL + + [e.style['margin-trim'\] = "block inline" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "inline block" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "block-start block-end inline-end inline-start" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "block-start block-end inline-start inline-end" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "inline-start block-end block-start inline-end" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "inline-start inline-end block-start block-end" should set the property value] + expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini b/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini index 86c285fb78a..0d491bce6a4 100644 --- a/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini +++ b/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini @@ -73,3 +73,6 @@ [CSS Fonts Module Level 4: parsing @font-palette-values 25] expected: FAIL + + [sibling-index() is invalid in base-palette descriptor] + expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini b/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini index 6b1969e3049..b0922321d1f 100644 --- a/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini +++ b/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini @@ -316,3 +316,6 @@ [basic parse tests - @font-feature-values bongo { @styleset { complex\\ blah: 1; } }] expected: FAIL + + [basic parse tests - @font-feature-values bongo { @stylistic { blah: sibling-index(); } }] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini new file mode 100644 index 00000000000..09b5c2407df --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-001.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini new file mode 100644 index 00000000000..d3d6008a74d --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-002.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini new file mode 100644 index 00000000000..be28f9f62c3 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-003.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini new file mode 100644 index 00000000000..f2c19d9824a --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-004.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini new file mode 100644 index 00000000000..e63a9af4a63 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-005.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini new file mode 100644 index 00000000000..e9fd7c8f430 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-006.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini new file mode 100644 index 00000000000..f0da110b11d --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-007.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini new file mode 100644 index 00000000000..fecb739fed1 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-008.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini new file mode 100644 index 00000000000..15809ab6be8 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-009.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini new file mode 100644 index 00000000000..087a090d25e --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-010.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini new file mode 100644 index 00000000000..39cd43f8d3f --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-011.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini new file mode 100644 index 00000000000..c60637403c8 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-012.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini new file mode 100644 index 00000000000..319ec1ea8c7 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-013.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini new file mode 100644 index 00000000000..7baae0182e4 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-014.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini new file mode 100644 index 00000000000..efff2a2620a --- /dev/null +++ b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini @@ -0,0 +1,3 @@ +[grid-content-alignment-with-abspos-001.html] + [.grid 1] + expected: FAIL diff --git a/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini new file mode 100644 index 00000000000..39f8cc21286 --- /dev/null +++ b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini @@ -0,0 +1,2 @@ +[replaced-element-016.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini new file mode 100644 index 00000000000..77a110a0e75 --- /dev/null +++ b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini @@ -0,0 +1,2 @@ +[replaced-element-017.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini new file mode 100644 index 00000000000..1a4d7b6af62 --- /dev/null +++ b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini @@ -0,0 +1,2 @@ +[intrinsic-percent-replaced-030.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-will-change/will-change-fixedpos-cb-003.html.ini b/tests/wpt/meta/css/css-will-change/will-change-fixedpos-cb-003.html.ini deleted file mode 100644 index 77a5d26e728..00000000000 --- a/tests/wpt/meta/css/css-will-change/will-change-fixedpos-cb-003.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[will-change-fixedpos-cb-003.html] - expected: FAIL diff --git a/tests/wpt/meta/css/filter-effects/filtered-html-is-not-container.html.ini b/tests/wpt/meta/css/filter-effects/filtered-html-is-not-container.html.ini deleted file mode 100644 index b366310b98b..00000000000 --- a/tests/wpt/meta/css/filter-effects/filtered-html-is-not-container.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[filtered-html-is-not-container.html] - expected: FAIL diff --git a/tests/wpt/meta/dom/nodes/insertion-removing-steps/blur-event.window.js.ini b/tests/wpt/meta/dom/nodes/insertion-removing-steps/blur-event.window.js.ini deleted file mode 100644 index 9b57360d600..00000000000 --- a/tests/wpt/meta/dom/nodes/insertion-removing-steps/blur-event.window.js.ini +++ /dev/null @@ -1,2 +0,0 @@ -[blur-event.window.html] - expected: CRASH diff --git a/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini b/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini index dda18d32621..ad2c6663e6c 100644 --- a/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini +++ b/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini @@ -67,3 +67,6 @@ [Check if a prefix bound to an empty namespace URI ("no namespace") serialize] expected: FAIL + + [Drop inconsistent xmlns="..." by matching on local name] + expected: FAIL diff --git a/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini b/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini new file mode 100644 index 00000000000..5424089439f --- /dev/null +++ b/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini @@ -0,0 +1,6 @@ +[xml-parse-serialize-roundtrip.html] + [DOMParser and XMLSerializer should round trip with CDATA sections: large CDATA] + expected: FAIL + + [DOMParser and XMLSerializer should round trip with CDATA sections: multiple CDATAs] + expected: FAIL diff --git a/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html.ini b/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html.ini deleted file mode 100644 index 8f3aec5177f..00000000000 --- a/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html] - [Check focus event and active element after focusing different site iframe then immediately focusing back] - expected: FAIL diff --git a/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe.html.ini b/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe.html.ini deleted file mode 100644 index b489ab52a39..00000000000 --- a/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[activeelement-after-focusing-different-site-iframe.html] - [Check trailing events] - expected: FAIL diff --git a/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini b/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini index 5864035c9e1..612b845c7e9 100644 --- a/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini +++ b/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini @@ -1,2 +1,3 @@ [activeelement-after-focusing-same-site-iframe-contentwindow.html] - expected: TIMEOUT + [Check result] + expected: FAIL diff --git a/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe.html.ini b/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe.html.ini deleted file mode 100644 index 406e6a58324..00000000000 --- a/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[activeelement-after-focusing-same-site-iframe.html] - [Check trailing events] - expected: FAIL diff --git a/tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini b/tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini index 532cbcbabfe..a58db5d3146 100644 --- a/tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini +++ b/tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini @@ -1,2 +1,3 @@ [activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html] - expected: TIMEOUT + [Check result] + expected: FAIL diff --git a/tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini b/tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini index 8483775c0c1..d8b0d3212c9 100644 --- a/tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini +++ b/tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini @@ -1,2 +1,3 @@ [activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html] - expected: TIMEOUT + [Check result] + expected: FAIL diff --git a/tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini b/tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini index 8bdcea27053..1e3e377f307 100644 --- a/tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini +++ b/tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini @@ -1,2 +1,3 @@ [focus-restoration-in-different-site-iframes-window.html] - expected: TIMEOUT + [Check result] + expected: FAIL diff --git a/tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini b/tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini index 53f4db35f7e..f19949138fa 100644 --- a/tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini +++ b/tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini @@ -1,2 +1,3 @@ [focus-restoration-in-same-site-iframes-window.html] - expected: TIMEOUT + [Check result] + expected: FAIL diff --git a/tests/wpt/meta/focus/iframe-focuses-parent-same-site.html.ini b/tests/wpt/meta/focus/iframe-focuses-parent-same-site.html.ini deleted file mode 100644 index 8877baa8ac6..00000000000 --- a/tests/wpt/meta/focus/iframe-focuses-parent-same-site.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[iframe-focuses-parent-same-site.html] - expected: TIMEOUT diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini index 02a8e91ea04..d5f4fa2f799 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini @@ -2,8 +2,5 @@ [window.open] expected: FAIL - [link click] - expected: FAIL - [form submission] expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini new file mode 100644 index 00000000000..407f9d191c7 --- /dev/null +++ b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini @@ -0,0 +1,3 @@ +[cross-document-nav-cross-document-nav.html] + [cross-document navigation then cross-document navigation] + expected: FAIL diff --git a/tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini b/tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini index 6720c0f77da..3e682215a0e 100644 --- a/tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini +++ b/tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini @@ -1,7 +1,4 @@ [cross-origin-objects-function-caching.html] - [Cross-origin Window methods are cached] - expected: FAIL - [Cross-origin Location `replace` method is cached] expected: FAIL diff --git a/tests/wpt/meta/html/browsers/the-window-object/focus.window.js.ini b/tests/wpt/meta/html/browsers/the-window-object/focus.window.js.ini deleted file mode 100644 index 27a9640a02c..00000000000 --- a/tests/wpt/meta/html/browsers/the-window-object/focus.window.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[focus.window.html] - [focus] - expected: FAIL diff --git a/tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini b/tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini index 8afe0888e4e..32cd3f302d4 100644 --- a/tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini +++ b/tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini @@ -328,9 +328,3 @@ [A SecurityError exception must be thrown when window.stop is accessed from a different origin.] expected: FAIL - - [A SecurityError exception should not be thrown when window.blur is accessed from a different origin.] - expected: FAIL - - [A SecurityError exception should not be thrown when window.focus is accessed from a different origin.] - expected: FAIL diff --git a/tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini b/tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini index e9061d31d26..94ad9ce191c 100644 --- a/tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini +++ b/tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini @@ -1,9 +1,4 @@ [window-properties.https.html] - [Window method: focus] - expected: FAIL - - [Window method: blur] - expected: FAIL [Window method: print] expected: FAIL diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini index 7e036a1c4e4..5d2657041d1 100644 --- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini +++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini @@ -1,5 +1,5 @@ [createImageBitmap-transfer.html] - expected: TIMEOUT + expected: ERROR [Transfer ImageBitmap created from a vector HTMLImageElement] expected: FAIL diff --git a/tests/wpt/meta/html/dom/idlharness.any.js.ini b/tests/wpt/meta/html/dom/idlharness.any.js.ini index f17466adc7f..ad5e57e0759 100644 --- a/tests/wpt/meta/html/dom/idlharness.any.js.ini +++ b/tests/wpt/meta/html/dom/idlharness.any.js.ini @@ -95,9 +95,6 @@ [History interface: existence and properties of interface object] expected: FAIL - [MessagePort interface: attribute onclose] - expected: FAIL - [WorkerGlobalScope interface: attribute onlanguagechange] expected: FAIL diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini index 23b8e353fb0..25375c6ea47 100644 --- a/tests/wpt/meta/html/dom/idlharness.https.html.ini +++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini @@ -1517,9 +1517,6 @@ [SVGSVGElement interface: attribute onpagereveal] expected: FAIL - [MessagePort interface: attribute onclose] - expected: FAIL - [NotRestoredReasonDetails interface: existence and properties of interface object] expected: FAIL @@ -1738,9 +1735,6 @@ [Document interface: attribute all] expected: FAIL - [Window interface: operation focus()] - expected: FAIL - [Window interface: attribute scrollbars] expected: FAIL @@ -1870,9 +1864,6 @@ [Document interface: new Document() must inherit property "dir" with the proper type] expected: FAIL - [Window interface: window must inherit property "blur()" with the proper type] - expected: FAIL - [Document interface: operation execCommand(DOMString, optional boolean, optional DOMString)] expected: FAIL @@ -1897,9 +1888,6 @@ [Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type] expected: FAIL - [Window interface: operation blur()] - expected: FAIL - [Document interface: iframe.contentDocument must inherit property "onslotchange" with the proper type] expected: FAIL @@ -1924,9 +1912,6 @@ [Document interface: documentWithHandlers must inherit property "onauxclick" with the proper type] expected: FAIL - [Window interface: window must inherit property "focus()" with the proper type] - expected: FAIL - [Document interface: documentWithHandlers must inherit property "onwebkitanimationend" with the proper type] expected: FAIL @@ -5375,9 +5360,6 @@ [Navigator interface: window.navigator must inherit property "pdfViewerEnabled" with the proper type] expected: FAIL - [MessagePort interface: attribute onclose] - expected: FAIL - [SharedWorker interface: existence and properties of interface object] expected: FAIL @@ -5750,9 +5732,6 @@ [SVGSVGElement interface: attribute onunload] expected: FAIL - [ShadowRoot interface: operation setHTMLUnsafe((TrustedHTML or DOMString))] - expected: FAIL - [OffscreenCanvasRenderingContext2D interface: operation getContextAttributes()] expected: FAIL diff --git a/tests/wpt/meta/html/dom/reflection-tabular.html.ini b/tests/wpt/meta/html/dom/reflection-tabular.html.ini index 7550e2dc15d..1aeec1b3ef7 100644 --- a/tests/wpt/meta/html/dom/reflection-tabular.html.ini +++ b/tests/wpt/meta/html/dom/reflection-tabular.html.ini @@ -1487,9 +1487,6 @@ [colgroup.tabIndex: IDL set to -2147483648] expected: FAIL - [colgroup.span: setAttribute() to 2147483647] - expected: FAIL - [colgroup.span: setAttribute() to 2147483648] expected: FAIL @@ -1499,9 +1496,6 @@ [colgroup.span: setAttribute() to 4294967296] expected: FAIL - [colgroup.span: setAttribute() to 1001] - expected: FAIL - [colgroup.span: IDL set to 0] expected: FAIL @@ -2276,9 +2270,6 @@ [col.tabIndex: IDL set to -2147483648] expected: FAIL - [col.span: setAttribute() to 2147483647] - expected: FAIL - [col.span: setAttribute() to 2147483648] expected: FAIL @@ -2288,9 +2279,6 @@ [col.span: setAttribute() to 4294967296] expected: FAIL - [col.span: setAttribute() to 1001] - expected: FAIL - [col.span: IDL set to 0] expected: FAIL @@ -5657,9 +5645,6 @@ [td.tabIndex: IDL set to -2147483648] expected: FAIL - [td.colSpan: setAttribute() to 2147483647] - expected: FAIL - [td.colSpan: setAttribute() to 2147483648] expected: FAIL @@ -5669,9 +5654,6 @@ [td.colSpan: setAttribute() to 4294967296] expected: FAIL - [td.colSpan: setAttribute() to 1001] - expected: FAIL - [td.colSpan: IDL set to 0] expected: FAIL @@ -5684,9 +5666,6 @@ [td.colSpan: IDL set to 1001] expected: FAIL - [td.rowSpan: setAttribute() to 2147483647] - expected: FAIL - [td.rowSpan: setAttribute() to 2147483648] expected: FAIL @@ -5696,9 +5675,6 @@ [td.rowSpan: setAttribute() to 4294967296] expected: FAIL - [td.rowSpan: setAttribute() to 65535] - expected: FAIL - [td.rowSpan: IDL set to 2147483647] expected: FAIL @@ -7157,9 +7133,6 @@ [th.tabIndex: IDL set to -2147483648] expected: FAIL - [th.colSpan: setAttribute() to 2147483647] - expected: FAIL - [th.colSpan: setAttribute() to 2147483648] expected: FAIL @@ -7169,9 +7142,6 @@ [th.colSpan: setAttribute() to 4294967296] expected: FAIL - [th.colSpan: setAttribute() to 1001] - expected: FAIL - [th.colSpan: IDL set to 0] expected: FAIL @@ -7184,9 +7154,6 @@ [th.colSpan: IDL set to 1001] expected: FAIL - [th.rowSpan: setAttribute() to 2147483647] - expected: FAIL - [th.rowSpan: setAttribute() to 2147483648] expected: FAIL @@ -7196,9 +7163,6 @@ [th.rowSpan: setAttribute() to 4294967296] expected: FAIL - [th.rowSpan: setAttribute() to 65535] - expected: FAIL - [th.rowSpan: IDL set to 2147483647] expected: FAIL diff --git a/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini b/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini index 8b8af2b9c2e..2ef0896e3b3 100644 --- a/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini +++ b/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini @@ -1,3 +1,4 @@ [document-base-url-window-initiator-is-not-opener.https.window.html] + expected: TIMEOUT [window.open() gets base url from initiator not opener.] expected: [FAIL, PASS, TIMEOUT] diff --git a/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini b/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini new file mode 100644 index 00000000000..ad3b45255f4 --- /dev/null +++ b/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini @@ -0,0 +1,2 @@ +[marquee-with-trusted-types.html] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini index 841bafc6eca..26704422bbe 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini @@ -1,3 +1,4 @@ [iframe_sandbox_popups_escaping-2.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini index 62a6e7fc812..bbc1f35d8d9 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_nonescaping-1.html] - expected: CRASH [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini index c6f1e5d7d84..a6591b318dc 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini @@ -1,4 +1,4 @@ [iframe_sandbox_popups_nonescaping-2.html] expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index d89a1691435..ccdaf8d61b2 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_nonescaping-3.html] - expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini new file mode 100644 index 00000000000..8458e10e93e --- /dev/null +++ b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini @@ -0,0 +1,2 @@ +[customizable-select-in-page-appearance.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini index 8dba4e9c469..bdba8dadafa 100644 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini +++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini @@ -15,3 +15,6 @@ [blob-url.any.html] [Different blob URLs pointing to the same blob resolve to different modules] expected: FAIL + + [Revoking a blob URL immediately after calling import will not fail] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini deleted file mode 100644 index ccad3276c85..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini +++ /dev/null @@ -1,9 +0,0 @@ -[code-cache-nonce.html] - [First dynamic import should use nonce=abc] - expected: FAIL - - [Second dynamic import should use nonce=def] - expected: FAIL - - [Third dynamic import should use nonce=ghi] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini deleted file mode 100644 index 0080e7908e9..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[propagate-nonce-external-classic.html] - [Dynamically imported module should eval when imported from script w/ a valid nonce.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini deleted file mode 100644 index 849c9b3e60d..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[propagate-nonce-external-module.html] - expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini deleted file mode 100644 index 74b32cc06dd..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[propagate-nonce-inline-classic.html] - [Dynamically imported module should eval when imported from script w/ a valid nonce.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini deleted file mode 100644 index eb08f590857..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[propagate-nonce-inline-module.html] - [Dynamically imported module should eval when imported from script w/ a valid nonce.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini index 9b3e3358ad3..8a3281def9e 100644 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini +++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini @@ -1,18 +1,3 @@ [string-compilation-nonce-classic.html] - [reflected inline event handlers must not inherit the nonce from the triggering script, thus fail] - expected: PASS - - [inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail] - expected: PASS - [setTimeout must inherit the nonce from the triggering script, thus execute] expected: FAIL - - [direct eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [indirect eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [the Function constructor must inherit the nonce from the triggering script, thus execute] - expected: FAIL
\ No newline at end of file diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini index 1d3b047b68b..98d0b640164 100644 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini +++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini @@ -1,18 +1,3 @@ [string-compilation-nonce-module.html] - [reflected inline event handlers must not inherit the nonce from the triggering script, thus fail] - expected: PASS - - [inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail] - expected: PASS - - [direct eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [indirect eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [the Function constructor must inherit the nonce from the triggering script, thus execute] - expected: FAIL - [setTimeout must inherit the nonce from the triggering script, thus execute] - expected: FAIL
\ No newline at end of file + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini deleted file mode 100644 index 64413107401..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini +++ /dev/null @@ -1,30 +0,0 @@ -[v8-code-cache.html] - [text/javascript: Run #1] - expected: FAIL - - [text/javascript: Run #2] - expected: FAIL - - [text/javascript: Run #3] - expected: FAIL - - [text/javascript: Run #4] - expected: FAIL - - [text/javascript: Run #5] - expected: FAIL - - [module: Run #1] - expected: FAIL - - [module: Run #2] - expected: FAIL - - [module: Run #3] - expected: FAIL - - [module: Run #4] - expected: FAIL - - [module: Run #5] - expected: FAIL diff --git a/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini b/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini new file mode 100644 index 00000000000..d8b897fb81f --- /dev/null +++ b/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini @@ -0,0 +1,3 @@ +[serializing-cdata-in-html-document.html] + [Serializing CDATA in an HTML document] + expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini deleted file mode 100644 index d0b3986d561..00000000000 --- a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[setHTMLUnsafe-CEReactions.html] - [ShadowRoot.setHTMLUnsafe should trigger custom element reactions.] - expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini deleted file mode 100644 index 850b529ff76..00000000000 --- a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[setHTMLUnsafe.html] - [ShadowRoot: setHTMLUnsafe with no shadowdom.] - expected: FAIL - - [ShadowRoot: setHTMLUnsafe with shadowdom.] - expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini index c00e2949bf5..b229be268ec 100644 --- a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini +++ b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini @@ -1,12 +1,6 @@ [event-listeners.window.html] - [Standard event listeners are to be removed from Window] - expected: FAIL - [Standard event listeners are to be removed from Window for an active but not fully active document] expected: FAIL - [Standard event listeners are to be removed from Window for a non-active document that is the associated Document of a Window (frame is removed)] - expected: FAIL - [Custom event listeners are to be removed from Window for an active but not fully active document] expected: FAIL diff --git a/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini b/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini index 0bb708b5b98..fb5e4d1adbe 100644 --- a/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini +++ b/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini @@ -22,9 +22,3 @@ [Reload domComplete > Original domComplete] expected: FAIL - - [Reload loadEventEnd > Original loadEventEnd] - expected: FAIL - - [Reload loadEventStart > Original loadEventStart] - expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini b/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini deleted file mode 100644 index 3a96cb5998d..00000000000 --- a/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini +++ /dev/null @@ -1,4896 +0,0 @@ -[gethtml.html] - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL diff --git a/tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini b/tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini index 1e95f7f9744..855ee5803f5 100644 --- a/tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini +++ b/tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini @@ -1,9 +1,9 @@ [block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html] - [shadowRoot.setHTMLUnsafe(html) assigned via policy (successful HTML transformation).] + [`shadowRoot.setHTMLUnsafe(string)` assigned via default policy (successful HTML transformation).] expected: FAIL - [`shadowRoot.setHTMLUnsafe(string)` assigned via default policy (successful HTML transformation).] + [`shadowRoot.setHTMLUnsafe(string)` throws.] expected: FAIL - [`shadowRoot.setHTMLUnsafe(string)` assigned via default policy does not throw] + [`shadowRoot.setHTMLUnsafe(null)` throws.] expected: FAIL diff --git a/tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini b/tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini index f42e7fa4f8b..79d9d1805d8 100644 --- a/tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini +++ b/tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini @@ -1,6 +1,3 @@ [trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html] - [No violation reported for TrustedHTML.] - expected: FAIL - [Violation report for plain string.] expected: FAIL diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index a8e069b27e7..3bfb92e671a 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -760,3 +760,15 @@ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t1.7249685451109781e-36\t2.0512369275093079e-1\t2.0512369275093079e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.0512369275093079e-1 at index of 14680.\n\tMax RelError of 1.0000000000000000e+0 at index of 14680.\n] expected: FAIL + + [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t-2.7021871583080320e+24\t2.0512369275093079e-1\t2.7021871583080320e+24\t1.3173452184234677e+25\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.7021871583080320e+24 at index of 14680.\n\tMax RelError of 1.3173452184234677e+25 at index of 14680.\n] + expected: FAIL + + [X SNR (-445.2002225707384 dB) is not greater than or equal to 65.737. Got -445.2002225707384.] + expected: FAIL + + [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t-4.2315589002308092e+19\t2.0512369275093079e-1\t4.2315589002308092e+19\t2.0629303438725304e+20\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 4.2315589002308092e+19 at index of 14680.\n\tMax RelError of 2.0629303438725304e+20 at index of 14680.\n] + expected: FAIL + + [X SNR (-349.0959218623025 dB) is not greater than or equal to 65.737. Got -349.0959218623025.] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/accept_alert/accept.py.ini b/tests/wpt/meta/webdriver/tests/classic/accept_alert/accept.py.ini new file mode 100644 index 00000000000..00caf69c8d5 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/accept_alert/accept.py.ini @@ -0,0 +1,27 @@ +[accept.py] + [test_null_response_value] + expected: FAIL + + [test_no_top_level_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_no_user_prompt] + expected: FAIL + + [test_accept_alert] + expected: FAIL + + [test_accept_confirm] + expected: FAIL + + [test_accept_prompt] + expected: FAIL + + [test_unexpected_alert] + expected: FAIL + + [test_accept_in_popup_window] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/add_cookie/add.py.ini b/tests/wpt/meta/webdriver/tests/classic/add_cookie/add.py.ini new file mode 100644 index 00000000000..37610cfc8ee --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/add_cookie/add.py.ini @@ -0,0 +1,42 @@ +[add.py] + [test_no_browsing_context] + expected: FAIL + + [test_cookie_unsupported_scheme[about\]] + expected: FAIL + + [test_cookie_unsupported_scheme[blob\]] + expected: FAIL + + [test_cookie_unsupported_scheme[data\]] + expected: FAIL + + [test_cookie_unsupported_scheme[file\]] + expected: FAIL + + [test_cookie_unsupported_scheme[ftp\]] + expected: FAIL + + [test_cookie_unsupported_scheme[javascript\]] + expected: FAIL + + [test_cookie_unsupported_scheme[websocket\]] + expected: FAIL + + [test_cookie_unsupported_scheme[secure websocket\]] + expected: FAIL + + [test_add_non_session_cookie] + expected: FAIL + + [test_add_cookie_with_valid_samesite_flag[None\]] + expected: FAIL + + [test_add_cookie_with_valid_samesite_flag[Lax\]] + expected: FAIL + + [test_add_cookie_with_valid_samesite_flag[Strict\]] + expected: FAIL + + [test_add_cookie_with_invalid_samesite_flag] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/add_cookie/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/add_cookie/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/add_cookie/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/back/back.py.ini b/tests/wpt/meta/webdriver/tests/classic/back/back.py.ini new file mode 100644 index 00000000000..10d35cc69e3 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/back/back.py.ini @@ -0,0 +1,19 @@ +[back.py] + disabled: consistent panic + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: ERROR + + [test_seen_nodes[http\]] + expected: FAIL + + [test_seen_nodes[https\]] + expected: FAIL + + [test_seen_nodes[https coop\]] + expected: FAIL + + [test_history_pushstate] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/back/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/back/user_prompts.py.ini new file mode 100644 index 00000000000..fcf10a0526c --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/back/user_prompts.py.ini @@ -0,0 +1,73 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert\]] + expected: FAIL + + [test_accept[capabilities0-beforeunload\]] + expected: FAIL + + [test_accept[capabilities0-confirm\]] + expected: FAIL + + [test_accept[capabilities0-prompt\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert\]] + expected: FAIL + + [test_dismiss[capabilities0-beforeunload\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-beforeunload\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[beforeunload-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/close_window/close.py.ini b/tests/wpt/meta/webdriver/tests/classic/close_window/close.py.ini new file mode 100644 index 00000000000..b1f13cee75e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/close_window/close.py.ini @@ -0,0 +1,19 @@ +[close.py] + disabled: panic in test_close_browsing_context_with_accepted_beforeunload_prompt + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_close_browsing_context_with_accepted_beforeunload_prompt[tab\]] + expected: FAIL + + [test_close_browsing_context_with_accepted_beforeunload_prompt[window\]] + expected: ERROR + + [test_close_last_browsing_context] + expected: ERROR + + [test_element_usage_after_closing_browsing_context] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/close_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/close_window/user_prompts.py.ini new file mode 100644 index 00000000000..fcf10a0526c --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/close_window/user_prompts.py.ini @@ -0,0 +1,73 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert\]] + expected: FAIL + + [test_accept[capabilities0-beforeunload\]] + expected: FAIL + + [test_accept[capabilities0-confirm\]] + expected: FAIL + + [test_accept[capabilities0-prompt\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert\]] + expected: FAIL + + [test_dismiss[capabilities0-beforeunload\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-beforeunload\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[beforeunload-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/delete.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/delete.py.ini new file mode 100644 index 00000000000..1a53a7bbaf5 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/delete.py.ini @@ -0,0 +1,3 @@ +[delete.py] + [test_no_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_cookie/delete.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_cookie/delete.py.ini new file mode 100644 index 00000000000..1a53a7bbaf5 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/delete_cookie/delete.py.ini @@ -0,0 +1,3 @@ +[delete.py] + [test_no_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_cookie/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_cookie/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/delete_cookie/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_session/delete.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_session/delete.py.ini new file mode 100644 index 00000000000..ee03ab08fe3 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/delete_session/delete.py.ini @@ -0,0 +1,7 @@ +[delete.py] + expected: ERROR + [test_null_response_value] + expected: FAIL + + [test_accepted_beforeunload_prompt] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/dismiss_alert/dismiss.py.ini b/tests/wpt/meta/webdriver/tests/classic/dismiss_alert/dismiss.py.ini new file mode 100644 index 00000000000..cd2546ede8b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/dismiss_alert/dismiss.py.ini @@ -0,0 +1,24 @@ +[dismiss.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_no_user_prompt] + expected: FAIL + + [test_dismiss_alert] + expected: FAIL + + [test_dismiss_confirm] + expected: FAIL + + [test_dismiss_prompt] + expected: FAIL + + [test_unexpected_alert] + expected: FAIL + + [test_dismiss_in_popup_window] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_clear/clear.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_clear/clear.py.ini new file mode 100644 index 00000000000..541ffc25ca6 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_clear/clear.py.ini @@ -0,0 +1,2 @@ +[clear.py] + expected: TIMEOUT diff --git a/tests/wpt/meta/webdriver/tests/classic/element_clear/disabled.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_clear/disabled.py.ini new file mode 100644 index 00000000000..f6367167d66 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_clear/disabled.py.ini @@ -0,0 +1,115 @@ +[disabled.py] + expected: TIMEOUT + [test_button[button\]] + expected: FAIL + + [test_button[reset\]] + expected: FAIL + + [test_button[submit\]] + expected: FAIL + + [test_input[button\]] + expected: FAIL + + [test_input[checkbox\]] + expected: FAIL + + [test_input[color\]] + expected: FAIL + + [test_input[date\]] + expected: FAIL + + [test_input[datetime-local\]] + expected: FAIL + + [test_input[email\]] + expected: FAIL + + [test_input[file\]] + expected: FAIL + + [test_input[image\]] + expected: FAIL + + [test_input[month\]] + expected: FAIL + + [test_input[number\]] + expected: FAIL + + [test_input[password\]] + expected: FAIL + + [test_input[radio\]] + expected: FAIL + + [test_input[range\]] + expected: FAIL + + [test_input[reset\]] + expected: FAIL + + [test_input[search\]] + expected: FAIL + + [test_input[submit\]] + expected: FAIL + + [test_input[tel\]] + expected: FAIL + + [test_input[text\]] + expected: FAIL + + [test_input[time\]] + expected: FAIL + + [test_input[url\]] + expected: FAIL + + [test_input[week\]] + expected: FAIL + + [test_textarea] + expected: FAIL + + [test_fieldset_descendant] + expected: FAIL + + [test_fieldset_descendant_first_legend] + expected: FAIL + + [test_fieldset_descendant_not_first_legend] + expected: FAIL + + [test_option] + expected: FAIL + + [test_option_optgroup] + expected: FAIL + + [test_option_select] + expected: FAIL + + [test_optgroup_select] + expected: FAIL + + [test_select] + expected: FAIL + + [test_xhtml[button\]] + expected: FAIL + + [test_xhtml[input\]] + expected: FAIL + + [test_xhtml[select\]] + expected: FAIL + + [test_xhtml[textarea\]] + expected: FAIL + + [test_xml] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_clear/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_clear/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_clear/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/bubbling.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/bubbling.py.ini new file mode 100644 index 00000000000..d99f3672ef6 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/bubbling.py.ini @@ -0,0 +1,6 @@ +[bubbling.py] + [test_click_event_bubbles_to_parents] + expected: FAIL + + [test_spin_event_loop] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/center_point.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/center_point.py.ini new file mode 100644 index 00000000000..3e3bfa2708e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/center_point.py.ini @@ -0,0 +1,33 @@ +[center_point.py] + [test_entirely_in_view] + expected: FAIL + + [test_css_pixel_rounding[1\]] + expected: FAIL + + [test_css_pixel_rounding[2\]] + expected: FAIL + + [test_css_pixel_rounding[3\]] + expected: FAIL + + [test_css_pixel_rounding[4\]] + expected: FAIL + + [test_css_pixel_rounding[5\]] + expected: FAIL + + [test_css_pixel_rounding[6\]] + expected: FAIL + + [test_css_pixel_rounding[7\]] + expected: FAIL + + [test_css_pixel_rounding[8\]] + expected: FAIL + + [test_css_pixel_rounding[9\]] + expected: FAIL + + [test_css_pixel_rounding[10\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini new file mode 100644 index 00000000000..ad0f9714ad1 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini @@ -0,0 +1,21 @@ +[click.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/events.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/events.py.ini new file mode 100644 index 00000000000..8f57d96cef8 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/events.py.ini @@ -0,0 +1,3 @@ +[events.py] + [test_event_mousemove] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini new file mode 100644 index 00000000000..982ea5ca753 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini @@ -0,0 +1,33 @@ +[interactability.py] + [test_display_none] + expected: FAIL + + [test_visibility_hidden] + expected: FAIL + + [test_hidden] + expected: FAIL + + [test_element_not_interactable_css_transform[translate(-100px, -100px)\]] + expected: FAIL + + [test_element_not_interactable_css_transform[rotate(50deg)\]] + expected: FAIL + + [test_element_not_interactable_out_of_view] + expected: FAIL + + [test_zero_sized_element[div\]] + expected: FAIL + + [test_zero_sized_element[span\]] + expected: FAIL + + [test_element_intercepted] + expected: FAIL + + [test_element_intercepted_no_pointer_events] + expected: FAIL + + [test_element_not_visible_overflow_hidden] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini new file mode 100644 index 00000000000..4811bba2d43 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini @@ -0,0 +1,49 @@ +[navigate.py] + expected: TIMEOUT + [test_numbers_link] + expected: FAIL + + [test_multi_line_link] + expected: FAIL + + [test_navigation_retains_input_state] + expected: FAIL + + [test_link_hash] + expected: FAIL + + [test_link_from_toplevel_context_with_target[\]] + expected: FAIL + + [test_link_from_toplevel_context_with_target[_blank\]] + expected: FAIL + + [test_link_from_toplevel_context_with_target[_parent\]] + expected: FAIL + + [test_link_from_toplevel_context_with_target[_self\]] + expected: FAIL + + [test_link_from_toplevel_context_with_target[_top\]] + expected: FAIL + + [test_link_from_nested_context_with_target[\]] + expected: FAIL + + [test_link_from_nested_context_with_target[_blank\]] + expected: FAIL + + [test_link_from_nested_context_with_target[_parent\]] + expected: FAIL + + [test_link_from_nested_context_with_target[_self\]] + expected: FAIL + + [test_link_from_nested_context_with_target[_top\]] + expected: FAIL + + [test_link_cross_origin] + expected: FAIL + + [test_link_closes_window] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/scroll_into_view.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/scroll_into_view.py.ini new file mode 100644 index 00000000000..87c9c813881 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/scroll_into_view.py.ini @@ -0,0 +1,30 @@ +[scroll_into_view.py] + [test_scroll_into_view] + expected: ERROR + + [test_partially_visible_does_not_scroll[9\]] + expected: ERROR + + [test_partially_visible_does_not_scroll[8\]] + expected: ERROR + + [test_partially_visible_does_not_scroll[7\]] + expected: ERROR + + [test_partially_visible_does_not_scroll[6\]] + expected: ERROR + + [test_partially_visible_does_not_scroll[5\]] + expected: ERROR + + [test_partially_visible_does_not_scroll[4\]] + expected: ERROR + + [test_partially_visible_does_not_scroll[3\]] + expected: ERROR + + [test_partially_visible_does_not_scroll[2\]] + expected: ERROR + + [test_partially_visible_does_not_scroll[1\]] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini new file mode 100644 index 00000000000..2bf7e5abac4 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini @@ -0,0 +1,15 @@ +[select.py] + [test_click_option] + expected: FAIL + + [test_click_preselected_option] + expected: FAIL + + [test_click_deselects_others] + expected: FAIL + + [test_click_selected_option] + expected: FAIL + + [test_out_of_view_dropdown] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini new file mode 100644 index 00000000000..92d8bfe9a3d --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini @@ -0,0 +1,15 @@ +[shadow_dom.py] + [test_shadow_element_click[host_element\]] + expected: FAIL + + [test_shadow_element_click[checkbox_element\]] + expected: FAIL + + [test_nested_shadow_element_click[outer_element\]] + expected: FAIL + + [test_nested_shadow_element_click[inner_element\]] + expected: FAIL + + [test_nested_shadow_element_click[checkbox\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/user_prompts.py.ini new file mode 100644 index 00000000000..a050673119e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/user_prompts.py.ini @@ -0,0 +1,73 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-beforeunload\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[beforeunload-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/content_editable.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/content_editable.py.ini new file mode 100644 index 00000000000..3cf383a34ff --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/content_editable.py.ini @@ -0,0 +1,9 @@ +[content_editable.py] + [test_sets_insertion_point_to_end] + expected: FAIL + + [test_sets_insertion_point_to_after_last_text_node] + expected: FAIL + + [test_no_move_caret_if_focused] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/events.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/events.py.ini new file mode 100644 index 00000000000..26b3aaa641b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/events.py.ini @@ -0,0 +1,9 @@ +[events.py] + [test_file_upload] + expected: FAIL + + [test_form_control_send_text[input\]] + expected: FAIL + + [test_form_control_send_text[textarea\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/file_upload.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/file_upload.py.ini new file mode 100644 index 00000000000..4fd4b29e87f --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/file_upload.py.ini @@ -0,0 +1,55 @@ +[file_upload.py] + expected: TIMEOUT + [test_empty_text] + expected: FAIL + + [test_multiple_files] + expected: FAIL + + [test_multiple_files_last_path_not_found] + expected: FAIL + + [test_multiple_files_without_multiple_attribute] + expected: FAIL + + [test_multiple_files_send_twice] + expected: FAIL + + [test_multiple_files_reset_with_element_clear] + expected: FAIL + + [test_single_file] + expected: FAIL + + [test_single_file_replaces_without_multiple_attribute] + expected: FAIL + + [test_single_file_appends_with_multiple_attribute] + expected: FAIL + + [test_transparent] + expected: FAIL + + [test_obscured] + expected: FAIL + + [test_outside_viewport] + expected: FAIL + + [test_hidden] + expected: FAIL + + [test_display_none] + expected: FAIL + + [test_not_focused] + expected: FAIL + + [test_focused] + expected: ERROR + + [test_strict_hidden] + expected: ERROR + + [test_strict_display_none] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/form_controls.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/form_controls.py.ini new file mode 100644 index 00000000000..5d4a3bd4de5 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/form_controls.py.ini @@ -0,0 +1,6 @@ +[form_controls.py] + [test_input_append] + expected: FAIL + + [test_textarea_append] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini new file mode 100644 index 00000000000..9510b686ea1 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini @@ -0,0 +1,24 @@ +[interactability.py] + [test_document_element_is_interactable] + expected: FAIL + + [test_iframe_is_interactable] + expected: FAIL + + [test_readonly_element] + expected: FAIL + + [test_not_a_focusable_element] + expected: FAIL + + [test_display_none] + expected: FAIL + + [test_visibility_hidden] + expected: FAIL + + [test_hidden] + expected: FAIL + + [test_disabled] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/scroll_into_view.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/scroll_into_view.py.ini new file mode 100644 index 00000000000..3e260cade03 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/scroll_into_view.py.ini @@ -0,0 +1,27 @@ +[scroll_into_view.py] + [test_element_outside_of_not_scrollable_viewport] + expected: FAIL + + [test_element_outside_of_scrollable_viewport] + expected: FAIL + + [test_contenteditable_element_outside_of_scrollable_viewport] + expected: FAIL + + [test_element_already_in_viewport[{block: 'start'}\]] + expected: FAIL + + [test_element_already_in_viewport[{block: 'center'}\]] + expected: FAIL + + [test_element_already_in_viewport[{block: 'end'}\]] + expected: FAIL + + [test_element_already_in_viewport[{block: 'nearest'}\]] + expected: FAIL + + [test_element_just_outside_viewport[Just above viewport\]] + expected: FAIL + + [test_element_just_outside_viewport[Just below viewport\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini new file mode 100644 index 00000000000..b2b09490191 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini @@ -0,0 +1,21 @@ +[send_keys.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/arguments.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/arguments.py.ini new file mode 100644 index 00000000000..6bcbe1197f6 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/arguments.py.ini @@ -0,0 +1,2 @@ +[arguments.py] + expected: TIMEOUT diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini new file mode 100644 index 00000000000..5d0711fe4ad --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini @@ -0,0 +1,12 @@ +[collections.py] + [test_array_in_array] + expected: FAIL + + [test_dom_token_list] + expected: FAIL + + [test_file_list] + expected: FAIL + + [test_html_all_collection] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/execute_async.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/execute_async.py.ini new file mode 100644 index 00000000000..6885d2e743e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/execute_async.py.ini @@ -0,0 +1,21 @@ +[execute_async.py] + [test_no_browsing_context] + expected: FAIL + + [test_abort_by_user_prompt[alert\]] + expected: FAIL + + [test_abort_by_user_prompt[confirm\]] + expected: FAIL + + [test_abort_by_user_prompt[prompt\]] + expected: FAIL + + [test_abort_by_user_prompt_twice[alert\]] + expected: FAIL + + [test_abort_by_user_prompt_twice[confirm\]] + expected: FAIL + + [test_abort_by_user_prompt_twice[prompt\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/node.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/node.py.ini new file mode 100644 index 00000000000..99dbcbef513 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/node.py.ini @@ -0,0 +1,33 @@ +[node.py] + [test_detached_shadow_root[top_context\]] + expected: FAIL + + [test_detached_shadow_root[child_context\]] + expected: FAIL + + [test_stale_element[top_context\]] + expected: FAIL + + [test_stale_element[child_context\]] + expected: FAIL + + [test_element_reference[shadow-root\]] + expected: FAIL + + [test_not_supported_nodes[attribute\]] + expected: FAIL + + [test_not_supported_nodes[text\]] + expected: FAIL + + [test_not_supported_nodes[processing_instruction\]] + expected: FAIL + + [test_not_supported_nodes[comment\]] + expected: FAIL + + [test_not_supported_nodes[document\]] + expected: FAIL + + [test_not_supported_nodes[doctype\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/user_prompts.py.ini new file mode 100644 index 00000000000..a050673119e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/user_prompts.py.ini @@ -0,0 +1,73 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-beforeunload\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[beforeunload-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/window.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/window.py.ini new file mode 100644 index 00000000000..5cd736463b1 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/window.py.ini @@ -0,0 +1,6 @@ +[window.py] + [test_web_reference[window\]] + expected: FAIL + + [test_window_open] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/arguments.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/arguments.py.ini new file mode 100644 index 00000000000..8818990c5ef --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/arguments.py.ini @@ -0,0 +1,88 @@ +[arguments.py] + expected: TIMEOUT + [test_no_such_element_with_unknown_id] + expected: FAIL + + [test_no_such_element_from_other_window_handle[open\]] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_no_such_shadow_root_with_unknown_id] + expected: FAIL + + [test_no_such_shadow_root_from_other_window_handle[open\]] + expected: FAIL + + [test_no_such_shadow_root_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_shadow_root_from_other_frame[open\]] + expected: FAIL + + [test_no_such_shadow_root_from_other_frame[closed\]] + expected: FAIL + + [test_detached_shadow_root_reference[top_context\]] + expected: FAIL + + [test_detached_shadow_root_reference[child_context\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[None-frame\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[None-window\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[False-frame\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[False-window\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[42-frame\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[42-window\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[value3-frame\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[value3-window\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[value4-frame\]] + expected: FAIL + + [test_invalid_argument_for_window_with_invalid_type[value4-window\]] + expected: FAIL + + [test_no_such_window_for_window_with_invalid_value] + expected: FAIL + + [test_element_reference[frame\]] + expected: FAIL + + [test_element_reference[node\]] + expected: FAIL + + [test_element_reference[shadow-root\]] + expected: FAIL + + [test_element_reference[window\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini new file mode 100644 index 00000000000..68e5ec4b830 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini @@ -0,0 +1,12 @@ +[collections.py] + [test_dom_token_list] + expected: FAIL + + [test_file_list] + expected: FAIL + + [test_html_all_collection] + expected: FAIL + + [test_array_in_array] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/execute.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/execute.py.ini new file mode 100644 index 00000000000..8a1571d1d7b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/execute.py.ini @@ -0,0 +1,24 @@ +[execute.py] + [test_no_browsing_context] + expected: FAIL + + [test_opening_new_window_keeps_current_window_handle] + expected: FAIL + + [test_abort_by_user_prompt[alert\]] + expected: FAIL + + [test_abort_by_user_prompt[confirm\]] + expected: FAIL + + [test_abort_by_user_prompt[prompt\]] + expected: FAIL + + [test_abort_by_user_prompt_twice[alert\]] + expected: FAIL + + [test_abort_by_user_prompt_twice[confirm\]] + expected: FAIL + + [test_abort_by_user_prompt_twice[prompt\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/node.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/node.py.ini new file mode 100644 index 00000000000..dd95e12798a --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/node.py.ini @@ -0,0 +1,33 @@ +[node.py] + [test_detached_shadow_root[top_context\]] + expected: FAIL + + [test_detached_shadow_root[child_context\]] + expected: FAIL + + [test_stale_element[top_context\]] + expected: FAIL + + [test_stale_element[child_context\]] + expected: FAIL + + [test_web_reference[shadow-root\]] + expected: FAIL + + [test_not_supported_nodes[attribute\]] + expected: FAIL + + [test_not_supported_nodes[text\]] + expected: FAIL + + [test_not_supported_nodes[processing_instruction\]] + expected: FAIL + + [test_not_supported_nodes[comment\]] + expected: FAIL + + [test_not_supported_nodes[document\]] + expected: ERROR + + [test_not_supported_nodes[doctype\]] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/promise.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/promise.py.ini new file mode 100644 index 00000000000..d5d950aa7ac --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/promise.py.ini @@ -0,0 +1,27 @@ +[promise.py] + [test_promise_resolve] + expected: FAIL + + [test_promise_resolve_delayed] + expected: FAIL + + [test_promise_all_resolve] + expected: FAIL + + [test_await_promise_resolve] + expected: FAIL + + [test_promise_resolve_timeout] + expected: FAIL + + [test_promise_reject] + expected: FAIL + + [test_promise_reject_delayed] + expected: FAIL + + [test_promise_all_reject] + expected: FAIL + + [test_promise_reject_timeout] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/user_prompts.py.ini new file mode 100644 index 00000000000..a050673119e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/user_prompts.py.ini @@ -0,0 +1,73 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-beforeunload\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[beforeunload-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/window.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/window.py.ini new file mode 100644 index 00000000000..9de464ed4f0 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/window.py.ini @@ -0,0 +1,15 @@ +[window.py] + [test_web_reference[window\]] + expected: FAIL + + [test_web_reference_in_array[window\]] + expected: FAIL + + [test_web_reference_in_object[window\]] + expected: FAIL + + [test_window_open] + expected: FAIL + + [test_same_id_after_cross_origin_navigation] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element/find.py.ini new file mode 100644 index 00000000000..7564f644b10 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_element/find.py.ini @@ -0,0 +1,34 @@ +[find.py] + expected: TIMEOUT + [test_no_browsing_context] + expected: ERROR + + [test_no_such_element_with_unknown_selector[not-existent\]] + expected: FAIL + + [test_no_such_element_with_unknown_selector[existent-other-frame\]] + expected: FAIL + + [test_no_such_element_with_unknown_selector[existent-inside-shadow-root\]] + expected: FAIL + + [test_find_element[xpath-//a\]] + expected: FAIL + + [test_xhtml_namespace[css selector-#linkText\]] + expected: FAIL + + [test_xhtml_namespace[link text-full link text\]] + expected: FAIL + + [test_xhtml_namespace[partial link text-link text\]] + expected: FAIL + + [test_xhtml_namespace[tag name-a\]] + expected: FAIL + + [test_xhtml_namespace[xpath-//*[name()='a'\]\]] + expected: FAIL + + [test_htmldocument[xpath-/html\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_element/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini new file mode 100644 index 00000000000..64a0652b75b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini @@ -0,0 +1,52 @@ +[find.py] + expected: TIMEOUT + [test_no_browsing_context] + expected: ERROR + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_with_unknown_selector[not-existent\]] + expected: FAIL + + [test_no_such_element_with_unknown_selector[existent-other-frame\]] + expected: FAIL + + [test_no_such_element_with_unknown_selector[existent-inside-shadow-root\]] + expected: FAIL + + [test_no_such_element_with_startnode_from_other_window_handle] + expected: FAIL + + [test_no_such_element_with_startnode_from_other_frame] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_find_element[xpath-//a\]] + expected: FAIL + + [test_xhtml_namespace[css selector-#linkText\]] + expected: FAIL + + [test_xhtml_namespace[link text-full link text\]] + expected: FAIL + + [test_xhtml_namespace[partial link text-link text\]] + expected: FAIL + + [test_xhtml_namespace[tag name-a\]] + expected: FAIL + + [test_xhtml_namespace[xpath-//*[name()='a'\]\]] + expected: FAIL + + [test_parent_htmldocument] + expected: FAIL + + [test_parent_of_document_node_errors] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/find.py.ini new file mode 100644 index 00000000000..dba98c7726b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/find.py.ini @@ -0,0 +1,157 @@ +[find.py] + expected: TIMEOUT + [test_null_parameter_value] + expected: FAIL + + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: ERROR + + [test_no_such_shadow_root_with_element] + expected: FAIL + + [test_no_such_shadow_root_with_unknown_shadow_root] + expected: FAIL + + [test_no_such_shadow_root_with_shadow_root_from_other_window_handle] + expected: FAIL + + [test_no_such_shadow_root_with_shadow_root_from_other_frame] + expected: FAIL + + [test_detached_shadow_root[top_context\]] + expected: FAIL + + [test_detached_shadow_root[child_context\]] + expected: FAIL + + [test_no_such_element_with_unknown_selector[not-existent\]] + expected: FAIL + + [test_no_such_element_with_unknown_selector[existent-other-frame\]] + expected: FAIL + + [test_no_such_element_with_unknown_selector[existent-outside-shadow-root\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[True\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[None\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[1\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[shadow_root_id3\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[shadow_root_id4\]] + expected: FAIL + + [test_invalid_using_argument[a\]] + expected: FAIL + + [test_invalid_using_argument[True\]] + expected: FAIL + + [test_invalid_using_argument[None\]] + expected: FAIL + + [test_invalid_using_argument[1\]] + expected: FAIL + + [test_invalid_using_argument[using4\]] + expected: FAIL + + [test_invalid_using_argument[using5\]] + expected: FAIL + + [test_invalid_selector_argument[None\]] + expected: FAIL + + [test_invalid_selector_argument[value1\]] + expected: FAIL + + [test_invalid_selector_argument[value2\]] + expected: FAIL + + [test_found_element_equivalence] + expected: FAIL + + [test_find_element[open-css selector-#linkText\]] + expected: FAIL + + [test_find_element[open-link text-full link text\]] + expected: FAIL + + [test_find_element[open-partial link text-link text\]] + expected: FAIL + + [test_find_element[open-tag name-a\]] + expected: FAIL + + [test_find_element[open-xpath-//a\]] + expected: FAIL + + [test_find_element[closed-css selector-#linkText\]] + expected: FAIL + + [test_find_element[closed-link text-full link text\]] + expected: FAIL + + [test_find_element[closed-partial link text-link text\]] + expected: FAIL + + [test_find_element[closed-tag name-a\]] + expected: FAIL + + [test_find_element[closed-xpath-//a\]] + expected: FAIL + + [test_find_element_link_text[<a href=#>link text</a>-link text\]] + expected: FAIL + + [test_find_element_link_text[<a href=#> link text </a>-link text\]] + expected: FAIL + + [test_find_element_link_text[<a href=#>link<br>text</a>-link\\ntext\]] + expected: FAIL + + [test_find_element_link_text[<a href=#>link&text</a>-link&text\]] + expected: FAIL + + [test_find_element_link_text[<a href=#>LINK TEXT</a>-LINK TEXT\]] + expected: FAIL + + [test_find_element_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT\]] + expected: FAIL + + [test_find_element_partial_link_text[<a href=#>partial link text</a>-link\]] + expected: FAIL + + [test_find_element_partial_link_text[<a href=#> partial link text </a>-link\]] + expected: FAIL + + [test_find_element_partial_link_text[<a href=#>partial link text</a>-k t\]] + expected: FAIL + + [test_find_element_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt\]] + expected: FAIL + + [test_find_element_partial_link_text[<a href=#>partial link&text</a>-k&t\]] + expected: FAIL + + [test_find_element_partial_link_text[<a href=#>PARTIAL LINK TEXT</a>-LINK\]] + expected: FAIL + + [test_find_element_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK\]] + expected: FAIL + + [test_find_element_in_nested_shadow_root[open\]] + expected: FAIL + + [test_find_element_in_nested_shadow_root[closed\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements/find.py.ini new file mode 100644 index 00000000000..44f232824bb --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_elements/find.py.ini @@ -0,0 +1,76 @@ +[find.py] + expected: TIMEOUT + [test_no_browsing_context] + expected: ERROR + + [test_find_elements[css selector-#linkText\]] + expected: FAIL + + [test_find_elements[link text-full link text\]] + expected: FAIL + + [test_find_elements[partial link text-link text\]] + expected: FAIL + + [test_find_elements[tag name-a\]] + expected: FAIL + + [test_find_elements[xpath-//a\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link text</a>-link text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#> link text </a>-link text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link<br>text</a>-link\\ntext\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link&text</a>-link&text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>LINK TEXT</a>-LINK TEXT\]] + expected: FAIL + + [test_find_elements_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link text</a>-link\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#> partial link text </a>-link\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link text</a>-k t\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link&text</a>-k&t\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>PARTIAL LINK TEXT</a>-LINK\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK\]] + expected: FAIL + + [test_xhtml_namespace[css selector-#linkText\]] + expected: FAIL + + [test_xhtml_namespace[link text-full link text\]] + expected: FAIL + + [test_xhtml_namespace[partial link text-link text\]] + expected: FAIL + + [test_xhtml_namespace[tag name-a\]] + expected: FAIL + + [test_xhtml_namespace[xpath-//*[name()='a'\]\]] + expected: FAIL + + [test_htmldocument[xpath-/html\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_elements/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/find.py.ini new file mode 100644 index 00000000000..69ec1b4bbcc --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/find.py.ini @@ -0,0 +1,82 @@ +[find.py] + expected: TIMEOUT + [test_no_browsing_context] + expected: ERROR + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_with_startnode_from_other_window_handle] + expected: FAIL + + [test_no_such_element_with_startnode_from_other_frame] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_find_elements[xpath-//a\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link text</a>-link text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#> link text </a>-link text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link<br>text</a>-link\\ntext\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link&text</a>-link&text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>LINK TEXT</a>-LINK TEXT\]] + expected: FAIL + + [test_find_elements_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link text</a>-link\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#> partial link text </a>-link\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link text</a>-k t\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link&text</a>-k&t\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>PARTIAL LINK TEXT</a>-LINK\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK\]] + expected: FAIL + + [test_xhtml_namespace[css selector-#linkText\]] + expected: FAIL + + [test_xhtml_namespace[link text-full link text\]] + expected: FAIL + + [test_xhtml_namespace[partial link text-link text\]] + expected: FAIL + + [test_xhtml_namespace[tag name-a\]] + expected: FAIL + + [test_xhtml_namespace[xpath-//*[name()='a'\]\]] + expected: FAIL + + [test_parent_htmldocument] + expected: FAIL + + [test_parent_of_document_node_errors] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/find.py.ini new file mode 100644 index 00000000000..5328af1b701 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/find.py.ini @@ -0,0 +1,157 @@ +[find.py] + expected: TIMEOUT + [test_null_parameter_value] + expected: FAIL + + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: ERROR + + [test_no_such_shadow_root_with_element] + expected: FAIL + + [test_no_such_shadow_root_with_unknown_shadow_root] + expected: FAIL + + [test_no_such_shadow_root_with_shadow_root_from_other_window_handle] + expected: FAIL + + [test_no_such_shadow_root_with_shadow_root_from_other_frame] + expected: FAIL + + [test_detached_shadow_root[top_context\]] + expected: FAIL + + [test_detached_shadow_root[child_context\]] + expected: FAIL + + [test_no_elements_with_unknown_selector[not-existent\]] + expected: FAIL + + [test_no_elements_with_unknown_selector[existent-other-frame\]] + expected: FAIL + + [test_no_elements_with_unknown_selector[existent-outside-shadow-root\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[True\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[None\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[1\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[shadow_root_id3\]] + expected: FAIL + + [test_invalid_shadow_root_id_argument[shadow_root_id4\]] + expected: FAIL + + [test_invalid_using_argument[a\]] + expected: FAIL + + [test_invalid_using_argument[True\]] + expected: FAIL + + [test_invalid_using_argument[None\]] + expected: FAIL + + [test_invalid_using_argument[1\]] + expected: FAIL + + [test_invalid_using_argument[using4\]] + expected: FAIL + + [test_invalid_using_argument[using5\]] + expected: FAIL + + [test_invalid_selector_argument[None\]] + expected: FAIL + + [test_invalid_selector_argument[value1\]] + expected: FAIL + + [test_invalid_selector_argument[value2\]] + expected: FAIL + + [test_find_elements_equivalence] + expected: FAIL + + [test_find_elements[open-css selector-#linkText\]] + expected: FAIL + + [test_find_elements[open-link text-full link text\]] + expected: FAIL + + [test_find_elements[open-partial link text-link text\]] + expected: FAIL + + [test_find_elements[open-tag name-a\]] + expected: FAIL + + [test_find_elements[open-xpath-//a\]] + expected: FAIL + + [test_find_elements[closed-css selector-#linkText\]] + expected: FAIL + + [test_find_elements[closed-link text-full link text\]] + expected: FAIL + + [test_find_elements[closed-partial link text-link text\]] + expected: FAIL + + [test_find_elements[closed-tag name-a\]] + expected: FAIL + + [test_find_elements[closed-xpath-//a\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link text</a>-link text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#> link text </a>-link text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link<br>text</a>-link\\ntext\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>link&text</a>-link&text\]] + expected: FAIL + + [test_find_elements_link_text[<a href=#>LINK TEXT</a>-LINK TEXT\]] + expected: FAIL + + [test_find_elements_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link text</a>-link\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#> partial link text </a>-link\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link text</a>-k t\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>partial link&text</a>-k&t\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=#>PARTIAL LINK TEXT</a>-LINK\]] + expected: FAIL + + [test_find_elements_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK\]] + expected: FAIL + + [test_find_elements_in_nested_shadow_root[open\]] + expected: FAIL + + [test_find_elements_in_nested_shadow_root[closed\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini b/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini new file mode 100644 index 00000000000..12538247f27 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini @@ -0,0 +1,34 @@ +[forward.py] + disabled: consistent panic + [test_no_top_browsing_context] + expected: ERROR + + [test_no_browsing_context] + expected: ERROR + + [test_basic] + expected: ERROR + + [test_no_browsing_history] + expected: ERROR + + [test_seen_nodes[http\]] + expected: ERROR + + [test_seen_nodes[https\]] + expected: ERROR + + [test_seen_nodes[https coop\]] + expected: ERROR + + [test_history_pushstate] + expected: ERROR + + [test_data_urls] + expected: ERROR + + [test_fragments] + expected: ERROR + + [test_removed_iframe] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/forward/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/forward/user_prompts.py.ini new file mode 100644 index 00000000000..326fdd875ad --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/forward/user_prompts.py.ini @@ -0,0 +1,3 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + expected: TIMEOUT diff --git a/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/from_minimized_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/from_minimized_window.py.ini new file mode 100644 index 00000000000..99b10143b3e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/from_minimized_window.py.ini @@ -0,0 +1,3 @@ +[from_minimized_window.py] + [test_fullscreen_from_minimized_window] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/fullscreen.py.ini b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/fullscreen.py.ini new file mode 100644 index 00000000000..d03f4481fba --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/fullscreen.py.ini @@ -0,0 +1,18 @@ +[fullscreen.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_response_payload] + expected: FAIL + + [test_fullscreen_from_normal_window] + expected: FAIL + + [test_fullscreen_from_maximized_window] + expected: FAIL + + [test_fullscreen_twice_is_idempotent] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/stress.py.ini b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/stress.py.ini new file mode 100644 index 00000000000..a6c136ac885 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/stress.py.ini @@ -0,0 +1,15 @@ +[stress.py] + [test_stress[0\]] + expected: FAIL + + [test_stress[1\]] + expected: FAIL + + [test_stress[2\]] + expected: FAIL + + [test_stress[3\]] + expected: FAIL + + [test_stress[4\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_active_element/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_active_element/get.py.ini new file mode 100644 index 00000000000..2d7e863ee5b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_active_element/get.py.ini @@ -0,0 +1,6 @@ +[get.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_active_element/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_active_element/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_active_element/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_alert_text/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_alert_text/get.py.ini new file mode 100644 index 00000000000..fa50e27c0d1 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_alert_text/get.py.ini @@ -0,0 +1,22 @@ +[get.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: ERROR + + [test_no_user_prompt] + expected: FAIL + + [test_get_alert_text] + expected: FAIL + + [test_get_confirm_text] + expected: FAIL + + [test_get_prompt_text] + expected: FAIL + + [test_unexpected_alert] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_label/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_label/get.py.ini new file mode 100644 index 00000000000..6f7cda2f119 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_label/get.py.ini @@ -0,0 +1,42 @@ +[get.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_invalid_value] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[open\]] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_get_computed_label[<button>ok</button>-button-ok\]] + expected: FAIL + + [test_get_computed_label[<button aria-labelledby="one two"></button><div id=one>ok</div><div id=two>go</div>-button-ok go\]] + expected: FAIL + + [test_get_computed_label[<button aria-label=foo>bar</button>-button-foo\]] + expected: FAIL + + [test_get_computed_label[<label><input> foo</label>-input-foo\]] + expected: FAIL + + [test_get_computed_label[<label for=b>foo<label><input id=b>-input-foo\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_label/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_label/user_prompts.py.ini new file mode 100644 index 00000000000..913351aaa55 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_label/user_prompts.py.ini @@ -0,0 +1,2 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734
\ No newline at end of file diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini new file mode 100644 index 00000000000..abd4a7750b7 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini @@ -0,0 +1,24 @@ +[get.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_computed_roles[<article>foo</article>-article-article\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_role/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/user_prompts.py.ini new file mode 100644 index 00000000000..b168410dab1 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/user_prompts.py.ini @@ -0,0 +1,2 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 diff --git a/tests/wpt/meta/webdriver/tests/classic/get_current_url/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_current_url/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_current_url/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini new file mode 100644 index 00000000000..69b4a4c7d0b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini @@ -0,0 +1,94 @@ +[get.py] + expected: TIMEOUT + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: ERROR + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[open\]] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_normal] + expected: FAIL + + [test_boolean_attribute[audio-attrs0\]] + expected: FAIL + + [test_boolean_attribute[button-attrs1\]] + expected: FAIL + + [test_boolean_attribute[details-attrs2\]] + expected: FAIL + + [test_boolean_attribute[dialog-attrs3\]] + expected: FAIL + + [test_boolean_attribute[fieldset-attrs4\]] + expected: FAIL + + [test_boolean_attribute[form-attrs5\]] + expected: FAIL + + [test_boolean_attribute[iframe-attrs6\]] + expected: FAIL + + [test_boolean_attribute[img-attrs7\]] + expected: FAIL + + [test_boolean_attribute[input-attrs8\]] + expected: FAIL + + [test_boolean_attribute[menuitem-attrs9\]] + expected: FAIL + + [test_boolean_attribute[ol-attrs10\]] + expected: FAIL + + [test_boolean_attribute[optgroup-attrs11\]] + expected: FAIL + + [test_boolean_attribute[option-attrs12\]] + expected: FAIL + + [test_boolean_attribute[script-attrs13\]] + expected: FAIL + + [test_boolean_attribute[select-attrs14\]] + expected: FAIL + + [test_boolean_attribute[textarea-attrs15\]] + expected: FAIL + + [test_boolean_attribute[track-attrs16\]] + expected: FAIL + + [test_boolean_attribute[video-attrs17\]] + expected: FAIL + + [test_global_boolean_attributes] + expected: FAIL + + [test_anchor_href[relative\]] + expected: FAIL + + [test_anchor_href[absolute\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini new file mode 100644 index 00000000000..bcd25112776 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini @@ -0,0 +1,21 @@ +[get.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini new file mode 100644 index 00000000000..646e2846e18 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini @@ -0,0 +1,94 @@ +[get.py] + expected: TIMEOUT + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: ERROR + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[open\]] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_property_non_existent] + expected: FAIL + + [test_content_attribute] + expected: FAIL + + [test_idl_attribute] + expected: FAIL + + [test_primitives["foobar"-foobar\]] + expected: FAIL + + [test_primitives[42-42\]] + expected: FAIL + + [test_primitives[js_primitive2-py_primitive2\]] + expected: FAIL + + [test_primitives[js_primitive3-py_primitive3\]] + expected: FAIL + + [test_primitives[null-None\]] + expected: FAIL + + [test_primitives[undefined-None\]] + expected: FAIL + + [test_collection_dom_token_list] + expected: FAIL + + [test_primitives_set_by_execute_script["foobar"-foobar\]] + expected: FAIL + + [test_primitives_set_by_execute_script[42-42\]] + expected: FAIL + + [test_primitives_set_by_execute_script[js_primitive2-py_primitive2\]] + expected: FAIL + + [test_primitives_set_by_execute_script[js_primitive3-py_primitive3\]] + expected: FAIL + + [test_primitives_set_by_execute_script[null-None\]] + expected: FAIL + + [test_primitives_set_by_execute_script[undefined-None\]] + expected: FAIL + + [test_web_reference[frame-WebFrame\]] + expected: FAIL + + [test_web_reference[shadowRoot-ShadowRoot\]] + expected: FAIL + + [test_web_reference[window-WebWindow\]] + expected: FAIL + + [test_mutated_element] + expected: FAIL + + [test_anchor_href[relative\]] + expected: FAIL + + [test_anchor_href[absolute\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_property/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_property/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_property/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini new file mode 100644 index 00000000000..065e9fbc4ce --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini @@ -0,0 +1,24 @@ +[get.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_basic] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_rect/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini new file mode 100644 index 00000000000..1b3957f08c8 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini @@ -0,0 +1,33 @@ +[get.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_invalid_value] + expected: FAIL + + [test_no_such_element_from_other_window_handle[open\]] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_get_shadow_root] + expected: FAIL + + [test_no_shadow_root] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini new file mode 100644 index 00000000000..b810c389100 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini @@ -0,0 +1,24 @@ +[get.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_get_element_tag_name] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini new file mode 100644 index 00000000000..5f04f967054 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini @@ -0,0 +1,42 @@ +[get.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_transform_capitalize[space\]] + expected: FAIL + + [test_transform_capitalize[dash\]] + expected: FAIL + + [test_transform_capitalize[underscore\]] + expected: FAIL + + [test_shadow_root_slot[custom outside\]] + expected: FAIL + + [test_shadow_root_slot[default visible\]] + expected: FAIL + + [test_shadow_root_slot[default outside\]] + expected: FAIL + + [test_shadow_root_slot[default hidden\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/get.py.ini new file mode 100644 index 00000000000..93b889d3a59 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/get.py.ini @@ -0,0 +1,12 @@ +[get.py] + [test_no_browsing_context] + expected: FAIL + + [test_get_named_session_cookie] + expected: FAIL + + [test_get_named_cookie] + expected: FAIL + + [test_duplicated_cookie] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_page_source/source.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_page_source/source.py.ini new file mode 100644 index 00000000000..f1326acbc2f --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_page_source/source.py.ini @@ -0,0 +1,3 @@ +[source.py] + [test_no_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_page_source/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_page_source/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_page_source/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_title/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_title/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_title/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_handle/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_handle/get.py.ini new file mode 100644 index 00000000000..0fb70be2b4d --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_window_handle/get.py.ini @@ -0,0 +1,3 @@ +[get.py] + [test_no_top_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_handle/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_handle/user_prompts.py.ini new file mode 100644 index 00000000000..0bc849b2704 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_window_handle/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert\]] + expected: FAIL + + [test_accept[capabilities0-confirm\]] + expected: FAIL + + [test_accept[capabilities0-prompt\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt\]] + expected: FAIL + + [test_dismiss[capabilities0-alert\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert\]] + expected: FAIL + + [test_default[confirm\]] + expected: FAIL + + [test_default[prompt\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_handles/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_handles/user_prompts.py.ini new file mode 100644 index 00000000000..0bc849b2704 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_window_handles/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert\]] + expected: FAIL + + [test_accept[capabilities0-confirm\]] + expected: FAIL + + [test_accept[capabilities0-prompt\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt\]] + expected: FAIL + + [test_dismiss[capabilities0-alert\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert\]] + expected: FAIL + + [test_default[confirm\]] + expected: FAIL + + [test_default[prompt\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_rect/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_rect/get.py.ini new file mode 100644 index 00000000000..3394ac22306 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_window_rect/get.py.ini @@ -0,0 +1,6 @@ +[get.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_payload] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_rect/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_rect/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/get_window_rect/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/idlharness.window.js.ini b/tests/wpt/meta/webdriver/tests/classic/idlharness.window.js.ini new file mode 100644 index 00000000000..ee8e266e35f --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/idlharness.window.js.ini @@ -0,0 +1,6 @@ +[idlharness.window.html] + [Navigator interface: attribute webdriver] + expected: FAIL + + [Navigator interface: navigator must inherit property "webdriver" with the proper type] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/interface/interface.py.ini b/tests/wpt/meta/webdriver/tests/classic/interface/interface.py.ini new file mode 100644 index 00000000000..9efc2c79243 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/interface/interface.py.ini @@ -0,0 +1,3 @@ +[interface.py] + [test_navigator_webdriver_active] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini new file mode 100644 index 00000000000..1f97f812861 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini @@ -0,0 +1,2 @@ +[enabled.py] + expected: TIMEOUT diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/user_prompts.py.ini new file mode 100644 index 00000000000..913351aaa55 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/user_prompts.py.ini @@ -0,0 +1,2 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734
\ No newline at end of file diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini new file mode 100644 index 00000000000..f75724979c5 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini @@ -0,0 +1,21 @@ +[selected.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_selected/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/maximize_window/from_minimized_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/maximize_window/from_minimized_window.py.ini new file mode 100644 index 00000000000..5d3e1ccc1b2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/maximize_window/from_minimized_window.py.ini @@ -0,0 +1,3 @@ +[from_minimized_window.py] + [test_restore_from_minimized] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/maximize_window/maximize.py.ini b/tests/wpt/meta/webdriver/tests/classic/maximize_window/maximize.py.ini new file mode 100644 index 00000000000..83d5c2fcf84 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/maximize_window/maximize.py.ini @@ -0,0 +1,21 @@ +[maximize.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_response_payload] + expected: FAIL + + [test_fully_exit_fullscreen] + expected: FAIL + + [test_maximize_from_normal_window] + expected: FAIL + + [test_maximize_with_window_already_at_maximum_size] + expected: FAIL + + [test_maximize_twice_is_idempotent] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/maximize_window/stress.py.ini b/tests/wpt/meta/webdriver/tests/classic/maximize_window/stress.py.ini new file mode 100644 index 00000000000..a6c136ac885 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/maximize_window/stress.py.ini @@ -0,0 +1,15 @@ +[stress.py] + [test_stress[0\]] + expected: FAIL + + [test_stress[1\]] + expected: FAIL + + [test_stress[2\]] + expected: FAIL + + [test_stress[3\]] + expected: FAIL + + [test_stress[4\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/maximize_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/maximize_window/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/maximize_window/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/minimize_window/minimize.py.ini b/tests/wpt/meta/webdriver/tests/classic/minimize_window/minimize.py.ini new file mode 100644 index 00000000000..75af78405d0 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/minimize_window/minimize.py.ini @@ -0,0 +1,21 @@ +[minimize.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_response_payload] + expected: FAIL + + [test_restore_from_fullscreen] + expected: FAIL + + [test_restore_from_maximized] + expected: FAIL + + [test_minimize_from_normal_window] + expected: FAIL + + [test_minimize_twice_is_idempotent] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/minimize_window/stress.py.ini b/tests/wpt/meta/webdriver/tests/classic/minimize_window/stress.py.ini new file mode 100644 index 00000000000..a6c136ac885 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/minimize_window/stress.py.ini @@ -0,0 +1,15 @@ +[stress.py] + [test_stress[0\]] + expected: FAIL + + [test_stress[1\]] + expected: FAIL + + [test_stress[2\]] + expected: FAIL + + [test_stress[3\]] + expected: FAIL + + [test_stress[4\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/minimize_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/minimize_window/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/minimize_window/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/navigate_to/navigate.py.ini b/tests/wpt/meta/webdriver/tests/classic/navigate_to/navigate.py.ini new file mode 100644 index 00000000000..2464f4b2b4d --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/navigate_to/navigate.py.ini @@ -0,0 +1,12 @@ +[navigate.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_seen_nodes[http\]] + expected: FAIL + + [test_seen_nodes[https\]] + expected: FAIL + + [test_seen_nodes[https coop\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/navigate_to/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/navigate_to/user_prompts.py.ini new file mode 100644 index 00000000000..fcf10a0526c --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/navigate_to/user_prompts.py.ini @@ -0,0 +1,73 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert\]] + expected: FAIL + + [test_accept[capabilities0-beforeunload\]] + expected: FAIL + + [test_accept[capabilities0-confirm\]] + expected: FAIL + + [test_accept[capabilities0-prompt\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert\]] + expected: FAIL + + [test_dismiss[capabilities0-beforeunload\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-beforeunload\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[beforeunload-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/create_alwaysMatch.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/create_alwaysMatch.py.ini new file mode 100644 index 00000000000..c837e638bb0 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_session/create_alwaysMatch.py.ini @@ -0,0 +1,21 @@ +[create_alwaysMatch.py] + [test_valid[timeouts-value12\]] + expected: FAIL + + [test_valid[strictFileInteractability-True\]] + expected: FAIL + + [test_valid[test:extension-False\]] + expected: FAIL + + [test_valid[test:extension-abc\]] + expected: FAIL + + [test_valid[test:extension-123\]] + expected: FAIL + + [test_valid[test:extension-value22\]] + expected: FAIL + + [test_valid[test:extension-value23\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/create_firstMatch.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/create_firstMatch.py.ini new file mode 100644 index 00000000000..3752bebca7b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_session/create_firstMatch.py.ini @@ -0,0 +1,21 @@ +[create_firstMatch.py] + [test_valid[timeouts-value12\]] + expected: FAIL + + [test_valid[strictFileInteractability-True\]] + expected: FAIL + + [test_valid[test:extension-False\]] + expected: FAIL + + [test_valid[test:extension-abc\]] + expected: FAIL + + [test_valid[test:extension-123\]] + expected: FAIL + + [test_valid[test:extension-value22\]] + expected: FAIL + + [test_valid[test:extension-value23\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/response.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/response.py.ini new file mode 100644 index 00000000000..b5c5cede365 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_session/response.py.ini @@ -0,0 +1,3 @@ +[response.py] + [test_capability_user_agent] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/unhandled_prompt_behavior.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/unhandled_prompt_behavior.py.ini new file mode 100644 index 00000000000..ff2e1c72126 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_session/unhandled_prompt_behavior.py.ini @@ -0,0 +1,24 @@ +[unhandled_prompt_behavior.py] + [test_unhandled_prompt_behavior_as_object_default[handler0-expected_capability0-True-True\]] + expected: FAIL + + [test_unhandled_prompt_behavior_as_object_default[handler1-expected_capability1-True-False\]] + expected: FAIL + + [test_unhandled_prompt_behavior_as_object_default[handler2-expected_capability2-False-True\]] + expected: FAIL + + [test_beforeunload_prompts_always_automatically_accepted[accept\]] + expected: FAIL + + [test_beforeunload_prompts_always_automatically_accepted[accept and notify\]] + expected: FAIL + + [test_beforeunload_prompts_always_automatically_accepted[dismiss\]] + expected: FAIL + + [test_beforeunload_prompts_always_automatically_accepted[dismiss and notify\]] + expected: FAIL + + [test_beforeunload_prompts_always_automatically_accepted[ignore\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/websocket_url.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/websocket_url.py.ini new file mode 100644 index 00000000000..76e42fd0ed0 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_session/websocket_url.py.ini @@ -0,0 +1,3 @@ +[websocket_url.py] + [test_bidi_upgrade] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini new file mode 100644 index 00000000000..7288018eebf --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini @@ -0,0 +1,6 @@ +[new.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini new file mode 100644 index 00000000000..77be6174789 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini @@ -0,0 +1,15 @@ +[new_tab.py] + [test_keeps_current_window_handle] + expected: ERROR + + [test_opens_about_blank_in_new_tab] + expected: ERROR + + [test_initial_selection_for_contenteditable] + expected: ERROR + + [test_sets_no_window_name] + expected: ERROR + + [test_sets_no_opener] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini new file mode 100644 index 00000000000..5ea6fe581f7 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini @@ -0,0 +1,12 @@ +[new_window.py] + [test_payload] + expected: FAIL + + [test_keeps_current_window_handle] + expected: FAIL + + [test_opens_about_blank_in_new_window] + expected: FAIL + + [test_initial_selection_for_contenteditable] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/new_window/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/invalid.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/invalid.py.ini new file mode 100644 index 00000000000..39649c5204a --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/invalid.py.ini @@ -0,0 +1,91 @@ +[invalid.py] + expected: TIMEOUT + [test_input_source_action_sequence_actions_pause_duration_invalid_value[9007199254740992-none\]] + expected: FAIL + + [test_input_source_action_sequence_actions_pause_duration_invalid_value[9007199254740992-key\]] + expected: FAIL + + [test_input_source_action_sequence_actions_pause_duration_invalid_value[9007199254740992-pointer\]] + expected: FAIL + + [test_input_source_action_sequence_actions_pause_duration_invalid_value[9007199254740992-wheel\]] + expected: FAIL + + [test_pointer_action_up_down_button_invalid_value[9007199254740992-pointerDown\]] + expected: FAIL + + [test_pointer_action_up_down_button_invalid_value[9007199254740992-pointerUp\]] + expected: FAIL + + [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-width-pointerDown\]] + expected: FAIL + + [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-width-pointerMove\]] + expected: FAIL + + [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-width-pointerUp\]] + expected: FAIL + + [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-height-pointerDown\]] + expected: FAIL + + [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-height-pointerMove\]] + expected: FAIL + + [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-height-pointerUp\]] + expected: FAIL + + [test_wheel_action_scroll_coordinate_invalid_type[None-x\]] + expected: FAIL + + [test_wheel_action_scroll_coordinate_invalid_type[None-y\]] + expected: FAIL + + [test_wheel_action_scroll_coordinate_invalid_value[-9007199254740992-x\]] + expected: FAIL + + [test_wheel_action_scroll_coordinate_invalid_value[-9007199254740992-y\]] + expected: FAIL + + [test_wheel_action_scroll_coordinate_invalid_value[9007199254740992-x\]] + expected: FAIL + + [test_wheel_action_scroll_coordinate_invalid_value[9007199254740992-y\]] + expected: FAIL + + [test_wheel_action_scroll_delta_invalid_type[None-x\]] + expected: FAIL + + [test_wheel_action_scroll_delta_invalid_type[None-y\]] + expected: FAIL + + [test_wheel_action_scroll_delta_invalid_value[-9007199254740992-x\]] + expected: FAIL + + [test_wheel_action_scroll_delta_invalid_value[-9007199254740992-y\]] + expected: FAIL + + [test_wheel_action_scroll_delta_invalid_value[9007199254740992-x\]] + expected: FAIL + + [test_wheel_action_scroll_delta_invalid_value[9007199254740992-y\]] + expected: FAIL + + [test_wheel_action_scroll_origin_pointer_not_supported] + expected: FAIL + + [test_wheel_action_scroll_origin_element_invalid_value] + expected: FAIL + + [test_wheel_action_scroll_missing_property[x\]] + expected: FAIL + + [test_wheel_action_scroll_missing_property[y\]] + expected: FAIL + + [test_wheel_action_scroll_missing_property[deltaX\]] + expected: FAIL + + [test_wheel_action_scroll_missing_property[deltaY\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini new file mode 100644 index 00000000000..0a9efbca289 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini @@ -0,0 +1,24 @@ +[key.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_key_down_closes_browsing_context] + expected: FAIL + + [test_backspace_erases_keys] + expected: FAIL + + [test_element_in_shadow_tree[outer-open\]] + expected: FAIL + + [test_element_in_shadow_tree[outer-closed\]] + expected: FAIL + + [test_element_in_shadow_tree[inner-open\]] + expected: FAIL + + [test_element_in_shadow_tree[inner-closed\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_events.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_events.py.ini new file mode 100644 index 00000000000..6dabfbb793f --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_events.py.ini @@ -0,0 +1,273 @@ +[key_events.py] + [test_modifier_key_sends_correct_events[\\ue00a-ALT\]] + expected: FAIL + + [test_modifier_key_sends_correct_events[\\ue009-CONTROL\]] + expected: FAIL + + [test_modifier_key_sends_correct_events[\\ue03d-META\]] + expected: FAIL + + [test_modifier_key_sends_correct_events[\\ue008-SHIFT\]] + expected: FAIL + + [test_modifier_key_sends_correct_events[\\ue052-R_ALT\]] + expected: FAIL + + [test_modifier_key_sends_correct_events[\\ue051-R_CONTROL\]] + expected: FAIL + + [test_modifier_key_sends_correct_events[\\ue053-R_META\]] + expected: FAIL + + [test_modifier_key_sends_correct_events[\\ue050-R_SHIFT\]] + expected: FAIL + + [test_non_printable_key_sends_events[\\ue00c-ESCAPE\]] + expected: FAIL + + [test_non_printable_key_sends_events[\\ue014-RIGHT\]] + expected: FAIL + + [test_printable_key_sends_correct_events[a-KeyA0\]] + expected: FAIL + + [test_printable_key_sends_correct_events[a-KeyA1\]] + expected: FAIL + + [test_printable_key_sends_correct_events["-Quote\]] + expected: FAIL + + [test_printable_key_sends_correct_events[,-Comma\]] + expected: FAIL + + [test_printable_key_sends_correct_events[\\xe0-\]] + expected: FAIL + + [test_printable_key_sends_correct_events[\\u0416-\]] + expected: FAIL + + [test_printable_key_sends_correct_events[@-Digit2\]] + expected: FAIL + + [test_printable_key_sends_correct_events[\\u2603-\]] + expected: FAIL + + [test_printable_key_sends_correct_events[\\uf6c2-\]] + expected: FAIL + + [test_sequence_of_keydown_printable_keys_sends_events] + expected: FAIL + + [test_sequence_of_keydown_printable_characters_sends_events] + expected: FAIL + + [test_special_key_sends_keydown[ADD-expected0\]] + expected: FAIL + + [test_special_key_sends_keydown[ALT-expected1\]] + expected: FAIL + + [test_special_key_sends_keydown[BACKSPACE-expected2\]] + expected: FAIL + + [test_special_key_sends_keydown[CANCEL-expected3\]] + expected: FAIL + + [test_special_key_sends_keydown[CLEAR-expected4\]] + expected: FAIL + + [test_special_key_sends_keydown[CONTROL-expected5\]] + expected: FAIL + + [test_special_key_sends_keydown[DECIMAL-expected6\]] + expected: FAIL + + [test_special_key_sends_keydown[DELETE-expected7\]] + expected: FAIL + + [test_special_key_sends_keydown[DIVIDE-expected8\]] + expected: FAIL + + [test_special_key_sends_keydown[DOWN-expected9\]] + expected: FAIL + + [test_special_key_sends_keydown[END-expected10\]] + expected: FAIL + + [test_special_key_sends_keydown[ENTER-expected11\]] + expected: FAIL + + [test_special_key_sends_keydown[EQUALS-expected12\]] + expected: FAIL + + [test_special_key_sends_keydown[ESCAPE-expected13\]] + expected: FAIL + + [test_special_key_sends_keydown[F1-expected14\]] + expected: FAIL + + [test_special_key_sends_keydown[F10-expected15\]] + expected: FAIL + + [test_special_key_sends_keydown[F11-expected16\]] + expected: FAIL + + [test_special_key_sends_keydown[F12-expected17\]] + expected: FAIL + + [test_special_key_sends_keydown[F2-expected18\]] + expected: FAIL + + [test_special_key_sends_keydown[F3-expected19\]] + expected: FAIL + + [test_special_key_sends_keydown[F4-expected20\]] + expected: FAIL + + [test_special_key_sends_keydown[F5-expected21\]] + expected: FAIL + + [test_special_key_sends_keydown[F6-expected22\]] + expected: FAIL + + [test_special_key_sends_keydown[F7-expected23\]] + expected: FAIL + + [test_special_key_sends_keydown[F8-expected24\]] + expected: FAIL + + [test_special_key_sends_keydown[F9-expected25\]] + expected: FAIL + + [test_special_key_sends_keydown[HELP-expected26\]] + expected: FAIL + + [test_special_key_sends_keydown[HOME-expected27\]] + expected: FAIL + + [test_special_key_sends_keydown[INSERT-expected28\]] + expected: FAIL + + [test_special_key_sends_keydown[LEFT-expected29\]] + expected: FAIL + + [test_special_key_sends_keydown[META-expected30\]] + expected: FAIL + + [test_special_key_sends_keydown[MULTIPLY-expected31\]] + expected: FAIL + + [test_special_key_sends_keydown[NULL-expected32\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD0-expected33\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD1-expected34\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD2-expected35\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD3-expected36\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD4-expected37\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD5-expected38\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD6-expected39\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD7-expected40\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD8-expected41\]] + expected: FAIL + + [test_special_key_sends_keydown[NUMPAD9-expected42\]] + expected: FAIL + + [test_special_key_sends_keydown[PAGE_DOWN-expected43\]] + expected: FAIL + + [test_special_key_sends_keydown[PAGE_UP-expected44\]] + expected: FAIL + + [test_special_key_sends_keydown[PAUSE-expected45\]] + expected: FAIL + + [test_special_key_sends_keydown[RETURN-expected46\]] + expected: FAIL + + [test_special_key_sends_keydown[RIGHT-expected47\]] + expected: FAIL + + [test_special_key_sends_keydown[R_ALT-expected48\]] + expected: FAIL + + [test_special_key_sends_keydown[R_ARROWDOWN-expected49\]] + expected: FAIL + + [test_special_key_sends_keydown[R_ARROWLEFT-expected50\]] + expected: FAIL + + [test_special_key_sends_keydown[R_ARROWRIGHT-expected51\]] + expected: FAIL + + [test_special_key_sends_keydown[R_ARROWUP-expected52\]] + expected: FAIL + + [test_special_key_sends_keydown[R_CONTROL-expected53\]] + expected: FAIL + + [test_special_key_sends_keydown[R_DELETE-expected54\]] + expected: FAIL + + [test_special_key_sends_keydown[R_END-expected55\]] + expected: FAIL + + [test_special_key_sends_keydown[R_HOME-expected56\]] + expected: FAIL + + [test_special_key_sends_keydown[R_INSERT-expected57\]] + expected: FAIL + + [test_special_key_sends_keydown[R_META-expected58\]] + expected: FAIL + + [test_special_key_sends_keydown[R_PAGEDOWN-expected59\]] + expected: FAIL + + [test_special_key_sends_keydown[R_PAGEUP-expected60\]] + expected: FAIL + + [test_special_key_sends_keydown[R_SHIFT-expected61\]] + expected: FAIL + + [test_special_key_sends_keydown[SEMICOLON-expected62\]] + expected: FAIL + + [test_special_key_sends_keydown[SEPARATOR-expected63\]] + expected: FAIL + + [test_special_key_sends_keydown[SHIFT-expected64\]] + expected: FAIL + + [test_special_key_sends_keydown[SPACE-expected65\]] + expected: FAIL + + [test_special_key_sends_keydown[SUBTRACT-expected66\]] + expected: FAIL + + [test_special_key_sends_keydown[TAB-expected67\]] + expected: FAIL + + [test_special_key_sends_keydown[UP-expected68\]] + expected: FAIL + + [test_special_key_sends_keydown[ZENKAKUHANKAKU-expected69\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_modifiers.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_modifiers.py.ini new file mode 100644 index 00000000000..70b4b687388 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_modifiers.py.ini @@ -0,0 +1,12 @@ +[key_modifiers.py] + [test_shift_modifier_and_non_printable_keys[\\ue008\]] + expected: FAIL + + [test_shift_modifier_and_non_printable_keys[\\ue050\]] + expected: FAIL + + [test_shift_modifier_generates_capital_letters[\\ue008\]] + expected: FAIL + + [test_shift_modifier_generates_capital_letters[\\ue050\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_shortcuts.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_shortcuts.py.ini new file mode 100644 index 00000000000..43e9ac6cf32 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_shortcuts.py.ini @@ -0,0 +1,3 @@ +[key_shortcuts.py] + [test_mod_a_mod_c_right_mod_v_pastes_text] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_special_keys.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_special_keys.py.ini new file mode 100644 index 00000000000..9f97050ec49 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_special_keys.py.ini @@ -0,0 +1,12 @@ +[key_special_keys.py] + [test_codepoint_keys_behave_correctly[\\U0001f604\]] + expected: FAIL + + [test_codepoint_keys_behave_correctly[\\U0001f60d\]] + expected: FAIL + + [test_codepoint_keys_behave_correctly[\\u0ba8\\u0bbf\]] + expected: FAIL + + [test_codepoint_keys_behave_correctly[\\u1100\\u1161\\u11a8\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_tentative.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_tentative.py.ini new file mode 100644 index 00000000000..a16bb76d7c7 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_tentative.py.ini @@ -0,0 +1,6 @@ +[key_tentative.py] + [test_grapheme_cluster[\\u0e01\\u0e33\]] + expected: FAIL + + [test_grapheme_cluster[\\U0001f937\\U0001f3fd\\u200d\\u2640\\ufe0f\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini new file mode 100644 index 00000000000..38af76d3cf4 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini @@ -0,0 +1,6 @@ +[navigation.py] + [test_key] + expected: FAIL + + [test_pointer] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/none.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/none.py.ini new file mode 100644 index 00000000000..1dad7888c51 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/none.py.ini @@ -0,0 +1,6 @@ +[none.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/perform.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/perform.py.ini new file mode 100644 index 00000000000..b4a8841b9ae --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/perform.py.ini @@ -0,0 +1,9 @@ +[perform.py] + [test_input_source_action_sequence_actions_pause_duration_valid[wheel\]] + expected: FAIL + + [test_input_source_action_sequence_actions_pause_duration_missing[wheel\]] + expected: FAIL + + [test_input_source_action_sequence_pointer_parameters_not_processed[wheel\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_contextmenu.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_contextmenu.py.ini new file mode 100644 index 00000000000..e0fb2381634 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_contextmenu.py.ini @@ -0,0 +1,9 @@ +[pointer_contextmenu.py] + [test_control_click[\\ue009-ctrlKey\]] + expected: ERROR + + [test_control_click[\\ue051-ctrlKey\]] + expected: ERROR + + [test_release_control_click] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_dblclick.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_dblclick.py.ini new file mode 100644 index 00000000000..523d8d29edb --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_dblclick.py.ini @@ -0,0 +1,9 @@ +[pointer_dblclick.py] + [test_dblclick_at_coordinates[0\]] + expected: FAIL + + [test_dblclick_at_coordinates[200\]] + expected: FAIL + + [test_no_dblclick_when_mouse_moves] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini new file mode 100644 index 00000000000..ebb9ef4dcc0 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini @@ -0,0 +1,21 @@ +[pointer_modifier_click.py] + [test_modifier_click[\\ue00a-altKey\]] + expected: ERROR + + [test_modifier_click[\\ue052-altKey\]] + expected: ERROR + + [test_modifier_click[\\ue03d-metaKey\]] + expected: ERROR + + [test_modifier_click[\\ue053-metaKey\]] + expected: ERROR + + [test_modifier_click[\\ue008-shiftKey\]] + expected: ERROR + + [test_modifier_click[\\ue050-shiftKey\]] + expected: ERROR + + [test_many_modifiers_click] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse.py.ini new file mode 100644 index 00000000000..4a163fe2fac --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse.py.ini @@ -0,0 +1,64 @@ +[pointer_mouse.py] + expected: TIMEOUT + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: ERROR + + [test_pointer_down_closes_browsing_context] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_click_at_coordinates] + expected: FAIL + + [test_context_menu_at_coordinates] + expected: FAIL + + [test_middle_click] + expected: FAIL + + [test_click_element_center] + expected: FAIL + + [test_click_element_in_shadow_tree[outer-open\]] + expected: FAIL + + [test_click_element_in_shadow_tree[outer-closed\]] + expected: FAIL + + [test_click_element_in_shadow_tree[inner-open\]] + expected: FAIL + + [test_click_element_in_shadow_tree[inner-closed\]] + expected: FAIL + + [test_click_navigation] + expected: FAIL + + [test_move_to_position_in_viewport[x\]] + expected: FAIL + + [test_move_to_position_in_viewport[y\]] + expected: FAIL + + [test_move_to_fractional_position] + expected: FAIL + + [test_move_to_origin_position_within_frame[viewport\]] + expected: FAIL + + [test_move_to_origin_position_within_frame[pointer\]] + expected: FAIL + + [test_move_to_origin_position_within_frame[element\]] + expected: FAIL + + [test_invalid_element_origin] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini new file mode 100644 index 00000000000..8657edd79e8 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini @@ -0,0 +1,63 @@ +[pointer_mouse_drag.py] + [test_drag_and_drop[20-0-0\]] + expected: ERROR + + [test_drag_and_drop[20-0-300\]] + expected: ERROR + + [test_drag_and_drop[20-0-800\]] + expected: ERROR + + [test_drag_and_drop[0-15-0\]] + expected: ERROR + + [test_drag_and_drop[0-15-300\]] + expected: ERROR + + [test_drag_and_drop[0-15-800\]] + expected: ERROR + + [test_drag_and_drop[10-15-0\]] + expected: ERROR + + [test_drag_and_drop[10-15-300\]] + expected: ERROR + + [test_drag_and_drop[10-15-800\]] + expected: ERROR + + [test_drag_and_drop[-20-0-0\]] + expected: ERROR + + [test_drag_and_drop[-20-0-300\]] + expected: ERROR + + [test_drag_and_drop[-20-0-800\]] + expected: ERROR + + [test_drag_and_drop[10--15-0\]] + expected: ERROR + + [test_drag_and_drop[10--15-300\]] + expected: ERROR + + [test_drag_and_drop[10--15-800\]] + expected: ERROR + + [test_drag_and_drop[-10--15-0\]] + expected: ERROR + + [test_drag_and_drop[-10--15-300\]] + expected: ERROR + + [test_drag_and_drop[-10--15-800\]] + expected: ERROR + + [test_drag_and_drop_with_draggable_element[0\]] + expected: ERROR + + [test_drag_and_drop_with_draggable_element[300\]] + expected: ERROR + + [test_drag_and_drop_with_draggable_element[800\]] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini new file mode 100644 index 00000000000..112a4f9ddf4 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini @@ -0,0 +1,27 @@ +[pointer_origin.py] + [test_viewport_inside] + expected: ERROR + + [test_pointer_inside] + expected: ERROR + + [test_element_center_point] + expected: ERROR + + [test_element_center_point_with_offset] + expected: ERROR + + [test_element_in_view_center_point_partly_visible] + expected: ERROR + + [test_element_larger_than_viewport] + expected: ERROR + + [test_element_outside_of_view_port] + expected: ERROR + + [test_viewport_outside] + expected: ERROR + + [test_pointer_outside] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini new file mode 100644 index 00000000000..106650cb70e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini @@ -0,0 +1,6 @@ +[pointer_pause_dblclick.py] + [test_dblclick_with_pause_after_second_pointerdown] + expected: FAIL + + [test_no_dblclick] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pen.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pen.py.ini new file mode 100644 index 00000000000..a3d52579f7d --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pen.py.ini @@ -0,0 +1,33 @@ +[pointer_pen.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_pointer_down_closes_browsing_context] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_pen_pointer_in_shadow_tree[outer-open\]] + expected: FAIL + + [test_pen_pointer_in_shadow_tree[outer-closed\]] + expected: FAIL + + [test_pen_pointer_in_shadow_tree[inner-open\]] + expected: FAIL + + [test_pen_pointer_in_shadow_tree[inner-closed\]] + expected: FAIL + + [test_pen_pointer_properties] + expected: FAIL + + [test_params_actions_origin_outside_viewport[element\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_touch.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_touch.py.ini new file mode 100644 index 00000000000..65101d138aa --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_touch.py.ini @@ -0,0 +1,42 @@ +[pointer_touch.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_pointer_down_closes_browsing_context] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_touch_pointer_in_shadow_tree[outer-open\]] + expected: FAIL + + [test_touch_pointer_in_shadow_tree[outer-closed\]] + expected: FAIL + + [test_touch_pointer_in_shadow_tree[inner-open\]] + expected: FAIL + + [test_touch_pointer_in_shadow_tree[inner-closed\]] + expected: FAIL + + [test_touch_pointer_properties] + expected: FAIL + + [test_touch_pointer_properties_angle_twist] + expected: FAIL + + [test_touch_pointer_properties_tilt_twist] + expected: FAIL + + [test_move_to_fractional_position] + expected: FAIL + + [test_params_actions_origin_outside_viewport[element\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_tripleclick.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_tripleclick.py.ini new file mode 100644 index 00000000000..7e0523a6116 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_tripleclick.py.ini @@ -0,0 +1,3 @@ +[pointer_tripleclick.py] + [test_tripleclick_at_coordinates] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/sequence.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/sequence.py.ini new file mode 100644 index 00000000000..54ee376545d --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/sequence.py.ini @@ -0,0 +1,3 @@ +[sequence.py] + [test_perform_no_actions_send_no_events] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/user_prompts.py.ini new file mode 100644 index 00000000000..ca5401f5012 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/user_prompts.py.ini @@ -0,0 +1,58 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: ERROR + + [test_accept[capabilities0-confirm-True\]] + expected: ERROR + + [test_accept[capabilities0-prompt-\]] + expected: ERROR + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: ERROR + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: ERROR + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: ERROR + + [test_dismiss[capabilities0-alert-None\]] + expected: ERROR + + [test_dismiss[capabilities0-confirm-False\]] + expected: ERROR + + [test_dismiss[capabilities0-prompt-None\]] + expected: ERROR + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: ERROR + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: ERROR + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: ERROR + + [test_ignore[capabilities0-alert\]] + expected: ERROR + + [test_ignore[capabilities0-confirm\]] + expected: ERROR + + [test_ignore[capabilities0-prompt\]] + expected: ERROR + + [test_default[alert-None\]] + expected: ERROR + + [test_default[confirm-False\]] + expected: ERROR + + [test_default[prompt-None\]] + expected: ERROR + + [test_dismissed_beforeunload] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/wheel.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/wheel.py.ini new file mode 100644 index 00000000000..3f6abc70f3e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/wheel.py.ini @@ -0,0 +1,39 @@ +[wheel.py] + [test_null_response_value] + expected: FAIL + + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_params_actions_origin_outside_viewport[element\]] + expected: FAIL + + [test_params_actions_origin_outside_viewport[viewport\]] + expected: FAIL + + [test_scroll_not_scrollable] + expected: FAIL + + [test_scroll_scrollable_overflow] + expected: FAIL + + [test_scroll_iframe] + expected: FAIL + + [test_scroll_shadow_tree[outer-open\]] + expected: FAIL + + [test_scroll_shadow_tree[outer-closed\]] + expected: FAIL + + [test_scroll_shadow_tree[inner-open\]] + expected: FAIL + + [test_scroll_shadow_tree[inner-closed\]] + expected: FAIL + + [test_scroll_with_key_pressed] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/permissions/set.py.ini b/tests/wpt/meta/webdriver/tests/classic/permissions/set.py.ini new file mode 100644 index 00000000000..a97d40f6155 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/permissions/set.py.ini @@ -0,0 +1,9 @@ +[set.py] + [test_set_to_state[granted\]] + expected: FAIL + + [test_set_to_state[denied\]] + expected: FAIL + + [test_set_to_state[prompt\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/print/background.py.ini b/tests/wpt/meta/webdriver/tests/classic/print/background.py.ini new file mode 100644 index 00000000000..0d71e219071 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/print/background.py.ini @@ -0,0 +1,9 @@ +[background.py] + [test_background[None-iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P4DwQACfsD/Z8fLAAAAAAASUVORK5CYII=\]] + expected: FAIL + + [test_background[True-iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2NgYGD4DwABBAEAwS2OUAAAAABJRU5ErkJggg==\]] + expected: FAIL + + [test_background[False-iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P4DwQACfsD/Z8fLAAAAAAASUVORK5CYII=\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/print/orientation.py.ini b/tests/wpt/meta/webdriver/tests/classic/print/orientation.py.ini new file mode 100644 index 00000000000..387ff60af8b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/print/orientation.py.ini @@ -0,0 +1,9 @@ +[orientation.py] + [test_orientation[default\]] + expected: FAIL + + [test_orientation[portrait\]] + expected: FAIL + + [test_orientation[landscape\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/print/printcmd.py.ini b/tests/wpt/meta/webdriver/tests/classic/print/printcmd.py.ini new file mode 100644 index 00000000000..5d21a234610 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/print/printcmd.py.ini @@ -0,0 +1,57 @@ +[printcmd.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_html_document] + expected: FAIL + + [test_large_html_document] + expected: FAIL + + [test_page_ranges_document[ranges0-expected0\]] + expected: FAIL + + [test_page_ranges_document[ranges1-expected1\]] + expected: FAIL + + [test_page_ranges_document[ranges2-expected2\]] + expected: FAIL + + [test_page_ranges_document[ranges3-expected3\]] + expected: FAIL + + [test_page_ranges_document[ranges4-expected4\]] + expected: FAIL + + [test_page_ranges_document[ranges5-expected5\]] + expected: FAIL + + [test_page_ranges_document[ranges6-expected6\]] + expected: FAIL + + [test_page_ranges_document[ranges7-expected7\]] + expected: FAIL + + [test_page_ranges_document[ranges8-expected8\]] + expected: FAIL + + [test_page_ranges_document[ranges9-expected9\]] + expected: FAIL + + [test_page_ranges_document[ranges10-expected10\]] + expected: FAIL + + [test_page_ranges_invalid[options9\]] + expected: FAIL + + [test_page_ranges_invalid[options10\]] + expected: FAIL + + [test_page_ranges_invalid[options11\]] + expected: FAIL + + [test_page_ranges_invalid[options12\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/print/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/print/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/print/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/refresh/refresh.py.ini b/tests/wpt/meta/webdriver/tests/classic/refresh/refresh.py.ini new file mode 100644 index 00000000000..08528d08784 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/refresh/refresh.py.ini @@ -0,0 +1,21 @@ +[refresh.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_seen_nodes[http\]] + expected: FAIL + + [test_seen_nodes[https\]] + expected: FAIL + + [test_seen_nodes[https coop\]] + expected: FAIL + + [test_history_pushstate] + expected: FAIL + + [test_refresh_switches_to_parent_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/refresh/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/refresh/user_prompts.py.ini new file mode 100644 index 00000000000..fcf10a0526c --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/refresh/user_prompts.py.ini @@ -0,0 +1,73 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert\]] + expected: FAIL + + [test_accept[capabilities0-beforeunload\]] + expected: FAIL + + [test_accept[capabilities0-confirm\]] + expected: FAIL + + [test_accept[capabilities0-prompt\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert\]] + expected: FAIL + + [test_dismiss[capabilities0-beforeunload\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-beforeunload-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-beforeunload\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[beforeunload-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/release_actions/release.py.ini b/tests/wpt/meta/webdriver/tests/classic/release_actions/release.py.ini new file mode 100644 index 00000000000..7c5e73584b6 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/release_actions/release.py.ini @@ -0,0 +1,6 @@ +[release.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence.py.ini b/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence.py.ini new file mode 100644 index 00000000000..6ba3814b563 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence.py.ini @@ -0,0 +1,3 @@ +[sequence.py] + [test_release_char_sequence_sends_keyup_events_in_reverse] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence_tentative.py.ini b/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence_tentative.py.ini new file mode 100644 index 00000000000..aed5f673813 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence_tentative.py.ini @@ -0,0 +1,6 @@ +[sequence_tentative.py] + [test_release_mouse_sequence_resets_dblclick_state[with release actions\]] + expected: FAIL + + [test_release_mouse_sequence_resets_dblclick_state[without release actions\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/send_alert_text/send.py.ini b/tests/wpt/meta/webdriver/tests/classic/send_alert_text/send.py.ini new file mode 100644 index 00000000000..fc3fe5245a3 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/send_alert_text/send.py.ini @@ -0,0 +1,3 @@ +[send.py] + disabled: https://github.com/servo/servo/issues/35734 + expected: TIMEOUT diff --git a/tests/wpt/meta/webdriver/tests/classic/set_timeouts/set.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_timeouts/set.py.ini new file mode 100644 index 00000000000..bfc9d7723d9 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/set_timeouts/set.py.ini @@ -0,0 +1,2 @@ +[set.py] + expected: TIMEOUT diff --git a/tests/wpt/meta/webdriver/tests/classic/set_timeouts/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_timeouts/user_prompts.py.ini new file mode 100644 index 00000000000..913351aaa55 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/set_timeouts/user_prompts.py.ini @@ -0,0 +1,2 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734
\ No newline at end of file diff --git a/tests/wpt/meta/webdriver/tests/classic/set_window_rect/from_minimized_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/from_minimized_window.py.ini new file mode 100644 index 00000000000..5d3e1ccc1b2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/from_minimized_window.py.ini @@ -0,0 +1,3 @@ +[from_minimized_window.py] + [test_restore_from_minimized] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini new file mode 100644 index 00000000000..6b28c2efdf8 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini @@ -0,0 +1,39 @@ +[set.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL + + [test_restore_from_fullscreen] + expected: FAIL + + [test_restore_from_maximized] + expected: FAIL + + [test_x_y_floats] + expected: FAIL + + [test_set_to_available_size] + expected: ERROR + + [test_set_smaller_than_minimum_browser_size] + expected: FAIL + + [test_x_y] + expected: FAIL + + [test_x_as_current] + expected: FAIL + + [test_y_as_current] + expected: FAIL + + [test_negative_x_y] + expected: ERROR + + [test_set_to_screen_size] + expected: ERROR + + [test_set_larger_than_screen_size] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/set_window_rect/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/user_prompts.py.ini new file mode 100644 index 00000000000..913351aaa55 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/user_prompts.py.ini @@ -0,0 +1,2 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734
\ No newline at end of file diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini new file mode 100644 index 00000000000..ee73fbf4ce8 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini @@ -0,0 +1,21 @@ +[switch.py] + [test_no_top_browsing_context[None\]] + expected: FAIL + + [test_no_top_browsing_context[0\]] + expected: FAIL + + [test_no_browsing_context[0\]] + expected: FAIL + + [test_no_browsing_context[id2\]] + expected: FAIL + + [test_no_browsing_context_when_already_top_level] + expected: FAIL + + [test_frame_id_shadow_root] + expected: FAIL + + [test_frame_id_null] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_number.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_number.py.ini new file mode 100644 index 00000000000..408f2eb2568 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_number.py.ini @@ -0,0 +1,15 @@ +[switch_number.py] + [test_frame_id_number_index_out_of_bounds[1\]] + expected: FAIL + + [test_frame_id_number_index_out_of_bounds[65535\]] + expected: FAIL + + [test_frame_id_number_index[0-foo\]] + expected: FAIL + + [test_frame_id_number_index[1-bar\]] + expected: FAIL + + [test_frame_id_number_index_nested] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_webelement.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_webelement.py.ini new file mode 100644 index 00000000000..9932ab9a5d5 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_webelement.py.ini @@ -0,0 +1,12 @@ +[switch_webelement.py] + [test_frame_id_webelement_stale_element_reference[top_context\]] + expected: FAIL + + [test_frame_id_webelement_stale_element_reference[child_context\]] + expected: FAIL + + [test_frame_id_webelement_frame[0-foo\]] + expected: FAIL + + [test_frame_id_webelement_frame[1-bar\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_parent_frame/switch.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_parent_frame/switch.py.ini new file mode 100644 index 00000000000..ffd3d06f212 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_parent_frame/switch.py.ini @@ -0,0 +1,6 @@ +[switch.py] + [test_switch_from_iframe] + expected: FAIL + + [test_switch_from_top_level] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_window/alerts.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_window/alerts.py.ini new file mode 100644 index 00000000000..3e6ad0c8af9 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_window/alerts.py.ini @@ -0,0 +1,3 @@ +[alerts.py] + [test_retain_tab_modal_status] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_window/switch.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_window/switch.py.ini new file mode 100644 index 00000000000..9b0ec38199b --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_window/switch.py.ini @@ -0,0 +1,12 @@ +[switch.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_finds_exising_user_prompt_after_tab_switch[alert\]] + expected: FAIL + + [test_finds_exising_user_prompt_after_tab_switch[confirm\]] + expected: FAIL + + [test_finds_exising_user_prompt_after_tab_switch[prompt\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/iframe.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/iframe.py.ini new file mode 100644 index 00000000000..dd77eca9d72 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/iframe.py.ini @@ -0,0 +1,9 @@ +[iframe.py] + [test_frame_element] + expected: FAIL + + [test_source_origin[same_origin\]] + expected: FAIL + + [test_source_origin[cross_origin\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/screenshot.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/screenshot.py.ini new file mode 100644 index 00000000000..319e4bf848f --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/screenshot.py.ini @@ -0,0 +1,30 @@ +[screenshot.py] + [test_no_browsing_context] + expected: FAIL + + [test_no_such_element_with_invalid_value] + expected: FAIL + + [test_no_such_element_with_shadow_root] + expected: FAIL + + [test_no_such_element_from_other_window_handle[open\]] + expected: FAIL + + [test_no_such_element_from_other_window_handle[closed\]] + expected: FAIL + + [test_no_such_element_from_other_frame[open\]] + expected: FAIL + + [test_no_such_element_from_other_frame[closed\]] + expected: FAIL + + [test_stale_element_reference[top_context\]] + expected: FAIL + + [test_stale_element_reference[child_context\]] + expected: FAIL + + [test_format_and_dimensions] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/take_screenshot/iframe.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/iframe.py.ini new file mode 100644 index 00000000000..62f7ab5e4da --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/iframe.py.ini @@ -0,0 +1,3 @@ +[iframe.py] + [test_always_captures_top_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini new file mode 100644 index 00000000000..f2fac7a7fa1 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini @@ -0,0 +1,6 @@ +[screenshot.py] + [test_no_top_browsing_context] + expected: FAIL + + [test_no_browsing_context] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/take_screenshot/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/user_prompts.py.ini new file mode 100644 index 00000000000..53b6399fdd2 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/user_prompts.py.ini @@ -0,0 +1,55 @@ +[user_prompts.py] + disabled: https://github.com/servo/servo/issues/35734 + [test_accept[capabilities0-alert-None\]] + expected: FAIL + + [test_accept[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept[capabilities0-prompt-\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-confirm-True\]] + expected: FAIL + + [test_accept_and_notify[capabilities0-prompt-\]] + expected: FAIL + + [test_dismiss[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss[capabilities0-prompt-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-alert-None\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-confirm-False\]] + expected: FAIL + + [test_dismiss_and_notify[capabilities0-prompt-None\]] + expected: FAIL + + [test_ignore[capabilities0-alert\]] + expected: FAIL + + [test_ignore[capabilities0-confirm\]] + expected: FAIL + + [test_ignore[capabilities0-prompt\]] + expected: FAIL + + [test_default[alert-None\]] + expected: FAIL + + [test_default[confirm-False\]] + expected: FAIL + + [test_default[prompt-None\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/interop/beforeunload_prompt.py.ini b/tests/wpt/meta/webdriver/tests/interop/beforeunload_prompt.py.ini new file mode 100644 index 00000000000..8d9822802f0 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/interop/beforeunload_prompt.py.ini @@ -0,0 +1,60 @@ +[beforeunload_prompt.py] + [test_accept[capabilities0-False\]] + expected: ERROR + + [test_accept[capabilities0-True\]] + expected: ERROR + + [test_accept_and_notify[capabilities0-False\]] + expected: ERROR + + [test_accept_and_notify[capabilities0-True\]] + expected: ERROR + + [test_dismiss[capabilities0-False\]] + expected: ERROR + + [test_dismiss[capabilities0-True\]] + expected: ERROR + + [test_dismiss_and_notify[capabilities0-False\]] + expected: ERROR + + [test_dismiss_and_notify[capabilities0-True\]] + expected: ERROR + + [test_ignore[capabilities0-False\]] + expected: ERROR + + [test_ignore[capabilities0-True\]] + expected: ERROR + + [test_accept[False\]] + expected: ERROR + + [test_accept[True\]] + expected: ERROR + + [test_accept_and_notify[False\]] + expected: ERROR + + [test_accept_and_notify[True\]] + expected: ERROR + + [test_dismiss[False\]] + expected: ERROR + + [test_dismiss[True\]] + expected: ERROR + + [test_dismiss_and_notify[False\]] + expected: ERROR + + [test_dismiss_and_notify[True\]] + expected: ERROR + + [test_ignore[False\]] + expected: ERROR + + [test_ignore[True\]] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/interop/frames.py.ini b/tests/wpt/meta/webdriver/tests/interop/frames.py.ini new file mode 100644 index 00000000000..21819720ff1 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/interop/frames.py.ini @@ -0,0 +1,3 @@ +[frames.py] + [test_classic_switch_to_parent_no_browsing_context] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/interop/shared_id_node.py.ini b/tests/wpt/meta/webdriver/tests/interop/shared_id_node.py.ini new file mode 100644 index 00000000000..07c51098229 --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/interop/shared_id_node.py.ini @@ -0,0 +1,18 @@ +[shared_id_node.py] + [test_web_element_reference_created_in_classic] + expected: ERROR + + [test_web_element_reference_created_in_bidi] + expected: ERROR + + [test_shadow_root_reference_created_in_classic[open\]] + expected: ERROR + + [test_shadow_root_reference_created_in_classic[closed\]] + expected: ERROR + + [test_shadow_root_reference_created_in_bidi[open\]] + expected: ERROR + + [test_shadow_root_reference_created_in_bidi[closed\]] + expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/interop/shared_id_window.py.ini b/tests/wpt/meta/webdriver/tests/interop/shared_id_window.py.ini new file mode 100644 index 00000000000..7dc97d71d7e --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/interop/shared_id_window.py.ini @@ -0,0 +1,15 @@ +[shared_id_window.py] + [test_top_level_context_id_equals_window_handle] + expected: ERROR + + [test_web_window_reference_created_in_classic] + expected: ERROR + + [test_web_frame_reference_created_in_classic] + expected: ERROR + + [test_web_window_reference_created_in_bidi] + expected: ERROR + + [test_web_frame_reference_created_in_bidi] + expected: ERROR diff --git a/tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini b/tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini index 492ba730948..b63c174f353 100644 --- a/tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini +++ b/tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini @@ -1,6 +1,3 @@ [global-object-implicit-this-value-cross-realm.html] - [Cross-realm global object's operation throws when called on incompatible object] - expected: FAIL - [Cross-realm global object's operation called on null / undefined] expected: FAIL diff --git a/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini b/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini deleted file mode 100644 index c625c16f713..00000000000 --- a/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini +++ /dev/null @@ -1,7 +0,0 @@ -[explicitly-closed.tentative.window.html] - expected: TIMEOUT - [Close event on port2 is fired when port1 is explicitly closed] - expected: TIMEOUT - - [Close event on port2 is fired when port1, which is in a different window, is explicitly closed.] - expected: TIMEOUT diff --git a/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini b/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini new file mode 100644 index 00000000000..ce3fb065178 --- /dev/null +++ b/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini @@ -0,0 +1,19 @@ +[depth_sensing_cpu_matchDepthViewIdentity.https.html] + expected: ERROR + [Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized` - webgl] + expected: TIMEOUT + + [Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized` - webgl2] + expected: NOTRUN + + [Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized` - webgl] + expected: NOTRUN + + [Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized` - webgl2] + expected: NOTRUN + + [Ensures session can be created when matchDepthView=false, `cpu-optimized` - webgl] + expected: NOTRUN + + [Ensures session can be created when matchDepthView=false, `cpu-optimized` - webgl2] + expected: NOTRUN diff --git a/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini b/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini new file mode 100644 index 00000000000..54901a8468a --- /dev/null +++ b/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini @@ -0,0 +1,19 @@ +[depth_sensing_gpu_matchDepthViewIdentity.https.html] + expected: ERROR + [Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized` - webgl] + expected: TIMEOUT + + [Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized` - webgl2] + expected: NOTRUN + + [Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized` - webgl] + expected: NOTRUN + + [Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized` - webgl2] + expected: NOTRUN + + [Ensures session can be created when matchDepthView=false, `gpu-optimized` - webgl] + expected: NOTRUN + + [Ensures session can be created when matchDepthView=false, `gpu-optimized` - webgl2] + expected: NOTRUN diff --git a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini deleted file mode 100644 index 24daae4c2e7..00000000000 --- a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[WorkerGlobalScope-close.html] - [Test sending a message after closing.] - expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index d3a939eab57..a3f77769a9d 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -25,6 +25,13 @@ {} ] ], + "form_reset-crash.html": [ + "b23cbf6aefdef8231e2cc4cb0e6416195d5bdf71", + [ + null, + {} + ] + ], "global-enumerate-crash.html": [ "a77e79b1465bf7555340dd5e9bf94a4c8caa85f2", [ @@ -12737,7 +12744,7 @@ ] }, "FocusEvent.html": [ - "9e002c1088de060b5e7f94c4152bf9fb779c04cc", + "7fb7aebf2afbac7f68a16308b9cc5d4588b7022f", [ null, {} @@ -13271,6 +13278,13 @@ {} ] ], + "focus_inter_documents.html": [ + "5c759772367e844066d1df0081917c9e129d09ec", + [ + null, + {} + ] + ], "follow-hyperlink.html": [ "6ac9eaeb5814a663988ed8c664c113072e329dc5", [ diff --git a/tests/wpt/mozilla/tests/mozilla/FocusEvent.html b/tests/wpt/mozilla/tests/mozilla/FocusEvent.html index 9e002c1088d..7fb7aebf2af 100644 --- a/tests/wpt/mozilla/tests/mozilla/FocusEvent.html +++ b/tests/wpt/mozilla/tests/mozilla/FocusEvent.html @@ -48,13 +48,6 @@ ] }, - { - element: document.body, - expected_events: [ - {element: input3, event_name: "blur"}, - ] - } - ]; var idx = 0; diff --git a/tests/wpt/mozilla/tests/mozilla/focus_inter_documents.html b/tests/wpt/mozilla/tests/mozilla/focus_inter_documents.html new file mode 100644 index 00000000000..5c759772367 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/focus_inter_documents.html @@ -0,0 +1,207 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> +<body> + <iframe id="f1"></iframe> + <iframe id="f2"></iframe> + <input id="d0"> + <script> + + /** Wait for an `event` event to be fired on `element`. Resolves to a boolean + * value indicating whether the event was fired within a predetermined period. */ + async function waitForEvent(element, event) { + let listener; + try { + return await new Promise(resolve => { + setTimeout(() => resolve(false), 1000); + listener = () => resolve(true); + element.addEventListener(event, listener); + }); + } finally { + if (listener) { + element.removeEventListener(event, listener); + } + } + } + + promise_test(async t => { + await new Promise(r => window.onload = r); + + const d0 = document.getElementById("d0"); + + // This test requires the document to have focus as a starting condition. + if (!document.hasFocus() || document.activeElement !== d0) { + const p = new Promise(r => d0.onfocus = r); + d0.focus(); + await p; + } + + assert_true(document.hasFocus(), "Document has focus as starting condition."); + assert_equals(document.activeElement, d0, "`d0` has focus as starting condition."); + }, "Starting condition"); + + promise_test(async t => { + const d0 = document.getElementById("d0"); + const f1 = document.getElementById("f1"); + f1.contentDocument.body.innerHTML = '<input id=d1>'; + const d1 = f1.contentDocument.getElementById("d1"); + + const p0 = waitForEvent(d1, 'focus'); + const p1 = waitForEvent(f1, 'focus'); + const p2 = waitForEvent(f1.contentWindow, 'focus'); + const p3 = waitForEvent(d0, 'blur'); + + d1.focus(); + + assert_true(await p0, "`d1.focus` fires in time"); + await p1; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit + assert_true(await p2, "`f1.contentWindow.focus` fires in time"); + assert_true(await p3, "`d0.blur` fires in time"); + + assert_equals(document.activeElement, f1, "The top-level document's activeElement is `f1`"); + assert_true(f1.contentDocument.hasFocus(), "f1's contentDocument has focus"); + assert_equals(f1.contentDocument.activeElement, d1, "f1's contentDocument's activeElement is `d1`"); + }, "Focusing an element in a nested browsing context also focuses the container"); + + promise_test(async t => { + const f1 = document.getElementById("f1"); + const d1 = f1.contentDocument.getElementById("d1"); + + const f2 = document.getElementById("f2"); + f2.contentDocument.body.innerHTML = '<input id=d2>'; + const d2 = f2.contentDocument.getElementById("d2"); + + const p0 = waitForEvent(d1, 'blur'); + const p1 = waitForEvent(f1, 'blur'); + const p2 = waitForEvent(f1.contentWindow, 'blur'); + + d2.focus(); + + assert_true(await p0, "`d1.blur` fires in time"); + await p1; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit + assert_true(await p2, "`f1.contentWindow.blur` fires in time"); + + // Wait for any ongoing execution of the focus update steps to complete + await new Promise(r => window.setTimeout(r, 0)); + + assert_equals(document.activeElement, f2, "The top-level document's activeElement is `f2`"); + assert_true(f2.contentDocument.hasFocus(), "f2's contentDocument has focus"); + assert_equals(f2.contentDocument.activeElement, d2, "f2's contentDocument's activeElement is `d2`"); + assert_false(f1.contentDocument.hasFocus(), "f1's contentDocument does not have focus"); + assert_equals(f1.contentDocument.activeElement, f1.contentDocument.body, "f1's contentDocument's activeElement is its body"); + }, "Focusing an element in a different container also unfocuses the previously focused element and its container"); + + promise_test(async t => { + const d0 = document.getElementById("d0"); + + const f2 = document.getElementById("f2"); + const d2 = f2.contentDocument.getElementById("d2"); + + const p0 = waitForEvent(d2, 'blur'); + const p1 = waitForEvent(f2, 'blur'); + const p2 = waitForEvent(f2.contentWindow, 'blur'); + const p3 = waitForEvent(d0, 'focus'); + + d0.focus(); + + assert_true(await p0, "`d2.blur` fires in time"); + await p1; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit + assert_true(await p2, "`f2.contentWindow.blur` fires in time"); + assert_true(await p3, "`d0.focus` fires in time"); + + // Wait for any ongoing execution of the focus update steps to complete + await new Promise(r => window.setTimeout(r, 0)); + + assert_equals(document.activeElement, d0, "The top-level document's activeElement is `d0`"); + assert_false(f2.contentDocument.hasFocus(), "f2's contentDocument does not have focus"); + assert_equals(f2.contentDocument.activeElement, f2.contentDocument.body, "f2's contentDocument's activeElement is its body"); + }, "Unfocusing a container also unfocuses any focused elements within"); + + promise_test(async t => { + const f1 = document.getElementById("f1"); + + const p0 = waitForEvent(f1, 'focus'); + const p1 = waitForEvent(f1.contentWindow, 'focus'); + + f1.focus(); + + await p0; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit + assert_true(await p1, "`f1.contentWindow.focus` fires in time"); + + assert_equals(document.activeElement, f1, "The top-level document's activeElement is `f1`"); + assert_true(f1.contentDocument.hasFocus(), "f1's contentDocument has focus"); + }, "Focusing a container changes the contained document's 'has focus steps' result"); + + promise_test(async t => { + const f1 = document.getElementById("f1"); + + // `f1` should be focused because of the previous step + assert_equals(document.activeElement, f1, "The top-level document's activeElement is `f1`"); + + // Navigate the focused container + const pLoad = new Promise(resolve => window.subframeIsReady = resolve); + f1.srcdoc = "<script>window.parent.subframeIsReady();</" + "script>"; + await pLoad; + + // Allow some delay before the document finally receives focus + if (!f1.contentDocument.hasFocus()) { + await waitForEvent(f1.contentWindow, 'focus'); + } + + assert_true(f1.contentDocument.hasFocus(), "f1's contentDocument has focus"); + }, "When a focused container navigates, the new document should receive focus"); + + promise_test(async t => { + const f2 = document.getElementById("f2"); + + const p0 = waitForEvent(f2, 'focus'); + const p1 = waitForEvent(f2.contentWindow, 'focus'); + + f2.contentWindow.focus(); + + await p0; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit + assert_true(await p1, "`f2.contentWindow.focus` fires in time"); + + assert_equals(document.activeElement, f2, "The top-level document's activeElement is `f2`"); + assert_true(f2.contentDocument.hasFocus(), "f2's contentDocument has focus"); + }, "Focusing the window of a nested browsing context also focuses the container"); + + promise_test(async t => { + const f2 = document.getElementById("f2"); + const d2 = f2.contentDocument.getElementById("d2"); + + { + const p = waitForEvent(d2, 'focus'); + f2.focus(); + d2.focus(); + await p; + } + + const p0 = waitForEvent(d2, 'blur'); + d2.blur(); + assert_true(await p0, "`d2.blur` fires in time"); + + // FIXME: This passes on Firefox, Blink, and WebKit but is not spec- + // compliant. Per spec, the top-level document's viewport should be + // focused instead. + // + // <https://html.spec.whatwg.org/multipage/#get-the-focusable-area> + // + // > The unfocusing steps for an object `old focus target`` that is either a + // > focusable area or an element that is not a focusable area are as + // > follows: [...] + // > + // > 7. If `topDocument`'s browsing context has system focus, then run the + // > focusing steps for topDocument's viewport. + + assert_equals(document.activeElement, f2, "The top-level document's activeElement is `f2`"); + assert_equals(f2.contentDocument.activeElement, f2.contentDocument.body, "f2's contentDocument's activeElement is its body"); + assert_true(f2.contentDocument.hasFocus(), "f2's contentDocument has focus"); + }, "Blurring an element in a nested browsing context focuses its node document"); + </script> +</body> +</html> diff --git a/tests/wpt/mozilla/tests/mozilla/form_reset-crash.html b/tests/wpt/mozilla/tests/mozilla/form_reset-crash.html new file mode 100644 index 00000000000..b23cbf6aefd --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/form_reset-crash.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<form id="form"> + <output><textarea></textarea></output> +</form> +<script> +form.reset(); +</script> diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml index 66794b69aba..5de0cc4bcb1 100644 --- a/tests/wpt/tests/.github/workflows/docker.yml +++ b/tests/wpt/tests/.github/workflows/docker.yml @@ -40,7 +40,7 @@ jobs: latest type=raw,value=${{ inputs.tag }} - name: Build and push the Docker image - uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 with: context: ./tools/docker push: true diff --git a/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html b/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html index 5f76d59eb35..ee5e27e35b6 100644 --- a/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html +++ b/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html @@ -2,12 +2,19 @@ <title>Assures no crash upon call of LanguageDetector.availability() on a detached document</title> <link rel="author" href="mailto:christinesm@chromium.org"> <link rel="help" href="https://issues.chromium.org/issues/384233287"> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> <body> <iframe src="about:blank"></iframe> <script> -const factory = frames[0].LanguageDetector; -const detector = factory.create(); +const iframe = frames[0]; +await test_driver.bless('Create LanguageDetector', null, iframe); + +const factory = iframe.LanguageDetector; +const detectorPromise = await factory.create(); document.getElementsByTagName("iframe")[0].remove(); -detector.availability(); + +factory.availability(); +detectorPromise.then(detector => detector.detect()); </script> </body> diff --git a/tests/wpt/tests/ai/language_detection/detector-iframe.https.html b/tests/wpt/tests/ai/language_detection/detector-iframe.https.html index 3e90d36b5aa..ddcf82bec68 100644 --- a/tests/wpt/tests/ai/language_detection/detector-iframe.https.html +++ b/tests/wpt/tests/ai/language_detection/detector-iframe.https.html @@ -37,6 +37,9 @@ function load_iframe(src, permission_policy) { }); } +// TODO(crbug.com/414428433): Tests in this file intermittently crash. +// Re-enable once potential causes in Permissions Policy implementation +// and test setup are addressed. promise_test(async t => { const src = HTTPS_NOTSAMESITE_ORIGIN + IFRAME_PATH; const iframe = await load_iframe(src, /*permission_policy=*/""); diff --git a/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js b/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js index a1c67db9129..80cbfa485e3 100644 --- a/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js +++ b/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js @@ -1,5 +1,8 @@ // META: title=Detect english // META: global=window +// META: timeout=long +// META: script=resources/util.js +// META: script=/resources/testdriver.js // META: script=../resources/util.js // META: script=../resources/locale-util.js @@ -45,7 +48,7 @@ promise_test(async t => { async function getExpectedInputLanguages(expectedInputLanguages) { - return (await LanguageDetector.create({expectedInputLanguages})) + return (await createLanguageDetector({expectedInputLanguages})) .expectedInputLanguages; } @@ -63,14 +66,14 @@ function uniqueCount(array) { promise_test(async t => { for (const [languageSubtag, variations] of Object.entries( valid_language_tags)) { - if (await getAvailability(languageSubtag) === 'unavailable') { + if (await getAvailability([languageSubtag]) === 'unavailable') { continue; } - await assert_valid_expected_input_languages(languageSubtag) + await assert_valid_expected_input_languages(languageSubtag); for (const variation of variations) { - await assert_valid_expected_input_languages(variation) + await assert_valid_expected_input_languages(variation); } const expectedInputLanguages = await getExpectedInputLanguages(variations); @@ -94,10 +97,10 @@ function assert_rejects_invalid_expected_input_languages( promise_test(async t => { for (const languageTag of invalid_language_tags) { assert_rejects_invalid_expected_input_languages( - t, LanguageDetector.create, [languageTag]); + t, createLanguageDetector, [languageTag]); } assert_rejects_invalid_expected_input_languages( - t, LanguageDetector.create, invalid_language_tags); + t, createLanguageDetector, invalid_language_tags); }, 'LanguageDetector.create() throws RangeError for invalid language tags'); promise_test(async t => { diff --git a/tests/wpt/tests/ai/language_detection/detector.https.window.js b/tests/wpt/tests/ai/language_detection/detector.https.window.js index e85ea6d249b..b0255bc552b 100644 --- a/tests/wpt/tests/ai/language_detection/detector.https.window.js +++ b/tests/wpt/tests/ai/language_detection/detector.https.window.js @@ -1,19 +1,32 @@ // META: title=Detect english // META: global=window +// META: timeout=long +// META: script=resources/util.js +// META: script=/resources/testdriver.js // META: script=../resources/util.js // META: script=../resources/locale-util.js 'use strict'; promise_test(async t => { - // Language detection is available after call to `create()`. - await LanguageDetector.create(); + // Creating the language detector without user activation rejects with + // NotAllowedError. + const createPromise = LanguageDetector.create(); + await promise_rejects_dom(t, 'NotAllowedError', createPromise); + + // Creating the translator with user activation succeeds. + await createLanguageDetector(); + + // Creating it should have switched it to available. const availability = await LanguageDetector.availability(); assert_equals(availability, 'available'); -}, 'Simple LanguageDetector.availability() call'); + + // Now that it is available, we should no longer need user activation. + await LanguageDetector.create(); +}, 'LanguageDetector.create() requires user activation when availability is "downloadable.'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const results = await detector.detect('Hello world!'); // must at least have the 'und' result. @@ -62,30 +75,30 @@ promise_test(async t => { throw error; } - await promise_rejects_exactly(t, error, LanguageDetector.create({monitor})); + await promise_rejects_exactly(t, error, createLanguageDetector({monitor})); }, 'If monitor throws an error, LanguageDetector.create() rejects with that error'); promise_test(async t => { - testMonitor(LanguageDetector.create); + testMonitor(createLanguageDetector); }, 'LanguageDetector.create() notifies its monitor on downloadprogress'); promise_test(async t => { const controller = new AbortController(); controller.abort(); - const createPromise = LanguageDetector.create({signal: controller.signal}); + const createPromise = createLanguageDetector({signal: controller.signal}); await promise_rejects_dom(t, 'AbortError', createPromise); }, 'LanguageDetector.create() call with an aborted signal.'); promise_test(async t => { await testAbortPromise(t, signal => { - return LanguageDetector.create({signal}); + return createLanguageDetector({signal}); }); -}, 'Aborting LanguageDetector.create().'); +}, 'Aborting createLanguageDetector().'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const text = 'Hello world!'; const promises = [detector.detect(text), detector.measureInputUsage(text)]; @@ -101,7 +114,7 @@ promise_test(async t => { promise_test(async t => { const controller = new AbortController(); - const detector = await LanguageDetector.create({signal: controller.signal}); + const detector = await createLanguageDetector({signal: controller.signal}); const text = 'Hello world!'; const promises = [detector.detect(text), detector.measureInputUsage(text)]; @@ -120,7 +133,7 @@ promise_test(async t => { const controller = new AbortController(); controller.abort(); - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const detectPromise = detector.detect('Hello world!', {signal: controller.signal}); @@ -128,14 +141,14 @@ promise_test(async t => { }, 'LanguageDetector.detect() call with an aborted signal.'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); await testAbortPromise(t, signal => { return detector.detect('Hello world!', {signal}); }); }, 'Aborting LanguageDetector.detect().'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const text = 'Hello world!'; const largeText = text.repeat(10000); @@ -157,7 +170,7 @@ promise_test(async t => { const controller = new AbortController(); controller.abort(); - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const measureInputUsagePromise = detector.measureInputUsage('hello', {signal: controller.signal}); @@ -165,17 +178,17 @@ promise_test(async t => { }, 'LanguageDetector.measureInputUsage() call with an aborted signal.'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); await testAbortPromise(t, signal => { return detector.measureInputUsage('hello', {signal}); }); }, 'Aborting LanguageDetector.measureInputUsage().'); promise_test(async () => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); assert_equals(detector.expectedInputLanguages, null); }, 'Creating LanguageDetector without expectedInputLanguages'); promise_test(async t => { - await testCreateMonitorWithAbort(t, LanguageDetector.create); + await testCreateMonitorWithAbort(t, createLanguageDetector); }, 'Progress events are not emitted after aborted.'); diff --git a/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js b/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js index 7ffa1362dd5..1dd248a9eca 100644 --- a/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js +++ b/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js @@ -1,5 +1,8 @@ // META: title=Detect english // META: global=window +// META: timeout=long +// META: script=resources/util.js +// META: script=/resources/testdriver.js // META: script=../resources/util.js 'use strict'; @@ -36,7 +39,7 @@ promise_test(async t => { const expectedInputLanguages = Object.keys(testInput); - const detector = await LanguageDetector.create({expectedInputLanguages}); + const detector = await createLanguageDetector({expectedInputLanguages}); for (const [language, input] of Object.entries(testInput)) { await assert_detects_correct_language(detector, input, language); @@ -45,7 +48,7 @@ promise_test(async t => { promise_test(async () => { const expectedInputLanguages = ['en', 'es']; - const detector = await LanguageDetector.create({expectedInputLanguages}); + const detector = await createLanguageDetector({expectedInputLanguages}); assert_array_equals(detector.expectedInputLanguages, expectedInputLanguages); assert_true(Object.isFrozen(detector.expectedInputLanguages)); }, 'Creating LanguageDetector with expectedInputLanguages'); diff --git a/tests/wpt/tests/ai/language_detection/resources/util.js b/tests/wpt/tests/ai/language_detection/resources/util.js new file mode 100644 index 00000000000..7cb3e7c2e13 --- /dev/null +++ b/tests/wpt/tests/ai/language_detection/resources/util.js @@ -0,0 +1,4 @@ +async function createLanguageDetector(options = {}) { + await test_driver.bless(); + return await LanguageDetector.create(options); +} diff --git a/tests/wpt/tests/audio-output/setSinkId.https.html b/tests/wpt/tests/audio-output/setSinkId.https.html index be65f0ac81b..662596910ee 100644 --- a/tests/wpt/tests/audio-output/setSinkId.https.html +++ b/tests/wpt/tests/audio-output/setSinkId.https.html @@ -26,14 +26,8 @@ promise_test(async t => { const list = await navigator.mediaDevices.enumerateDevices(); assert_greater_than(list.length, 0, "media device list includes at least one device"); - const audioInputList = list.filter(({kind}) => kind == "audioinput"); const outputDevicesList = list.filter(({kind}) => kind == "audiooutput"); - // List of exposed microphone groupIds - const exposedGroupIds = new Set(audioInputList.map(device => device.groupId)); - for (const { deviceId, groupId } of outputDevicesList) { - assert_true(exposedGroupIds.has(groupId), - "audiooutput device groupId must match an exposed microphone"); assert_greater_than(deviceId.length, 0, "deviceId.length"); const p1 = audio.setSinkId(deviceId); diff --git a/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py b/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py new file mode 100644 index 00000000000..3a332dd58b2 --- /dev/null +++ b/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py @@ -0,0 +1,18 @@ +def main(request, response): + headers = [(b"Content-Type", b"text/html")] + headers += [(b"Clear-Site-Data", b'"prefetchCache"')] + content = f''' + <script> + setTimeout(() => {{ + if(window.opener) {{ + window.opener.postMessage("message", "*"); + }} else {{ + window.parent.postMessage("message", "*"); + }} + window.close(); + }}, 1000); + </script> + <body> + {request.url} + </body>''' + return 200, headers, content diff --git a/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py b/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py new file mode 100644 index 00000000000..bf845cfb699 --- /dev/null +++ b/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py @@ -0,0 +1,18 @@ +def main(request, response): + headers = [(b"Content-Type", b"text/html")] + headers += [(b"Clear-Site-Data", b'"prerenderCache"')] + content = f''' + <script> + setTimeout(() => {{ + if(window.opener) {{ + window.opener.postMessage("message", "*"); + }} else {{ + window.parent.postMessage("message", "*"); + }} + window.close(); + }}, 1000); + </script> + <body> + {request.url} + </body>''' + return 200, headers, content diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js index 89d84b13d1b..f3bbe0ea560 100644 --- a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js +++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js @@ -20,3 +20,22 @@ cookie_test(async t => { {deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]}, 'Deletion not observed after document.cookie sets already-expired cookie'); }, 'CookieStore setting already-expired cookie should not be observed'); + +cookie_test(async t => { + const eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set({ + name: 'cookie', + value: 'ALREADY-EXPIRED', + expires: new Date(new Date() - 10_000), + partitioned: true, + }); + await cookieStore.set('alt-cookie', 'IGNORE'); + assert_equals( + await getCookieString(), + 'alt-cookie=IGNORE', + 'Already-expired cookie not included in CookieStore'); + await verifyCookieChangeEvent( + eventPromise, + {deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]}, + 'Deletion not observed after document.cookie sets already-expired cookie'); +}, 'CookieStore setting already-expired partitioned cookie should not be observed'); diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js index 82b0f2baa2b..1937ebdae35 100644 --- a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js +++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js @@ -78,6 +78,21 @@ cookie_test(async t => { 'Deletion not observed after document.cookie sets already-expired cookie'); }, 'document.cookie set already-expired cookie should not be observed by CookieStore'); +cookie_test(async t => { + let eventPromise = observeNextCookieChangeEvent(); + await setCookieStringDocument('DOCUMENT-cookie=VALUE; path=/'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'DOCUMENT-cookie', value: 'VALUE'}]}, + 'Original cookie is observed.'); + + eventPromise = observeNextCookieChangeEvent(); + // Overwrite the original cookie with a duplicate, this should not dispatch an event. + await setCookieStringDocument('DOCUMENT-cookie=VALUE; path=/'); + await setCookieStringDocument('DOCUMENT-alt-cookie=IGNORE; path=/'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'DOCUMENT-alt-cookie', value: 'IGNORE'}]}, + 'Duplicate cookie is not observed.'); +}, 'document.cookie duplicate cookie should not be observed by CookieStore'); cookie_test(async t => { let eventPromise = observeNextCookieChangeEvent(); diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js index 8f5ef1cabbe..8517995acfe 100644 --- a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js +++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js @@ -62,6 +62,22 @@ cookie_test(async t => { 'Deletion not observed after HTTP sets already-expired cookie'); }, 'HTTP set already-expired cookie should not be observed by CookieStore'); +cookie_test(async t => { + let eventPromise = observeNextCookieChangeEvent(); + await setCookieStringHttp('HTTP-cookie=VALUE; path=/'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'HTTP-cookie', value: 'VALUE'}]}, + 'Original cookie is observed.'); + + eventPromise = observeNextCookieChangeEvent(); + // Overwrite the original cookie with a duplicate, this should not dispatch an event. + await setCookieStringHttp('HTTP-cookie=VALUE; path=/'); + await setCookieStringHttp('HTTP-alt-cookie=IGNORE; path=/'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'HTTP-alt-cookie', value: 'IGNORE'}]}, + 'Duplicate cookie is not observed.'); +}, 'HTTP duplicate cookie should not be observed by CookieStore'); + cookie_test(async t => { let eventPromise = observeNextCookieChangeEvent(); diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js new file mode 100644 index 00000000000..5f9c2927433 --- /dev/null +++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js @@ -0,0 +1,43 @@ +// META: title=Cookie Store API: Test that setting a duplicate cookie does not fire a second event. +// META: script=resources/cookie-test-helpers.js + +'use strict'; + +cookie_test(async t => { + let eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set('cookie', 'VALUE'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'cookie', value: 'VALUE'}]}, + 'Original cookie is observed.'); + + eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set('cookie', 'VALUE'); + await cookieStore.set('alt-cookie', 'IGNORE'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'alt-cookie', value: 'IGNORE'}]}, + 'Duplicate cookie is not observed.'); +}, 'CookieStore duplicate cookie should not be observed'); + +cookie_test(async t => { + let eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set({ + name: 'cookie', + value: 'VALUE', + partitioned: true, + }); + await verifyCookieChangeEvent( + eventPromise, + {changed: [{name: 'cookie', value: 'VALUE', partitioned: true}]}, + 'Original cookie is observed.'); + + eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set({ + name: 'cookie', + value: 'VALUE', + partitioned: true, + }); + await cookieStore.set('alt-cookie', 'IGNORE'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'alt-cookie', value: 'IGNORE'}]}, + 'Duplicate cookie is not observed.'); +}, 'CookieStore duplicate partitioned cookie should not be observed'); diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html new file mode 100644 index 00000000000..22c1fd03e38 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; + justify-self: center; +} +</style> +<div class="container"><div class="block"> + <div class="abs"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html new file mode 100644 index 00000000000..06c11e6cdb6 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<title>Align-items only applies to OOF elements of block elements when statically positioned if it would apply if not OOF.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12121"> +<link rel="match" href="align-items-static-position-001-ref.tentative.html"> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; + align-items: center; + justify-items: center; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<div class="container"><div class="block"> + <div class="abs"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html new file mode 100644 index 00000000000..6f53b041787 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<div class="container"><div class="inline">text + <div class="abs"></div> + <br>text +</div></div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html new file mode 100644 index 00000000000..f90004b5672 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<title>Align-items doesn't apply to OOF elements of inline elements when statically positioned because they would apply if not OOF.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12121"> +<link rel="match" href="align-items-static-position-002-ref.tentative.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; + align-items: center; + justify-items: center; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<div class="container"><div class="inline">text + <div class="abs"></div> + <br>text +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html new file mode 100644 index 00000000000..132bbb7360f --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- start aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="top: 25px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 0px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 25px;"></div> +</div></div> +<br> +<!-- end aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="bottom: 50px; left: -50px"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="bottom: 0px; left: -50px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="bottom: 50px; left: 50px;"></div> +</div></div> +<br> +<!-- center aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="top: 12.5px; left: -25px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 25px; left: -25px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 12.5px; left: 25px;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html new file mode 100644 index 00000000000..39f871f4c2b --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<title>Align-self applies to OOF elements of inline elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-003-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.static-positioned-inline { + left: auto; + right: auto; +} + +.static-positioned-block { + top: auto; + bottom: auto; +} + +.positioned-inline { + left: 0; + right: 0; +} + +.positioned-block { + top: 0; + bottom: 0; +} + +.center { + justify-self: center; + align-self: center; +} + +.end { + justify-self: end; + align-self: end; +} + +.start { + justify-self: start; + align-self: start; +} +</style> +<!-- start aligned --> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block start"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline positioned-block start"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs positioned-inline static-positioned-block start"></div> + <br>text +</div></div> +<br> +<!-- end aligned --> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block end"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline positioned-block end"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs positioned-inline static-positioned-block end"></div> + <br>text +</div></div> +<br> +<!-- center aligned --> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block center"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline positioned-block center"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs positioned-inline static-positioned-block center"></div> + <br>text +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html new file mode 100644 index 00000000000..68130ee1d7e --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.vertRL { + writing-mode: vertical-rl; +} + +.vertLR { + writing-mode: vertical-lr; +} +</style> +<!-- start aligned --> +<div class="container vertRL"><div class="inline">text + <div class="abs" style="top: 0px; right: 25px;"></div> +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="top: 0px; left: 25px;"></div> +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs" style="top: 0px; right: 0px;"></div> +</div></div> +<br> +<!-- end aligned --> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="top: -50px; right: 50px"></div> +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs" style="bottom: 0px; left: 50px;"></div> +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="top: -50px; right: 0px;"></div> +</div></div> +<br> +<!-- center aligned --> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="right: 12.5px; top: -25px;"></div> +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs" style="top: 25px; left: 12.5px;"></div> +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="top: -25px; left: 25px;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html new file mode 100644 index 00000000000..afba7215b11 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html @@ -0,0 +1,118 @@ +<!DOCTYPE html> +<title>Align-self applies to OOF elements of inline elements when statically positioned with different writing modes.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-004-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.static-positioned-inline { + left: auto; + right: auto; +} + +.static-positioned-block { + top: auto; + bottom: auto; +} + +.positioned-inline { + left: 0; + right: 0; +} + +.positioned-block { + top: 0; + bottom: 0; +} + +.center { + justify-self: center; + align-self: center; +} + +.end { + justify-self: end; + align-self: end; +} + +.start { + justify-self: start; + align-self: start; +} + +.vertRL { + writing-mode: vertical-rl; +} + +.vertLR { + writing-mode: vertical-lr; +} +</style> +<!-- start aligned --> +<div class="container vertRL"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block start"></div> + <br>text +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs static-positioned-inline positioned-block start"></div> + <br>text +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs positioned-inline static-positioned-block start"></div> + <br>text +</div></div> +<br> +<!-- end aligned --> +<div class="container vertLR"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block end"></div> + <br>text +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs static-positioned-inline positioned-block end"></div> + <br>text +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs positioned-inline static-positioned-block end"></div> + <br>text +</div></div> +<br> +<!-- center aligned --> +<div class="container vertRL"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block center"></div> + <br>text +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs static-positioned-inline positioned-block center"></div> + <br>text +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs positioned-inline static-positioned-block center"></div> + <br>text +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html new file mode 100644 index 00000000000..947bd270448 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.container { + position: relative; + border: 1px solid; +} + +.abs { + position: absolute; + background: purple; + opacity: 0.5; + bottom: 0px; +} +</style> +<div class="container"> + <span style="font: 20px Ahem;">hello + <span class="abs">hello</span> + <span style="vertical-align: top; font-size: 50px;">world</span> + </span> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html new file mode 100644 index 00000000000..e148f0ebda3 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<title>Align-self applies to OOF elements of inline elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-normal"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-normal"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-005-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.container { + position: relative; + border: 1px solid; +} + +.abs { + position: absolute; + background: purple; + align-self: end; + opacity: 0.5; +} +</style> +<div class="container"> + <span style="font: 20px Ahem;">hello + <span class="abs">hello</span> + <span style="vertical-align: top; font-size: 50px;">world</span> + </span> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html new file mode 100644 index 00000000000..5bbafc64845 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<style> +.block { + width: 75px; + height: 75px; + z-index: -1; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- start aligned --> +<div class="container"><div class="block"> + <div class="abs"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="left: 30px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs"></div> +</div></div> +<br> +<!-- end aligned --> +<div class="container"><div class="block"> + <div class="abs" style="top: -45px; left: 30px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="top: -45px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="top: -45px; left: 30px;"></div> +</div></div> +<br> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html new file mode 100644 index 00000000000..253b2a52f61 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<title>Align-self:self-start/end applies to OOF elements of block elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-006-ref.html"> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + display: inline-block; + width: 100px; + height: 100px; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.end { + justify-self: self-end; + align-self: self-end; +} + +.start { + justify-self: self-start; + align-self: self-start; +} +</style> +<!-- self-start aligned --> +<div class="container"><div class="block"> + <div class="abs start"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs start" style="direction: rtl;"></div> +</div></div> +<div class="container"><div class="block" style="direction: rtl;"> + <div class="abs start" style="direction: ltr;"></div> +</div></div> +<br> +<!-- self-end aligned --> +<div class="container"><div class="block"> + <div class="abs end"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs end" style="direction: rtl;"></div> +</div></div> +<div class="container"><div class="block" style="direction: rtl;"> + <div class="abs end" style="direction: ltr;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html new file mode 100644 index 00000000000..bc9b5f4f650 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- start aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="top: 25px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="left: -50px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 0px;"></div> +</div></div> +<br> +<!-- end aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="bottom: 50px; left: -50px"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 0px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: -25px; left: -50px;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html new file mode 100644 index 00000000000..ebe872aaab9 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<title>Align-self:self-start/end applies to OOF elements of inline elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-007-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.end { + justify-self: self-end; + align-self: self-end; +} + +.start { + justify-self: self-start; + align-self: self-start; +} +</style> +<!-- self-start aligned --> +<div class="container"><div class="inline">text + <div class="abs start"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs start" style="direction: rtl;"></div> + <br>text +</div></div> +<div class="container"><div class="inline" style="direction: rtl;">text + <div class="abs start" style="direction: ltr;"></div> + <br>text +</div></div> +<br> +<!-- self-end aligned --> +<div class="container"><div class="inline">text + <div class="abs end"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs end" style="direction: rtl;"></div> + <br>text +</div></div> +<div class="container"><div class="inline" style="direction: rtl;">text + <div class="abs end" style="direction: ltr;"></div> + <br>text +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html new file mode 100644 index 00000000000..79cf612b8f8 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + display: inline-block; + width: 100px; + height: 100px; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- justify-self --> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: end;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: end;"></div> +</div></div> +<br> +<div class="container"><div class="block"> + <div class="abs" style="left: 25px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: end;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<br> +<!-- align-self --> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: end;"></div> +</div></div> +<br> +<div class="container"><div class="block"> + <div class="abs" style="top: 25px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: end;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html new file mode 100644 index 00000000000..187974884b4 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<title>Align-self applies to OOF elements of block elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-008-ref.html"> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + display: inline-block; + width: 100px; + height: 100px; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- justify-self --> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: auto;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: normal;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: right;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: left;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: flex-start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: flex-end;"></div> +</div></div> +<br> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: anchor-center;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: first baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: last baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: legacy;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: stretch;"></div> +</div></div> +<br> +<!-- align-self --> +<div class="container"><div class="block"> + <div class="abs" style="align-self: auto;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: normal;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: right;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: left;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: flex-start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: flex-end;"></div> +</div></div> +<br> +<div class="container"><div class="block"> + <div class="abs" style="align-self: anchor-center;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: first baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: last baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: legacy;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: stretch;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html new file mode 100644 index 00000000000..4eaa9d2f3a6 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.container { + position: relative; + width: 200px; + height: 200px; + top: -50px; + left: -50px; +} +.abspos { + position: absolute; + inset: 10px auto 10px 50px; + margin: auto 0 auto 0; + align-self: stretch; + background: green; +} +.abspos::before { + content: ''; + min-width: 100px; + height: 100%; + aspect-ratio: 1; + display: block; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="container"> + <div class="abspos"></div> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html new file mode 100644 index 00000000000..9d1b6454c84 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.container { + position: relative; + width: 200px; + height: 200px; + top: -50px; + left: -50px; +} +.abspos { + position: absolute; + inset: 10px 50px 10px 50px; + margin: auto 0 auto 0; + align-self: stretch; + background: green; +} +.abspos::before { + content: ''; + width: 100px; + height: 100px; + display: block; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="container"> + <div class="abspos"></div> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html new file mode 100644 index 00000000000..c50b32f089b --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.container { + position: relative; + width: 200px; + height: 200px; + top: -50px; + left: -50px; +} +.abspos { + position: absolute; + inset: 50px 10px auto 10px; + margin: 0 auto 0 auto; + justify-self: stretch; + background: green; +} +.abspos::before { + content: ''; + width: 100%; + min-height: 100px; + aspect-ratio: 1; + display: block; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="container"> + <div class="abspos"></div> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html new file mode 100644 index 00000000000..7d7b4bfc857 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.container { + position: relative; + width: 200px; + height: 200px; + top: -50px; + left: -50px; +} +.abspos { + position: absolute; + inset: 50px 10px 50px 10px; + margin: 0 auto 0 auto; + justify-self: stretch; + background: green; +} +.abspos::before { + content: ''; + width: 100px; + height: 100px; + display: block; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="container"> + <div class="abspos"></div> +</div> diff --git a/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html new file mode 100644 index 00000000000..5b45527fd9c --- /dev/null +++ b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="help" href="https://crbug.com/405795970"> +<style> + @keyframes --anim { + from { + width: calc(10px * sibling-index()); + } + to { + width: calc(50px); + } + } + #target { + animation: --anim 2s; + } +</style> +<p>Pass if no crash</p> +<div id="target"></div> diff --git a/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html b/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html index ad2d17f2ef0..c38adea9a68 100644 --- a/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html +++ b/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html @@ -27,8 +27,13 @@ test_computed_value("margin-trim", "inline-start block-start", "block-start inli test_computed_value("margin-trim", "inline-end block-start", "block-start inline-end"); test_computed_value("margin-trim", "inline-end block-end", "block-end inline-end"); test_computed_value("margin-trim", "block-start block-end inline-start", "block-start inline-start block-end"); -test_computed_value("margin-trim", "inline-start block-start inline-end block-end", "block-start inline-start block-end inline-end"); -test_computed_value("margin-trim", "inline-start inline-end block-start", "block-start inline-start inline-end"); + +test_computed_value("margin-trim", "block-start inline-start block-end inline-end", "block inline"); +test_computed_value("margin-trim", "block-start block-end inline-end inline-start", "block inline"); +test_computed_value("margin-trim", "block-start block-end inline-start inline-end", "block inline"); +test_computed_value("margin-trim", "inline-start block-end block-start inline-end", "block inline"); +test_computed_value("margin-trim", "inline-start inline-end block-start block-end", "block inline"); +test_computed_value("margin-trim", "inline-end block-end inline-start block-start", "block inline"); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-box/parsing/margin-trim.html b/tests/wpt/tests/css/css-box/parsing/margin-trim.html index 0d92f80b9b9..e8679f9cbf3 100644 --- a/tests/wpt/tests/css/css-box/parsing/margin-trim.html +++ b/tests/wpt/tests/css/css-box/parsing/margin-trim.html @@ -21,6 +21,9 @@ test_valid_value("margin-trim", "block-end"); test_valid_value("margin-trim", "inline-start"); test_valid_value("margin-trim", "inline-end"); +test_valid_value("margin-trim", "block inline"); +test_valid_value("margin-trim", "inline block"); + // Serialize values into either block or inline test_valid_value("margin-trim", "block-start block-end", "block"); test_valid_value("margin-trim", "inline-start inline-end", "inline"); @@ -29,10 +32,15 @@ test_valid_value("margin-trim", "inline-end inline-start", "inline"); test_valid_value("margin-trim", "inline-start block-start"); test_valid_value("margin-trim", "inline-end block-start block-end"); -test_valid_value("margin-trim", "block-start inline-start block-end inline-end"); -test_valid_value("margin-trim", "inline-end block-end inline-start block-start"); -test_invalid_value("margin-trim", "block inline"); +// Serialize 4 values into "block inline" +test_valid_value("margin-trim", "block-start inline-start block-end inline-end", "block inline"); +test_valid_value("margin-trim", "block-start block-end inline-end inline-start", "block inline"); +test_valid_value("margin-trim", "block-start block-end inline-start inline-end", "block inline"); +test_valid_value("margin-trim", "inline-start block-end block-start inline-end", "block inline"); +test_valid_value("margin-trim", "inline-start inline-end block-start block-end", "block inline"); +test_valid_value("margin-trim", "inline-end block-end inline-start block-start", "block inline"); + test_invalid_value("margin-trim", "block block"); test_invalid_value("margin-trim", "inline inline"); test_invalid_value("margin-trim", "block inline-start inline-end"); diff --git a/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html b/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html index 0c949e9ea7d..408264b58df 100644 --- a/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html +++ b/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html @@ -26,6 +26,7 @@ test_valid_value("animation-timing-function", "linear(0, 0.5 25% 75%, 1 100% 100 test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 0.998, 1 100% 100%)"); test_valid_value("animation-timing-function", "linear(0, 0 40%, 1, 0.5, 1)"); test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 1.004, 0.998, 1 100% 100%)"); +test_valid_value("animation-timing-function", "linear(calc(0/0), 1)", "linear(0 0%, 1 100%)"); test_invalid_value("animation-timing-function", "linear()"); test_invalid_value("animation-timing-function", "linear(0)"); diff --git a/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html b/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html index 4e8b21e4413..e8465ff7a33 100644 --- a/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html +++ b/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html @@ -29,6 +29,7 @@ test_invalid_value("animation-timing-function", "steps(0, jump-start)"); test_invalid_value("animation-timing-function", "steps(0, jump-end)"); test_invalid_value("animation-timing-function", "steps(0, jump-both)"); test_invalid_value("animation-timing-function", "steps(1, jump-none)"); +test_invalid_value("animation-timing-function", "steps(calc(0/0), jump-none)"); </script> </body> diff --git a/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html b/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html index a3a0a88ba68..32c9c4c5efe 100644 --- a/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html +++ b/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html @@ -140,13 +140,18 @@ @font-palette-values --A { override-colors: 0 color-mix(in lch, red, color-mix(in lch, currentcolor, black)); } + +/* 24 */ +@font-palette-values --A { + base-palette: sibling-index(); +} </style> </head> <body> <script> let rules = document.getElementById("style").sheet.cssRules; test(function() { - assert_equals(rules.length, 24); + assert_equals(rules.length, 25); }); test(function() { @@ -343,6 +348,13 @@ test(function() { assert_equals(text.indexOf("override-colors"), -1); assert_equals(rule.overrideColors, ""); }); + +test(function() { + let text = rules[24].cssText; + let rule = rules[24]; + assert_equals(text.indexOf("base-palette"), -1); + assert_equals(rule.basePalette, ""); +}, "sibling-index() is invalid in base-palette descriptor"); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html b/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html index 7a5844d5600..08c20142449 100644 --- a/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html +++ b/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html @@ -81,6 +81,7 @@ var testrules = [ { rule: _("@styleset { ok-1: 1; }"), serializationSame: true }, { rule: _("@annotation { ok-1: 3; }"), serializationSame: true }, { rule: _("@stylistic { blah: 3; }"), serializationSame: true }, + { rule: _("@stylistic { blah: sibling-index(); }"), serializationNoValueDefn: true }, { rule: makeRule("bongo", "\n@styleset\n { blah: 3; super-blah: 4 5;\n more-blah: 5 6 7;\n }"), serializationSame: true }, { rule: makeRule("bongo", "\n@styleset\n {\n blah:\n 3\n;\n super-blah:\n 4\n 5\n;\n more-blah:\n 5 6\n 7;\n }"), serializationSame: true }, diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html new file mode 100644 index 00000000000..834c96ccd39 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-gap: 10px; + display: flex; + } + + .items { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 200px; + background: gold; + left: 2px; + top: 62px; + } + + .column-gap { + position: absolute; + height: 130px; + width: 10px; + background: blue; + top: 2px; + } +</style> + +<div class="container"> + <div class="items"></div> + <div class="items"></div> + <div class="items"></div> +</div> +<div class="column-gap" style="left:62px;"></div> +<div class="column-gap" style="left:132px;"></div> +<div class="row-gap"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html new file mode 100644 index 00000000000..c3752156c7d --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-001-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-count: 3; + column-width: 60px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html new file mode 100644 index 00000000000..d132f0ca677 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html @@ -0,0 +1,96 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 200px; + background: gold; + left: 2px; + top: 120px; + } + + .column-gap1 { + position: absolute; + height: 40px; + width: 10px; + background: blue; + top: 2px; + } + + .column-gap2 { + position: absolute; + height: 142px; + width: 10px; + background: blue; + top: 60px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> + <div class="column-gap2" style="left:62px;"></div> + <div class="column-gap2" style="left:132px;"></div> + <div class="row-gap"></div> + <div class="spanner"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html new file mode 100644 index 00000000000..0b632fa94ac --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap and a spanner. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-002-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html new file mode 100644 index 00000000000..cd26da24389 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + height: 200px; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + height: 200px; + } + + .column-gap1 { + position: absolute; + height: 200px; + width: 10px; + background: blue; + top: 2px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } +</style> +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html new file mode 100644 index 00000000000..2f2473fd046 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted basic case. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-003-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + #container { + border: 2px solid rgb(96 139 168); + width: 200px; + column-count: 3; + column-width: 60px; + column-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 200px; + margin: 0px; + } +</style> + +<div id="container"> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html new file mode 100644 index 00000000000..002b1f2b594 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + } + + .container1 { + width: 200px; + height: 130px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 72px; + left: 2px; + width: 200px; + height: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 4px; + width: 200px; + background: gold; + left: 2px; + top: 65px; + } + + .column-gap { + position: absolute; + height: 130px; + width: 4px; + background: blue; + top: 2px; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="column-gap" style="left:65px;"></div> + <div class="column-gap" style="left:135px;"></div> + <div class="row-gap"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html new file mode 100644 index 00000000000..0dcbeef4df8 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with smaller width than gap and column-wrap. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-004-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-count: 3; + column-width: 60px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 4px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 4px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html new file mode 100644 index 00000000000..6543021c979 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + display: flex; + border: 1px solid #ccc; + height: 50px; + width: 210px; + column-gap: 10px; + } + + .outer-items { + background: rgb(96 139 168 / 0.2); + height 50px; + width: 100px; + } + + .inner { + display: flex; + height: 50px; + column-gap: 10px; + width: 100px; + } + + .inner-items { + height: 50px; + width: 45px; + background: black; + } + + .column-gap { + position: absolute; + height: 50px; + top: 1px; + left: 101px; + width: 10px; + } + + .row-gap { + position: absolute; + background: purple; + height: 10px; + top: 21px; + left: 111px; + width: 100px; + } +</style> +<div class="outer"> + <div class="outer-items"></div> + <div class="outer-items" id="nested"> + <div class="inner"> + <div class="inner-items"></div> + <div class="inner-items"></div> + </div> + </div> +</div> +<div class="column-gap" style="background: blue;"></div> +<div class="column-gap" style="background: gold; left: 156px"></div> +<div class="row-gap"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html new file mode 100644 index 00000000000..daa65e904e7 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with nested multicol with column wrap. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-005-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer-container { + column-count: 2; + column-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + border: 1px solid #ccc; + width: 210px; + height: 50px; + } + + .nested-container { + column-count: 2; + column-gap: 10px; + width: 100px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: gold; + row-gap: 10px; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: purple; + column-wrap: wrap; + column-fill: auto; + column-height: 20px; + } + + .column1 { + background: rgb(96 139 168 / 0.2); + width: 100px; + height: 50px + } + + .nested-column { + background: black; + width: 45px; + height: 20px; + } +</style> + +<div class="outer-container"> + <div class="column1"> + </div> + <div class="column2"> + <div class="nested-container"> + <div class="nested-column"></div> + <div class="nested-column"></div> + <div class="nested-column"></div> + <div class="nested-column"></div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html new file mode 100644 index 00000000000..4cb56d207fe --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + .outer-container { + columns: 3; + column-fill: auto; + height: 100px; + width: 600px; + gap: 10px; + background: yellow; + } + + .nested-container { + columns: 2; + box-decoration-break: clone; + padding: 10px; + gap: 10px; + background: cyan; + } + + .inner-column { + height: 250px; + background: hotpink; + width: 80px; + } + + #col-gap1 { + position: absolute; + height: 80px; + width: 1px; + background: green; + top: 18px; + left: 104px; + } + + #col-gap2 { + position: absolute; + width: 1px; + background: green; + top: 18px; + left: 307px; + height: 45px; + } +</style> +<div class="outer-container"> + <div class="nested-container"> + <div class="inner-column"></div> + </div> +</div> +<div id="col-gap1"></div> +<div id="col-gap2"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html new file mode 100644 index 00000000000..64b3b007ab5 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with nested fragmented multicol. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-006-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + .outer-container { + columns: 3; + column-fill: auto; + height: 100px; + width: 600px; + gap: 10px; + background: yellow; + } + + .nested-container { + columns: 2; + box-decoration-break: clone; + padding: 10px; + column-rule: solid; + column-rule-color: green; + column-rule-width: 1px; + background: cyan; + gap: 10px; + } + + .inner-column { + height: 250px; + background: hotpink; + width: 80px; + } +</style> +<div class="outer-container"> + <div class="nested-container"> + <div class="inner-column"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html new file mode 100644 index 00000000000..09973ddc690 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html @@ -0,0 +1,133 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + #outer { + width: 620px; + height: 200px; + background: yellow; + } + + .inner1 { + border-top: 2px solid; + border-left: 2px solid; + border-right: 2px solid; + background: cyan; + height: 198px; + width: 296px; + } + + .inner2 { + border-bottom: 2px solid; + border-left: 2px solid; + border-right: 2px solid; + position: absolute; + left: 320px; + top: 0px; + height: 130px; + width: 296px; + background: cyan + } + + .inner-flex { + display: flex; + column-gap: 20px; + } + + .inner-items { + background: hotpink; + width: 85.333px; + } + + .column-gap1 { + width: 10px; + background: blue; + position: absolute; + top: 2px; + } + + .column-gap2 { + width: 10px; + background: blue; + position: absolute; + top: 40px; + } + + .spanner { + background: grey; + opacity: 0.5; + height: 18px; + width: 296px; + } + + .row-gap1 { + height: 10px; + background: green; + position: relative; + width: 296px; + top: 105px; + } + + .row-gap2 { + height: 10px; + background: green; + position: absolute; + width: 296px; + top: 105px; + } + + .column-gap3 { + background: blue; + height: 130px; + position: absolute; + width: 10px; + top: 0px; + } +</style> + +<div id="outer"> + <div class="inner1"> + <div class="inner-flex"> + <div class="inner-items" style="height:20px;"></div> + <div class="inner-items" style="height:20px" ;></div> + <div class="inner-items" style="height:20px;"></div> + </div> + <div class="inner-flex" style="position: absolute; left:2px; top:40px"> + <div class="inner-items" style="height:100px;"></div> + <div class="inner-items" style="height:100px" ;></div> + <div class="inner-items" style="height:100px;"></div> + </div> + <div class="inner-flex" style="position: absolute; left:2px; top:160px"> + <div class="inner-items" style="height:40px;"></div> + <div class="inner-items" style="height:40px" ;></div> + <div class="inner-items" style="height:40px;"></div> + </div> + <div class="spanner"></div> + <div class="column-gap1" style="height: 20px; left:calc(2px + 85.333px + 5px)"></div> + <div class="column-gap1" style="height: 20px; left:calc(2px + 85.333px + 5px + 10px + 5px + 85.333px + 5px)"> + </div> + <div class="column-gap2" style="height: 160px; left:calc(2px + 85.333px + 5px)"></div> + <div class="column-gap2" style="height: 160px; left:calc(2px + 85.333px + 5px + 10px + 5px + 85.333px + 5px)"> + </div> + <div class="row-gap1"></div> + </div> + <div class="inner2"> + <div class="inner-flex"> + <div class="inner-items" style="height:100px"></div> + <div class="inner-items" style="height:100px"></div> + <div class="inner-items" style="height:100px"></div> + </div> + <div class="inner-flex" style="position: absolute; top:120px;"> + <div class="inner-items" style="height:10px"></div> + <div class="inner-items" style="height:10px"></div> + <div class="inner-items" style="height:10px"></div> + </div> + <div class="column-gap3" style="left:calc(85.333px + 5px);"></div> + <div class="column-gap3" style="left:calc(85.333px + 5px + 10px + 5px + 85.333px + 5px);"></div> + <div class="row-gap2"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html new file mode 100644 index 00000000000..1f23ed7f7ca --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with nested fragmented multicol. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-007-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + #outer { + width: 620px; + columns: 2; + column-fill: auto; + gap: 20px; + height: 200px; + background: yellow; + } + + #inner { + columns: 3; + border: 2px solid; + gap: 20px; + column-height: 100px; + column-rule-style: solid; + column-rule-color: blue; + column-rule-width: 10px; + row-rule-style: solid; + row-rule-color: green; + row-rule-width: 10px; + column-wrap: wrap; + background: cyan; + } +</style> + +<div id="outer"> + <div id="inner"> + <div style="height:60px; background:hotpink;"></div> + <div style="column-span:all; background: grey; opacity: 0.5; height:18px"></div> + <div style="height:750px; background:hotpink;"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html new file mode 100644 index 00000000000..d49c2f50f19 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 200px; + left: 2px; + top: 120px; + display: flex; + column-gap: 10px; + } + + .row-gap-items { + width: 60px; + background: gold; + } + + .column-gap1 { + position: absolute; + height: 40px; + width: 10px; + background: blue; + top: 2px; + } + + .column-gap2 { + position: absolute; + height: 60px; + width: 10px; + background: blue; + top: 60px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } + + .column-gap3 { + position: absolute; + height: 72px; + width: 10px; + background: blue; + top: 130px; + } +</style> +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="row-gap"> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + </div> + <div class="spanner"></div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> + <div class="column-gap2" style="left:62px;"></div> + <div class="column-gap2" style="left:132px;"></div> + <div class="column-gap3" style="left:62px;"></div> + <div class="column-gap3" style="left:132px;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html new file mode 100644 index 00000000000..ed299b5d9f6 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with 0px outset and rule-break intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-008-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: intersection; + column-rule-break: intersection; + column-rule-outset: 0px; + row-rule-outset: 0px; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html new file mode 100644 index 00000000000..124bf7eaeb1 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html @@ -0,0 +1,116 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 204px; + left: 0px; + top: 120px; + display: flex; + column-gap: 6px; + } + + .row-gap-items { + width: 64px; + background: gold; + } + + .column-gap1 { + position: absolute; + height: 44px; + width: 10px; + background: blue; + top: 0px; + } + + .column-gap2 { + position: absolute; + height: 64px; + width: 10px; + background: blue; + top: 58px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } + + .column-gap3 { + position: absolute; + height: 76px; + width: 10px; + background: blue; + top: 128px; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> + <div class="column-gap2" style="left:62px;"></div> + <div class="column-gap2" style="left:132px;"></div> + <div class="spanner"></div> + <div class="column-gap3" style="left:62px;"></div> + <div class="column-gap3" style="left:132px;"></div> + <div class="row-gap"> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html new file mode 100644 index 00000000000..b00c6a70f8a --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with 2px outset and rule-break intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-009-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: intersection; + column-rule-break: intersection; + column-rule-outset: 2px; + row-rule-outset: 2px; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html new file mode 100644 index 00000000000..9582ab4103d --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html @@ -0,0 +1,135 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .container3 { + position: absolute; + top: 130px; + column-gap: 10px; + display: flex; + } + + .items3 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 204px; + left: 4px; + top: 120px; + display: flex; + column-gap: 14px; + } + + .row-gap-items { + width: 56px; + background: gold; + } + + .column-gap1 { + position: absolute; + height: 36px; + width: 10px; + background: blue; + top: 4px; + } + + .column-gap2 { + position: absolute; + height: 56px; + width: 10px; + background: blue; + top: 62px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } + + .column-gap3 { + position: absolute; + height: 68px; + width: 10px; + background: blue; + top: 132px; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="container3"> + <div class="items3"></div> + <div class="items3"></div> + <div class="items3"></div> + </div> + <div class="row-gap"> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + </div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> + <div class="column-gap2" style="left:62px;"></div> + <div class="column-gap2" style="left:132px;"></div> + <div class="spanner"></div> + <div class="column-gap3" style="left:62px;"></div> + <div class="column-gap3" style="left:132px;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html new file mode 100644 index 00000000000..61bb4a9b933 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with -2px outset and rule-break intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-010-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: intersection; + column-rule-break: intersection; + column-rule-outset: -2px; + row-rule-outset: -2px; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html new file mode 100644 index 00000000000..3387918d399 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .container3 { + position: absolute; + top: 130px; + column-gap: 10px; + display: flex; + } + + .items3 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 2px; + width: 200px; + background: gold; + left: 2px; + top: 124px; + } + + .column-gap1 { + position: absolute; + height: 40px; + width: 2px; + background: blue; + top: 2px; + } + + .column-gap2 { + position: absolute; + height: 142px; + width: 2px; + background: blue; + top: 60px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="container3"> + <div class="items3"></div> + <div class="items3"></div> + <div class="items3"></div> + </div> + <div class="column-gap1" style="left:66px;"></div> + <div class="column-gap1" style="left:136px;"></div> + <div class="column-gap2" style="left:66px;"></div> + <div class="column-gap2" style="left:136px;"></div> + <div class="row-gap"></div> + <div class="spanner"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html new file mode 100644 index 00000000000..cf588ded41e --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with 100% outset and rule-break intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-011-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 2px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 2px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: intersection; + column-rule-break: intersection; + column-rule-outset: 100%; + row-rule-outset: 100%; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html new file mode 100644 index 00000000000..9fb5e85e920 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .container3 { + position: absolute; + top: 130px; + column-gap: 10px; + display: flex; + } + + .items3 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 2px; + width: 200px; + background: gold; + left: 2px; + top: 124px; + } + + .column-gap1 { + position: absolute; + height: 200px; + width: 2px; + background: blue; + top: 2px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } +</style> +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="container3"> + <div class="items3"></div> + <div class="items3"></div> + <div class="items3"></div> + </div> + <div class="column-gap1" style="left:66px;"></div> + <div class="column-gap1" style="left:136px;"></div> + <div class="row-gap"></div> + <div class="spanner"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html new file mode 100644 index 00000000000..078b810cf8e --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with 2px width and rule-break none. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-012-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 2px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 2px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: none; + column-rule-break: none; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html new file mode 100644 index 00000000000..8e426d8ed32 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<style> + body { + margin: 0px; + } + + .mc { + position: absolute; + top: 0px; + left: 0px; + width: 100px; + height: 100px; + columns: 2; + column-fill: auto; + column-gap: 10px; + } + + .fake-column-gaps { + position: absolute; + top: 4px; + left: 45px; + display: flex; + height: 92px; + column-gap: 45px; + } + + .column-gap { + width: 10px; + background: gold; + } +</style> + +<div class="fake-column-gaps"> + <div class="column-gap"></div> + <div class="column-gap"></div> + <div class="column-gap"></div> +</div> +<div class="mc"> + <div style="height: 400px; background: cyan;"> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html new file mode 100644 index 00000000000..d4170084f06 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-013-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .mc { + position: absolute; + top: 0px; + width: 100px; + height: 100px; + columns: 2; + column-fill: auto; + column-gap: 10px; + column-rule-color: gold; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-outset: -4px; + } +</style> + +<div class="mc"> + <div style="height: 400px; background: cyan;"> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html new file mode 100644 index 00000000000..9d9674bd476 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-gap: 10px; + display: flex; + } + + .items { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .last-item { + position: absolute; + left: 2px; + top: 72px; + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 2px; + width: 200px; + background: gold; + left: 2px; + top: 66px; + } + + .column-gap { + position: absolute; + height: 60px; + width: 10px; + background: blue; + top: 2px; + } +</style> + +<div class="container"> + <div class="items"></div> + <div class="items"></div> + <div class="items"></div> +</div> +<div class="last-item"></div> +<div class="column-gap" style="left:62px;"></div> +<div class="column-gap" style="left:132px;"></div> +<div class="column-gap" style="left:62px; top: 72px;"></div> +<div class="column-gap" style="left:132px; top: 72px;"></div> +<div class="row-gap"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html new file mode 100644 index 00000000000..1dcd393d99a --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap, rule-break-intersection, and fewer + columns in last row. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-014-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-count: 3; + column-width: 60px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 2px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + column-fill: auto; + column-rule-break: intersection; + column-rule-outset: 0; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html new file mode 100644 index 00000000000..2d5b401b8d2 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133"> +<meta name="assert" content="A replaced element with a percentage block-size doesn't compress the min-content contribution on its block axis to zero."> +<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html"> + +<p>Test passes if there is a filled green square.</p> +<div style="display: grid; grid-template-rows: min-content;"> + <canvas width="100" height="100" style="background: green; block-size: 100%"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html new file mode 100644 index 00000000000..575fa8c7817 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133"> +<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="A replaced element with a percentage max-block-size doesn't compress the min-content contribution on its block axis to zero."> + +<p>Test passes if there is a filled green square.</p> +<div style="display: grid; grid-template-rows: min-content;"> + <canvas width="200" height="200" style="background: green; max-block-size: 50%"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html b/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html new file mode 100644 index 00000000000..8b3068be6da --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test: focused ::scroll-button() does not crash after becoming display none</title> +<link rel="help" href="http://crbug.com/402673873"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<style> + #scroller::scroll-button(left) { + content: ""; + background-color: red; + height: 100px; + width: 100px; + top: 0; + left: 0; + position: absolute; + } + + #scroller.hide::scroll-button(left) { + display: none; + } + + #scroller { + width: 300px; + height: 300px; + overflow: auto; + } + + #filler { + height: 20000x; + } +</style> +<div id="scroller"> + <div id="filler"></div> +</div> +<script> + promise_test(async t => { + await new test_driver.Actions() + .pointerMove(15, 15) + .pointerDown() + .pointerUp() + .send(); + scroller.className = "hide"; + document.documentElement.offsetTop; + await new test_driver.Actions() + .pointerMove(15, 15) + .pointerDown() + .pointerUp() + .send(); + assert_true(true); + }); +</script> diff --git a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html index a116ead01b7..71c5f6573d6 100644 --- a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html +++ b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html @@ -33,6 +33,10 @@ promise_test(async function() { Math.round(bounds.top + bounds.height / 2), 0, -100) .send(); + // Await two animation frames to give a chance to scroll. + await new Promise(resolve => requestAnimationFrame(resolve)); + await new Promise(resolve => requestAnimationFrame(resolve)); + assert_equals(window.scrollY, originalScrollPos, "overscroll-behavior should work on the root"); }); </script> diff --git a/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html b/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html new file mode 100644 index 00000000000..c0dc8e20eee --- /dev/null +++ b/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html @@ -0,0 +1,31 @@ +<!doctype html> +<title>CSS Shadow Parts - :host::part() in nesting</title> +<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/#part"> +<link rel="help" href="https://drafts.csswg.org/css-scoping/#host-selector"> +<link rel="help" href="https://crbug.com/326526716"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="host"></div> +<script> +test(function() { + let host = document.getElementById("host"); + host.attachShadow({ mode: "open" }).innerHTML = ` + <style> + :host { + &::part(mypart) { + color: lime; + } + } + </style> + <div part="mypart">This text should be green.</div> + `; + + let part = host.shadowRoot.querySelector("[part]"); + + assert_equals( + window.getComputedStyle(part).color, + "rgb(0, 255, 0)", + ":host::part() works in nesting", + ); +}, ":host::part works in nesting"); +</script> diff --git a/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html new file mode 100644 index 00000000000..feff03bbe2e --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="A replaced element with a percentage block-size doesn't compress the min-content contribution on its block axis to zero."> + +<p>Test passes if there is a filled green square.</p> +<div style="inline-size: min-content"> + <canvas width="100" height="100" + style="writing-mode:vertical-rl; background: green; block-size: 100%"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html new file mode 100644 index 00000000000..5a6b103c22e --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="A replaced element with a percentage max-block-size doesn't compress the min-content contribution on its block axis to zero."> + +<p>Test passes if there is a filled green square.</p> +<div style="inline-size: min-content"> + <canvas width="200" height="200" + style="writing-mode:vertical-rl; background: green; max-block-size: 50%"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-tables/colspan-zero-crash.html b/tests/wpt/tests/css/css-tables/colspan-zero-crash.html new file mode 100644 index 00000000000..a50586a5bfa --- /dev/null +++ b/tests/wpt/tests/css/css-tables/colspan-zero-crash.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/servo/servo/issues/36699"> +<link rel="author" href="mailto:fwang@igalia.com" title="Frédéric Wang"> +<span id="span"></span> +<script> + let th = document.createElement("th"); + span.replaceWith(th); + th.colSpan = 0; +</script> + diff --git a/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html b/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html new file mode 100644 index 00000000000..1afdae2be9d --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html @@ -0,0 +1,128 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- TODO update link --> + <link rel="help" href="https://www.w3.org/TR/css-view-transitions-2/"> + <title>Scope view transitions run in parallel</title> +</head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style type="text/css"> + .block { + background-color: blue; + position: relative; + height: 100px; + width: 100px; + margin: 50px; + } + + #target1 { + view-transition-name: a; + } + + #target2 { + view-transition-name: b; + } + + ::view-transition-group(*), + ::view-transition-image-pair(*), + ::view-transition-old(*) { + animation: unset; + } + + ::view-transition-old(*) { + opacity: 0; + } + + @keyframes stylize { + from { + opacity: 0.5; + } + to { + opacity: 1.0; + } + } + ::view-transition-new(*) { + animation: stylize 1s paused; + } + +</style> +<body> + <div id="target1" class="block"></div> + <div id="target2" class="block"></div> +</body> +<script type="text/javascript"> + + async function run_parallel_scoped_view_transition_test( + transition_update_callback, + message) { + promise_test(async t => { + const vt1 = target1.startViewTransition(() => {}); + const vt2 = target2.startViewTransition(() => {}); + await Promise.all([vt1.ready, vt2.ready]); + + let list = document.getAnimations().map(a => { + return `${a.effect.pseudoElement}:${a.animationName}`; + }); + let expected = [ + '::view-transition-new(a):stylize', + '::view-transition-new(b):stylize' + ]; + assert_array_equals(list, expected, 'Before callback'); + assert_equals( + getComputedStyle(target1, "::view-transition-new(a)") + .getPropertyValue("opacity"), + "0.5"); + assert_equals( + getComputedStyle(target2, "::view-transition-new(b)") + .getPropertyValue("opacity"), + "0.5"); + + transition_update_callback(vt1); + await vt1.finished.then( + () => {}, + () => { + // The only case where the finished promise should not be resolved is + // when the DOM update callback returns a rejected promise. + assert_unreached('Finished promise should have been resolved'); + }); + + list = document.getAnimations().map(a => { + return `${a.effect.pseudoElement}:${a.animationName}`; + }); + assert_array_equals(list, [`::view-transition-new(b):stylize`], + 'After callback'); + assert_equals( + getComputedStyle(target2, "::view-transition-new(b)") + .getPropertyValue("opacity"), + "0.5"); + }, message); + } + + run_parallel_scoped_view_transition_test( + (vt) => { + vt.skipTransition(); + }, + 'Concurrent transition keeps running after transition skipped'); + + run_parallel_scoped_view_transition_test( + () => { + document.getAnimations().filter(a => { + return a.effect.target.id == 'target1'; + }).forEach(a => { + a.finish(); + }); + }, 'Concurrent transition keeps running after transition finished'); + + run_parallel_scoped_view_transition_test( + () => { + document.getAnimations().filter(a => { + return a.effect.target.id == 'target1'; + }).forEach(a => { + a.cancel(); + }); + }, 'Concurrent transition keeps running after transition canceled'); +</script> +</html> diff --git a/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html b/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html new file mode 100644 index 00000000000..c5b52346fc0 --- /dev/null +++ b/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html @@ -0,0 +1,106 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Writing Modes reference: text-align in orthogonal table cell</title> + +<meta name="flags" content="ahem" /> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + +<style> +table { + font: 20px/1 Ahem; + border: 1px solid gray; + display: inline-table; + margin: 1em; +} + +td { + padding: 0; + color: green; + vertical-align: top; +} + +td div { + position: relative; +} + +.t { + top: 0; +} +.m { + top: 2em; +} +.b { + top: 4em; +} +</style> + +<div> +<table> + <tr> + <td>X<br>X<br>X<br>X<br>X</td> + <td><div class=t>X</div></td> + <td><div class=m>X</div></td> + <td><div class=b>X</div></td> + <td><div class=t>X</div></td> + <td><div class=b>X</div></td> + <td>X<br> <br> <br> <br>X</td> + </tr> +</table> +<table> + <tr> + <td>X<br>X<br>X<br>X<br>X</td> + <td><div class=t>X</div></td> + <td><div class=m>X</div></td> + <td><div class=b>X</div></td> + <td><div class=b>X</div></td> + <td><div class=t>X</div></td> + <td>X<br> <br> <br> <br>X</td> + </tr> +</table> +</div> + +<div> +<table> + <tr> + <td>X<br>X<br>X<br>X<br>X</td> + <td><div class=b>X</div></td> + <td><div class=m>X</div></td> + <td><div class=t>X</div></td> + <td><div class=b>X</div></td> + <td><div class=t>X</div></td> + <td>X<br> <br> <br> <br>X</td> + </tr> +</table> +<table> + <tr> + <td>X<br>X<br>X<br>X<br>X</td> + <td><div class=b>X</div></td> + <td><div class=m>X</div></td> + <td><div class=t>X</div></td> + <td><div class=t>X</div></td> + <td><div class=b>X</div></td> + <td>X<br> <br> <br> <br>X</td> + </tr> +</table> +</div> + +<div> +<table> + <tr><td>XXXXX</td></tr> + <tr><td>X </td></tr> + <tr><td> X </td></tr> + <tr><td> X</td></tr> + <tr><td>X </td></tr> + <tr><td> X</td></tr> + <tr><td>X X</td></tr> +</table> +<table> + <tr><td>XXXXX</td></tr> + <tr><td>X </td></tr> + <tr><td> X </td></tr> + <tr><td> X</td></tr> + <tr><td> X</td></tr> + <tr><td>X </td></tr> + <tr><td>X X</td></tr> +</table> +</div> diff --git a/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html b/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html new file mode 100644 index 00000000000..a8d33f281fd --- /dev/null +++ b/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html @@ -0,0 +1,187 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Writing Modes test: text-align in orthogonal table cell</title> + +<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#line-mappings"> +<meta assert="text-align values respect line-relative mappings of the table cell"> +<link rel="match" href="reference/table-cell-align-006-ref.html"> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> + +<meta name="flags" content="ahem" /> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + +<style> +table { + font: 20px/1 Ahem; + border: 1px solid gray; + display: inline-table; + margin: 1em; +} + +td { + padding: 0; + color: green; +} + +table.vrl td { + writing-mode: vertical-rl; +} + +table.slr td { + writing-mode: sideways-lr; +} + +table.h { + writing-mode: vertical-lr; +} + +table.h td { + writing-mode: initial; +} + +/* If text-align works correctly on the cells, their green Ahem glyphs + should cover the red part of each background. */ +.left { + text-align: left; + background: linear-gradient(to bottom, red 20%, transparent 20%); +} +.slr .left { + background: linear-gradient(to top, red 20%, transparent 20%); +} +.center { + text-align: center; + background: linear-gradient(to bottom, transparent 40%, red 40%, red 60%, transparent 60%); +} +.right { + text-align: right; + background: linear-gradient(to bottom, transparent 80%, red 80%); +} +.slr .right { + background: linear-gradient(to top, transparent 80%, red 80%); +} +.start, +.slr .start:dir(rtl) + { + text-align: start; + background: linear-gradient(to bottom, red 20%, transparent 20%); +} +.start:dir(rtl), +.slr .start { + background: linear-gradient(to top, red 20%, transparent 20%); +} +.end, +.slr .end:dir(rtl) + { + text-align: end; + background: linear-gradient(to bottom, transparent 80%, red 80%); +} +.end:dir(rtl), +.slr .end + { + background: linear-gradient(to top, transparent 80%, red 80%); +} +.justify { + text-align-last: justify; + background: linear-gradient(to bottom, red 20%, transparent 20% 80%, red 80% ); +} + +.h .left { + background: linear-gradient(to right, red 20%, transparent 20%); +} +.h .center { + background: linear-gradient(to right, transparent 40%, red 40%, red 60%, transparent 60%); +} +.h .right { + background: linear-gradient(to right, transparent 80%, red 80%); +} +.h .start { + background: linear-gradient(to right, red 20%, transparent 20%); +} +.h .start:dir(rtl) { + background: linear-gradient(to left, red 20%, transparent 20%); +} +.h .end { + background: linear-gradient(to right, transparent 80%, red 80%); +} +.h .end:dir(rtl) { + background: linear-gradient(to left, transparent 80%, red 80%); +} +.h .justify { + background: linear-gradient(to right, red 20%, transparent 20% 80%, red 80% ); +} +</style> + +</div> +<table class=vrl> + <tr> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +<table class=vrl> + <tr dir=rtl> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +</div> + +<div> +<table class=slr> + <tr> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +<table class=slr> + <tr dir=rtl> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +</div> + +<div> +<table class=h> + <tr> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +<table class=h> + <tr dir=rtl> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +</div> diff --git a/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html b/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html new file mode 100644 index 00000000000..961794728d3 --- /dev/null +++ b/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html @@ -0,0 +1,14 @@ +<!doctype html> +<meta charset=utf-8> +<title></title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +async_test((t) => { + const et = new EventTarget(); + et.addEventListener('test', t.step_func_done((e) => { + assert_true(e.cancelable); + }), {passive: true}); + et.dispatchEvent(new Event('test', {cancelable: true})); +}, "A generic event with only passive listeners remains cancelable"); +</script> diff --git a/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html b/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html index c3b704bf188..6c294e464a5 100644 --- a/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html +++ b/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html @@ -81,6 +81,25 @@ test(function() { }, 'Check if inconsistent xmlns="..." is dropped.'); test(function() { + const root1 = parse('<package></package>'); + root1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf'); + const manifest1 = root1.appendChild(root1.ownerDocument.createElement('manifest')); + manifest1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf'); + assert_equals(serialize(root1), '<package><manifest/></package>'); + + const root2 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>'); + const manifest2 = root2.appendChild(root2.ownerDocument.createElement('manifest')); + manifest2.setAttribute('xmlns', 'http://www.idpf.org/2007/opf'); + assert_equals(serialize(root2), + '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>'); + + const root3 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>'); + const manifest3 = root3.appendChild(root3.ownerDocument.createElement('manifest')); + assert_equals(serialize(root3), + '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>'); +}, 'Drop inconsistent xmlns="..." by matching on local name'); + +test(function() { let root = parse('<r xmlns:xx="uri"></r>'); root.setAttributeNS('uri', 'name', 'v'); assert_equals(serialize(root), '<r xmlns:xx="uri" xx:name="v"/>'); diff --git a/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html b/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html new file mode 100644 index 00000000000..5195b9f04b5 --- /dev/null +++ b/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/327273585"> +<link rel=help href="https://issues.chromium.org/issues/41101979"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<script> +function runTest(xmlString, testName) { + test(() => { + const xmlDoc = (new DOMParser()).parseFromString(xmlString, 'text/xml'); + const result = (new XMLSerializer()).serializeToString(xmlDoc); + assert_equals(result, xmlString); + }, `DOMParser and XMLSerializer should round trip with CDATA sections: ${testName}`); +} + +runTest( + `<root><![CDATA[ +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +]]></root>`, + 'large CDATA'); + +runTest( + '<root><htmlDefn><![CDATA[<div><![CDATA[ Just Rubbish Data $#$^#^$ ]]]]><![CDATA[></div><div></div>]]></htmlDefn></root>', + 'multiple CDATAs'); +</script> diff --git a/tests/wpt/tests/editing/include/editor-test-utils.js b/tests/wpt/tests/editing/include/editor-test-utils.js index 9c5600af77b..f0c4f583992 100644 --- a/tests/wpt/tests/editing/include/editor-test-utils.js +++ b/tests/wpt/tests/editing/include/editor-test-utils.js @@ -568,5 +568,8 @@ class EditorTestUtils { }) - (${EditorTestUtils.getNodeDescription(range.endContainer)}, ${range.endOffset})`; } + static waitForRender() { + return new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve))); + } } diff --git a/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html b/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html index 39e8b46e69b..cac621ad3cd 100644 --- a/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html +++ b/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html @@ -3,6 +3,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> +<script src="../include/editor-test-utils.js"></script> <body> <div contenteditable="true" id="target"> @@ -11,13 +12,13 @@ // Selectionchange event should not get fired if the selection is already set to the beginning of the root promise_test(async () => { let selectionChangeCount = 0; - document.getElementById("target").focus(); - await new Promise(resolve => step_timeout(resolve, 50)); + const target = document.getElementById("target"); + await new test_driver.click(target); + await EditorTestUtils.waitForRender(); document.addEventListener("selectionchange", () => ++selectionChangeCount); - test_driver.send_keys(target, "\uE003"); - // Waits a short time to allow any events to be processed. - await new Promise(resolve => step_timeout(resolve, 50)); + await new test_driver.send_keys(target, "\uE003"); + await EditorTestUtils.waitForRender(); assert_equals(selectionChangeCount, 0, "Selectionchange event should not get fired"); - }, "Selectionchange event not get fired when the selection is already set to the beginning of the root "); + }, "Selectionchange event should not get fired when the selection is already set to the beginning of the root "); </script> </body>
\ No newline at end of file diff --git a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js index e472fccdc4d..ee0cdd84efa 100644 --- a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js +++ b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js @@ -11,7 +11,9 @@ // META: variant=?17-20 // META: variant=?21-24 // META: variant=?25-28 -// META: variant=?29-last +// META: variant=?29-32 +// META: variant=?33-36 +// META: variant=?37-last "use strict"; @@ -35,7 +37,21 @@ subsetTest(promise_test, async test => { 'bidCount': 0, 'multiBidLimit': 1, 'prevWinsMs': [], - 'forDebuggingOnlySampling': false + 'forDebuggingOnlySampling': false, + 'viewCounts': { + 'pastHour': 0, + 'pastDay': 0, + 'pastWeek': 0, + 'past30Days': 0, + 'past90Days': 0 + }, + 'clickCounts': { + 'pastHour': 0, + 'pastDay': 0, + 'pastWeek': 0, + 'past30Days': 0, + 'past90Days': 0 + } }; let biddingLogicURL = createBiddingScriptURL({ generateBid: @@ -48,6 +64,17 @@ subsetTest(promise_test, async test => { expectedBrowserSignals.forDebuggingOnlyInCooldownOrLockout = browserSignals.forDebuggingOnlyInCooldownOrLockout; + // Don't check exact values of view/click reports. + function zeroCounts(object) { + object.pastHour = 0; + object.pastDay = 0; + object.pastWeek = 0; + object.past30Days = 0; + object.past90Days = 0; + } + zeroCounts(browserSignals.viewCounts); + zeroCounts(browserSignals.clickCounts); + // Remove deprecated field, if present. delete browserSignals.prevWins; @@ -947,3 +974,253 @@ subsetTest(promise_test, async test => { } }); }, 'browserSignals.wasmHelper.'); + + +// Generates 0 or 1 clicks, dependent on `produceAttributionSrc` & +// `produceUserAction`, and `numViews` views for `igOwner`, provided by +// `viewClickProvider`. +async function generateViewsAndClicks( + test, uuid, viewClickProvider, igOwner, numViews, produceAttributionSrc, + produceUserAction) { + let iframe = await createIframe(test, viewClickProvider); + let script = ` + // We use a wrapper iframe here so the original remains in communication. + let frame = document.createElement('iframe'); + document.body.appendChild(frame); + let frameDocument = frame.contentDocument; + let a = frameDocument.createElement('a'); + a.href = '${RESOURCE_PATH}/record-click.py?' + + 'eligible_origin=${igOwner}&num_views=${numViews}'; + if (${produceAttributionSrc}) { + a.attributionSrc = ''; + } + a.target = '_self'; + a.appendChild(frameDocument.createTextNode('Click me')); + frameDocument.body.appendChild(a); + + if (${produceUserAction}) { + // Note: test_driver.click() seems to not work well with Chrome's + // content_shell; while .bless() does... unreliably. + // headless_shell/chrome path seems to work reliably. User activation + // is used sparingly to work around content_shell flakiness. + await test_driver.bless('User-initiated click', () => { a.click() }); + } else { + a.click(); + } + `; + + await runInFrame(test, iframe, script); +} + +// Keep running a basic auction with an interest group in +// `interestGroupOverrides` until it succeeds; joining and leaving the +// IG every time to bypass caching which is permitted to provide stale +// view/click counts. +async function keepTryingAuctionUntilWinBypassCaching( + test, uuid, interestGroupOverrides) { + while (true) { + await joinInterestGroup(test, uuid, interestGroupOverrides); + let result = await runBasicFledgeAuction(test, uuid); + if (result !== null) { // Got a winner. + break; + } + await leaveInterestGroup(interestGroupOverrides); + } +} + +// Like keepTryingAuctionUntilWinBypassCaching but for auctions with +// cross-origin interest group, owned by `igOwner`. +async function crossOriginKeepTryingAuctionUntilWinBypassCaching( + test, uuid, igOwner, interestGroupOverrides) { + while (true) { + await joinCrossOriginInterestGroup( + test, uuid, igOwner, interestGroupOverrides); + const auctionConfigOverrides = {interestGroupBuyers: [igOwner]}; + let result = + await runBasicFledgeAuction(test, uuid, auctionConfigOverrides); + if (result !== null) { // Got a winner. + break; + } + await leaveCrossOriginInterestGroup( + test, uuid, igOwner, interestGroupOverrides); + } +} + +// Generates `numViews` views and 0 or 1 clicks based on `produceAttributionSrc` +// and `produceUserAction`, by `viewClickProvider` available to `igOwner`, then +// creates an interest group for `igOwner` with given +// `viewAndClickCountsProviders`, and runs an auction +// to make sure the events are eventually available. +async function testClickiness( + test, igOwner, viewClickProvider, numViews, produceAttributionSrc, + produceUserAction, viewAndClickCountsProviders = undefined) { + const uuid = generateUuid(test); + + await generateViewsAndClicks( + test, uuid, viewClickProvider, igOwner, numViews, produceAttributionSrc, + produceUserAction); + + // For clicks to be recorded, both attributionsrc attribution must exist + // and a user action must be used. If we don't expect clicks, we can expect + // that the number is exactly 0 since re-running the test won't break that. + // + // This is relying on all tests using Ad-Auction-Record-Event using distinct + // `viewClickProvider`s. + let clicksBadTest = + produceAttributionSrc && produceUserAction ? '< 1' : ' !== 0'; + + let viewsBadTest = (numViews > 0) ? `< ${numViews}` : ' !== 0'; + + // Join an IG to read view/click info back. We use a UUID for a name to make + // sure nothing old is cached, since view/clicks are permitted to be a bit + // stale. + let interestGroupOverrides = { + owner: igOwner, + name: uuid, + biddingLogicURL: createBiddingScriptURL({ + origin: igOwner, + generateBid: ` + // We should see at least one click and numViews views the test injects. + if (browserSignals.clickCounts.pastHour ${clicksBadTest} || + browserSignals.clickCounts.pastDay ${clicksBadTest} || + browserSignals.clickCounts.pastWeek ${clicksBadTest} || + browserSignals.clickCounts.past30Days ${clicksBadTest} || + browserSignals.clickCounts.past90Days ${clicksBadTest} || + browserSignals.viewCounts.pastHour ${viewsBadTest} || + browserSignals.viewCounts.pastDay ${viewsBadTest} || + browserSignals.viewCounts.pastWeek ${viewsBadTest} || + browserSignals.viewCounts.past30Days ${viewsBadTest} || + browserSignals.viewCounts.past90Days ${viewsBadTest}) { + return -1; + } + ` + }) + }; + + if (viewAndClickCountsProviders) { + interestGroupOverrides.viewAndClickCountsProviders = + viewAndClickCountsProviders; + } + + await crossOriginKeepTryingAuctionUntilWinBypassCaching( + test, uuid, igOwner, interestGroupOverrides); +} + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN5; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN6; + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 2, + /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ true, [VIEW_CLICK_PROVIDER]); +}, 'browserSignals for clickiness.'); + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN5; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN5; + + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 4, + /*produceAttributionSrc=*/ false, + /*produceUserAction=*/ false); +}, 'IG owner is default clickiness provider if nothing is specified'); + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN4; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN4; + + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 6, + /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ true, []); +}, 'IG owner is default clickiness provider if empty list provided'); + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN3; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN3; + + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 0, + /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ true, []); +}, 'browserSignals for clickiness --- just a click'); + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN2; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN2; + + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 1, + /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ false, [VIEW_CLICK_PROVIDER]); +}, 'browserSignals for clickiness --- no click report w/o user action'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + const IG_OWNER = window.location.origin; + const VIEW_CLICK_PROVIDER1 = OTHER_ORIGIN1; + const VIEW_CLICK_PROVIDER2 = window.location.origin; + + // From provider 1 have click, no views. + // From provider 2 have views, no clicks; + await generateViewsAndClicks( + test, uuid, VIEW_CLICK_PROVIDER1, IG_OWNER, + /*numViews=*/ 0, /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ true); + await generateViewsAndClicks( + test, uuid, VIEW_CLICK_PROVIDER2, IG_OWNER, + /*numViews=*/ 2, /*produceAttributionSrc=*/ false, + /*produceUserAction=*/ false); + + // Create an IG that subscribes only to provider 2 --- it should only see + // the views. + let interestGroupOverrides = { + name: uuid, + viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER2], + biddingLogicURL: createBiddingScriptURL({ + generateBid: ` + if (browserSignals.clickCounts.pastHour !== 0 || + browserSignals.viewCounts.pastHour < 2) { + throw JSON.stringify(browserSignals); + } + ` + }) + }; + + await keepTryingAuctionUntilWinBypassCaching( + test, uuid, interestGroupOverrides); + + // Now see that subscribing only to 1 provides only the click. + interestGroupOverrides = { + name: uuid, + viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER1], + biddingLogicURL: createBiddingScriptURL({ + generateBid: ` + if (browserSignals.clickCounts.pastHour < 1 || + browserSignals.viewCounts.pastHour !== 0) { + throw JSON.stringify(browserSignals); + } + ` + }) + }; + + await keepTryingAuctionUntilWinBypassCaching( + test, uuid, interestGroupOverrides); + + // Now subscribe to both. + interestGroupOverrides = { + name: uuid, + viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER1, VIEW_CLICK_PROVIDER2], + biddingLogicURL: createBiddingScriptURL({ + generateBid: ` + if (browserSignals.clickCounts.pastHour < 1 || + browserSignals.viewCounts.pastHour < 2) { + throw JSON.stringify(browserSignals); + } + ` + }) + }; + + await keepTryingAuctionUntilWinBypassCaching( + test, uuid, interestGroupOverrides); +}, 'browserSignals for clickiness --- viewAndClickCountsProviders works.'); diff --git a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js index 0a18ea40d3d..49ebfd1c596 100644 --- a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js +++ b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js @@ -695,6 +695,16 @@ async function joinCrossOriginInterestGroup(test, uuid, origin, interestGroupOve `await joinInterestGroup(test_instance, "${uuid}", ${interestGroup})`); } +// Leaves a cross-origin interest group, by running a leave in an iframe. +async function leaveCrossOriginInterestGroup(test, uuid, origin, interestGroupOverrides = {}) { + let interestGroup = JSON.stringify( + createInterestGroupForOrigin(uuid, origin, interestGroupOverrides)); + + let iframe = await createIframe(test, origin, 'join-ad-interest-group'); + await runInFrame(test, iframe, + `await leaveInterestGroup(${interestGroup})`); +} + // Joins an interest group in a top-level window, which has the same origin // as the joined interest group. async function joinInterestGroupInTopLevelWindow( diff --git a/tests/wpt/tests/fledge/tentative/resources/record-click.py b/tests/wpt/tests/fledge/tentative/resources/record-click.py new file mode 100644 index 00000000000..b4e76873d9b --- /dev/null +++ b/tests/wpt/tests/fledge/tentative/resources/record-click.py @@ -0,0 +1,21 @@ +# This responds with a page reporting a click event to the origin provided in +# the `eligible_origin` query param. The pages loads `num_views` copies of +# record-view.py as images in a clickiness-eligible way; with them reporting +# view events. +def main(request, response): + eligible_origin = request.GET.get(b"eligible_origin") + num_views = int(request.GET.get(b"num_views")) + response.status = (200, b"OK") + response.headers.set(b"Content-Type", b"text/html") + response.headers.set( + b"Ad-Auction-Record-Event", + b"type=\"click\", eligible-origins=(\"%s\")" % eligible_origin) + + result = b"<!DOCTYPE html>" + img_template = b"<img src=\"record-view.py?i=%d&eligible_origin=%s\"" + \ + b" attributionsrc>" + for i in range(0, num_views): + view = img_template % (i, eligible_origin) + result = result + view + return result.decode("utf-8") + diff --git a/tests/wpt/tests/fledge/tentative/resources/record-view.py b/tests/wpt/tests/fledge/tentative/resources/record-view.py new file mode 100644 index 00000000000..d423b2d9c72 --- /dev/null +++ b/tests/wpt/tests/fledge/tentative/resources/record-view.py @@ -0,0 +1,19 @@ +# This responds with an image reporting a view event to the origin provided in +# the `eligible_origin` query param. +def main(request, response): + eligible_origin = request.GET.get(b"eligible_origin") + response.status = (200, b"OK") + response.headers.set(b"Content-Type", b"image/png") + response.headers.set( + b"Ad-Auction-Record-Event", + b"type=\"view\", eligible-origins=(\"%s\")" % eligible_origin) + png = b"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" + \ + b"\x49\x48\x44\x52\x00\x00\x00\x05\x00\x00\x00\x05" + \ + b"\x08\x06\x00\x00\x00\x8d\x6f\x26\xe5\x00\x00\x00" + \ + b"\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e" + \ + b"\xc4\x01\x95\x2b\x0e\x1b\x00\x00\x00\x15\x49\x44" + \ + b"\x41\x54\x08\x99\x63\x64\xf8\xcf\xf0\x9f\x01\x0d" + \ + b"\x30\xa1\x0b\x50\x41\x10\x00\xcd\xaa\x02\x08\x0f" + \ + b"\x23\x6b\x59\x00\x00\x00\x00\x49\x45\x4e\x44\xae" + \ + b"\x42\x60\x82" + return png diff --git a/tests/wpt/tests/focus/focus-element-crash.html b/tests/wpt/tests/focus/focus-element-crash.html new file mode 100644 index 00000000000..27df1c0b130 --- /dev/null +++ b/tests/wpt/tests/focus/focus-element-crash.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> +<meta charset="utf-8"> +<meta name="assert" content="focus element adopted or remounted shouldn't crash."> + +<body> + +<!--focus element remounted test case--> +<audio onloadstart="select.focus()" src=""></audio> +<iframe id="iframe"></iframe> +<table id="table"> + <td> + <select id="select" onblur=";"></select> + </td> +</table> +<script> + window.addEventListener("load", _ => iframe.appendChild(table)); +</script> + +<!--focus element adopted test case--> +<input id="username" type="text" placeholder="username"> +<input id="password" type="text" placeholder="password"> +</body> +<script> + let search = document.getElementById("search"); + let username = document.getElementById("username"); + username.focus(); + window.onload = () => document.adoptNode(username); + username.addEventListener("blur", function (e) { + document.body.append(`event:${e.type} fire.`) + }); +</script> +</html> diff --git a/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml new file mode 100644 index 00000000000..319b5b8e04c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: canvas-createconicgradient + files: + - 2d.gradient.conic.* diff --git a/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml new file mode 100644 index 00000000000..5d9106c1cd6 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml @@ -0,0 +1,5 @@ +features: +- name: canvas-createconicgradient + files: + - conic-gradient.html + - conic-gradient-rotation.html diff --git a/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml new file mode 100644 index 00000000000..319b5b8e04c --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: canvas-createconicgradient + files: + - 2d.gradient.conic.* diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md deleted file mode 100644 index b3c24c3f82d..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Because this test suite is run as a virtual suite and it's quite deep in the -folders, we have to use abbreviations for the test names to not run over 200 -characters, which is problematic on Windows. - -* unspecified -> "u" -* unsafe-none -> "un" -* same-origin -> "so" -* same-origin-allow-popups -> "soap" -* restrict-properties -> omitted diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html deleted file mode 100644 index 1c315b35d7f..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html +++ /dev/null @@ -1,19 +0,0 @@ -<!doctype html> -<title> Check openee.closed access is allowed for COOP: restrict-properties</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/test-access-property.js"></script> -<script> - -testAccessProperty( - "closed", - w => w.closed, - expectReport = false, - use_restrict_properties = true -); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html deleted file mode 100644 index 7a96f4f5762..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html +++ /dev/null @@ -1,62 +0,0 @@ -<!doctype html> -<title> - COOP reports are sent to the openee when the openee used COOP-RO: - restrict-properties and its same-origin opener tries to access it. -</title> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script> -<script> - -const directory = "/html/cross-origin-opener-policy"; -const same_origin = get_host_info().HTTPS_ORIGIN; - -promise_test(async t => { - const report_token = token(); - const openee_token = token(); - const opener_token = token(); // The current test window. - - const opener_url = location.href; - - const reportTo = reportToHeaders(report_token); - const openee_url = same_origin + executor_path + reportTo.header + - reportTo.coopReportOnlyRestrictPropertiesHeader + - `&uuid=${openee_token}`; - - const openee = window.open(openee_url); - t.add_cleanup(() => send(openee_token, "window.close()")) - - // 1. Make sure the new document to be loaded. - send(openee_token, ` - send("${opener_token}", "Ready"); - `); - let reply = await receive(opener_token); - assert_equals(reply, "Ready"); - - // 2. Try to access the openee. A report is sent, because of COOP-RO: - // restrict-properties. - tryAccess(openee); - - // 3. Check a report is sent to the openee. - let report = - await receiveReport(report_token, "access-to-coop-page-from-opener"); - assert_equals(report.type, "coop"); - assert_equals(report.url, openee_url.replace(/"/g, '%22')); - assert_equals(report.body.disposition, "reporting"); - assert_equals(report.body.effectivePolicy, "restrict-properties"); - assert_equals(report.body.property, "blur"); - assert_source_location_missing(report); - assert_equals(report.body.openerURL, opener_url); - assert_equals(report.body.openeeURL, undefined); - assert_equals(report.body.otherDocumentURL, undefined); - assert_equals(report.body.referrer, opener_url); - assert_equals(report.body.initialPopupURL, undefined); -}, "access-reporting-openee-rp-ro"); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html deleted file mode 100644 index 9e1e85b16a5..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html +++ /dev/null @@ -1,71 +0,0 @@ -<!doctype html> -<title> - COOP reports are sent to the opener when the opener used COOP-RO: - restrict-properties and its same-origin openee tries to access it. -</title> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script> -<script> - -const directory = "/html/cross-origin-opener-policy"; -const same_origin = get_host_info().HTTPS_ORIGIN; - -promise_test(async t => { - // The test window. - const this_window_token = token(); - - // The "opener" window. This has COOP and a reporter. - const opener_report_token= token(); - const opener_token = token(); - const opener_reportTo = reportToHeaders(opener_report_token); - const opener_url = same_origin + executor_path + opener_reportTo.header + - opener_reportTo.coopReportOnlyRestrictPropertiesHeader + - `&uuid=${opener_token}`; - - // The "openee" window. This is same origin with the "opener". - const openee_report_token= token(); - const openee_token = token(); - const openee_url = same_origin + executor_path + `&uuid=${openee_token}`; - - // 1. Create the opener window. - let opener_window_proxy = window.open(opener_url); - t.add_cleanup(() => send(opener_token, "window.close()")); - - // 2. The opener opens its openee. - send(opener_token, ` - openee = window.open("${openee_url}"); - send("${this_window_token}", "ACK 1"); - `); - assert_equals("ACK 1", await receive(this_window_token)); - t.add_cleanup(() => send(openee_token, "window.close()")); - - // 3. The openee tries to access its opener. - send(openee_token, addScriptAndTriggerOnload( - directory + "/reporting/resources/try-access.js", - "tryAccess(opener);") - ); - - // 4. Check a report sent to the opener. - let report = - await receiveReport(opener_report_token, "access-to-coop-page-from-openee"); - assert_equals(report.type, "coop"); - assert_equals(report.url, opener_url.replace(/"/g, '%22')); - assert_equals(report.body.disposition, "reporting"); - assert_equals(report.body.effectivePolicy, "restrict-properties"); - assert_equals(report.body.property, "blur"); - assert_source_location_missing(report); - assert_equals(report.body.openerURL, undefined); - assert_equals(report.body.openeeURL, openee_url); - assert_equals(report.body.otherDocumentURL, undefined); - assert_equals(report.body.referrer, undefined); - assert_equals(report.body.initialPopupURL, openee_url); -}, "access-reporting-opener-rp-ro"); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html deleted file mode 100644 index 5bc718e2a89..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html +++ /dev/null @@ -1,19 +0,0 @@ -<!doctype html> -<title> Check openee.postMessage() access is allowed for COOP: restrict-properties</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/test-access-property.js"></script> -<script> - -testAccessProperty( - "postMessage", - w => w.postMessage("message", "*"), - expectReport = false, - use_restrict_properties = true -); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html deleted file mode 100644 index e5c87751748..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html +++ /dev/null @@ -1,65 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -promise_test(async t => { - const popup_token = token(); - const second_popup_token = token(); - const reply_token = token(); - - const unsafe_none_url = getExecutorPath( - popup_token, - SAME_ORIGIN.origin, - { coop: "unsafe-none"}); - - const restrict_properties_url = getExecutorPath( - second_popup_token, - SAME_ORIGIN.origin, - { coop: "restrict-properties"}); - - // We open popup and then ping it, it will respond after loading. - const popup = window.open(unsafe_none_url); - send(popup_token, `send('${reply_token}', 'Popup loaded');`); - assert_equals(await receive(reply_token), 'Popup loaded'); - - // Make sure the popup will be closed once the test has run, keeping a clean - // state. - t.add_cleanup(() => { - send(popup_token, `close()`); - }); - - // Now navigate this popup to a restrict-properties page. - send(popup_token, `document.location = '${restrict_properties_url}'`); - send(second_popup_token, `send('${reply_token}', 'Popup loaded');`); - assert_equals(await receive(reply_token), 'Popup loaded'); - - // Navigate again to the original page. - send(second_popup_token, `document.location = '${unsafe_none_url}'`); - send(popup_token, `send('${reply_token}', 'Popup loaded');`); - assert_equals(await receive(reply_token), 'Popup loaded'); - - // Give some time for things to settle across processes etc. before - // proceeding with verifications. - await new Promise(resolve => { t.step_timeout(resolve, 500); }); - - // Verify that we have full access to the popup. - assert_false(popup.closed, 'Popup is closed from opener?'); - assert_true(await getPopupHasOpener(popup_token) === "true", - 'Popup has nulled opener?'); - assert_true(canAccessProperty(popup, "document"), - 'Main page has dom access to the popup?'); - assert_true(canAccessProperty(popup, "frames"), - 'Main page has cross origin access to the popup?'); - -}, "COOP: restrict-properties has no impact in a navigation chain between " + - "multiple unsafe-none pages."); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers deleted file mode 100644 index 073ce7adfbd..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: unsafe-none diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js deleted file mode 100644 index 1247400a4e3..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js +++ /dev/null @@ -1,144 +0,0 @@ -// META: script=/common/get-host-info.sub.js -// META: script=/common/utils.js -// META: script=/common/dispatcher/dispatcher.js - -const executor_path = '/common/dispatcher/executor.html?pipe='; -const cross_origin = get_host_info().OTHER_ORIGIN; -const same_origin = get_host_info().ORIGIN; -const coep_require_corp_header = - '|header(Cross-Origin-Embedder-Policy,require-corp)'; -const corp_cross_origin_header = - '|header(Cross-Origin-Resource-Policy,cross-origin)'; -const coop_restrict_properties_header = - '|header(Cross-Origin-Opener-Policy,restrict-properties)'; - -function iframePopupAboutBlankTest( - origin, {expectedCrossOriginIsolated}, description) { - promise_test(async t => { - assert_true(crossOriginIsolated, 'Is main frame crossOriginIsolated?'); - assert_true( - 'SharedArrayBuffer' in globalThis, - 'Is SharedArrayBuffer defined in main frame?'); - - const reply_token = token(); - const iframe_token = token(); - - const iframe = document.createElement('iframe'); - iframe.src = origin + executor_path + coep_require_corp_header + - corp_cross_origin_header + `&uuid=${iframe_token}`; - document.body.appendChild(iframe); - - send(iframe_token, `send('${reply_token}', 'Iframe loaded');`); - assert_equals(await receive(reply_token), 'Iframe loaded'); - - send(iframe_token, ` - window.popup = window.open(); - send('${reply_token}', popup === null); - `); - assert_equals(await receive(reply_token), 'false', 'Is popup handle null?'); - - send( - iframe_token, - `send('${reply_token}', popup.window.crossOriginIsolated);`); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is popup crossOriginIsolated?'); - - send(iframe_token, ` - send('${reply_token}', 'SharedArrayBuffer' in popup.window.globalThis); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is SharedArrayBuffer defined in popup?'); - - // Test whether the popup's subframe is crossOriginIsolated - const popup_iframe_token = token(); - const popup_iframe_src = origin + executor_path + coep_require_corp_header + - corp_cross_origin_header + `&uuid=${popup_iframe_token}`; - send(iframe_token, ` - const iframe = window.popup.document.createElement('iframe'); - iframe.src = '${popup_iframe_src}'; - popup.document.body.appendChild(iframe); - `); - - send(popup_iframe_token, ` - send('${reply_token}', 'Iframe in popup loaded'); - `); - assert_equals(await receive(reply_token), 'Iframe in popup loaded'); - - send(popup_iframe_token, ` - send('${reply_token}', crossOriginIsolated); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is iframe in popup crossOriginIsolated?'); - - send(popup_iframe_token, ` - send('${reply_token}', 'SharedArrayBuffer' in globalThis); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is SharedArrayBuffer defined in iframe in popup?'); - - // Test whether a nested iframe is crossOriginIsolated - const popup_nested_iframe_token = token(); - const popup_nested_iframe_src = origin + executor_path + - coep_require_corp_header + corp_cross_origin_header + - `&uuid=${popup_nested_iframe_token}`; - send(iframe_token, ` - blank_iframe = popup.document.createElement('iframe'); - blank_iframe.src = ''; - popup.document.body.appendChild(blank_iframe); - nested_iframe = - blank_iframe.contentDocument.createElement('iframe'); - nested_iframe.src = '${popup_nested_iframe_src}'; - blank_iframe.contentDocument.body.appendChild(nested_iframe); - `); - - send(popup_nested_iframe_token, ` - send('${reply_token}', 'Nested iframe in popup loaded'); - `); - assert_equals(await receive(reply_token), 'Nested iframe in popup loaded'); - - send(popup_nested_iframe_token, ` - send('${reply_token}', crossOriginIsolated); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is nested iframe in popup crossOriginIsolated?'); - - send(popup_nested_iframe_token, ` - send('${reply_token}', 'SharedArrayBuffer' in globalThis); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is SharedArrayBuffer defined in nested iframe in popup?'); - - // Navigate the popup out of the initial empty document, with COOP:RP and - // COEP: require-corp. Expect to be crossOriginIsolated. - const popup_token = token(); - const popup_src = origin + executor_path + coop_restrict_properties_header + - coep_require_corp_header + `&uuid=${popup_token}`; - send(iframe_token, `popup.window.location = '${popup_src}';`); - - send(popup_token, `send('${reply_token}', 'Popup loaded');`); - assert_equals(await receive(reply_token), 'Popup loaded'); - - send(popup_token, `send('${reply_token}', crossOriginIsolated);`); - assert_equals( - await receive(reply_token), 'true', - 'Is popup crossOriginIsolated after navigation?'); - - send(popup_token, ` - send('${reply_token}', 'SharedArrayBuffer' in globalThis); - `); - assert_equals( - await receive(reply_token), 'true', - 'Is SharedArrayBuffer defined in popup after navigation?'); - }, description); -} - -iframePopupAboutBlankTest( - cross_origin, {expectedCrossOriginIsolated: false}, 'Cross-origin iframe'); -iframePopupAboutBlankTest( - same_origin, {expectedCrossOriginIsolated: true}, 'Same-origin iframe'); diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers deleted file mode 100644 index 19d0dbe4e18..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties -Cross-Origin-Embedder-Policy: require-corp diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html deleted file mode 100644 index 8cf2679e190..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html +++ /dev/null @@ -1,94 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<meta name="variant" content="?1-1"> -<meta name="variant" content="?2-2"> -<meta name="variant" content="?3-3"> -<meta name="variant" content="?4-4"> -<meta name="variant" content="?5-5"> -<meta name="variant" content="?6-6"> -<meta name="variant" content="?7-7"> -<meta name="variant" content="?8-8"> -<meta name="variant" content="?9-last"> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/dispatcher/dispatcher.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src=/common/subset-tests.js></script> -<script src=/common/utils.js></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/iframe-test.js"></script> - -<body> -<script> - -// This document has COOP: restrict-properties. The popup has COOP: same-origin. -// Opening from an iframe should not be different from opening from the main -// frame and the opener should be severed. -[ - { - "title": "same origin iframe, same origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "same site iframe, same origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "cross origin iframe, same origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "same origin iframe, same site popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "same site iframe, same site popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "cross origin iframe, same site popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "same origin iframe, cross origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - }, - { - "title": "same site iframe, cross origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - }, - { - "title": "cross origin iframe, cross origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - } -].forEach(variant => { - subsetTest( - iframe_test, - `COOP: restrict-properties to popup COOP: same-origin via an iframe, ` + - `with ${variant.title}`, - variant.iframeOrigin, - variant.popupOrigin, - { coop: 'same-origin' }, - variant.opener); -}); -</script> -</body> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html deleted file mode 100644 index f3af3ca7db1..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html +++ /dev/null @@ -1,91 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<meta name="variant" content="?1-2"> -<meta name="variant" content="?3-4"> -<meta name="variant" content="?5-6"> -<meta name="variant" content="?7-8"> -<meta name="variant" content="?9-last"> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/dispatcher/dispatcher.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src=/common/subset-tests.js></script> -<script src=/common/utils.js></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/iframe-test.js"></script> - -<body> -<script> - - -// This document has COOP: restrict-properties. The popup has COOP: -// same-origin-allow-popups. Opening from an iframe should not be different from -// opening from the main frame and the opener should be severed. -[ - { - "title": "same origin iframe, same origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "same site iframe, same origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "cross origin iframe, same origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "same origin iframe, same site popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "same site iframe, same site popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "cross origin iframe, same site popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "same origin iframe, cross origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - }, - { - "title": "same site iframe, cross origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - }, - { - "title": "cross origin iframe, cross origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - } -].forEach(variant => { - subsetTest( - iframe_test, - `COOP: restrict-properties to popup COOP: same-origin-allow-popups ` + - `via an iframe, with ${variant.title}`, - variant.iframeOrigin, - variant.popupOrigin, - { coop: 'same-origin-allow-popups' }, - variant.opener); -}); -</script> -</body> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html deleted file mode 100644 index 560dfd90511..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html +++ /dev/null @@ -1,90 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<meta name="variant" content="?1-2"> -<meta name="variant" content="?3-4"> -<meta name="variant" content="?5-6"> -<meta name="variant" content="?7-8"> -<meta name="variant" content="?9-last"> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/dispatcher/dispatcher.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src=/common/subset-tests.js></script> -<script src=/common/utils.js></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/iframe-test.js"></script> - -<body> -<script> - -// This document has COOP: restrict-properties. The popup has COOP: unsafe-none. -// Opening from an iframe should not be different from opening from the main -// frame and the opener should be severed. -[ - { - "title": "same origin iframe, same origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "restricted" - }, - { - "title": "same site iframe, same origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_ORIGIN, - "opener": "restricted" - }, - { - "title": "cross origin iframe, same origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "restricted" - }, - { - "title": "same origin iframe, same site popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "same site iframe, same site popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "cross origin iframe, same site popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "same origin iframe, cross origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - }, - { - "title": "same site iframe, cross origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - }, - { - "title": "cross origin iframe, cross origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - } -].forEach(variant => { - subsetTest( - iframe_test, - `COOP: restrict-properties to popup COOP: unsafe-none via an iframe, ` + - `with ${variant.title}`, - variant.iframeOrigin, - variant.popupOrigin, - { coop: 'unsafe-none' }, - variant.opener); -}); -</script> -</body> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html deleted file mode 100644 index 17840724d9e..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html +++ /dev/null @@ -1,91 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<meta name="variant" content="?1-2"> -<meta name="variant" content="?3-4"> -<meta name="variant" content="?5-6"> -<meta name="variant" content="?7-8"> -<meta name="variant" content="?9-last"> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/dispatcher/dispatcher.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src=/common/subset-tests.js></script> -<script src=/common/utils.js></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/iframe-test.js"></script> - -<body> -<script> - -// This document has COOP: restrict-properties. The popup has COOP: -// restrict-properties. Opening from an iframe should not be different from -// opening from the main frame and the opener should be restricted if -// cross-origin. -[ - { - "title": "same origin iframe, same origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "preserved" - }, - { - "title": "same site iframe, same origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_ORIGIN, - "opener": "preserved" - }, - { - "title": "cross origin iframe, same origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "preserved" - }, - { - "title": "same origin iframe, same site popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "same site iframe, same site popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "cross origin iframe, same site popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "same origin iframe, cross origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - }, - { - "title": "same site iframe, cross origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - }, - { - "title": "cross origin iframe, cross origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - } -].forEach(variant => { - subsetTest( - iframe_test, - `COOP: restrict-properties to popup COOP: restrict-properties via an ` + - `iframe, with ${variant.title}`, - variant.iframeOrigin, - variant.popupOrigin, - { coop: 'restrict-properties' }, - variant.opener); -}); -</script> -</body> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html deleted file mode 100644 index 10929847ee6..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html +++ /dev/null @@ -1,57 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> - -<script> - -async function createCoopRestrictPropertiesPopup(popupToken, name) { - const url = SAME_ORIGIN.origin + '/common/dispatcher/executor.html' + - `?uuid=${popupToken}` + - '&pipe=|header(Cross-Origin-Opener-Policy, restrict-properties)'; - const popup = window.open(url, name); - add_completion_callback(() => popup.close()); - - // Wait for the popup to be loaded. - const replyToken = token(); - send(popupToken, `send('${replyToken}', 'Done loading')`); - assert_equals(await receive(replyToken), 'Done loading'); - - return popup; -} - -promise_test(async t => { - // Start by opening a first COOP: restrict-properties popup. No name is set to - // begin with. - const popupToken1 = token(); - const popup1 = await createCoopRestrictPropertiesPopup(popupToken1, ''); - - // Once the popup is live, explicitly set a name. - const name = token(); - send(popupToken1, `window.name = '${name}'`); - - // To make sure this name has been propagated to other processes, send a dummy - // message from the popup to the main page, and wait for it to be received. - // It should be delivered after the name change is replicated. - const message_waiter = new Promise(resolve => { - onmessage = (event) => { - if (event.data == 'Waited enough') { resolve(); } - } - }); - send(popupToken1, `opener.postMessage('Waited enough', '*')`); - await message_waiter; - - // Finally, call window.open with the same name. This should not resolve - // across browsing context groups, and create a brand new popup. - const popupToken2 = token(); - const popup2 = await createCoopRestrictPropertiesPopup(popupToken2, name); - assert_not_equals(popup1, popup2, - 'Named targeting resolved across isolation boundaries'); - -}, 'Verify that named targeting does not work across isolation boundaries.'); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html deleted file mode 100644 index e5313a6e222..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "severed", - "origin": SAME_ORIGIN - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "severed", - "origin": SAME_SITE - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "severed", - "origin": CROSS_ORIGIN - } -].forEach(variant => { - popup_test(`${variant.origin.name} ${variant.title}`, variant.origin, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers deleted file mode 100644 index 46ad58d83bf..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: same-origin diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html deleted file mode 100644 index 595a10a84bb..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_ORIGIN - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_SITE - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": CROSS_ORIGIN - } -].forEach(variant => { - popup_test(`${variant.origin.name} ${variant.title}`, variant.origin, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers deleted file mode 100644 index d83ed86fb9b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: same-origin-allow-popups diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html deleted file mode 100644 index 595a10a84bb..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_ORIGIN - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_SITE - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": CROSS_ORIGIN - } -].forEach(variant => { - popup_test(`${variant.origin.name} ${variant.title}`, variant.origin, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html deleted file mode 100644 index 595a10a84bb..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_ORIGIN - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_SITE - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": CROSS_ORIGIN - } -].forEach(variant => { - popup_test(`${variant.origin.name} ${variant.title}`, variant.origin, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers deleted file mode 100644 index 073ce7adfbd..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: unsafe-none diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html deleted file mode 100644 index a84d52584e9..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html +++ /dev/null @@ -1,44 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with empty coop", - "coop": "", - "opener": "restricted" - }, - { - "title": "popup with coop unsafe-none", - "coop": "unsafe-none", - "opener": "restricted" - }, - { - "title": "popup with coop same-origin", - "coop": "same-origin", - "opener": "severed" - }, - { - "title": "popup with coop same-origin-allow-popups", - "coop": "same-origin-allow-popups", - "opener": "severed" - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted" - } -].forEach(variant => { - popup_test(`Cross-origin ${variant.title}`, CROSS_ORIGIN, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html deleted file mode 100644 index c0020fa23a4..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html +++ /dev/null @@ -1,44 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with empty coop", - "coop": "", - "opener": "restricted" - }, - { - "title": "popup with coop unsafe-none", - "coop": "unsafe-none", - "opener": "restricted" - }, - { - "title": "popup with coop same-origin", - "coop": "same-origin", - "opener": "severed" - }, - { - "title": "popup with coop same-origin-allow-popups", - "coop": "same-origin-allow-popups", - "opener": "severed" - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "preserved" - } -].forEach(variant => { - popup_test(`Same-origin ${variant.title}`, SAME_ORIGIN, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html deleted file mode 100644 index 7d115ac7e63..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html +++ /dev/null @@ -1,44 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with empty coop", - "coop": "", - "opener": "restricted" - }, - { - "title": "popup with coop unsafe-none", - "coop": "unsafe-none", - "opener": "restricted" - }, - { - "title": "popup with coop same-origin", - "coop": "same-origin", - "opener": "severed" - }, - { - "title": "popup with coop same-origin-allow-popups", - "coop": "same-origin-allow-popups", - "opener": "severed" - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted" - } -].forEach(variant => { - popup_test(`Same-site ${variant.title}`, SAME_SITE, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html deleted file mode 100644 index 9bc171a269c..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html +++ /dev/null @@ -1,62 +0,0 @@ -<!doctype html> -<title> - Verify that we consider browsing context group reuse for COOP reporting. -</title> -<meta name="timeout" content="long"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script - src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=f1e361ab5854f2dcfe0224b19bc53199&report_only_id=b6fe666b74547291d52d72790adde05c"></script> -<script> - -const same_origin = get_host_info().HTTPS_ORIGIN; -const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN; - -promise_test(async test => { - // To receive reports use the same hard-coded value as the one passed in the - // headers and to "reporting-common.js". - const report_token = "b6fe666b74547291d52d72790adde05c"; - const reportTo = reportToHeaders(report_token); - - // 1. Open a popup without any COOP. It should be in a - // different virtual browsing context group. - const opener_token = token(); // For this window. - const initial_openee_token = token(); - const initial_openee_url = cross_origin + executor_path + - `&uuid=${initial_openee_token}`; - let openee = window.open(initial_openee_url); - - // 2. Navigate the openee to a COOP-RO: restrict-properties page. If the - // policy was enforced, it would live in the same browsing context group as - // this page. The virtual browsing context group should similarly be equal. - // Note: We omit the reporting endpoint header, because it is not possible to - // easily escape it. Since it is not necessary in this test, we skip it. - const final_openee_token = token(); - const final_openee_url = same_origin + executor_path + - reportTo.coopReportOnlyRestrictPropertiesHeader + - `&uuid=${final_openee_token}`; - - send(initial_openee_token, `location.href = '${final_openee_url}';`); - test.add_cleanup(() => send(final_openee_token, "window.close()")); - - // Wait for the final openee to load. - send(final_openee_token, - `send("${opener_token}", "Ready"); - `); - assert_equals(await receive(opener_token), "Ready"); - - // 3. Try to access the openee from the opener. No report should be sent. - tryAccess(openee); - - let report = - await receiveReport(report_token, "access-from-coop-page-to-openee") - assert_equals(report, "timeout"); - -}, "access-reporting-browsing-context-group-reuse"); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers deleted file mode 100644 index 33abadd83dd..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint" -Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=f1e361ab5854f2dcfe0224b19bc53199", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=b6fe666b74547291d52d72790adde05c" diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html deleted file mode 100644 index b89030f218f..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html +++ /dev/null @@ -1,55 +0,0 @@ -<!doctype html> -<meta name=timeout content=long> -<title>Opening a restrict-properties</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script - src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=fb054dadb3a9ec17b5cd5c0152d2a7dd&report_only_id=c265b07fbb3bffa2cd2a5179d686ced2"></script> - -<script> - -let tests = [ - // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports - - // Open a same-origin popup with COOP unsafe-none, which mismatches with the - // current document (opener) COOP report-only (restrict-properties) values. - [ - SAME_ORIGIN, - "unsafe-none", - "", - "", - "", - [] - ], - - // Open a cross-origin popup with COOP unsafe-none, which mismatches with the - // current document (opener) COOP report-only (restrict-properties) values. - [ - CROSS_ORIGIN, - "unsafe-none", - "", - "", - "", - [] - ], - - // Open a same-origin popup with COOP restrict-properties, which matches with - // the current document (opener) COOP report-only (restrict-properties) value. - [ - SAME_ORIGIN, - "restrict-properties", - "", - "", - "", - [] - ], -]; - -runNavigationReportingTests(document.title, tests); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers deleted file mode 100644 index 07ecad96f24..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint" -Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fb054dadb3a9ec17b5cd5c0152d2a7dd", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c265b07fbb3bffa2cd2a5179d686ced2" diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html deleted file mode 100644 index 6b31f7e0098..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html +++ /dev/null @@ -1,55 +0,0 @@ -<!doctype html> -<meta name=timeout content=long> -<title>Opening a restrict-properties</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script - src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=ed5a8be35e4e21c2ba960e6574e0a32c&report_only_id=fa22ddc676642edae42c75defb82ba2e"></script> - -<script> - -let tests = [ - // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports - - // Open a same-origin popup with COOP unsafe-none, which mismatches - // with the current document (opener) COOP (restrict-properties) values. - [ - SAME_ORIGIN, - "unsafe-none", - "", - "", - "", - [] - ], - - // Open a cross-origin popup with COOP unsafe-none, which mismatches - // with the current document (opener) COOP (restrict-properties) values. - [ - CROSS_ORIGIN, - "unsafe-none", - "", - "", - "", - [] - ], - - // Open a same-origin popup with COOP restrict-properties, which matches with - // the current document (opener) COOP (restrict-properties) value. - [ - SAME_ORIGIN, - "restrict-properties", - "", - "", - "", - [] - ], -]; - -runNavigationReportingTests(document.title, tests); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers deleted file mode 100644 index a61e2919c8a..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties; report-to="coop-report-endpoint" -Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=ed5a8be35e4e21c2ba960e6574e0a32c", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fa22ddc676642edae42c75defb82ba2e" diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html deleted file mode 100644 index c47e59cd8f1..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html +++ /dev/null @@ -1,43 +0,0 @@ -<!doctype html> -<meta name=timeout content=long> -<title>reporting same origin with report-to</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> - -<script> - -let tests = [ - // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports - - // Open a same-origin popup with COOP report-only restrict-properties, which - // mismatches with the current document (opener) COOP (unsafe-none). - [ - SAME_ORIGIN, - "", - "", - `restrict-properties; report-to="${popupReportOnlyEndpoint.name}"`, - "", - [] - ], - - // Open a cross-origin popup with COOP report-only restrict-properties, which - // mismatches with the current document (opener) COOP (unsafe-none). - [ - CROSS_ORIGIN, - "", - "", - `restrict-properties; report-to="${popupReportOnlyEndpoint.name}"`, - "", - [] - ], -]; - -runNavigationReportingTests(document.title, tests); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers deleted file mode 100644 index 16903320bb5..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy: unsafe-none -Referrer-Policy: origin diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html deleted file mode 100644 index ff60e8c5afd..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html +++ /dev/null @@ -1,43 +0,0 @@ -<!doctype html> -<meta name=timeout content=long> -<title>reporting same origin with report-to</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> - -<script> - -let tests = [ - // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports - - // Open a same-origin popup with COOP report-only restrict-properties, which - // mismatches with the current document (opener) COOP (unsafe-none). - [ - SAME_ORIGIN, - `restrict-properties; report-to="${popupReportEndpoint.name}"`, - "", - "", - "", - [] - ], - - // Open a cross-origin popup with COOP report-only restrict-properties, which - // mismatches with the current document (opener) COOP (unsafe-none). - [ - CROSS_ORIGIN, - `restrict-properties; report-to="${popupReportEndpoint.name}"`, - "", - "", - "", - [] - ], -]; - -runNavigationReportingTests(document.title, tests); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers deleted file mode 100644 index 16903320bb5..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy: unsafe-none -Referrer-Policy: origin diff --git a/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml b/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml new file mode 100644 index 00000000000..4700eca4a12 --- /dev/null +++ b/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: writingsuggestions + files: "**" diff --git a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html index b177f47b757..5042557212e 100644 --- a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html +++ b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html @@ -1,8 +1,8 @@ <!doctype html> <html> <body> -<div style="width: 1em; color: white; background-color: black;"> - <marquee loop="1" behavior="alternate">m</marquee> +<div style="vertical-align: text-bottom; display: inline-block;"> + <div style="width: 10px; height: 10px; background-color: green;"></div> </div> </body> </html> diff --git a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html index 57f49850321..f16c58bb85d 100644 --- a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html +++ b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html @@ -1,12 +1,12 @@ <!doctype html> <html> <head> -<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'"> -<link rel="match" href="marquee-with-trusted-types-ref.html"> + <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'"> + <link rel="match" href="marquee-with-trusted-types-ref.html"> </head> <body> -<div style="width: 1em; color: white; background-color: black;"> - <marquee loop="1" behavior="alternate">m</marquee> -</div> +<marquee scrollamount="0"> + <div style="width: 10px; height: 10px; background-color: green;"></div> +</marquee> </body> </html> diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-hit-test-during-load-event-crash.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-hit-test-during-load-event-crash.html new file mode 100644 index 00000000000..f668fc51573 --- /dev/null +++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-hit-test-during-load-event-crash.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<div style="visibility: hidden;"> + <iframe id="iframe"></iframe> +</div> +<script> + window.addEventListener("load", _ => + iframe.contentDocument.elementFromPoint(0, 0) + ); +</script> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html new file mode 100644 index 00000000000..57ea51e367c --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<link rel=stylesheet href="resources/customizable-select-in-page.css"> +<link rel=stylesheet href="../customizable-select/resources/customizable-select-styles.css"> +<script src="resources/customizable-select-in-page.js"></script> + +<div class=customizable-select-in-page size=4> + <div class="customizable-select-option selected">select multiple</div> + <div class=customizable-select-option>two</div> + <div class=customizable-select-option>three</div> +</div> + +<div class=customizable-select-in-page size=4> + <div class="customizable-select-option selected">select size=4</div> + <div class=customizable-select-option>two</div> + <div class=customizable-select-option>three</div> +</div> + +<div class="customizable-select-in-page disabled" size=4> + <div class="customizable-select-option selected">select disabled</div> + <div class=customizable-select-option>two</div> + <div class=customizable-select-option>three</div> + <div class=customizable-select-option>disabled</div> +</div> + +<!-- TODO(crbug.com/407801061): Fix padding and remove this div. --> +<div style="position: absolute; top: 150px"> + +<div class=customizable-select-in-page size=4> + <div class="customizable-select-option selected">with disabled option</div> + <div class=customizable-select-option>two</div> + <div class=customizable-select-option>three</div> + <div class="customizable-select-option disabled">disabled</div> +</div> + +<div class=customizable-select-in-page size=4> + <div class=customizable-select-legend>optgroup</div> + <div class=customizable-select-option>option in optgroup</div> + <div class=customizable-select-option>option out of optgroup</div> +</div> + +<div class=customizable-select-in-page size=4> + <div class="customizable-select-legend disabled">disabled optgroup</div> + <div class="customizable-select-option disabled">option in optgroup</div> + <div class=customizable-select-option>option out of optgroup</div> +</div> + +<script> +updateCustomizableSelectInPageSize(); +</script> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html new file mode 100644 index 00000000000..b3bf75eb0ff --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/357649033"> +<link rel=match href="customizable-select-in-page-appearance-ref.html"> + +<style> +select { + appearance: base-select; +} +</style> + +<select multiple> + <option selected>select multiple</option> + <option>two</option> + <option>three</option> +</select> + +<select size=4> + <option selected>select size=4</option> + <option>two</option> + <option>three</option> +</select> + +<select size=4 disabled> + <option selected>select disabled</option> + <option>two</option> + <option>three</option> + <option disabled>disabled</option> +</select> + +<!-- TODO(crbug.com/407801061): Fix padding and remove this div. --> +<div style="position: absolute; top: 150px"> + +<select size=4> + <option selected>with disabled option</option> + <option>two</option> + <option>three</option> + <option disabled>disabled</option> +</select> + +<select size=4> + <optgroup> + <legend>optgroup</legend> + <option>option in optgroup</option> + </optgroup> + <option>option out of optgroup</option> +</select> + +<select size=4> + <optgroup disabled> + <legend>disabled optgroup</legend> + <option>option in optgroup</option> + </optgroup> + <option>option out of optgroup</option> +</select> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html new file mode 100644 index 00000000000..24e6e39ea48 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html @@ -0,0 +1,192 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/357649033"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> + +<style> +select { + appearance: base-select; +} +</style> + +<button id=beforemultiple>button before multiple</button> +<select multiple> + <option class=one>one</option> + <option class=two>two</option> + <option class=disabled disabled>disabled</option> +</select> + +<button id=beforesize>button before size=4</button> +<select size=4> + <option class=one>one</option> + <option class=two>two</option> + <option class=disabled disabled>disabled</option> +</select> + +<script> +const tabKey = '\uE004'; +const enterKey = '\uE007'; +const spaceKey = '\uE00D'; +const arrowUp = '\uE013'; +const arrowDown = '\uE015'; +function pressKey(keyCode) { + return (new test_driver.Actions() + .keyDown(keyCode) + .keyUp(keyCode)) + .send(); +} + +promise_test(async () => { + const select = document.querySelector('select[multiple]'); + const optionOne = select.querySelector('.one'); + const optionTwo = select.querySelector('.two'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected at the start of the test.'); + + beforemultiple.focus(); + await pressKey(tabKey); + assert_equals(document.activeElement, optionOne, + 'The first option should get focus when keyboard focusing into a select.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionOne, + 'Focus should not be moved after pressing space.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after the first space.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should be selected after the first space.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after arrow down.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionTwo, + 'Disabled option should not be focusable.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after second space.'); + assert_equals(select.selectedOptions.length, 2, + 'Two options should be selected after second space.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after second space.'); + assert_equals(select.selectedOptions[1], optionTwo, + 'Second option should be selected after second space.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after third space.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after third space.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after third space.'); + + await pressKey(enterKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after first enter.'); + assert_equals(select.selectedOptions.length, 2, + 'Two options should be selected after first enter.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after first enter.'); + assert_equals(select.selectedOptions[1], optionTwo, + 'Second option should be selected after first enter.'); + + await pressKey(enterKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after second enter.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after second enter.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after second enter.'); + + await pressKey(arrowUp); + assert_equals(document.activeElement, optionOne, + 'First option should be focused after arrow up.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after arrow up.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after arrow up.'); +}, 'Keyboard behavior for base appearance <select multiple>'); + +promise_test(async () => { + const select = document.querySelector('select[size]'); + const optionOne = select.querySelector('.one'); + const optionTwo = select.querySelector('.two'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected at the start of the test.'); + + beforesize.focus(); + await pressKey(tabKey); + assert_equals(document.activeElement, optionOne, + 'The first option should get focus when keyboard focusing into a select.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionOne, + 'Focus should not be moved after pressing space.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after the first space.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should be selected after the first space.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after arrow down.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionTwo, + 'Disabled option should not be focusable.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after second space.'); + assert_equals(select.selectedOptions.length, 1, + 'One options should be selected after second space.'); + assert_equals(select.selectedOptions[0], optionTwo, + 'Second option should be selected after second space.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after third space.'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected after third space.'); + + await pressKey(enterKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after first enter.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after first enter.'); + assert_equals(select.selectedOptions[0], optionTwo, + 'Second option should be selected after first enter.'); + + await pressKey(enterKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after second enter.'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected after second enter.'); + + await pressKey(arrowUp); + assert_equals(document.activeElement, optionOne, + 'First option should be focused after arrow up.'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected after arrow up.'); +}, 'Keyboard behavior for base appearance <select size=4>'); + +promise_test(async () => { + document.body.focus(); + + const selectMultiple = document.querySelector('select[multiple]'); + selectMultiple.focus(); + assert_not_equals(document.activeElement, selectMultiple, '<select multiple>'); + + const selectSize = document.querySelector('select[size]'); + selectSize.focus(); + assert_not_equals(document.activeElement, selectSize, '<select size=4>'); +}, 'Base appearance in-page selects should not be focusable.'); + +// TODO(crbug.com/357649033): Test tab key while focused on an option after deciding behavior. +</script> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html new file mode 100644 index 00000000000..d5b93693cf7 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html @@ -0,0 +1,129 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/357649033"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> + +<style> +select { + appearance: base-select; +} +</style> + +<select multiple> + <option class=one>one</option> + <option class=two>two</option> + <option class=disabled disabled>disabled</option> +</select> + +<select size=4> + <option class=one>one</option> + <option class=two>two</option> + <option class=disabled disabled>disabled</option> +</select> + +<script> +function click(element) { + return (new test_driver.Actions() + .pointerMove(1, 1, {origin: element}) + .pointerDown() + .pointerUp()) + .send(); +} + +function touch(element) { + return (new test_driver.Actions() + .addPointer('finger', 'touch') + .pointerMove(1, 1, {origin: element, sourceName: 'finger'}) + .pointerDown({sourceName: 'finger'}) + .pointerUp({sourceName: 'finger'})) + .send(); +} + +['mouse', 'touch'].forEach(inputType => { + const activate = inputType == 'touch' ? touch : click; + + promise_test(async () => { + const select = document.querySelector('select[multiple]'); + select.value = null; + select.removeAttribute('disabled'); + const optionOne = select.querySelector('.one'); + const optionTwo = select.querySelector('.two'); + const disabledOption = select.querySelector('.disabled'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected at the start of the test.'); + + await activate(optionOne); + assert_equals(select.selectedOptions.length, 1, + 'There should be one selected option after first click.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Option one should be selected after first click.'); + + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 2, + 'There should be two selected options after second click.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Option one should stay selected after second click.'); + assert_equals(select.selectedOptions[1], optionTwo, + 'Option two should be seleted after second click.'); + + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 1, + 'There should be one selected option after third click.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Option one should stay selected after third click.'); + + await activate(disabledOption); + assert_equals(select.selectedOptions.length, 1, + 'Disabled option should not be checkable.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Disabled option should not be checkable.'); + + select.setAttribute('disabled', ''); + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 1, + 'Disabled select should not have checkable options.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Disabled select should not have checkable options.'); + }, `${inputType}: input behavior for base appearance <select multiple>`); + + promise_test(async () => { + const select = document.querySelector('select[size]'); + select.value = null; + select.removeAttribute('disabled'); + const optionOne = select.querySelector('.one'); + const optionTwo = select.querySelector('.two'); + const disabledOption = select.querySelector('.disabled'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected at the start of the test.'); + + await activate(optionOne); + assert_equals(select.selectedOptions.length, 1, + 'There should be one selected option after first click.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Option one should be selected after first click.'); + + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 1, + 'There should be one selected option after second click.'); + assert_equals(select.selectedOptions[0], optionTwo, + 'Option two should be selected after second click.'); + + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 0, + 'There should be no selected options after third click.'); + + await activate(disabledOption); + assert_equals(select.selectedOptions.length, 0, + 'Disabled option should not be checkable.'); + + select.setAttribute('disabled', ''); + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 0, + 'Disabled select should not have checkable options.'); + }, `${inputType}: input behavior for base appearance <select size=4>`); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css new file mode 100644 index 00000000000..deb080b4756 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css @@ -0,0 +1,14 @@ +.customizable-select-in-page { + display: inline-block; + border: 1px solid; + overflow-inline: hidden; + overflow-block: scroll; +} + +.customizable-select-in-page.disabled { + color: color-mix(in lab, currentColor 50%, transparent); +} + +.customizable-select-in-page:not(.disabled) .customizable-select-legend.disabled { + color: color-mix(in lab, currentColor 50%, transparent); +} diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js new file mode 100644 index 00000000000..13230943321 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js @@ -0,0 +1,13 @@ +function updateCustomizableSelectInPageSize() { + document.querySelectorAll('.customizable-select-in-page').forEach(select => { + const size = Number(select.getAttribute('size')); + if (size) { + let optionHeight = 0; + select.querySelectorAll('.customizable-select-option').forEach(option => { + const rect = option.getBoundingClientRect(); + optionHeight = Math.max(optionHeight, rect.height); + }); + select.style.height = (optionHeight * size) + 'px'; + } + }); +} diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html deleted file mode 100644 index 45a74da7559..00000000000 --- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<select multiple> - <option>one</option> - <option>two div button</option> -</select> - -<select multiple size=2> - <option>one</option> - <option>two</option> - <option>three</option> - <option>four</option> -</select> - -<select multiple> - <option selected>option</option> -</select> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html deleted file mode 100644 index 48673b446bc..00000000000 --- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<html class=reftest-wait> -<link rel=author href="mailto:jarhar@chromium.org"> -<link rel=match href="select-multiple-base-appearance-ref.html"> - -<style> -select, ::picker(select) { - appearance: base-select; -} -</style> - -<select multiple> - <option>one</option> - <option> - two - <div>div</div> - <button>button</button> - </option> -</select> - -<select multiple size=2> - <option>one</option> - <option>two</option> - <option>three</option> - <option>four</option> -</select> - -<select id=needsmultiple> - <option selected>option</option> -</select> - -<script> -requestAnimationFrame(() => { - document.getElementById('needsmultiple').setAttribute('multiple', ''); - requestAnimationFrame(() => { - document.documentElement.classList.remove('reftest-wait'); - }); -}); -</script> diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html index 1e000866099..5afb407640b 100644 --- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html +++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html @@ -48,11 +48,9 @@ } } - async_test((t) => { - window.onload = async () => { - await assert_focus_order([before,within1,after1,dialog2,within2,after2, - within3,after3,dialog4,within4,after4]); - t.done(); - }; + promise_test(async () => { + await new Promise(resolve => window.onload = resolve); + await assert_focus_order([before,within1,after1,dialog2,within2,after2, + within3,after3,dialog4,within4,after4]); }, "The dialog element itself should not be keyboard focusable."); </script> diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html index 9a9c87167d5..6555f1b43bd 100644 --- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html +++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html @@ -35,14 +35,8 @@ function openDialog(openMethod) { assert_true(dialog.matches(':open')); assert_equals(dialog.matches(':modal'),openMethod === 'modal'); } -function getSignal(t) { - const controller = new AbortController(); - const signal = controller.signal; - t.add_cleanup(() => controller.abort()); - return signal; -} -async function setup(t,closedby) { +function setup(t,closedby) { t.add_cleanup(() => { dialog.close(); dialog.removeAttribute('closedby'); @@ -52,16 +46,14 @@ async function setup(t,closedby) { if (closedby) { dialog.setAttribute('closedby',closedby); } - // Be sure any pending close events (from prior test cleanups) get fired. - await waitForRender(); - return getSignal(t); + return t.get_signal(); } ['modeless','modal','open'].forEach(openMethod => { [null,'any','closedrequest','none'].forEach(closedby => { const testDescription = `for ${openMethod} dialog with closedby=${closedby}`; promise_test(async (t) => { - await setup(t,closedby); + setup(t,closedby); openDialog(openMethod); dialog.requestClose(); assert_false(dialog.open); @@ -69,25 +61,35 @@ async function setup(t,closedby) { },`requestClose basic behavior ${testDescription}`); promise_test(async (t) => { - const signal = await setup(t,closedby); + const signal = setup(t,closedby); let events = []; + const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers(); dialog.addEventListener('cancel',() => events.push('cancel'),{signal}); - dialog.addEventListener('close',() => events.push('close'),{signal}); + dialog.addEventListener('close',() => { + events.push('close'); + hasClosed(); + },{signal}); openDialog(openMethod); assert_array_equals(events,[]); dialog.requestClose(); assert_false(dialog.open); assert_false(dialog.matches(':open')); assert_array_equals(events,['cancel'],'close is scheduled'); - await waitForRender(); + await untilFullyClosed; assert_array_equals(events,['cancel','close']); },`requestClose fires both cancel and close ${testDescription}`); promise_test(async (t) => { - const signal = await setup(t,'none'); + const signal = setup(t,'none'); let events = []; + const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers(); + const { promise: untilFullyClosedAgain, resolve: hasClosedAgain } = Promise.withResolvers(); + const closeResolvers = [hasClosed, hasClosedAgain]; dialog.addEventListener('cancel',() => events.push('cancel'),{signal}); - dialog.addEventListener('close',() => events.push('close'),{signal}); + dialog.addEventListener('close',() => { + events.push('close'); + closeResolvers.shift()(); + },{signal}); openDialog(openMethod); dialog.setAttribute('closedby',closedby); assert_array_equals(events,[]); @@ -95,6 +97,7 @@ async function setup(t,closedby) { assert_false(dialog.open,'Adding closedby after dialog is open'); assert_false(dialog.matches(':open')); assert_array_equals(events,['cancel']); + await untilFullyClosed; events=[]; openDialog(openMethod); dialog.removeAttribute('closedby'); @@ -102,11 +105,13 @@ async function setup(t,closedby) { dialog.requestClose(); assert_false(dialog.open,'Removing closedby after dialog is open'); assert_array_equals(events,['cancel']); + await untilFullyClosedAgain; + assert_array_equals(events,['cancel', 'close']); },`closedby has no effect on dialog.requestClose() ${testDescription}`); if (closedby != "none") { promise_test(async (t) => { - const signal = await setup(t,closedby); + const signal = setup(t,closedby); let shouldPreventDefault = true; dialog.addEventListener('cancel',(e) => { if (shouldPreventDefault) { @@ -124,7 +129,7 @@ async function setup(t,closedby) { },`requestClose can be cancelled ${testDescription}`); promise_test(async (t) => { - const signal = await setup(t,closedby); + const signal = setup(t,closedby); dialog.addEventListener('cancel',(e) => e.preventDefault(),{signal}); openDialog(openMethod); // No user activation here. @@ -136,7 +141,7 @@ async function setup(t,closedby) { },`requestClose avoids abuse prevention logic ${testDescription}`); promise_test(async (t) => { - await setup(t,closedby); + setup(t,closedby); openDialog(openMethod); assert_equals(dialog.returnValue,'','Return value starts out empty'); const returnValue = 'The return value'; @@ -153,7 +158,7 @@ async function setup(t,closedby) { },`requestClose(returnValue) passes along the return value ${testDescription}`); promise_test(async (t) => { - await setup(t,closedby); + setup(t,closedby); dialog.addEventListener('cancel',(e) => e.preventDefault(),{once:true}); openDialog(openMethod); dialog.returnValue = 'foo'; @@ -168,23 +173,27 @@ async function setup(t,closedby) { }); promise_test(async (t) => { - await setup(t); + setup(t); dialog.open = true; dialog.requestClose(); assert_false(dialog.open); },`requestClose basic behavior when dialog is open via attribute`); promise_test(async (t) => { - const signal = await setup(t); + const signal = setup(t); let events = []; + const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers(); dialog.addEventListener('cancel',() => events.push('cancel'),{signal}); - dialog.addEventListener('close',() => events.push('close'),{signal}); + dialog.addEventListener('close',() => { + events.push('close') + hasClosed(); + },{signal}); dialog.open = true; assert_array_equals(events,[]); dialog.requestClose(); assert_false(dialog.open); assert_array_equals(events,['cancel'],'close is scheduled'); - await waitForRender(); + await untilFullyClosed; assert_array_equals(events,['cancel','close']); },`requestClose fires cancel and close when dialog is open via attribute`); diff --git a/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html b/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html index a4a425b9c1f..2a1ac80e65a 100644 --- a/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html +++ b/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html @@ -39,12 +39,21 @@ These two must look the same, each having 2 cells in one row: </table> <br> <table id=table3> - <col span=1001> + <col id="colspan-3" span=1001> <tr> <td colspan=1000><div class="square"></div></td> <td><div class="square"></div></td> </tr> </table> +<table> + <tr> + <td id="colspan-limit-test1" colspan=5></td> + <td id="colspan-limit-test2" colspan=0></td> + <td id="colspan-limit-test3" colspan=1000></td> + <td id="colspan-limit-test4" colspan=1001></td> + <td id="colspan-limit-test5" colspan=5555555></td> + </tr> +</table> </main> <script> @@ -56,4 +65,48 @@ test(() => { assert_equals(table2.offsetWidth, 51, "table2 width"); assert_equals(table3.offsetWidth, 51, "table3 width"); }, "col span of 1001 must be treated as 1000"); + +test(() => { + let td = document.createElement("td"); + td.colSpan = 5; + assert_equals(td.colSpan, 5); + + td.colSpan = 0; + assert_equals(td.colSpan, 1); + + td.colSpan = 1000; + assert_equals(td.colSpan, 1000); + + td.colSpan = 1001; + assert_equals(td.colSpan, 1000); + + td.colSpan = 555555; + assert_equals(td.colSpan, 1000); +}, "colspan must be clamped to [1, 1000] when set via script"); + +test(() => { + assert_equals(document.getElementById("colspan-limit-test1").colSpan, 5); + assert_equals(document.getElementById("colspan-limit-test2").colSpan, 1); + assert_equals(document.getElementById("colspan-limit-test3").colSpan, 1000); + assert_equals(document.getElementById("colspan-limit-test4").colSpan, 1000); + assert_equals(document.getElementById("colspan-limit-test5").colSpan, 1000); +}, "colspan must be clamped to [1, 1000] when parsing attributes"); + +test(() => { + let column = document.getElementById("colspan-3"); + column.span = 5; + assert_equals(column.span, 5); + + column.span = 0; + assert_equals(column.span, 1); + + column.span = 1000; + assert_equals(column.span, 1000); + + column.span = 1001; + assert_equals(column.span, 1000); + + column.span = 555555; + assert_equals(column.span, 1000); +}, "column span must be clamped to [1, 1000] when set via script"); </script> diff --git a/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html b/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html index cdfa61bbcdc..798639b3875 100644 --- a/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html +++ b/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html @@ -29,6 +29,17 @@ <!-- We'll add another 65534 rows later --> </table> +<table> + <tr> + <td id="rowspan-limit-test1" rowspan=5></td> + <td id="rowspan-limit-test2" rowspan=0></td> + <td id="rowspan-limit-test3" rowspan=1000></td> + <td id="rowspan-limit-test4" rowspan=65534></td> + <td id="rowspan-limit-test5" rowspan=65535></td> + <td id="rowspan-limit-test6" rowspan=5555555></td> + </tr> +</table> + <script> var $ = document.querySelector.bind(document); @@ -63,4 +74,34 @@ test(() => { assert_equals($("#d1").getBoundingClientRect().bottom, $("#d2").getBoundingClientRect().bottom); }, "rowspan of 65535 must be treated as 65534"); + +test(() => { + let td = document.createElement("td"); + td.rowSpan = 5; + assert_equals(td.rowSpan, 5); + + td.rowSpan = 0; + assert_equals(td.rowSpan, 0); + + td.rowSpan = 1000; + assert_equals(td.rowSpan, 1000); + + td.rowSpan = 65534; + assert_equals(td.rowSpan, 65534); + + td.rowSpan = 65535; + assert_equals(td.rowSpan, 65534); + + td.rowSpan = 555555; + assert_equals(td.rowSpan, 65534); +}, "rowspan must be clamped to [0, 65534] when set via script"); + +test(() => { + assert_equals(document.getElementById("rowspan-limit-test1").rowSpan, 5); + assert_equals(document.getElementById("rowspan-limit-test2").rowSpan, 0); + assert_equals(document.getElementById("rowspan-limit-test3").rowSpan, 1000); + assert_equals(document.getElementById("rowspan-limit-test4").rowSpan, 65534); + assert_equals(document.getElementById("rowspan-limit-test5").rowSpan, 65534); + assert_equals(document.getElementById("rowspan-limit-test6").rowSpan, 65534); +}, "rowspan must be clamped to [0, 65534] when parsing attributes"); </script> diff --git a/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html b/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html new file mode 100644 index 00000000000..b2366285a41 --- /dev/null +++ b/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title>Serializing CDATA in an HTML document</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/parsing.html#serialising-html-fragments"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(t => { + const doc = new DOMParser().parseFromString('<svg xmlns="http://www.w3.org/2000/svg"><![CDATA[<img>]]></svg>', 'application/xml'); + const el = document.adoptNode(doc.documentElement); + assert_equals(el.outerHTML, '<svg xmlns="http://www.w3.org/2000/svg"><img></svg>'); +}); +</script> diff --git a/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml new file mode 100644 index 00000000000..a1af3e21a48 --- /dev/null +++ b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: pdf-viewer + files: + - plugins-and-mimetypes.html diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini new file mode 100644 index 00000000000..7de34991442 --- /dev/null +++ b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini @@ -0,0 +1,3 @@ +[set_geolocation_override.https.html] + expected: + if product != "chrome": ERROR diff --git a/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html new file mode 100644 index 00000000000..5cbcf546423 --- /dev/null +++ b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<meta charset="utf-8"/> +<title>TestDriver bidi.emulation.set_geolocation_override method</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js?feature=bidi"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<script> + promise_setup(async () => { + // Ensure permission is granted before proceeding. + await test_driver.bidi.permissions.set_permission({ + descriptor: {name: "geolocation"}, + state: "granted", + }); + + // Ensure any previously set geolocation emulations are cleared. + await test_driver.bidi.emulation.set_geolocation_override( + {coordinates: null}); + }); + + /** Get the current geolocation or error */ + function get_current_geolocation() { + return new Promise( + resolve => window.navigator.geolocation.getCurrentPosition( + position => resolve(position.coords.toJSON()), + error => resolve({code: error.code, message: error.message}), + // Fail fast if geolocation is not available. + {timeout: 500} + )) + } + + /** Asserts that relevant coordinate properties match */ + function assert_coordinates_match(actual, expected) { + for (const key in expected) { + assert_equals(actual[key], expected[key], + `"${key}" should match the expected value ${expected[key]}`); + } + } + + const SOME_COORDINATES = { + latitude: 52.51, + longitude: 13.39, + accuracy: 0.5, + altitude: 34, + altitudeAccuracy: 0.75, + heading: 180, + speed: 2.77 + }; + + promise_test(async (t) => { + // Get the initial geolocation (might be error). + const initial_coords = await get_current_geolocation(); + + // Set the geolocation override + await test_driver.bidi.emulation.set_geolocation_override({ + coordinates: SOME_COORDINATES + }); + + // Get the geolocation after setting the override. + const coords = await get_current_geolocation(); + // Assert the coordinates match the override. + assert_coordinates_match(coords, SOME_COORDINATES); + + // Clear the geolocation override. + await test_driver.bidi.emulation.set_geolocation_override( + {coordinates: null}); + // Assert coordinates are set to the original value. + assert_coordinates_match(await get_current_geolocation(), initial_coords); + }, "emulate geolocation and clear override"); +</script> diff --git a/tests/wpt/tests/interfaces/fedcm.idl b/tests/wpt/tests/interfaces/fedcm.idl index 215f375432e..5ce2d260f11 100644 --- a/tests/wpt/tests/interfaces/fedcm.idl +++ b/tests/wpt/tests/interfaces/fedcm.idl @@ -84,8 +84,10 @@ dictionary IdentityProviderAPIConfig { dictionary IdentityProviderAccount { required USVString id; - required USVString name; - required USVString email; + USVString name; + USVString email; + USVString tel; + USVString username; USVString given_name; USVString picture; sequence<USVString> approved_clients; diff --git a/tests/wpt/tests/interfaces/image-capture.idl b/tests/wpt/tests/interfaces/image-capture.idl index 21e03d4db82..26cc7fab5cd 100644 --- a/tests/wpt/tests/interfaces/image-capture.idl +++ b/tests/wpt/tests/interfaces/image-capture.idl @@ -3,7 +3,7 @@ // (https://github.com/w3c/webref) // Source: MediaStream Image Capture (https://w3c.github.io/mediacapture-image/) -[Exposed=Window] +[Exposed=Window, SecureContext] interface ImageCapture { constructor(MediaStreamTrack videoTrack); Promise<Blob> takePhoto(optional PhotoSettings photoSettings = {}); diff --git a/tests/wpt/tests/interfaces/mediastream-recording.idl b/tests/wpt/tests/interfaces/mediastream-recording.idl index 496bfcf2e27..68c891cdc91 100644 --- a/tests/wpt/tests/interfaces/mediastream-recording.idl +++ b/tests/wpt/tests/interfaces/mediastream-recording.idl @@ -56,7 +56,7 @@ interface BlobEvent : Event { readonly attribute DOMHighResTimeStamp timecode; }; -dictionary BlobEventInit { +dictionary BlobEventInit : EventInit { required Blob data; DOMHighResTimeStamp timecode; }; diff --git a/tests/wpt/tests/interfaces/turtledove.idl b/tests/wpt/tests/interfaces/turtledove.idl index b9f50d47885..7f11cdc3790 100644 --- a/tests/wpt/tests/interfaces/turtledove.idl +++ b/tests/wpt/tests/interfaces/turtledove.idl @@ -206,6 +206,7 @@ partial interface Navigator { [Exposed=InterestGroupScriptRunnerGlobalScope] interface InterestGroupScriptRunnerGlobalScope { readonly attribute PrivateAggregation? privateAggregation; + readonly attribute ProtectedAudienceUtilities protectedAudience; }; dictionary PASignalValue { @@ -220,6 +221,12 @@ dictionary PAExtendedHistogramContribution { bigint filteringId = 0; }; +[Exposed=InterestGroupScriptRunnerGlobalScope] +interface ProtectedAudienceUtilities { + Uint8Array encodeUtf8(USVString input); + USVString decodeUtf8(Uint8Array bytes); +}; + [Exposed=InterestGroupBiddingAndScoringScriptRunnerGlobalScope] interface ForDebuggingOnly { undefined reportAdAuctionWin(USVString url); diff --git a/tests/wpt/tests/interfaces/webcodecs.idl b/tests/wpt/tests/interfaces/webcodecs.idl index 274ef96578a..3d4db1ed49d 100644 --- a/tests/wpt/tests/interfaces/webcodecs.idl +++ b/tests/wpt/tests/interfaces/webcodecs.idl @@ -141,7 +141,7 @@ dictionary AudioDecoderConfig { required DOMString codec; [EnforceRange] required unsigned long sampleRate; [EnforceRange] required unsigned long numberOfChannels; - BufferSource description; + AllowSharedBufferSource description; }; dictionary VideoDecoderConfig { diff --git a/tests/wpt/tests/interfaces/WebCryptoAPI.idl b/tests/wpt/tests/interfaces/webcrypto.idl index ff7a89cd0d5..ff7a89cd0d5 100644 --- a/tests/wpt/tests/interfaces/WebCryptoAPI.idl +++ b/tests/wpt/tests/interfaces/webcrypto.idl diff --git a/tests/wpt/tests/interfaces/webgpu.idl b/tests/wpt/tests/interfaces/webgpu.idl index de1f7c1e52b..4fec46a2557 100644 --- a/tests/wpt/tests/interfaces/webgpu.idl +++ b/tests/wpt/tests/interfaces/webgpu.idl @@ -109,6 +109,7 @@ dictionary GPUDeviceDescriptor }; enum GPUFeatureName { + "core-features-and-limits", "depth-clip-control", "depth32float-stencil8", "texture-compression-bc", diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl index 57f2a4a9890..37fcc32501e 100644 --- a/tests/wpt/tests/interfaces/webnn.idl +++ b/tests/wpt/tests/interfaces/webnn.idl @@ -36,6 +36,8 @@ interface MLContext { undefined dispatch(MLGraph graph, MLNamedTensors inputs, MLNamedTensors outputs); Promise<MLTensor> createTensor(MLTensorDescriptor descriptor); + Promise<MLTensor> createConstantTensor( + MLOperandDescriptor descriptor, AllowSharedBufferSource inputData); Promise<ArrayBuffer> readTensor(MLTensor tensor); Promise<undefined> readTensor(MLTensor tensor, AllowSharedBufferSource outputData); @@ -133,6 +135,7 @@ interface MLTensor { readonly attribute FrozenArray<unsigned long> shape; readonly attribute boolean readable; readonly attribute boolean writable; + readonly attribute boolean constant; undefined destroy(); }; @@ -154,6 +157,9 @@ interface MLGraphBuilder { // Create a scalar operand from the specified number of the specified type. MLOperand constant(MLOperandDataType type, MLNumber value); + // Create an operand from a specified constant tensor. + MLOperand constant(MLTensor tensor); + // Compile the graph up to the specified output operands asynchronously. Promise<MLGraph> build(MLNamedOperands outputs); }; diff --git a/tests/wpt/tests/interfaces/webxr-depth-sensing.idl b/tests/wpt/tests/interfaces/webxr-depth-sensing.idl index 9befd640646..7ddbec7cc97 100644 --- a/tests/wpt/tests/interfaces/webxr-depth-sensing.idl +++ b/tests/wpt/tests/interfaces/webxr-depth-sensing.idl @@ -34,6 +34,10 @@ partial interface XRSession { readonly attribute XRDepthUsage depthUsage; readonly attribute XRDepthDataFormat depthDataFormat; readonly attribute XRDepthType? depthType; + readonly attribute boolean? depthActive; + + undefined pauseDepthSensing(); + undefined resumeDepthSensing(); }; [SecureContext, Exposed=Window] @@ -43,9 +47,10 @@ interface XRDepthInformation { [SameObject] readonly attribute XRRigidTransform normDepthBufferFromNormView; readonly attribute float rawValueToMeters; - readonly attribute XRView? view; }; +XRDepthInformation includes XRViewGeometry; + [Exposed=Window] interface XRCPUDepthInformation : XRDepthInformation { [SameObject] readonly attribute ArrayBuffer data; diff --git a/tests/wpt/tests/interfaces/webxr.idl b/tests/wpt/tests/interfaces/webxr.idl index 1098000d6c2..874994086a2 100644 --- a/tests/wpt/tests/interfaces/webxr.idl +++ b/tests/wpt/tests/interfaces/webxr.idl @@ -118,6 +118,11 @@ interface XRBoundedReferenceSpace : XRReferenceSpace { readonly attribute FrozenArray<DOMPointReadOnly> boundsGeometry; }; +[SecureContext, Exposed=Window] interface mixin XRViewGeometry { + readonly attribute Float32Array projectionMatrix; + [SameObject] readonly attribute XRRigidTransform transform; +}; + enum XREye { "none", "left", @@ -126,13 +131,13 @@ enum XREye { [SecureContext, Exposed=Window] interface XRView { readonly attribute XREye eye; - readonly attribute Float32Array projectionMatrix; - [SameObject] readonly attribute XRRigidTransform transform; readonly attribute double? recommendedViewportScale; undefined requestViewportScale(double? scale); }; +XRView includes XRViewGeometry; + [SecureContext, Exposed=Window] interface XRViewport { readonly attribute long x; readonly attribute long y; diff --git a/tests/wpt/tests/interfaces/writing-assistance-apis.idl b/tests/wpt/tests/interfaces/writing-assistance-apis.idl new file mode 100644 index 00000000000..916daee754e --- /dev/null +++ b/tests/wpt/tests/interfaces/writing-assistance-apis.idl @@ -0,0 +1,193 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: Writing Assistance APIs (https://webmachinelearning.github.io/writing-assistance-apis/) + +[Exposed=Window, SecureContext] +interface Summarizer { + static Promise<Summarizer> create(optional SummarizerCreateOptions options = {}); + static Promise<Availability> availability(optional SummarizerCreateCoreOptions options = {}); + + Promise<DOMString> summarize( + DOMString input, + optional SummarizerSummarizeOptions options = {} + ); + ReadableStream summarizeStreaming( + DOMString input, + optional SummarizerSummarizeOptions options = {} + ); + + readonly attribute DOMString sharedContext; + readonly attribute SummarizerType type; + readonly attribute SummarizerFormat format; + readonly attribute SummarizerLength length; + + readonly attribute FrozenArray<DOMString>? expectedInputLanguages; + readonly attribute FrozenArray<DOMString>? expectedContextLanguages; + readonly attribute DOMString? outputLanguage; + + Promise<double> measureInputUsage( + DOMString input, + optional SummarizerSummarizeOptions options = {} + ); + readonly attribute unrestricted double inputQuota; +}; +Summarizer includes DestroyableModel; + +dictionary SummarizerCreateCoreOptions { + SummarizerType type = "key-points"; + SummarizerFormat format = "markdown"; + SummarizerLength length = "short"; + + sequence<DOMString> expectedInputLanguages; + sequence<DOMString> expectedContextLanguages; + DOMString outputLanguage; +}; + +dictionary SummarizerCreateOptions : SummarizerCreateCoreOptions { + AbortSignal signal; + CreateMonitorCallback monitor; + + DOMString sharedContext; +}; + +dictionary SummarizerSummarizeOptions { + AbortSignal signal; + DOMString context; +}; + +enum SummarizerType { "tl;dr", "teaser", "key-points", "headline" }; +enum SummarizerFormat { "plain-text", "markdown" }; +enum SummarizerLength { "short", "medium", "long" }; + +[Exposed=Window, SecureContext] +interface Writer { + static Promise<Writer> create(optional WriterCreateOptions options = {}); + static Promise<Availability> availability(optional WriterCreateCoreOptions options = {}); + + Promise<DOMString> write( + DOMString input, + optional WriterWriteOptions options = {} + ); + ReadableStream writeStreaming( + DOMString input, + optional WriterWriteOptions options = {} + ); + + readonly attribute DOMString sharedContext; + readonly attribute WriterTone tone; + readonly attribute WriterFormat format; + readonly attribute WriterLength length; + + readonly attribute FrozenArray<DOMString>? expectedInputLanguages; + readonly attribute FrozenArray<DOMString>? expectedContextLanguages; + readonly attribute DOMString? outputLanguage; + + Promise<double> measureInputUsage( + DOMString input, + optional WriterWriteOptions options = {} + ); + readonly attribute unrestricted double inputQuota; +}; +Writer includes DestroyableModel; + +dictionary WriterCreateCoreOptions { + WriterTone tone = "neutral"; + WriterFormat format = "markdown"; + WriterLength length = "short"; + + sequence<DOMString> expectedInputLanguages; + sequence<DOMString> expectedContextLanguages; + DOMString outputLanguage; +}; + +dictionary WriterCreateOptions : WriterCreateCoreOptions { + AbortSignal signal; + CreateMonitorCallback monitor; + + DOMString sharedContext; +}; + +dictionary WriterWriteOptions { + DOMString context; + AbortSignal signal; +}; + +enum WriterTone { "formal", "neutral", "casual" }; +enum WriterFormat { "plain-text", "markdown" }; +enum WriterLength { "short", "medium", "long" }; + +[Exposed=Window, SecureContext] +interface Rewriter { + static Promise<Rewriter> create(optional RewriterCreateOptions options = {}); + static Promise<Availability> availability(optional RewriterCreateCoreOptions options = {}); + + Promise<DOMString> rewrite( + DOMString input, + optional RewriterRewriteOptions options = {} + ); + ReadableStream rewriteStreaming( + DOMString input, + optional RewriterRewriteOptions options = {} + ); + + readonly attribute DOMString sharedContext; + readonly attribute RewriterTone tone; + readonly attribute RewriterFormat format; + readonly attribute RewriterLength length; + + readonly attribute FrozenArray<DOMString>? expectedInputLanguages; + readonly attribute FrozenArray<DOMString>? expectedContextLanguages; + readonly attribute DOMString? outputLanguage; + + Promise<double> measureInputUsage( + DOMString input, + optional RewriterRewriteOptions options = {} + ); + readonly attribute unrestricted double inputQuota; +}; +Rewriter includes DestroyableModel; + +dictionary RewriterCreateCoreOptions { + RewriterTone tone = "as-is"; + RewriterFormat format = "as-is"; + RewriterLength length = "as-is"; + + sequence<DOMString> expectedInputLanguages; + sequence<DOMString> expectedContextLanguages; + DOMString outputLanguage; +}; + +dictionary RewriterCreateOptions : RewriterCreateCoreOptions { + AbortSignal signal; + CreateMonitorCallback monitor; + + DOMString sharedContext; +}; + +dictionary RewriterRewriteOptions { + DOMString context; + AbortSignal signal; +}; + +enum RewriterTone { "as-is", "more-formal", "more-casual" }; +enum RewriterFormat { "as-is", "plain-text", "markdown" }; +enum RewriterLength { "as-is", "shorter", "longer" }; + +[Exposed=Window, SecureContext] +interface CreateMonitor : EventTarget { + attribute EventHandler ondownloadprogress; +}; + +callback CreateMonitorCallback = undefined (CreateMonitor monitor); + +enum Availability { + "unavailable", + "downloadable", + "downloading", + "available" +}; + +interface mixin DestroyableModel { + undefined destroy(); +}; diff --git a/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html b/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html index 714355f5c1c..467cf5d50c7 100644 --- a/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html +++ b/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html @@ -9,8 +9,8 @@ <script src=permission-helper.js></script> </head> <body> - <iframe allow="camera 'src';microphone 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe> -<iframe allow="camera 'src';microphone 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe> + <iframe allow="camera 'src';microphone 'src';speaker-selection 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe> +<iframe allow="camera 'src';microphone 'src';speaker-selection 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe> <script> let deviceList; diff --git a/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html b/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html index 856f2ce37ce..1af16659326 100644 --- a/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html +++ b/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html @@ -1,85 +1,62 @@ <!doctype html> -<html> -<head> -<title>The pointerout event should not be fired if the pointer doesn't move</title> +<title> + Layout change under a stationary pointer fires boundary events and no pointermove event +</title> <meta name="viewport" content="width=device-width"> -<link rel="help" href="https://github.com/w3c/pointerevents/issues/457"> +<link rel="help" + href="https://w3c.github.io/pointerevents/#boundary-events-caused-by-layout-changes"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-actions.js"></script> <script src="/resources/testdriver-vendor.js"></script> +<script src="pointerevent_support.js"></script> <style> -#target{ - width:100px; - height:100px; - background-color:red; -} - -#overlay{ - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - background-color: rgba(0,0,0,0.2); - z-index: 1000; - text-align: center; - display:none; -} + div { + position: absolute; + top: 0; + left: 0; + width: 50px; + height: 50px; + } + + #overlay { + z-index: 1000; + display: none; + } </style> -</head> -<body> -<h1>The pointerout event should not be fired if the pointer doesn't move</h1> -<h4> - Test Description: This test checks if the pointerout event dispatched unexpectedly. - <ol> - <li>Click on the black rectangle. - <li>Don't move mouse after clicking. - </ol> -</h4> -<p> <div id="target"></div> <div id="overlay"></div> -<div id="log"></div> <script> -function waitForAnimationFrame() { - return new Promise(resolve => { - requestAnimationFrame(() => { - requestAnimationFrame(resolve); - }); - }); -} + "use strict"; -promise_test(async () => { const target = document.getElementById("target"); + const overlay = document.getElementById("overlay"); - let out_event_count = 0; - target.addEventListener("pointerout", function() { - out_event_count++; - }); + let logging_active = false; + let num_pointermoves = 0; - // Wait for the click event on target element and update display style on - // overlay element. - const promise = new Promise(resolve => { - target.addEventListener("click", async function() { - const overlay = document.getElementById("overlay"); - overlay.style.display= 'block'; - await waitForAnimationFrame(); + target.addEventListener("click", () => logging_active = true); + target.addEventListener("pointermove", () => { + if (logging_active) num_pointermoves++; + }); - overlay.style.display= 'none' - await waitForAnimationFrame(); + promise_test(async t => { + await test_driver.click(target); - resolve(); - }, { once: true }); - }); + let pointerout_promise = getEvent("pointerout", target); + overlay.style.display = "block"; + await pointerout_promise; - // Click target. - test_driver.click(target); - await promise; + let pointerover_promise = getEvent("pointerover", target); + overlay.style.display = "none"; + await waitForAnimationFrames(2); + // Why does Chrome time out at the next line w/o the redundant wait above? + // Does chrome require something to request a main frame in order to detect + // the new pointer target after the style update to generate the event? + // https://crbug.com/413595088 + await pointerover_promise; - assert_equals(out_event_count, 0, "The pointerout event should not be fired"); -}, "The pointerout event should not be fired if the pointer doesn't move"); + assert_equals(num_pointermoves, 0, "no pointermove events are expected"); + }, "Layout change under a stationary pointer fires boundary events and no pointermove event"); </script> -</body> -</html> diff --git a/tests/wpt/tests/resources/chromium/webxr-test.js b/tests/wpt/tests/resources/chromium/webxr-test.js index 0885b559e63..ce2503b1bbc 100644 --- a/tests/wpt/tests/resources/chromium/webxr-test.js +++ b/tests/wpt/tests/resources/chromium/webxr-test.js @@ -757,30 +757,34 @@ class MockRuntime { const viewport_size = 20; return [{ eye: vrMojom.XREye.kLeft, - fieldOfView: { - upDegrees: 48.316, - downDegrees: 50.099, - leftDegrees: 50.899, - rightDegrees: 35.197 + geometry: { + fieldOfView: { + upDegrees: 48.316, + downDegrees: 50.099, + leftDegrees: 50.899, + rightDegrees: 35.197 + }, + mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({ + position: [-0.032, 0, 0], + orientation: [0, 0, 0, 1] + })) }, - mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({ - position: [-0.032, 0, 0], - orientation: [0, 0, 0, 1] - })), viewport: { x: 0, y: 0, width: viewport_size, height: viewport_size } }, { eye: vrMojom.XREye.kRight, - fieldOfView: { - upDegrees: 48.316, - downDegrees: 50.099, - leftDegrees: 50.899, - rightDegrees: 35.197 + geometry: { + fieldOfView: { + upDegrees: 48.316, + downDegrees: 50.099, + leftDegrees: 50.899, + rightDegrees: 35.197 + }, + mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({ + position: [0.032, 0, 0], + orientation: [0, 0, 0, 1] + })) }, - mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({ - position: [0.032, 0, 0], - orientation: [0, 0, 0, 1] - })), viewport: { x: viewport_size, y: 0, width: viewport_size, height: viewport_size } }]; } @@ -835,13 +839,15 @@ class MockRuntime { return { eye: viewEye, - fieldOfView: fov, - mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform(fakeXRViewInit.viewOffset)), + geometry: { + fieldOfView: fov, + mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform(fakeXRViewInit.viewOffset)) + }, viewport: { x: xOffset, - y: 0, - width: fakeXRViewInit.resolution.width, - height: fakeXRViewInit.resolution.height + y: 0, + width: fakeXRViewInit.resolution.width, + height: fakeXRViewInit.resolution.height }, isFirstPersonObserver: fakeXRViewInit.isFirstPersonObserver ? true : false, viewOffset: composeGFXTransform(fakeXRViewInit.viewOffset) @@ -915,12 +921,12 @@ class MockRuntime { let frame_views = this.primaryViews_; for (let i = 0; i < this.primaryViews_.length; i++) { - this.primaryViews_[i].mojoFromView = + this.primaryViews_[i].geometry.mojoFromView = this._getMojoFromViewerWithOffset(this.primaryViews_[i].viewOffset); } if (this.enabledFeatures_.includes(xrSessionMojom.XRSessionFeature.SECONDARY_VIEWS)) { for (let i = 0; i < this.secondaryViews_.length; i++) { - this.secondaryViews_[i].mojoFromView = + this.secondaryViews_[i].geometry.mojoFromView = this._getMojoFromViewerWithOffset(this.secondaryViews_[i].viewOffset); } diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js index f127e2b2c8d..6e8410b7ea4 100644 --- a/tests/wpt/tests/resources/testdriver.js +++ b/tests/wpt/tests/resources/testdriver.js @@ -254,12 +254,57 @@ } }, /** - * `log <https://w3c.github.io/webdriver-bidi/#module-log>`_ module. + * `emulation <https://www.w3.org/TR/webdriver-bidi/#module-emulation>`_ module. + */ + emulation: { + /** + * Overrides the geolocation coordinates for the specified + * browsing contexts. + * Matches the `emulation.setGeolocationOverride + * <https://w3c.github.io/webdriver-bidi/#command-emulation-setGeolocationOverride>`_ + * WebDriver BiDi command. + * + * @example + * await test_driver.bidi.emulation.set_geolocation_override({ + * coordinates: { + * latitude: 52.51, + * longitude: 13.39, + * accuracy: 0.5, + * altitude: 34, + * altitudeAccuracy: 0.75, + * heading: 180, + * speed: 2.77 + * } + * }); + * + * @param {object} params - Parameters for the command. + * @param {null|object} params.coordinates - The optional + * geolocation coordinates to set. Matches the + * `emulation.GeolocationCoordinates <https://w3c.github.io/webdriver-bidi/#type-emulation-GeolocationCoordinates>`_ + * value. If null or omitted, the emulation will be removed. + * @param {null|Array.<(Context)>} [params.contexts] The + * optional contexts parameter specifies which browsing contexts + * to set the geolocation override on. It should be either an + * array of Context objects (window or browsing context id), or + * null. If null or omitted, the override will be set on the + * current browsing context. + * @returns {Promise<void>} Resolves when the geolocation + * override is successfully set. + */ + set_geolocation_override: function (params) { + // Ensure the bidi feature is enabled before calling the internal method + assertBidiIsEnabled(); + return window.test_driver_internal.bidi.emulation.set_geolocation_override( + params); + }, + }, + /** + * `log <https://www.w3.org/TR/webdriver-bidi/#module-log>`_ module. */ log: { entry_added: { /** - * @typedef {object} LogEntryAdded `log.entryAdded <https://w3c.github.io/webdriver-bidi/#event-log-entryAdded>`_ event. + * @typedef {object} LogEntryAdded `log.entryAdded <https://www.w3.org/TR/webdriver-bidi/#event-log-entryAdded>`_ event. */ /** @@ -1576,6 +1621,12 @@ } } }, + emulation: { + set_geolocation_override: function (params) { + throw new Error( + "bidi.emulation.set_geolocation_override is not implemented by testdriver-vendor.js"); + } + }, log: { entry_added: { async subscribe() { diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html b/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html index f741cc634d7..323d984c989 100644 --- a/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html +++ b/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html @@ -21,7 +21,7 @@ } #scroller { - overflow: auto; + overflow: hidden; height: 100px; width: 100px; will-change: transform; /* force compositing */ diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html index ed8e8337a65..28973d2d185 100644 --- a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html +++ b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html @@ -22,7 +22,7 @@ } #scroller { - overflow: auto; + overflow: hidden; height: 100px; width: 100px; will-change: transform; /* force compositing */ diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html index de50599fbaf..45ba3f99ccd 100644 --- a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html +++ b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html @@ -22,7 +22,7 @@ drive two animations"> } #scroller { - overflow: auto; + overflow: hidden; height: 100px; width: 100px; will-change: transform; /* force compositing */ diff --git a/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html b/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html index d75f30e664e..cdd2e0be40c 100644 --- a/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html +++ b/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html @@ -87,7 +87,7 @@ parseFloat(getComputedStyle(fieldset).borderBottom); // Validate the start and end offsets for each view timeline. - anims.forEach(async (anim) => { + for (let anim of anims) { assert_equals(anim.timeline.source.id, 'fieldset'); assert_equals(anim.timeline.subject.tagName, 'INPUT'); const bounds = anim.effect.target.getBoundingClientRect(); @@ -96,13 +96,13 @@ const expectedEndOffset = bounds.bottom - fieldsetContentTop; assert_approx_equals( parseFloat(anim.timeline.startOffset), - expectedStartOffset, 0.1, + expectedStartOffset, 0.5, `Unexpected start offset for ${anim.effect.target.id}`); assert_approx_equals( parseFloat(anim.timeline.endOffset), - expectedEndOffset, 0.1, + expectedEndOffset, 0.5, `Unexpected end offset for ${anim.effect.target.id}`); - }); + }; }, 'Fieldset is a valid source for a view timeline'); } diff --git a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html index a4a5f372838..5ab144b05ed 100644 --- a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html +++ b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html @@ -9,6 +9,13 @@ </head> <body> + <div> + <template shadowrootmode="open"> + <!-- This button shouldn't link to the real form in fancy-form-1 as it's in a different tree scope --> + <button id="button-in-shadow" form="fancy-form-1"></button> + </template> + </div> + <button id="reset-button-1" type="reset" form="fancy-form-1"></button> <fancy-form-1 id="fancy-form-1"> <template shadowrootmode="open" shadowrootreferencetarget="real-form"> @@ -44,6 +51,9 @@ input.value = "new value"; const resetButton = document.getElementById(resetButtonId); + assert_equals(realForm.elements.length, 2, "The .elements property should have 2 elements."); + assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element."); + assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form."); assert_equals(input.value, "new value", "The input value should be updated to the new value."); resetButton.click(); assert_equals(input.value, "default value", "The input value should be reset to the default value."); @@ -56,5 +66,107 @@ document.getElementById('reset-button-3').setAttribute('form', "fancy-form-3"); testFormWithReferenceTarget('fancy-form-3', 'reset-button-3', "Reference target works with setAttribute('form')"); </script> + + <form-associated-custom-button id="custom-button" form="fancy-form-4"></form-associated-custom-button> + <fancy-form-4 id="fancy-form-4"> + <template shadowrootmode="open" shadowrootreferencetarget="real-form"> + <form id="real-form"> + <input type="text" value="default value"> + <!-- The internal button of the custom button below shouldn't be associated with real-form --> + <form-associated-custom-button id="custom-button-in-shadow"></form-associated-custom-button> + </form> + </template> + </fancy-form-4> + <script> + class FormAssociatedCustomButton extends HTMLElement { + static formAssociated = true; + constructor() { + super(); + this.internals_ = this.attachInternals(); + const shadow = this.attachShadow({ mode: 'open' }); + shadow.innerHTML = `<button>fancy button</button>`; + } + } + window.customElements.define("form-associated-custom-button", FormAssociatedCustomButton); + test(function () { + const customElement = document.getElementById("custom-button"); + const fancyForm = document.getElementById("fancy-form-4"); + const realForm = fancyForm.shadowRoot.getElementById("real-form"); + const customElementInShadow = fancyForm.shadowRoot.getElementById("custom-button-in-shadow"); + const input = realForm.firstElementChild; + + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements."); + assert_equals(realForm.elements[0], customElement, "The first element should be the form-associated custom element."); + assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form."); + assert_equals(realForm.elements[2], customElementInShadow, "The 3rd element should be the custom element inside the real form."); + + // Swap the input and the custom element in real-form. + realForm.moveBefore(customElementInShadow, input); + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements."); + assert_equals(realForm.elements[0], customElement, "The first element should be the form-associated custom element."); + assert_equals(realForm.elements[1], customElementInShadow, "The 2nd element should be the custom element inside the real form."); + assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form."); + + // Swap the referencing element and the fancy form + customElement.parentNode.moveBefore(fancyForm, customElement); + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements."); + assert_equals(realForm.elements[0], customElementInShadow, "The first element should be the custom element inside the real form."); + assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form."); + assert_equals(realForm.elements[2], customElement, "The 3rd element should be the form-associated custom element."); + }, "Reference target works with form-associated custom element."); + </script> + + <button id="reset-button-5" type="reset" form="fancy-form-5"></button> + <fancy-form-5 id="fancy-form-5"> + <template shadowrootmode="open" shadowrootreferencetarget="nested-element"> + <nested-element id="nested-element"> + <template shadowrootmode="open" shadowrootreferencetarget="real-form"> + <form id="real-form"> + <input type="text" value="default value"> + </form> + </template> + </nested-element> + <button id="button-in-shadow" form="nested-element"></button> + <div> + <template shadowrootmode="open"> + <!-- This button shouldn't link to the real form in nested-element as it's in a different tree scope --> + <button id="button-in-different-shadow" form="nested-element"></button> + </template> + </div> + </template> + </fancy-form-5> + <script> + test(function () { + const fancyForm = document.getElementById("fancy-form-5"); + const nestedElement = fancyForm.shadowRoot.getElementById("nested-element"); + const buttonInShadow = fancyForm.shadowRoot.getElementById("button-in-shadow"); + const realForm = nestedElement.shadowRoot.getElementById("real-form"); + const input = realForm.firstElementChild; + + input.value = "new value"; + const resetButton = document.getElementById("reset-button-5"); + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements."); + // The elements in .elements property should be in tree order (preorder, depth-first). + assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element."); + assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form."); + assert_equals(realForm.elements[2], buttonInShadow, "The 3rd element should be the button in the shadow dom."); + assert_equals(input.value, "new value", "The input value should be updated to the new value."); + resetButton.click(); + assert_equals(input.value, "default value", "The input value should be reset to the default value."); + + // Remove the button that's using reference target in the 1st level shadow. + buttonInShadow.remove(); + assert_equals(realForm.elements.length, 2, "The .elements property should have 2 elements after removing the button."); + + // Add a new button using reference target in the 1st level shadow. + const newButtonInShadow = document.createElement("button"); + newButtonInShadow.setAttribute("form", "nested-element"); + nestedElement.parentNode.insertBefore(newButtonInShadow, nestedElement); + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements after a new button is inserted."); + assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element."); + assert_equals(realForm.elements[1], newButtonInShadow, "The 2nd element should be the button in the shadow dom."); + assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form."); + }, "Reference target works with nested shadow trees."); + </script> </body> </html> diff --git a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html deleted file mode 100644 index c5796e48b76..00000000000 --- a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html +++ /dev/null @@ -1,35 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/utils.js"></script> -<script src="../resources/utils.js"></script> -<script src="resources/utils.sub.js"></script> -<script> - setup(() => assertSpeculationRulesIsSupported()); - - promise_test(async t => { - let agent = await spawnWindow(t, { protocol: 'https' }); - let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 }); - await agent.forceSinglePrefetch(nextUrl); - - // Open new window with url to clear cache data through Clear-Site-Data header. - // Ensure that the cache is cleared before the navigation. - const gotMessage = new Promise(resolve => { - window.addEventListener('message', e => { - resolve(e.data); - }, { - once: true - }); - }); - let cache_helper = "cache_helper=" + token() + "&"; - window.open("../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); await gotMessage; - await gotMessage; - - await agent.navigate(nextUrl); - // Because Clear-Site-Data response header is sent, prefetches are expected - // to be evicted. - // The navigation to nextURL is not expected to use the prefetch cache. - assert_not_prefetched(await agent.getRequestHeaders()); - }, "clear-site-data cache headers should prevent it from being fetched"); -</script> diff --git a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html new file mode 100644 index 00000000000..48f6264e852 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<!-- +This file is marked as "tentative" until: +* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and + https://github.com/WICG/nav-speculation/issues/357 is added to the specification. +--> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/common/utils.js"></script> +<script src="../resources/utils.js"></script> +<script src="resources/utils.sub.js"></script> +<script> + setup(() => assertSpeculationRulesIsSupported()); + + // Test that Clear-Site-Data header value "prefetchCache" clears prefetch cache + promise_test(async t => { + let agent = await spawnWindow(t, { protocol: 'https' }); + let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 }); + await agent.forceSinglePrefetch(nextUrl); + + // Open new window with url to clear cache data through Clear-Site-Data header. + // Ensure that the cache is cleared before the navigation. + const gotMessage = new Promise(resolve => { + window.addEventListener('message', e => { + resolve(e.data); + }, { + once: true + }); + }); + window.open("/../../clear-site-data/support/clear-site-data-prefetchCache.py"); + await gotMessage; + + await agent.navigate(nextUrl); + // Because Clear-Site-Data response header is sent, prefetches are expected + // to be evicted. + // The navigation to nextURL is not expected to use the prefetch cache. + assert_not_prefetched(await agent.getRequestHeaders()); + }, "clear-site-data prefetchCache headers should prevent it from being fetched"); + + // Test that Clear-Site-Data header value "cache" clears prefetch cache + promise_test(async t => { + let agent = await spawnWindow(t, { protocol: 'https' }); + let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 }); + await agent.forceSinglePrefetch(nextUrl); + + // Open new window with url to clear cache data through Clear-Site-Data header. + // Ensure that the cache is cleared before the navigation. + const gotMessage = new Promise(resolve => { + window.addEventListener('message', e => { + resolve(e.data); + }, { + once: true + }); + }); + let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&"; + window.open("/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); + await gotMessage; + + await agent.navigate(nextUrl); + // Because Clear-Site-Data response header is sent, prefetches are expected + // to be evicted. + // The navigation to nextURL is not expected to use the prefetch cache. + assert_not_prefetched(await agent.getRequestHeaders()); + }, "clear-site-data cache headers should prevent it from being fetched"); +</script> diff --git a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html index 34b77f8bc47..db52e758750 100644 --- a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html +++ b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html @@ -1,4 +1,9 @@ <!DOCTYPE html> +<!-- +This file is marked as "tentative" until: +* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and + https://github.com/WICG/nav-speculation/issues/357 is added to the specification. +--> <title>clear-site-data-cache cancels prerenders</title> <meta name="timeout" content="long"> <body> @@ -40,8 +45,7 @@ promise_test(async t => { once: true }); }); - let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&"; - window.open(differentOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); + window.open(differentOrigin + "/../../clear-site-data/support/clear-site-data-prerenderCache.py"); await gotMessage; // Because Clear-Site-Data response header is sent on a different origin than diff --git a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html index cb253d45eaa..23d862c5130 100644 --- a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html +++ b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html @@ -1,4 +1,9 @@ <!DOCTYPE html> +<!-- +This file is marked as "tentative" until: +* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and + https://github.com/WICG/nav-speculation/issues/357 is added to the specification. +--> <title>clear-site-data-cache cancels prerenders</title> <meta name="timeout" content="long"> <body> @@ -13,6 +18,41 @@ <script> setup(() => assertSpeculationRulesIsSupported()); +// Test that Clear-Site-Data header value "prerenderCache" clears prerender cache +promise_test(async t => { + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow({ + origin: 'HTTPS_ORIGIN' + }, { + features: 'noopener' + }); + const prerenderedRC = await addPrerenderRC(referrerRC, { + origin: 'HTTPS_ORIGIN' + }); + + const sameOrigin = get_host_info().HTTPS_ORIGIN; + + // Open new window with url to clear cache data through Clear-Site-Data header. + // Ensure that the cache is cleared before the navigation. + const gotMessage = new Promise(resolve => { + window.addEventListener('message', e => { + resolve(e.data); + }, { + once: true + }); + }); + window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-prerenderCache.py"); + await gotMessage; + + // Because Clear-Site-Data response header is sent, the existing prerender + // is expected to be canceled. + // And the navigation is expected to create another page instead of activation. + referrerRC.navigateTo(prerenderedRC.url); + assert_equals(await getActivationStart(prerenderedRC), 0); +}, "clear-site-data prerenderCache headers should prevent it from being activated"); + +// Test that Clear-Site-Data header value "cache" clears prerender cache promise_test(async t => { const rcHelper = new RemoteContextHelper(); @@ -37,7 +77,7 @@ promise_test(async t => { }); }); let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&"; - new_window = window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); + window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); await gotMessage; // Because Clear-Site-Data response header is sent, the existing prerender @@ -45,7 +85,7 @@ promise_test(async t => { // And the navigation is expected to create another page instead of activation. referrerRC.navigateTo(prerenderedRC.url); assert_equals(await getActivationStart(prerenderedRC), 0); -}); +}, "clear-site-data cache headers should prevent it from being activated"); </script> </body> </html> diff --git a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js index b2ba5cd4c27..cf10f7f2e83 100644 --- a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js +++ b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js @@ -4,12 +4,64 @@ // See https://crbug.com/335506658 for details. promise_test(async () => { - let closed = new ReadableStream({ - pull(controller) { - controller.enqueue('is there anybody in there?'); - } - }).getReader().closed; - // 3 GCs are actually required to trigger the bug at time of writing. - for (let i = 0; i < 5; ++i) - await garbageCollect(); + const closed = new ReadableStream({ + pull(controller) { + controller.enqueue('is there anybody in there?'); + } + }).getReader().closed; + // 3 GCs are actually required to trigger the bug at time of writing. + for (let i = 0; i < 5; ++i) + await garbageCollect(); }, 'Garbage-collecting a stream along with its reader should not crash'); + + +// See https://crbug.com/390646657 for details. +promise_test(async () => { + const written = new WritableStream({ + write(chunk) { + return new Promise(resolve => {}); + } + }).getWriter().write('just nod if you can hear me'); + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer with a pending write should not crash'); + + +promise_test(async () => { + const closed = new WritableStream({ + write(chunk) { } + }).getWriter().closed; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer should not crash with closed promise is retained'); + +promise_test(async () => { + const ready = new WritableStream({ + write(chunk) { } + }, {highWaterMark: 0}).getWriter().ready; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer should not crash when backpressure is being applied'); + +promise_test(async () => { + let reader = new ReadableStream({ + pull() { } + }).getReader(); + const promise = reader.read(); + reader = null; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream with a pending read should not crash'); + +promise_test(async () => { + let reader = new ReadableStream({ + type: "bytes", + pull() { return new Promise(resolve => {}); } + }).getReader({mode: "byob"}); + const promise = reader.read(new Uint8Array(42)); + reader = null; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream with a pending BYOB read should not crash'); + + diff --git a/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html b/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html new file mode 100644 index 00000000000..b083538a8b8 --- /dev/null +++ b/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>Fetch Priority - SVG Image element</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<svg> +<image id=image1 fetchpriority="high"/> +<image id=image2 fetchpriority="low"/> +<image id=image3 fetchpriority="auto"/> +<image id=image4 fetchpriority="xyz"/> +<image id=image5 /> +</svg> + +<script> + test(() => { + assert_equals(image1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the image element"); + assert_equals(image2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the image element"); + assert_equals(image3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the image element"); + assert_equals(image4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the image element"); + assert_equals(image5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the image element"); + }, "fetchpriority attribute on <image> elements should reflect valid IDL values"); + + test(() => { + const image = document.createElementNS("http://www.w3.org/2000/svg", "image"); + assert_equals(image.fetchPriority, "auto"); + }, "default fetchpriority attribute on <image> elements should be 'auto'"); +</script> diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html new file mode 100644 index 00000000000..25765c5b93e --- /dev/null +++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tabbing through Non-Rendered SVG elements</title> +<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com"> +<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<svg xmlns="http://www.w3.org/2000/svg"> + <text tabindex='1' id="start" x="10" y="10">start</text> + <g x="30" y="10" style="display: none;"> + <text tabindex='2' id="middle" x="30" y="10">middle</text> + </g> + <text tabindex='3' id="end" x="50" y="10">end</text> +</svg> + +<script> + promise_test(async t => { + const start = document.getElementById('start'); + const end = document.getElementById('end'); + + start.focus(); + assert_equals(document.activeElement, start, "Start element should be focused initially"); + + // Simulate pressing the Tab key + await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab + + // Verify that the focus moved to the end element and middle element is skipped + assert_equals(document.activeElement, end, "End element should be focused after pressing Tab"); + }, "Hidden SVG Tab focus test"); +</script> diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html new file mode 100644 index 00000000000..fd9fd34275d --- /dev/null +++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tabbing through Non-Rendered SVG elements</title> +<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com"> +<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<svg xmlns="http://www.w3.org/2000/svg"> + <a href="#void" id="start"> + <text tabindex='-1' x="10" y="10">start</text> + </a> + <g x="30" y="10" style="display: none;"> + <a href="#void" id="middle"> + <text tabindex='-1' x="30" y="10">middle</text> + </a> + </g> + <a href="#void" id="end"> + <text tabindex='-1' x="50" y="10">end</text> + </a> +</svg> + +<script> + promise_test(async t => { + const start = document.getElementById('start'); + const end = document.getElementById('end'); + + start.focus(); + assert_equals(document.activeElement, start, "Start element should be focused initially"); + + // Simulate pressing the Tab key + await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab + + // Verify that the focus moved to the end element and middle element is skipped + assert_equals(document.activeElement, end, "End element should be focused after pressing Tab"); + }, "Hidden SVG Tab focus test"); +</script> diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html new file mode 100644 index 00000000000..097cff57b5a --- /dev/null +++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tabbing through Non-Rendered SVG elements</title> +<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com"> +<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<svg xmlns="http://www.w3.org/2000/svg"> + <text tabindex='1' id="start" x="10" y="10">start</text> + <defs> + <text tabindex='2' id="middle" x="30" y="10">middle</text> + </defs> + <text tabindex='3' id="end" x="50" y="10">end</text> +</svg> + +<script> + promise_test(async t => { + const start = document.getElementById('start'); + const end = document.getElementById('end'); + + start.focus(); + assert_equals(document.activeElement, start, "Start element should be focused initially"); + + // Simulate pressing the Tab key + await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab + + // Verify that the focus moved to the end element and middle element is skipped + assert_equals(document.activeElement, end, "End element should be focused after pressing Tab"); + }, "Hidden SVG Tab focus test"); +</script> diff --git a/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html b/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html new file mode 100644 index 00000000000..2f73e1e59a8 --- /dev/null +++ b/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>Fetch Priority - SVG Script element</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<svg> +<script id=script1 href="resources/script.js" fetchpriority="high"></script> +<script id=script2 href="resources/script.js" fetchpriority="low"></script> +<script id=script3 href="resources/script.js" fetchpriority="auto"></script> +<script id=script4 href="resources/script.js" fetchpriority="xyz"></script> +<script id=script5 href="resources/script.js"></script> +</svg> + +<script> + test(() => { + assert_equals(script1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the script element"); + assert_equals(script2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the script element"); + assert_equals(script3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the script element"); + assert_equals(script4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the script element"); + assert_equals(script5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the script element"); + }, "fetchpriority attribute on SVG <script> elements should reflect valid IDL values"); + + test(() => { + const script = document.createElementNS("http://www.w3.org/2000/svg", "script"); + assert_equals(script.fetchPriority, "auto"); + }, "default fetchpriority attribute on SVG <script> elements should be 'auto'"); +</script> diff --git a/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html b/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html new file mode 100644 index 00000000000..9fe97b12d77 --- /dev/null +++ b/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<title>SVG Test: sibling-index() as cx property value should not crash</title> +<link rel="help" href="https://crbug.com/407890255"> +<style>circle { cx: sibling-index(); }</style> +<p>Pass if loading this page does not crash</p> diff --git a/tests/wpt/tests/tools/ci/requirements_tc.txt b/tests/wpt/tests/tools/ci/requirements_tc.txt index cb4ba194778..ada75c2f761 100644 --- a/tests/wpt/tests/tools/ci/requirements_tc.txt +++ b/tests/wpt/tests/tools/ci/requirements_tc.txt @@ -1,4 +1,4 @@ pygithub==2.6.1 pyyaml==6.0.1 requests==2.32.3 -taskcluster==83.5.6 +taskcluster==83.5.8 diff --git a/tests/wpt/tests/tools/requirements_tests.txt b/tests/wpt/tests/tools/requirements_tests.txt index 833fdb3b876..ca00b8f1f98 100644 --- a/tests/wpt/tests/tools/requirements_tests.txt +++ b/tests/wpt/tests/tools/requirements_tests.txt @@ -2,5 +2,5 @@ httpx[http2]==0.27.2 json-e==4.7.0 jsonschema==4.17.3 pyyaml==6.0.1 -taskcluster==83.5.6 +taskcluster==83.5.8 mozterm==1.0.0 diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py index 71187ee76d7..9925a4b511d 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py @@ -87,6 +87,34 @@ class BidiBluetoothSimulatePreconnectedPeripheralAction: return await self.protocol.bidi_bluetooth.simulate_preconnected_peripheral( context, address, name, manufacturer_data, known_service_uuids) + +class BidiEmulationSetGeolocationOverrideAction: + name = "bidi.emulation.set_geolocation_override" + + def __init__(self, logger, protocol): + do_delayed_imports() + self.logger = logger + self.protocol = protocol + + async def __call__(self, payload): + coordinates = payload['coordinates'] + contexts = [] + for context in payload["contexts"]: + # Context can be either a browsing context id, or a BiDi serialized window. In the latter case, the + # value is extracted from the serialized object. + if isinstance(context, str): + contexts.append(context) + elif isinstance(context, webdriver.bidi.protocol.BidiWindow): + contexts.append(context.browsing_context) + else: + raise ValueError("Unexpected context type: %s" % context) + if len(contexts) == 0: + raise ValueError("At least one context must be provided") + + return await self.protocol.bidi_emulation.set_geolocation_override( + coordinates, contexts) + + class BidiSessionSubscribeAction: name = "bidi.session.subscribe" @@ -133,5 +161,6 @@ async_actions = [ BidiBluetoothHandleRequestDevicePrompt, BidiBluetoothSimulateAdapterAction, BidiBluetoothSimulatePreconnectedPeripheralAction, + BidiEmulationSetGeolocationOverrideAction, BidiPermissionsSetPermissionAction, BidiSessionSubscribeAction] diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py index 123c89c98b2..87403c2944d 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -39,6 +39,7 @@ from .protocol import (BaseProtocolPart, VirtualSensorProtocolPart, BidiBluetoothProtocolPart, BidiBrowsingContextProtocolPart, + BidiEmulationProtocolPart, BidiEventsProtocolPart, BidiPermissionsProtocolPart, BidiScriptProtocolPart, @@ -263,6 +264,19 @@ class WebDriverBidiScriptProtocolPart(BidiScriptProtocolPart): await_promise=True) +class WebDriverBidiEmulationProtocolPart(BidiEmulationProtocolPart): + def __init__(self, parent): + super().__init__(parent) + self.webdriver = None + + def setup(self): + self.webdriver = self.parent.webdriver + + async def set_geolocation_override(self, coordinates, contexts): + return await self.webdriver.bidi_session.emulation.set_geolocation_override( + coordinates=coordinates, contexts=contexts) + + class WebDriverBidiPermissionsProtocolPart(BidiPermissionsProtocolPart): def __init__(self, parent): super().__init__(parent) @@ -810,6 +824,7 @@ class WebDriverBidiProtocol(WebDriverProtocol): enable_bidi = True implements = [WebDriverBidiBluetoothProtocolPart, WebDriverBidiBrowsingContextProtocolPart, + WebDriverBidiEmulationProtocolPart, WebDriverBidiEventsProtocolPart, WebDriverBidiPermissionsProtocolPart, WebDriverBidiScriptProtocolPart, diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py index 7630fe1f358..833dff45636 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py @@ -445,6 +445,18 @@ class BidiPermissionsProtocolPart(ProtocolPart): pass +class BidiEmulationProtocolPart(ProtocolPart): + """Protocol part for emulation""" + __metaclass__ = ABCMeta + name = "bidi_emulation" + + @abstractmethod + async def set_geolocation_override(self, + coordinates: Optional[Mapping[str, Any]], + contexts: List[str]) -> None: + pass + + class BidiScriptProtocolPart(ProtocolPart): """Protocol part for executing BiDi scripts""" __metaclass__ = ABCMeta diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js index d83ba4192eb..ab8b04ba3cd 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js @@ -261,6 +261,17 @@ 'bluetooth.requestDevicePromptUpdated', on_event); }; + window.test_driver_internal.bidi.emulation.set_geolocation_override = + function (params) { + return create_action("bidi.emulation.set_geolocation_override", { + // Default to the current window. + contexts: [window], + // Default to no coordinates. + coordinates: null, + ...(params ?? {}) + }); + } + window.test_driver_internal.bidi.log.entry_added.subscribe = function (params) { return subscribe({ diff --git a/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html b/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html index 852e49fa7fe..e6c9d8b4e16 100644 --- a/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html +++ b/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html @@ -15,8 +15,14 @@ promise_test(async (t) => { await test_driver.clear_display_features(); }); - // When the viewport is not divided the segments property should be null. - assert_equals(viewport.segments, null); + // When the viewport is not divided the segments property should return an + // array with one segment, the size of the viewport. + assert_equals(viewport.segments.length, 1); + let segment = viewport.segments[0]; + assert_equals(segment.x, 0); + assert_equals(segment.y, 0); + assert_equals(segment.width, window.innerWidth); + assert_equals(segment.height, window.innerHeight); // iframes do not receive segments information. assert_equals(window.frames[0].viewport.segments, null); @@ -88,7 +94,11 @@ promise_test(async (t) => { }); await test_driver.clear_display_features(); assert_true(await promise); - assert_equals(viewport.segments, null); + segment = viewport.segments[0]; + assert_equals(segment.x, 0); + assert_equals(segment.y, 0); + assert_equals(segment.width, window.innerWidth); + assert_equals(segment.height, window.innerHeight); // iframes do not receive segments information. assert_equals(window.frames[0].viewport.segments, null); diff --git a/tests/wpt/tests/viewport/viewport-segments.html b/tests/wpt/tests/viewport/viewport-segments.html index 64f0eb9caef..cd24f2bd230 100644 --- a/tests/wpt/tests/viewport/viewport-segments.html +++ b/tests/wpt/tests/viewport/viewport-segments.html @@ -9,6 +9,9 @@ test(() => { assert_true('segments' in viewport, "`segments` must be a property of viewport."); - assert_equals(viewport.segments, null, "For a viewport not segmented, no segments must be exposed."); + assert_equals(viewport.segments[0].innerWidth, viewport.innerWidth, + "For a viewport not segmented, there should only one segment with the viewport size."); + assert_equals(viewport.segments[0].innerHeight, viewport.innerHeight, + "For a viewport not segmented, there should only one segment with the viewport size."); }); </script> diff --git a/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html b/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html new file mode 100644 index 00000000000..812a7952738 --- /dev/null +++ b/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html @@ -0,0 +1,8 @@ +<!DOCTYPE html> +<link rel="help" href="https://crbug.com/414645284"> +<div id="target"></div> +<script> + target.animate([ + { offset: "calc(20% * sibling-index())" }, + ], 2000); +</script> diff --git a/tests/wpt/tests/web-animations/resources/keyframe-tests.js b/tests/wpt/tests/web-animations/resources/keyframe-tests.js index 2bcce1ecf47..34a84f45b20 100644 --- a/tests/wpt/tests/web-animations/resources/keyframe-tests.js +++ b/tests/wpt/tests/web-animations/resources/keyframe-tests.js @@ -541,11 +541,6 @@ const gKeyframesTests = [ output: [keyframe(offset(0.5), { left: '10px' })], }, { - desc: 'a single keyframe sequence with a complex calc() offset', - input: [{ offset: 'calc(0.5 + 0.25 * sign(100em - 1px))', left: '10px' }], - output: [keyframe(offset(0.75), { left: '10px' })], - }, - { desc: 'a one property keyframe sequence with some omitted offsets', input: [{ offset: 0.00, left: '10px' }, { offset: 0.25, left: '20px' }, diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py index fdb9e8b3ca7..8322829ebaf 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py @@ -318,7 +318,7 @@ async def test_iframe( event = await wait_for_future_safe(on_prompt_closed) assert event == { - "context": new_tab["context"], + "context": frame["context"], "accepted": True, "type": "alert", } diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py index c24128004f7..a9051f662c8 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py @@ -197,7 +197,7 @@ async def test_iframe( event = await wait_for_future_safe(on_entry) assert event == { - "context": new_tab["context"], + "context": frame["context"], "type": "alert", "handler": "dismiss", "message": "in iframe", diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py index 79241287fbc..e804848e0be 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py @@ -114,6 +114,18 @@ async def test_params_coordinates_latitude_invalid_type(bidi_session, top_contex ) +@pytest.mark.parametrize("value", [-90.1, 90.1]) +async def test_params_coordinates_latitude_invalid_value(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=value, + longitude=10, + ), + ) + + async def test_params_coordinates_longitude_missing(bidi_session, top_context): with pytest.raises(error.InvalidArgumentException): await bidi_session.emulation.set_geolocation_override( @@ -136,6 +148,18 @@ async def test_params_coordinates_longitude_invalid_type(bidi_session, top_conte ) +@pytest.mark.parametrize("value", [-180.5, 180.5]) +async def test_params_coordinates_longitude_invalid_value(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=value, + ), + ) + + @pytest.mark.parametrize("value", [False, "foo", [], {}]) async def test_params_coordinates_accuracy_invalid_type(bidi_session, top_context, value): with pytest.raises(error.InvalidArgumentException): @@ -149,6 +173,18 @@ async def test_params_coordinates_accuracy_invalid_type(bidi_session, top_contex ) +async def test_params_coordinates_accuracy_invalid_value(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=10, + accuracy=-1, + ), + ) + + @pytest.mark.parametrize("value", [False, "foo", [], {}]) async def test_params_coordinates_altitude_invalid_type(bidi_session, top_context, value): with pytest.raises(error.InvalidArgumentException): @@ -176,6 +212,19 @@ async def test_params_coordinates_altitude_accuracy_invalid_type(bidi_session, t ) +async def test_params_coordinates_altitude_accuracy_invalid_value(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=10, + altitude=10, + altitude_accuracy=-1, + ), + ) + + async def test_params_coordinates_altitude_accuracy_without_altitude(bidi_session, top_context): with pytest.raises(error.InvalidArgumentException): await bidi_session.emulation.set_geolocation_override( @@ -201,6 +250,19 @@ async def test_params_coordinates_heading_invalid_type(bidi_session, top_context ) +@pytest.mark.parametrize("value", [-0.5, 360, 360.5]) +async def test_params_coordinates_heading_invalid_value(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=10, + heading=value, + ), + ) + + @pytest.mark.parametrize("value", [False, "foo", [], {}]) async def test_params_coordinates_speed_invalid_type(bidi_session, top_context, value): with pytest.raises(error.InvalidArgumentException): @@ -214,6 +276,18 @@ async def test_params_coordinates_speed_invalid_type(bidi_session, top_context, ) +async def test_params_coordinates_speed_invalid_value(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=10, + speed=-1.5, + ), + ) + + @pytest.mark.parametrize("value", [True, "foo", 42, {}]) async def test_params_user_contexts_invalid_type(bidi_session, value): with pytest.raises(error.InvalidArgumentException): diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py index 9483a707eab..e8119d29d9e 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py @@ -396,7 +396,7 @@ async def test_page_with_cached_script_javascript( @pytest.mark.asyncio -async def tst_page_with_cached_javascript_module( +async def test_page_with_cached_javascript_module( bidi_session, url, inline, diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js b/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js index 612003d58ea..12bfa0bd73e 100644 --- a/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js +++ b/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js @@ -33,3 +33,13 @@ promise_test(async t => { }); await closeEventPromise; }, 'Close event on port2 is fired when port1, which is in a different window, is explicitly closed.') + +promise_test(async t => { + const rc = await addWindow(); + const waitForPort = expectMessagePortFromWindowWithoutStartingIt(window); + await createMessageChannelAndSendPortFollowedByClose(rc); + const port = await waitForPort; + const closeEventPromise = createCloseEventPromise(port); + port.start(); + await closeEventPromise; +}, 'Close event on port2 is fired when port1, in a different window, is closed during the transfer of port2.') diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js b/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js index cb9ea9fe981..48744ac1c5b 100644 --- a/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js +++ b/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js @@ -22,6 +22,44 @@ function expectMessagePortFromWindow(window) { } /** + * Create a new promise that resolves when the window receives + * the MessagePort and does not start it. + * + * @param {Window} window - The window to wait for the MessagePort. + * @returns {Promise<MessagePort>} A promise you should await to ensure the + * window + * receives the MessagePort. + */ +function expectMessagePortFromWindowWithoutStartingIt(window) { + return new Promise(resolve => { + window.onmessage = e => { + try { + assert_true(e.ports[0] instanceof window.MessagePort); + resolve(e.ports[0]); + } catch (e) { + reject(e); + } + }; + }); +} + +/** + * Create a new MessageChannel and transfers one of the ports to + * the window which opened the window with a remote context provided + * as an argument, and immediately closes the entangled port. + * + * @param {RemoteContextWrapper} remoteContextWrapper + */ +async function createMessageChannelAndSendPortFollowedByClose(remoteContextWrapper) { + await remoteContextWrapper.executeScript(() => { + const {port1, port2} = new MessageChannel(); + port1.start(); + window.opener.postMessage({}, '*', [port2]); + port1.close(); + }); +} + +/** * Create a new MessageChannel and transfers one of the ports to * the window which opened the window with a remote context provided * as an argument. diff --git a/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js b/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js index fcf144200f6..de6a5761df4 100644 --- a/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js @@ -14,11 +14,8 @@ // MLOperand abs(MLOperand input); -const getAbsPrecisionTolerance = (graphResources) => { - const toleranceValueDict = {float32: 0, float16: 0}; - const expectedDataType = - getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); - return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; +const getAbsPrecisionTolerance = () => { + return {metricType: 'ULP', value: 0}; }; const absTests = [ @@ -538,6 +535,62 @@ const absTests = [ } } } + }, + + // int8 tests + { + 'name': 'abs int8 4D tensor', + 'graph': { + 'inputs': { + 'absInput': { + 'data': [ + // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127] + // abs(-128) would overflow when data type is int8 + -127, 0, 126, 127 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + }, + 'operators': [{ + 'name': 'abs', + 'arguments': [{'input': 'absInput'}], + 'outputs': 'absOutput' + }], + 'expectedOutputs': { + 'absOutput': { + 'data': [127, 0, 126, 127], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + } + } + }, + + // int32 tests + { + 'name': 'abs int32 4D tensor', + 'graph': { + 'inputs': { + 'absInput': { + 'data': [ + // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647] + // abs(-2147483648) would overflow when data type is int32 + -2147483647, 0, 2147483646, 2147483647 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + }, + 'operators': [{ + 'name': 'abs', + 'arguments': [{'input': 'absInput'}], + 'outputs': 'absOutput' + }], + 'expectedOutputs': { + 'absOutput': { + 'data': [2147483647, 0, 2147483646, 2147483647], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + } + } } ]; diff --git a/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js b/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js index 0208e2ec605..d4192172046 100644 --- a/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js @@ -22,50 +22,6 @@ const getConcatPrecisionTolerance = (graphResources) => { return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; }; -const buildAndExecuteGraphWithConcat = - async (context, builder, graphResources) => { - const graphInputs = graphResources.inputs; - const operator = graphResources.operators[0]; - - const inputOperands = []; - const inputNameArray = - operator.arguments[0][Object.keys(operator.arguments[0])[0]]; - for (const inputName of inputNameArray) { - const operand = - createOperand(context, builder, inputName, graphInputs[inputName]); - inputOperands.push(operand); - } - - let outputOperand = builder[operator.name]( - inputOperands, - operator.arguments[1][Object.keys(operator.arguments[1])[0]]); - const outputOperandName = Object.keys(graphResources.expectedOutputs)[0]; - const expectedDescriptor = - graphResources.expectedOutputs[outputOperandName].descriptor; - if (!context.opSupportLimits().output.dataTypes.includes( - expectedDescriptor.dataType)) { - const compatibleType = findCompatibleType( - expectedDescriptor.dataType, - context.opSupportLimits().output.dataTypes); - outputOperand = builder.cast(outputOperand, compatibleType); - expectedDescriptor.castedType = compatibleType; - } - - assertDescriptorsEquals(outputOperand, expectedDescriptor); - - const namedOutputOperand = {}; - namedOutputOperand[outputOperandName] = outputOperand; - - // Compile the constructed graph. - const graph = await builder.build(namedOutputOperand); - - // Execute the compiled graph. - const result = await computeGraph( - context, graph, graphInputs, graphResources.expectedOutputs); - - return {result, namedOutputOperand}; -}; - const concatTests = [ { 'name': 'concat two float32 1D constant tensors of same shape along axis 0', @@ -2428,7 +2384,7 @@ const concatTests = [ if (navigator.ml) { concatTests.forEach((test) => { webnn_conformance_test( - buildAndExecuteGraphWithConcat, getConcatPrecisionTolerance, test); + buildAndExecuteGraph, getConcatPrecisionTolerance, test); }); } else { test(() => assert_implements(navigator.ml, 'missing navigator.ml')); diff --git a/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js b/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js index c03afc52516..8bc10475453 100644 --- a/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js @@ -14,11 +14,8 @@ // MLOperand neg(MLOperand input); -const getNegPrecisionTolerance = (graphResources) => { - const toleranceValueDict = {float32: 0, float16: 0}; - const expectedDataType = - getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); - return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; +const getNegPrecisionTolerance = () => { + return {metricType: 'ULP', value: 0}; }; const negTests = [ @@ -551,6 +548,62 @@ const negTests = [ } } } + }, + + // int8 tests + { + 'name': 'neg int8 4D tensor', + 'graph': { + 'inputs': { + 'negInput': { + 'data': [ + // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127] + // neg(-128) would overflow when data type is int8 + -127, 0, 126, 127 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + }, + 'operators': [{ + 'name': 'neg', + 'arguments': [{'input': 'negInput'}], + 'outputs': 'negOutput' + }], + 'expectedOutputs': { + 'negOutput': { + 'data': [127, 0, -126, -127], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + } + } + }, + + // int32 tests + { + 'name': 'neg int32 4D tensor', + 'graph': { + 'inputs': { + 'negInput': { + 'data': [ + // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647] + // neg(-2147483648) would overflow when data type is int32 + -2147483647, 0, 2147483646, 2147483647 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + }, + 'operators': [{ + 'name': 'neg', + 'arguments': [{'input': 'negInput'}], + 'outputs': 'negOutput' + }], + 'expectedOutputs': { + 'negOutput': { + 'data': [2147483647, 0, -2147483646, -2147483647], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + } + } } ]; diff --git a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js index 8f6f2246b04..3b59c3bb49d 100644 --- a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js @@ -558,6 +558,372 @@ const subgraphTests = [ } } }, + { + 'name': 'quantized tanh', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 0.6811466217041016, 0.0479511022567749, 0.33355462551116943, + 0.19882695376873016, 0.41167140007019043, 0.07934240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'tanh', + 'arguments': [{'input': 'dequantizedInput'}], + 'outputs': 'tanhOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'tanhOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedtanhOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedtanhOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.5921568870544434, 0.0470588281750679, 0.32156863808631897, + 0.19607844948768616, 0.38823533058166504, 0.0784313753247261, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized sigmoid', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 0.6811466217041016, 0.0479511022567749, 0.33355462551116943, + 0.19882695376873016, 0.41167140007019043, 0.07934240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.00390625], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.00390625], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'sigmoid', + 'arguments': [{'input': 'dequantizedInput'}], + 'outputs': 'sigmoidOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'sigmoidOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedsigmoidOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedsigmoidOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.6640625, 0.51171875, 0.58203125, + 0.55078125, 0.6015625, 0.51953125, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized leaky relu', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 1.6811466217041016, 0.0479511022567749, 0.33355462551116943, + -0.1988269537687301, -0.0041167140007019, -0.0634240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [0], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [0], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'leakyRelu', + 'arguments': [ + {'input': 'dequantizedInput'}, + {'options': {'alpha': 5.799162942273234}} + ], + 'outputs': 'leakyReluOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'leakyReluOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedleakyReluOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedleakyReluOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.49803924560546875, 0.0470588281750679, 0.3333333432674408, + -0.501960813999176, -0.02352941408753395, -0.364705890417099, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized concat', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [ + -0.990639865398407, -0.576785683631897, -0.32276400923728943, + -0.44735023379325867, -0.11028251051902771, -0.5945112705230713, + ], + 'descriptor': {shape: [3, 2], dataType: 'float32'}, + 'constant': false + }, + 'inputAScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputAZeroPoint': { + 'data': [127], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'inputB': { + 'data': [ + 2, 27, 38, + ], + 'descriptor': {shape: [3, 1], dataType: 'int8'}, + 'constant': true + }, + 'inputBScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputBZeroPoint': { + 'data': [127], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [127], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'inputA'}, + {'scale': 'inputAScale', 'zeroPoint': 'inputAZeroPoint'} + ], + 'outputs': 'quantizedInputA' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInputA'}, + {'scale': 'inputAScale', 'zeroPoint': 'inputAZeroPoint'} + ], + 'outputs': 'dequantizedInputA' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'inputB'}, + {'scale': 'inputBScale', 'zeroPoint': 'inputBZeroPoint'} + ], + 'outputs': 'dequantizedInputB' + }, + { + 'name': 'concat', + 'arguments': [ + { + 'inputs': ['dequantizedInputA', 'dequantizedInputB'] + }, + {'axis': 1} + ], + 'outputs': 'concatOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'concatOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedConcatOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedConcatOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + -0.9921569228172302, -0.5764706134796143, -0.4901961088180542, + -0.32156863808631897, -0.44705885648727417, -0.3921568989753723, + -0.1098039299249649, -0.5960784554481506, -0.3490196168422699, + ], + 'descriptor': {shape: [3, 3], dataType: 'float32'} + } + } + } + }, ]; if (navigator.ml) { diff --git a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js index 16cc2a3fa67..63ef9fa9ff0 100644 --- a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js @@ -581,7 +581,61 @@ const reluTests = [ } } } - } + }, + + // int8 tests + { + 'name': 'relu int8 4D tensor', + 'graph': { + 'inputs': { + 'reluInput': { + 'data': [ + // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127] + -128, 0, 126, 127 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + }, + 'operators': [{ + 'name': 'relu', + 'arguments': [{'input': 'reluInput'}], + 'outputs': 'reluOutput' + }], + 'expectedOutputs': { + 'reluOutput': { + 'data': [0, 0, 126, 127], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + } + } + }, + + // int32 tests + { + 'name': 'relu int32 4D tensor', + 'graph': { + 'inputs': { + 'reluInput': { + 'data': [ + // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647] + -2147483648, 0, 2147483646, 2147483647 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + }, + 'operators': [{ + 'name': 'relu', + 'arguments': [{'input': 'reluInput'}], + 'outputs': 'reluOutput' + }], + 'expectedOutputs': { + 'reluOutput': { + 'data': [0, 0, 2147483646, 2147483647], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + } + } + }, ]; if (navigator.ml) { diff --git a/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js b/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js index 2f2fadf7282..85b15f5a000 100644 --- a/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js @@ -14,7 +14,16 @@ const getSubPrecisionTolerance = (graphResources) => { - const toleranceValueDict = {float32: 1, float16: 1}; + const toleranceValueDict = { + float32: 1, + float16: 1, + int8: 0, + uint8: 0, + int32: 0, + uint32: 0, + int64: 0, + uint64: 0 + }; const expectedDataType = getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; @@ -916,6 +925,208 @@ const subTests = [ } } } + }, + + // int8 tests + { + 'name': 'sub int8 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [ + 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74, + 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'} + }, + 'inputB': { + 'data': [ + -49, 40, 7, 76, -81, 59, 11, 48, 65, 27, 30, -38, + -49, -78, 16, 35, -28, 28, 35, -3, -57, -21, 27, 32 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + // the range of int8 result: [-128, 127] + 'data': [ + 122, -26, -76, -128, 6, -61, -94, -33, -127, 5, 52, -36, + 127, 126, -35, -120, 117, -6, 45, 100, 109, 110, -47, 67 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'} + } + } + } + }, + + // uint8 tests + { + 'name': 'sub uint8 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [1, 10, 100, 255], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'} + }, + 'inputB': { + // b should be lesser than or equal to a, otherwise the result would + // overflow when testing uint8 data type + 'data': [1, 8, 88, 254], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [0, 2, 12, 1], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'} + } + } + } + }, + + // int32 tests + { + 'name': 'sub int32 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [ + 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74, + 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'} + }, + 'inputB': { + 'data': [ + -49, 40, 7, 89, -81, 59, 11, 48, 85, 27, 30, -38, + -83, -86, 16, 46, -28, 28, 35, -77, -57, -58, 27, 32 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [ + 122, -26, -76, -141, 6, -61, -94, -33, -147, 5, 52, -36, + 161, 134, -35, -131, 117, -6, 45, 174, 109, 147, -47, 67 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'} + } + } + } + }, + + // uint32 tests + { + 'name': 'sub uint32 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [1, 10, 100, 1024], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'} + }, + 'inputB': { + // b should be lesser than or equal to a, otherwise the result would + // overflow when testing uint32 data type + 'data': [1, 8, 88, 1000], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [0, 2, 12, 24], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'} + } + } + } + }, + + // int64 tests + { + 'name': 'sub int64 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [ + 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74, + 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'} + }, + 'inputB': { + 'data': [ + -49, 40, 7, 89, -81, 59, 11, 48, 85, 27, 30, -38, + -83, -86, 16, 46, -28, 28, 35, -77, -57, -58, 27, 32 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [ + 122, -26, -76, -141, 6, -61, -94, -33, -147, 5, 52, -36, + 161, 134, -35, -131, 117, -6, 45, 174, 109, 147, -47, 67 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'} + } + } + } + }, + + // uint64 tests + { + 'name': 'sub uint64 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [1, 10, 100, 1024], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'} + }, + 'inputB': { + // b should be lesser than or equal to a, otherwise the result would + // overflow when testing uint64 data type + 'data': [1, 8, 88, 1000], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [0, 2, 12, 24], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'} + } + } + } } ]; diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js index d19cb7cf760..50d7911a918 100644 --- a/tests/wpt/tests/webnn/resources/utils.js +++ b/tests/wpt/tests/webnn/resources/utils.js @@ -10,7 +10,7 @@ const operatorToleranceDict = { leakyRelu: {float32: 1, float16: 2}, linear: {float32: 2, float16: 2}, prelu: {float32: 1, float16: 1}, - relu: {float32: 0, float16: 0}, + relu: {float32: 0, float16: 0, int8: 0, int32: 0}, reshape: {float32: 0, float16: 0}, sigmoid: {float32: 34, float16: 10}, softplus: {float32: 18, float16: 18}, @@ -703,6 +703,10 @@ function validateContextSupportsGraph(context, graph) { assert( typeof inputName === 'string', `the inputs' item of ${operatorName} should be a string.`); + if (!graph.inputs[inputName]) { + // intermediate input + continue; + } validateInputOrConstantDataType( inputName, operatorSupportLimits, 'inputs'); } @@ -788,7 +792,21 @@ const buildAndExecuteGraph = async (context, builder, graphResources) => { for (const argument of operator.arguments) { for (const argumentName in argument) { if (argumentName !== 'options') { - if (graphInputs.hasOwnProperty(argument[argumentName])) { + if (operator.name === 'concat' && argumentName === 'inputs') { + const concatInputs = []; + for (const inputName of argument[argumentName]) { + if (graphInputs.hasOwnProperty(inputName)) { + const operandName = inputName; + const operand = createOperand( + context, builder, operandName, graphInputs[operandName]); + concatInputs.push(operand); + } else if (intermediateOperands.hasOwnProperty(inputName)) { + concatInputs.push(intermediateOperands[inputName]); + } + // concatInputs.push(intermediateOperands[inputName]); + } + argumentArray.push(concatInputs); + } else if (graphInputs.hasOwnProperty(argument[argumentName])) { const operandName = argument[argumentName]; const operand = createOperand( context, builder, operandName, graphInputs[operandName]); diff --git a/tests/wpt/tests/webrtc-stats/supported-stats.https.html b/tests/wpt/tests/webrtc-stats/supported-stats.https.html index 677736f3cd8..81aef5f94b9 100644 --- a/tests/wpt/tests/webrtc-stats/supported-stats.https.html +++ b/tests/wpt/tests/webrtc-stats/supported-stats.https.html @@ -69,6 +69,7 @@ function isPropertyTestable(type, property) { ], 'inbound-rtp': [ 'fecSsrc', // requires FlexFEC to be negotiated. + 'fecBytesReceived', // requires FlexFEC to be negotiated. ], 'media-source': [ 'echoReturnLoss', // requires gUM with an audio input device. diff --git a/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html b/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html index aa66bfbb2bf..bc7831361ab 100644 --- a/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html +++ b/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html @@ -301,4 +301,28 @@ }] })); }, `with empty urls should throw SyntaxError`); + test(() => { + const pc = new RTCPeerConnection({ iceServers: [{ + urls: 'stun:stun1.example.net' + }] }); + let config = pc.getConfiguration(); + assert_equals(config.iceServers.length, 1); + pc.setConfiguration({}); + config = pc.getConfiguration(); + assert_equals(config.iceServers.length, 0); + }, `setConfiguration(config) - without iceServers removes ice servers`); + + config_test(makePc => { + const pc = makePc({ iceServers: [...Array(32)].map((_, i) => ({ + urls: `stun:stun${i+1}.example.net` + })) }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 32); + + for (let i = 0; i < 32; i++) { + const server = iceServers[i]; + assert_array_equals(server.urls, [`stun:stun${i+1}.example.net`]); + } + }, `with 32 ice servers must succeed`); </script> diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html b/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html index 3fd83a76fe2..62df4293067 100644 --- a/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html +++ b/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html @@ -319,18 +319,21 @@ of 16 characters. If one of the RIDs does not meet these requirements, throw a TypeError. */ + +["video", "audio"].forEach(kind => { + test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); assert_idl_attribute(pc, 'addTransceiver'); assert_throws_js(TypeError, () => - pc.addTransceiver('video', { + pc.addTransceiver(kind, { sendEncodings: [{ rid: '@Invalid!' }] })); - }, 'addTransceiver() with rid containing invalid non-alphanumeric characters should throw TypeError'); + }, `addTransceiver("${kind}") with rid containing invalid non-alphanumeric characters should throw TypeError`); test(t => { const pc = new RTCPeerConnection(); @@ -338,22 +341,41 @@ assert_idl_attribute(pc, 'addTransceiver'); assert_throws_js(TypeError, () => - pc.addTransceiver('audio', { + pc.addTransceiver(kind, { sendEncodings: [{ rid: 'a'.repeat(17) }] })); - }, 'addTransceiver() with rid longer than 16 characters should throw TypeError'); + }, `addTransceiver("${kind}") with rid longer than 16 characters should throw TypeError`); + + test(t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + assert_idl_attribute(pc, 'addTransceiver'); + + assert_throws_js(TypeError, () => + pc.addTransceiver(kind, { + sendEncodings: [{rid: 'a'}, {rid: 'a'}] + })); + }, `addTransceiver("${kind}") with duplicate rids should throw TypeError`); test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); - pc.addTransceiver('audio', { + pc.addTransceiver(kind, { sendEncodings: [{ rid: 'foo' }] }); - }, `addTransceiver() with valid rid value should succeed`); + }, `addTransceiver("${kind}") with valid rid value should succeed`); + + test(t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + pc.addTransceiver('video', { + sendEncodings: [{rid: 'a'}, {rid: 'b'}] + }); + }, `addTransceiver("${kind}") with multiple rid values should succeed`); test(t => { const pc = new RTCPeerConnection(); @@ -369,7 +391,8 @@ rid: 'foo' }] }); - }, `addTransceiver() with valid sendEncodings should succeed`); + }, `addTransceiver("${kind}") with valid sendEncodings should succeed`); +}); /* TODO diff --git a/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html b/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html new file mode 100644 index 00000000000..f3256106e90 --- /dev/null +++ b/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/webxr_util.js"></script> +<script src="../../resources/webxr_math_utils.js"></script> +<script src="../../resources/webxr_test_constants.js"></script> +<script src="../../resources/webxr_test_asserts.js"></script> +<script src="../../resources/webxr_test_constants_fake_depth.js"></script> +<script src="../matchDepthViewValues.js"></script> + +<script> + +const fakeDeviceInitParams = { + supportedModes: ["immersive-ar"], + views: VALID_VIEWS, + supportedFeatures: ALL_FEATURES, + depthSensingData: DEPTH_SENSING_DATA, +}; + +function matchDepthViewFalsePlaceholderTest(session) { + // Currently we just assert that we are able to get a session when + // matchDepthView is false. If we got to this point, we have a session. + return Promise.resolve(); +} + +xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized`", + depthViewGeometryTestGenerator(/*isCpuOptimized=*/true), + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['cpu-optimized'], + dataFormatPreference: [], + }, + }); + +xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized`", + depthViewGeometryTestGenerator(/*isCpuOptimized=*/true), + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['cpu-optimized'], + dataFormatPreference: [], + matchDepthView: true, + }, + }); + +xr_session_promise_test("Ensures session can be created when matchDepthView=false, `cpu-optimized`", + matchDepthViewFalsePlaceholderTest, + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['cpu-optimized'], + dataFormatPreference: [], + matchDepthView: false, + }, + }); + +</script> diff --git a/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html b/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html new file mode 100644 index 00000000000..1813ddd449e --- /dev/null +++ b/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/webxr_util.js"></script> +<script src="../../resources/webxr_math_utils.js"></script> +<script src="../../resources/webxr_test_constants.js"></script> +<script src="../../resources/webxr_test_asserts.js"></script> +<script src="../../resources/webxr_test_constants_fake_depth.js"></script> +<script src="../matchDepthViewValues.js"></script> + +<script> + +const fakeDeviceInitParams = { + supportedModes: ["immersive-ar"], + views: VALID_VIEWS, + supportedFeatures: ALL_FEATURES, + depthSensingData: DEPTH_SENSING_DATA, +}; + +function matchDepthViewFalsePlaceholderTest(session) { + // Currently we just assert that we are able to get a session when + // matchDepthView is false. If we got to this point, we have a session. + return Promise.resolve(); +} + +xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized`", + depthViewGeometryTestGenerator(/*isCpuOptimized=*/false), + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['gpu-optimized'], + dataFormatPreference: [], + }, + }); + +xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized`", + depthViewGeometryTestGenerator(/*isCpuOptimized=*/false), + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['gpu-optimized'], + dataFormatPreference: [], + matchDepthView: true, + }, + }); + +xr_session_promise_test("Ensures session can be created when matchDepthView=false, `gpu-optimized`", + matchDepthViewFalsePlaceholderTest, + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['gpu-optimized'], + dataFormatPreference: [], + matchDepthView: false, + }, + }); + +</script> diff --git a/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js b/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js new file mode 100644 index 00000000000..597f9734d3f --- /dev/null +++ b/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js @@ -0,0 +1,31 @@ +'use strict'; + +// import * as XrConstants from 'resources/webxr_test_constants.js' +// import * as XrAsserts from 'resources/webxr_test_asserts.js' + +// TODO: Expand the WebXrTestApi to specify a viewGeometry that this can validate +// as well. +const depthViewGeometryTestGenerator = function(isCpuOptimized) { + return (session, controller, t, sessionObjects) => { + + return session.requestReferenceSpace('viewer').then((viewerSpace) => new Promise((resolve) => { + + const glBinding = new XRWebGLBinding(session, sessionObjects.gl); + + const rafCb = function(time, frame) { + const pose = frame.getViewerPose(viewerSpace); + for(const view of pose.views) { + const depthInformation = isCpuOptimized ? frame.getDepthInformation(view) + : glBinding.getDepthInformation(view); + t.step(()=> { + assert_matrix_approx_equals(IDENTITY_MATRIX, depthInformation.projectionMatrix); + assert_transform_approx_equals(IDENTITY_TRANSFORM, depthInformation.transform); + }); + } + resolve(); + } + + session.requestAnimationFrame(rafCb); + })); // Promise + }; // Test Func +}; // Generator Func diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini index 37602dbc1f6..435cfbe0d5c 100644 --- a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini +++ b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini @@ -13,6 +13,3 @@ [WebGL test #588] expected: FAIL - - [WebGL test #52] - expected: FAIL |