diff options
529 files changed, 20773 insertions, 2724 deletions
diff --git a/Cargo.lock b/Cargo.lock index 74c26708e59..15991d2b9ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "webxr" version = "0.0.1" -source = "git+https://github.com/servo/webxr#b79870164f518d90268aaaac1fb83059b83dceda" +source = "git+https://github.com/servo/webxr#c6abf4c60d165ffc978ad2ebd6bcddc3c21698e1" dependencies = [ "bindgen", "euclid", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "webxr-api" version = "0.0.1" -source = "git+https://github.com/servo/webxr#b79870164f518d90268aaaac1fb83059b83dceda" +source = "git+https://github.com/servo/webxr#c6abf4c60d165ffc978ad2ebd6bcddc3c21698e1" dependencies = [ "euclid", "ipc-channel", diff --git a/README.md b/README.md index 98687f13fe8..164d7ca555f 100644 --- a/README.md +++ b/README.md @@ -227,6 +227,15 @@ settings for the installer are fine). 7. Install Visual Studio Community 2017 (https://www.visualstudio.com/vs/community/). You MUST add "Visual C++" to the list of installed components as well as the "Windows Universal C runtime." They are not on by default. Visual Studio 2017 MUST installed to the default location or mach.bat will not find it. +Note that version is hard to download online and is easier to install via [Chocolatey](https://chocolatey.org/install#installing-chocolatey) with: +``` +choco install -y visualstudio2017community --package-parameters="'--add Microsoft.VisualStudio.Component.Git'" +Update-SessionEnvironment #refreshing env due to Git install + +#--- UWP Workload and installing Windows Template Studio --- +choco install -y visualstudio2017-workload-nativedesktop +``` + ##### [Optional] Install LLVM for faster link times You may experience much faster builds on Windows by following these steps. (Related Rust issue: https://github.com/rust-lang/rust/issues/37543) diff --git a/components/bluetooth/lib.rs b/components/bluetooth/lib.rs index 19d6db743e4..5c54860d9e3 100644 --- a/components/bluetooth/lib.rs +++ b/components/bluetooth/lib.rs @@ -288,7 +288,7 @@ impl BluetoothManager { self.adapter = BluetoothAdapter::init_mock().ok(); match test::test(self, data_set_name) { Ok(_) => return Ok(()), - Err(error) => Err(BluetoothError::Type(error.description().to_owned())), + Err(error) => Err(BluetoothError::Type(error.to_string())), } } diff --git a/components/config/Cargo.toml b/components/config/Cargo.toml index 774c1b0f7bf..f930b60a5d3 100644 --- a/components/config/Cargo.toml +++ b/components/config/Cargo.toml @@ -30,5 +30,5 @@ servo_config_plugins = { path = "../config_plugins" } [dev-dependencies] std_test_override = { path = "../std_test_override" } -[target.'cfg(not(any(target_os = "android", feature = "uwp")))'.dependencies] +[target.'cfg(not(target_os = "android"))'.dependencies] dirs = "1.0" diff --git a/components/devtools/protocol.rs b/components/devtools/protocol.rs index bfc547f6b75..29fbaa2beeb 100644 --- a/components/devtools/protocol.rs +++ b/components/devtools/protocol.rs @@ -8,7 +8,6 @@ use serde::Serialize; use serde_json::{self, Value}; -use std::error::Error; use std::io::{Read, Write}; use std::net::TcpStream; @@ -62,7 +61,7 @@ impl JsonPacketStream for TcpStream { Ok(0) => return Ok(None), // EOF Ok(1) => buf[0], Ok(_) => unreachable!(), - Err(e) => return Err(e.description().to_owned()), + Err(e) => return Err(e.to_string()), }; match byte { b':' => { @@ -79,7 +78,7 @@ impl JsonPacketStream for TcpStream { debug!("{}", packet); return match serde_json::from_str(&packet) { Ok(json) => Ok(Some(json)), - Err(err) => Err(err.description().to_owned()), + Err(err) => Err(err.to_string()), }; }, c => buffer.push(c), diff --git a/components/layout_2020/display_list.rs b/components/layout_2020/display_list.rs index f39a2f23b18..6bd6c60a663 100644 --- a/components/layout_2020/display_list.rs +++ b/components/layout_2020/display_list.rs @@ -5,15 +5,21 @@ use crate::fragments::{BoxFragment, Fragment}; use crate::geom::physical::{Rect, Vec2}; use embedder_traits::Cursor; -use euclid::{Point2D, SideOffsets2D}; +use euclid::{Point2D, SideOffsets2D, Size2D}; use gfx::text::glyph::GlyphStore; use std::sync::Arc; +use style::dom::OpaqueNode; use style::properties::ComputedValues; -use style::values::computed::{BorderStyle, Length}; -use webrender_api::{self as wr, units, CommonItemProperties, PrimitiveFlags}; +use style::values::computed::{BorderStyle, Length, LengthPercentage}; +use style::values::specified::ui::CursorKind; +use webrender_api::{self as wr, units}; + +// `webrender_api::display_item::ItemTag` is private +type ItemTag = (u64, u16); +type HitInfo = Option<ItemTag>; pub struct DisplayListBuilder { - pipeline_id: wr::PipelineId, + current_space_and_clip: wr::SpaceAndClipInfo, pub wr: wr::DisplayListBuilder, pub is_contentful: bool, } @@ -21,11 +27,33 @@ pub struct DisplayListBuilder { impl DisplayListBuilder { pub fn new(pipeline_id: wr::PipelineId, viewport_size: wr::units::LayoutSize) -> Self { Self { - pipeline_id, + current_space_and_clip: wr::SpaceAndClipInfo::root_scroll(pipeline_id), is_contentful: false, wr: wr::DisplayListBuilder::new(pipeline_id, viewport_size), } } + + fn common_properties( + &self, + clip_rect: units::LayoutRect, + hit_info: HitInfo, + ) -> wr::CommonItemProperties { + wr::CommonItemProperties { + clip_rect, + clip_id: self.current_space_and_clip.clip_id, + spatial_id: self.current_space_and_clip.spatial_id, + hit_info, + // TODO(gw): Make use of the WR backface visibility functionality. + flags: wr::PrimitiveFlags::default(), + } + } + + fn clipping_and_scrolling_scope<R>(&mut self, f: impl FnOnce(&mut Self) -> R) -> R { + let previous = self.current_space_and_clip; + let result = f(self); + self.current_space_and_clip = previous; + result + } } /// Contentful paint, for the purpose of @@ -60,19 +88,12 @@ impl Fragment { .translate(&containing_block.top_left); let mut baseline_origin = rect.top_left.clone(); baseline_origin.y += t.ascent; - let cursor = cursor(&t.parent_style, Cursor::Text); - let common = CommonItemProperties { - clip_rect: rect.clone().into(), - clip_id: wr::ClipId::root(builder.pipeline_id), - spatial_id: wr::SpatialId::root_scroll_node(builder.pipeline_id), - hit_info: cursor.map(|cursor| (t.tag.0 as u64, cursor as u16)), - // TODO(gw): Make use of the WR backface visibility functionality. - flags: PrimitiveFlags::default(), - }; let glyphs = glyphs(&t.glyphs, baseline_origin); if glyphs.is_empty() { return; } + let hit_info = hit_info(&t.parent_style, t.tag, Cursor::Text); + let common = builder.common_properties(rect.clone().into(), hit_info); let color = t.parent_style.clone_color(); builder .wr @@ -85,14 +106,8 @@ impl Fragment { .rect .to_physical(i.style.writing_mode, containing_block) .translate(&containing_block.top_left); - let common = CommonItemProperties { - clip_rect: rect.clone().into(), - clip_id: wr::ClipId::root(builder.pipeline_id), - spatial_id: wr::SpatialId::root_scroll_node(builder.pipeline_id), - hit_info: None, - // TODO(gw): Make use of the WR backface visibility functionality. - flags: PrimitiveFlags::default(), - }; + let hit_info = None; + let common = builder.common_properties(rect.clone().into(), hit_info); builder.wr.push_image( &common, rect.into(), @@ -122,18 +137,11 @@ impl BoxFragment { .to_physical(self.style.writing_mode, containing_block) .translate(&containing_block.top_left) .into(); - let cursor = cursor(&self.style, Cursor::Default); - let common = CommonItemProperties { - clip_rect: border_rect, - clip_id: wr::ClipId::root(builder.pipeline_id), - spatial_id: wr::SpatialId::root_scroll_node(builder.pipeline_id), - hit_info: cursor.map(|cursor| (self.tag.0 as u64, cursor as u16)), - // TODO(gw): Make use of the WR backface visibility functionality. - flags: PrimitiveFlags::default(), - }; + let hit_info = hit_info(&self.style, self.tag, Cursor::Default); + let border_radius = self.border_radius(&border_rect); - self.background_display_items(builder, &common); - self.border_display_items(builder, &common, border_rect); + self.background_display_items(builder, hit_info, border_rect, &border_radius); + self.border_display_items(builder, hit_info, border_rect, border_radius); let content_rect = self .content_rect .to_physical(self.style.writing_mode, containing_block) @@ -143,24 +151,61 @@ impl BoxFragment { } } + fn border_radius(&self, border_rect: &units::LayoutRect) -> wr::BorderRadius { + let resolve = |radius: &LengthPercentage, box_size: f32| { + radius.percentage_relative_to(Length::new(box_size)).px() + }; + let corner = |corner: &style::values::computed::BorderCornerRadius| { + Size2D::new( + resolve(&corner.0.width.0, border_rect.size.width), + resolve(&corner.0.height.0, border_rect.size.height), + ) + }; + let b = self.style.get_border(); + wr::BorderRadius { + top_left: corner(&b.border_top_left_radius), + top_right: corner(&b.border_top_right_radius), + bottom_right: corner(&b.border_bottom_right_radius), + bottom_left: corner(&b.border_bottom_left_radius), + } + } + fn background_display_items( &self, builder: &mut DisplayListBuilder, - common: &CommonItemProperties, + hit_info: HitInfo, + border_rect: units::LayoutRect, + border_radius: &wr::BorderRadius, ) { let background_color = self .style .resolve_color(self.style.clone_background_color()); - if background_color.alpha > 0 || common.hit_info.is_some() { - builder.wr.push_rect(common, rgba(background_color)) + if background_color.alpha > 0 || hit_info.is_some() { + builder.clipping_and_scrolling_scope(|builder| { + if !border_radius.is_zero() { + builder.current_space_and_clip.clip_id = builder.wr.define_clip( + &builder.current_space_and_clip, + border_rect, + Some(wr::ComplexClipRegion { + rect: border_rect, + radii: *border_radius, + mode: wr::ClipMode::Clip, + }), + None, + ); + } + let common = builder.common_properties(border_rect, hit_info); + builder.wr.push_rect(&common, rgba(background_color)) + }); } } fn border_display_items( &self, builder: &mut DisplayListBuilder, - common: &CommonItemProperties, + hit_info: HitInfo, border_rect: units::LayoutRect, + radius: wr::BorderRadius, ) { let b = self.style.get_border(); let widths = SideOffsets2D::new( @@ -187,15 +232,18 @@ impl BoxFragment { BorderStyle::Outset => wr::BorderStyle::Outset, }, }; + let common = builder.common_properties(border_rect, hit_info); let details = wr::BorderDetails::Normal(wr::NormalBorder { top: side(b.border_top_style, b.border_top_color), right: side(b.border_right_style, b.border_right_color), bottom: side(b.border_bottom_style, b.border_bottom_color), left: side(b.border_left_style, b.border_left_color), - radius: wr::BorderRadius::zero(), + radius, do_aa: true, }); - builder.wr.push_border(common, border_rect, widths, details) + builder + .wr + .push_border(&common, border_rect, widths, details) } } @@ -233,16 +281,21 @@ fn glyphs(glyph_runs: &[Arc<GlyphStore>], mut origin: Vec2<Length>) -> Vec<wr::G glyphs } -fn cursor(values: &ComputedValues, default: Cursor) -> Option<Cursor> { +fn hit_info(style: &ComputedValues, tag: OpaqueNode, auto_cursor: Cursor) -> HitInfo { use style::computed_values::pointer_events::T as PointerEvents; - use style::values::specified::ui::CursorKind; - let inherited_ui = values.get_inherited_ui(); + let inherited_ui = style.get_inherited_ui(); if inherited_ui.pointer_events == PointerEvents::None { - return None; + None + } else { + let cursor = cursor(inherited_ui.cursor.keyword, auto_cursor); + Some((tag.0 as u64, cursor as u16)) } - Some(match inherited_ui.cursor.keyword { - CursorKind::Auto => default, +} + +fn cursor(kind: CursorKind, auto_cursor: Cursor) -> Cursor { + match kind { + CursorKind::Auto => auto_cursor, CursorKind::None => Cursor::None, CursorKind::Default => Cursor::Default, CursorKind::Pointer => Cursor::Pointer, @@ -278,5 +331,5 @@ fn cursor(values: &ComputedValues, default: Cursor) -> Option<Cursor> { CursorKind::AllScroll => Cursor::AllScroll, CursorKind::ZoomIn => Cursor::ZoomIn, CursorKind::ZoomOut => Cursor::ZoomOut, - }) + } } diff --git a/components/net/http_cache.rs b/components/net/http_cache.rs index e47b4e81951..592ad7a99aa 100644 --- a/components/net/http_cache.rs +++ b/components/net/http_cache.rs @@ -230,12 +230,15 @@ fn get_response_expiry(response: &Response) -> Duration { let max_heuristic = Duration::hours(24) - age; let heuristic_freshness = if let Some(last_modified) = // If the response has a Last-Modified header field, - // caches are encouraged to use a heuristic expiration value - // that is no more than some fraction of the interval since that time. - response.headers.typed_get::<LastModified>() { + // caches are encouraged to use a heuristic expiration value + // that is no more than some fraction of the interval since that time. + response.headers.typed_get::<LastModified>() + { let current = time::now().to_timespec(); let last_modified: SystemTime = last_modified.into(); - let last_modified = last_modified.duration_since(SystemTime::UNIX_EPOCH).unwrap(); + let last_modified = last_modified + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap(); let last_modified = Timespec::new(last_modified.as_secs() as i64, 0); // A typical setting of this fraction might be 10%. let raw_heuristic_calc = (current - last_modified) / 10; diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index 18e4e696f80..7868556adfe 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -44,7 +44,6 @@ use net_traits::{ use servo_arc::Arc; use servo_url::{ImmutableOrigin, ServoUrl}; use std::collections::{HashMap, HashSet}; -use std::error::Error; use std::iter::FromIterator; use std::mem; use std::ops::Deref; @@ -622,7 +621,7 @@ pub fn http_fetch( HeaderValue::to_str(v) .map(|l| { ServoUrl::parse_with_base(response.actual_response().url(), &l) - .map_err(|err| err.description().into()) + .map_err(|err| err.to_string()) }) .ok() }); diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index c948055bc55..f85d623fe4f 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -40,7 +40,6 @@ use servo_arc::Arc as ServoArc; use servo_url::ServoUrl; use std::borrow::{Cow, ToOwned}; use std::collections::HashMap; -use std::error::Error; use std::fs::{self, File}; use std::io::prelude::*; use std::ops::Deref; @@ -361,7 +360,7 @@ where let mut file = match File::open(&path) { Err(why) => { - warn!("couldn't open {}: {}", display, Error::description(&why)); + warn!("couldn't open {}: {}", display, why); return; }, Ok(file) => file, @@ -369,11 +368,7 @@ where let mut string_buffer: String = String::new(); match file.read_to_string(&mut string_buffer) { - Err(why) => panic!( - "couldn't read from {}: {}", - display, - Error::description(&why) - ), + Err(why) => panic!("couldn't read from {}: {}", display, why), Ok(_) => println!("successfully read from {}", display), } @@ -396,16 +391,12 @@ where let display = path.display(); let mut file = match File::create(&path) { - Err(why) => panic!("couldn't create {}: {}", display, Error::description(&why)), + Err(why) => panic!("couldn't create {}: {}", display, why), Ok(file) => file, }; match file.write_all(json_encoded.as_bytes()) { - Err(why) => panic!( - "couldn't write to {}: {}", - display, - Error::description(&why) - ), + Err(why) => panic!("couldn't write to {}: {}", display, why), Ok(_) => println!("successfully wrote to {}", display), } } diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index a25a804ce01..f7b291e420f 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -31,7 +31,6 @@ use ipc_channel::Error as IpcError; use mime::Mime; use msg::constellation_msg::HistoryStateId; use servo_url::ServoUrl; -use std::error::Error; use time::precise_time_ns; use webrender_api::ImageKey; @@ -699,11 +698,11 @@ pub enum NetworkError { impl NetworkError { pub fn from_hyper_error(error: &HyperError) -> Self { - NetworkError::Internal(error.description().to_owned()) + NetworkError::Internal(error.to_string()) } pub fn from_http_error(error: &HttpError) -> Self { - NetworkError::Internal(error.description().to_owned()) + NetworkError::Internal(error.to_string()) } } diff --git a/components/profile/heartbeats.rs b/components/profile/heartbeats.rs index ac29d12bbb3..5a09ea4f9e6 100644 --- a/components/profile/heartbeats.rs +++ b/components/profile/heartbeats.rs @@ -7,7 +7,6 @@ use heartbeats_simple::HeartbeatPow as Heartbeat; use profile_traits::time::ProfilerCategory; use std::collections::HashMap; use std::env::var_os; -use std::error::Error; use std::fs::File; use std::path::Path; @@ -85,7 +84,7 @@ fn open_heartbeat_log<P: AsRef<Path>>(name: P) -> Option<File> { match File::create(name) { Ok(f) => Some(f), Err(e) => { - warn!("Failed to open heartbeat log: {}", Error::description(&e)); + warn!("Failed to open heartbeat log: {}", e); None }, } @@ -138,7 +137,7 @@ fn maybe_create_heartbeat( fn log_heartbeat_records(hb: &mut Heartbeat) { match hb.log_to_buffer_index() { Ok(_) => (), - Err(e) => warn!("Failed to write heartbeat log: {}", Error::description(&e)), + Err(e) => warn!("Failed to write heartbeat log: {}", e), } } diff --git a/components/profile/time.rs b/components/profile/time.rs index 3dac5663799..cea75b54b44 100644 --- a/components/profile/time.rs +++ b/components/profile/time.rs @@ -19,7 +19,6 @@ use servo_config::opts::OutputOptions; use std::borrow::ToOwned; use std::cmp::Ordering; use std::collections::{BTreeMap, HashMap}; -use std::error::Error; use std::fs::File; use std::io::{self, Write}; use std::path::Path; @@ -397,11 +396,7 @@ impl Profiler { Some(OutputOptions::FileName(ref filename)) => { let path = Path::new(&filename); let mut file = match File::create(&path) { - Err(e) => panic!( - "Couldn't create {}: {}", - path.display(), - Error::description(&e) - ), + Err(e) => panic!("Couldn't create {}: {}", path.display(), e), Ok(file) => file, }; write!( diff --git a/components/script/dom/audiotrack.rs b/components/script/dom/audiotrack.rs index b66ea5bf4cc..af237bc8b1a 100644 --- a/components/script/dom/audiotrack.rs +++ b/components/script/dom/audiotrack.rs @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::audiotracklist::AudioTrackList; +use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::AudioTrackBinding::{self, AudioTrackMethods}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; @@ -19,7 +20,7 @@ pub struct AudioTrack { label: DOMString, language: DOMString, enabled: Cell<bool>, - track_list: Option<Dom<AudioTrackList>>, + track_list: DomRefCell<Option<Dom<AudioTrackList>>>, } impl AudioTrack { @@ -37,7 +38,7 @@ impl AudioTrack { label: label.into(), language: language.into(), enabled: Cell::new(false), - track_list: track_list.map(|t| Dom::from_ref(t)), + track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))), } } @@ -73,6 +74,14 @@ impl AudioTrack { pub fn set_enabled(&self, value: bool) { self.enabled.set(value); } + + pub fn add_track_list(&self, track_list: &AudioTrackList) { + *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list)); + } + + pub fn remove_track_list(&self) { + *self.track_list.borrow_mut() = None; + } } impl AudioTrackMethods for AudioTrack { @@ -103,7 +112,7 @@ impl AudioTrackMethods for AudioTrack { // https://html.spec.whatwg.org/multipage/#dom-audiotrack-enabled fn SetEnabled(&self, value: bool) { - if let Some(list) = self.track_list.as_ref() { + if let Some(list) = self.track_list.borrow().as_ref() { if let Some(idx) = list.find(self) { list.set_enabled(idx, value); } diff --git a/components/script/dom/audiotracklist.rs b/components/script/dom/audiotracklist.rs index e26f23cb2a8..5191221b7d9 100644 --- a/components/script/dom/audiotracklist.rs +++ b/components/script/dom/audiotracklist.rs @@ -104,9 +104,14 @@ impl AudioTrackList { pub fn add(&self, track: &AudioTrack) { self.tracks.borrow_mut().push(Dom::from_ref(track)); + track.add_track_list(self); } pub fn clear(&self) { + self.tracks + .borrow() + .iter() + .for_each(|t| t.remove_track_list()); self.tracks.borrow_mut().clear(); } } diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs index 2514efcf063..2097769cb31 100644 --- a/components/script/dom/bindings/interface.rs +++ b/components/script/dom/bindings/interface.rs @@ -9,16 +9,13 @@ use crate::dom::bindings::codegen::PrototypeList; use crate::dom::bindings::constant::{define_constants, ConstantSpec}; use crate::dom::bindings::conversions::{get_dom_class, DOM_OBJECT_SLOT}; use crate::dom::bindings::guard::Guard; -use crate::dom::bindings::utils::{ - get_proto_or_iface_array, ProtoOrIfaceArray, DOM_PROTOTYPE_SLOT, -}; +use crate::dom::bindings::utils::{ProtoOrIfaceArray, DOM_PROTOTYPE_SLOT}; use crate::script_runtime::JSContext as SafeJSContext; use js::error::throw_type_error; use js::glue::UncheckedUnwrapObject; +use js::jsapi::GetWellKnownSymbol; use js::jsapi::HandleObject as RawHandleObject; -use js::jsapi::MutableHandleValue as RawMutableHandleValue; use js::jsapi::{jsid, Class, ClassOps}; -use js::jsapi::{GetNonCCWObjectGlobal, GetWellKnownSymbol}; use js::jsapi::{JSAutoRealm, JSClass, JSContext, JSFunctionSpec, JSObject, JSFUN_CONSTRUCTOR}; use js::jsapi::{JSPropertySpec, JSString, JSTracer, JS_AtomizeAndPinString}; use js::jsapi::{JS_GetFunctionObject, JS_NewFunction, JS_NewGlobalObject}; @@ -28,10 +25,10 @@ use js::jsapi::{ObjectOps, OnNewGlobalHookOption, SymbolCode}; use js::jsapi::{TrueHandleValue, Value}; use js::jsapi::{JSPROP_PERMANENT, JSPROP_READONLY, JSPROP_RESOLVING}; use js::jsval::{JSVal, PrivateValue}; +use js::rust::wrappers::JS_FireOnNewGlobalObject; use js::rust::wrappers::RUST_SYMBOL_TO_JSID; use js::rust::wrappers::{JS_DefineProperty, JS_DefineProperty5}; use js::rust::wrappers::{JS_DefineProperty3, JS_DefineProperty4, JS_DefinePropertyById5}; -use js::rust::wrappers::{JS_FireOnNewGlobalObject, JS_GetPrototype}; use js::rust::wrappers::{JS_LinkConstructorAndPrototype, JS_NewObjectWithUniqueType}; use js::rust::{define_methods, define_properties, get_object_class}; use js::rust::{HandleObject, HandleValue, MutableHandleObject, RealmOptions}; @@ -102,7 +99,7 @@ impl InterfaceConstructorBehavior { finalize: None, call: Some(invalid_constructor), construct: Some(invalid_constructor), - hasInstance: Some(has_instance_hook), + hasInstance: None, // heycam/webidl#356 trace: None, }) } @@ -119,7 +116,7 @@ impl InterfaceConstructorBehavior { finalize: None, call: Some(non_new_constructor), construct: Some(hook), - hasInstance: Some(has_instance_hook), + hasInstance: None, // heycam/webidl#356 trace: None, }) } @@ -428,78 +425,6 @@ unsafe extern "C" fn fun_to_string_hook( ret } -/// Hook for instanceof on interface objects. -unsafe extern "C" fn has_instance_hook( - cx: *mut JSContext, - obj: RawHandleObject, - value: RawMutableHandleValue, - rval: *mut bool, -) -> bool { - let cx = SafeJSContext::from_ptr(cx); - let obj_raw = HandleObject::from_raw(obj); - let val_raw = HandleValue::from_raw(value.handle()); - match has_instance(cx, obj_raw, val_raw) { - Ok(result) => { - *rval = result; - true - }, - Err(()) => false, - } -} - -/// Return whether a value is an instance of a given prototype. -/// <http://heycam.github.io/webidl/#es-interface-hasinstance> -fn has_instance( - cx: SafeJSContext, - interface_object: HandleObject, - value: HandleValue, -) -> Result<bool, ()> { - if !value.is_object() { - // Step 1. - return Ok(false); - } - - rooted!(in(*cx) let mut value_out = value.to_object()); - rooted!(in(*cx) let mut value = value.to_object()); - - unsafe { - let js_class = get_object_class(interface_object.get()); - let object_class = &*(js_class as *const NonCallbackInterfaceObjectClass); - - if let Ok(dom_class) = get_dom_class(UncheckedUnwrapObject( - value.get(), - /* stopAtWindowProxy = */ 0, - )) { - if dom_class.interface_chain[object_class.proto_depth as usize] == object_class.proto_id - { - // Step 4. - return Ok(true); - } - } - - // Step 2. - let global = GetNonCCWObjectGlobal(interface_object.get()); - assert!(!global.is_null()); - let proto_or_iface_array = get_proto_or_iface_array(global); - rooted!(in(*cx) let prototype = (*proto_or_iface_array)[object_class.proto_id as usize]); - assert!(!prototype.is_null()); - // Step 3 only concern legacy callback interface objects (i.e. NodeFilter). - - while JS_GetPrototype(*cx, value.handle(), value_out.handle_mut()) { - *value = *value_out; - if value.is_null() { - // Step 5.2. - return Ok(false); - } else if value.get() as *const _ == prototype.get() { - // Step 5.3. - return Ok(true); - } - } - } - // JS_GetPrototype threw an exception. - Err(()) -} - fn create_unscopable_object(cx: SafeJSContext, names: &[&[u8]], mut rval: MutableHandleObject) { assert!(!names.is_empty()); assert!(rval.is_null()); diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 217e66837bb..d2e1876b9d8 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -311,6 +311,15 @@ unsafe impl<T: JSTraceable> JSTraceable for VecDeque<T> { } } +unsafe impl<T: JSTraceable + Eq + Hash> JSTraceable for indexmap::IndexSet<T> { + #[inline] + unsafe fn trace(&self, trc: *mut JSTracer) { + for e in self.iter() { + e.trace(trc); + } + } +} + unsafe impl<A, B, C, D> JSTraceable for (A, B, C, D) where A: JSTraceable, diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index e992a8707dd..c45e4286992 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -189,14 +189,21 @@ fn create_html_element( } } - // Steps 7.1-7.2 + // Steps 7.1-7.3 let result = create_native_html_element(name.clone(), prefix, document, creator); + match is { + Some(is) => { + result.set_is(is); + result.set_custom_element_state(CustomElementState::Undefined); + }, + None => { + if is_valid_custom_element_name(&*name.local) { + result.set_custom_element_state(CustomElementState::Undefined); + } + }, + }; - // Step 7.3 - if is_valid_custom_element_name(&*name.local) || is.is_some() { - result.set_custom_element_state(CustomElementState::Undefined); - } - + // Step 8 result } diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index 7b4229835e2..392cf49cce5 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -448,6 +448,17 @@ impl CustomElementRegistryMethods for CustomElementRegistry { // Step 6 promise } + /// https://html.spec.whatwg.org/multipage/#dom-customelementregistry-upgrade + fn Upgrade(&self, node: &Node) { + // Spec says to make a list first and then iterate the list, but + // try-to-upgrade only queues upgrade reactions and doesn't itself + // modify the tree, so that's not an observable distinction. + node.traverse_preorder(ShadowIncluding::Yes).for_each(|n| { + if let Some(element) = n.downcast::<Element>() { + try_upgrade_element(element); + } + }); + } } #[derive(Clone, JSTraceable, MallocSizeOf)] @@ -581,7 +592,9 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen return; } - // Step 3 + // Step 3 happens later to save having to undo it in an exception + + // Step 4 for attr in element.attrs().iter() { let local_name = attr.local_name().clone(); let value = DOMString::from(&**attr.value()); @@ -593,7 +606,7 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen ); } - // Step 4 + // Step 5 if element.is_connected() { ScriptThread::enqueue_callback_reaction( element, @@ -602,44 +615,51 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen ); } - // Step 5 + // Step 6 definition .construction_stack .borrow_mut() .push(ConstructionStackEntry::Element(DomRoot::from_ref(element))); - // Step 7 + // Steps 7-8, successful case let result = run_upgrade_constructor(&definition.constructor, element); + // "regardless of whether the above steps threw an exception" step definition.construction_stack.borrow_mut().pop(); - // Step 7 exception handling + // Step 8 exception handling if let Err(error) = result { - // Step 7.1 + // Step 8.exception.1 element.set_custom_element_state(CustomElementState::Failed); - // Step 7.2 + // Step 8.exception.2 isn't needed since step 3 hasn't happened yet + + // Step 8.exception.3 element.clear_reaction_queue(); - // Step 7.3 + // Step 8.exception.4 let global = GlobalScope::current().expect("No current global"); let cx = global.get_cx(); unsafe { throw_dom_exception(cx, &global, error); report_pending_exception(*cx, true); } + return; } - // Step 8 + // TODO Step 9: "If element is a form-associated custom element..." + + // Step 10 + element.set_custom_element_state(CustomElementState::Custom); - // Step 9 + // Step 3 element.set_custom_element_definition(definition); } /// <https://html.spec.whatwg.org/multipage/#concept-upgrade-an-element> -/// Steps 7.1-7.2 +/// Steps 8.1-8.3 #[allow(unsafe_code)] fn run_upgrade_constructor( constructor: &Rc<CustomElementConstructor>, @@ -654,10 +674,12 @@ fn run_upgrade_constructor( } rooted!(in(*cx) let mut construct_result = ptr::null_mut::<JSObject>()); { + // Step 8.1 TODO when shadow DOM exists + // Go into the constructor's compartment let _ac = JSAutoRealm::new(*cx, constructor.callback()); let args = HandleValueArray::new(); - // Step 7.1 + // Step 8.2 if unsafe { !Construct1( *cx, @@ -668,7 +690,7 @@ fn run_upgrade_constructor( } { return Err(Error::JSFailed); } - // Step 7.2 + // Step 8.3 let mut same = false; rooted!(in(*cx) let construct_result_val = ObjectValue(construct_result.get())); if unsafe { diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 567d4fa6861..ad0e7445f0f 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -538,9 +538,8 @@ impl DedicatedWorkerGlobalScope { let worker = self.worker.borrow().as_ref().unwrap().clone(); let global_scope = self.upcast::<GlobalScope>(); let pipeline_id = global_scope.pipeline_id(); - let origin = global_scope.origin().immutable().ascii_serialization(); let task = Box::new(task!(post_worker_message: move || { - Worker::handle_message(worker, origin, data); + Worker::handle_message(worker, data); })); self.parent_sender .send(CommonScriptMsg::Task( diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 94c9c8603c4..572c18dc129 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -11,7 +11,6 @@ use crate::dom::bindings::callback::ExceptionHandling; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::BeforeUnloadEventBinding::BeforeUnloadEventBinding::BeforeUnloadEventMethods; use crate::dom::bindings::codegen::Bindings::DocumentBinding; -use crate::dom::bindings::codegen::Bindings::DocumentBinding::ElementCreationOptions; use crate::dom::bindings::codegen::Bindings::DocumentBinding::{ DocumentMethods, DocumentReadyState, }; @@ -25,7 +24,7 @@ use crate::dom::bindings::codegen::Bindings::TouchBinding::TouchMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::{ FrameRequestCallback, ScrollBehavior, WindowMethods, }; -use crate::dom::bindings::codegen::UnionTypes::NodeOrString; +use crate::dom::bindings::codegen::UnionTypes::{NodeOrString, StringOrElementCreationOptions}; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; use crate::dom::bindings::num::Finite; @@ -371,6 +370,8 @@ pub struct Document { page_showing: Cell<bool>, /// Whether the document is salvageable. salvageable: Cell<bool>, + /// Whether the document was aborted with an active parser + active_parser_was_aborted: Cell<bool>, /// Whether the unload event has already been fired. fired_unload: Cell<bool>, /// List of responsive images @@ -2265,6 +2266,7 @@ impl Document { // Step 3. if let Some(parser) = self.get_current_parser() { + self.active_parser_was_aborted.set(true); parser.abort(); self.salvageable.set(false); } @@ -2813,6 +2815,7 @@ impl Document { throw_on_dynamic_markup_insertion_counter: Cell::new(0), page_showing: Cell::new(false), salvageable: Cell::new(true), + active_parser_was_aborted: Cell::new(false), fired_unload: Cell::new(false), responsive_images: Default::default(), redirect_count: Cell::new(0), @@ -3622,7 +3625,7 @@ impl DocumentMethods for Document { fn CreateElement( &self, mut local_name: DOMString, - options: &ElementCreationOptions, + options: StringOrElementCreationOptions, ) -> Fallible<DomRoot<Element>> { if xml_name_type(&local_name) == InvalidXMLName { debug!("Not a valid element name"); @@ -3643,7 +3646,12 @@ impl DocumentMethods for Document { }; let name = QualName::new(None, ns, LocalName::from(local_name)); - let is = options.is.as_ref().map(|is| LocalName::from(&**is)); + let is = match options { + StringOrElementCreationOptions::String(_) => None, + StringOrElementCreationOptions::ElementCreationOptions(options) => { + options.is.as_ref().map(|is| LocalName::from(&**is)) + }, + }; Ok(Element::create( name, is, @@ -3658,11 +3666,16 @@ impl DocumentMethods for Document { &self, namespace: Option<DOMString>, qualified_name: DOMString, - options: &ElementCreationOptions, + options: StringOrElementCreationOptions, ) -> Fallible<DomRoot<Element>> { let (namespace, prefix, local_name) = validate_and_extract(namespace, &qualified_name)?; let name = QualName::new(prefix, namespace, local_name); - let is = options.is.as_ref().map(|is| LocalName::from(&**is)); + let is = match options { + StringOrElementCreationOptions::String(_) => None, + StringOrElementCreationOptions::ElementCreationOptions(options) => { + options.is.as_ref().map(|is| LocalName::from(&**is)) + }, + }; Ok(Element::create( name, is, @@ -4449,18 +4462,25 @@ impl DocumentMethods for Document { return Ok(DomRoot::from_ref(self)); } + // Step 7 + if self.active_parser_was_aborted.get() { + return Ok(DomRoot::from_ref(self)); + } + // TODO: prompt to unload. // TODO: set unload_event_start and unload_event_end window_from_node(self).set_navigation_start(); - // Step 7 + // Step 8 // TODO: https://github.com/servo/servo/issues/21937 if self.has_browsing_context() { + // spec says "stop document loading", + // which is a process that does more than just abort self.abort(); } - // Step 8 + // Step 9 for node in self .upcast::<Node>() .traverse_preorder(ShadowIncluding::Yes) @@ -4468,16 +4488,16 @@ impl DocumentMethods for Document { node.upcast::<EventTarget>().remove_all_listeners(); } - // Step 9 + // Step 10 if self.window.Document() == DomRoot::from_ref(self) { self.window.upcast::<EventTarget>().remove_all_listeners(); } - // Step 10 + // Step 11 // TODO: https://github.com/servo/servo/issues/21936 Node::replace_all(None, self.upcast::<Node>()); - // Step 11 + // Step 12 if self.is_fully_active() { let mut new_url = entry_responsible_document.url(); if entry_responsible_document != DomRoot::from_ref(self) { @@ -4487,13 +4507,13 @@ impl DocumentMethods for Document { self.set_url(new_url); } - // Step 12 + // Step 13 // TODO: https://github.com/servo/servo/issues/21938 - // Step 13 + // Step 14 self.set_quirks_mode(QuirksMode::NoQuirks); - // Step 14 + // Step 15 let resource_threads = self .window .upcast::<GlobalScope>() @@ -4503,13 +4523,13 @@ impl DocumentMethods for Document { DocumentLoader::new_with_threads(resource_threads, Some(self.url())); ServoParser::parse_html_script_input(self, self.url()); - // Step 15 - self.ready_state.set(DocumentReadyState::Loading); - // Step 16 - // Handled when creating the parser in step 14 + self.ready_state.set(DocumentReadyState::Loading); // Step 17 + // Handled when creating the parser in step 15 + + // Step 18 Ok(DomRoot::from_ref(self)) } @@ -4541,8 +4561,8 @@ impl DocumentMethods for Document { return Err(Error::InvalidState); } - if !self.is_active() { - // Step 3. + // Step 3 - what specifies the is_active() part here? + if !self.is_active() || self.active_parser_was_aborted.get() { return Ok(()); } diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs index e86e7472a95..d12b18168f8 100644 --- a/components/script/dom/domimplementation.rs +++ b/components/script/dom/domimplementation.rs @@ -9,6 +9,7 @@ use crate::dom::bindings::codegen::Bindings::DocumentBinding::{ DocumentMethods, ElementCreationOptions, }; use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use crate::dom::bindings::codegen::UnionTypes::StringOrElementCreationOptions; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; @@ -105,10 +106,13 @@ impl DOMImplementationMethods for DOMImplementation { let maybe_elem = if qname.is_empty() { None } else { - let options = ElementCreationOptions { is: None }; + let options = + StringOrElementCreationOptions::ElementCreationOptions(ElementCreationOptions { + is: None, + }); match doc .upcast::<Document>() - .CreateElementNS(maybe_namespace, qname, &options) + .CreateElementNS(maybe_namespace, qname, options) { Err(error) => return Err(error), Ok(elem) => Some(elem), diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index f6937427eda..04f8d948a24 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -24,6 +24,7 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus}; use crate::dom::eventsource::EventSource; use crate::dom::eventtarget::EventTarget; use crate::dom::file::File; +use crate::dom::htmlscriptelement::ScriptId; use crate::dom::messageevent::MessageEvent; use crate::dom::messageport::MessagePort; use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope; @@ -32,6 +33,7 @@ use crate::dom::window::Window; use crate::dom::workerglobalscope::WorkerGlobalScope; use crate::dom::workletglobalscope::WorkletGlobalScope; use crate::microtask::{Microtask, MicrotaskQueue}; +use crate::script_module::ModuleTree; use crate::script_runtime::{CommonScriptMsg, JSContext as SafeJSContext, ScriptChan, ScriptPort}; use crate::script_thread::{MainThreadScriptChan, ScriptThread}; use crate::task::TaskCanceller; @@ -119,6 +121,14 @@ pub struct GlobalScope { /// Timers used by the Console API. console_timers: DomRefCell<HashMap<DOMString, u64>>, + /// module map is used when importing JavaScript modules + /// https://html.spec.whatwg.org/multipage/#concept-settings-object-module-map + #[ignore_malloc_size_of = "mozjs"] + module_map: DomRefCell<HashMap<ServoUrl, Rc<ModuleTree>>>, + + #[ignore_malloc_size_of = "mozjs"] + inline_module_map: DomRefCell<HashMap<ScriptId, Rc<ModuleTree>>>, + /// For providing instructions to an optional devtools server. #[ignore_malloc_size_of = "channels are hard"] devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>, @@ -391,6 +401,8 @@ impl GlobalScope { pipeline_id, devtools_wants_updates: Default::default(), console_timers: DomRefCell::new(Default::default()), + module_map: DomRefCell::new(Default::default()), + inline_module_map: DomRefCell::new(Default::default()), devtools_chan, mem_profiler_chan, time_profiler_chan, @@ -1357,6 +1369,24 @@ impl GlobalScope { &self.consumed_rejections } + pub fn set_module_map(&self, url: ServoUrl, module: ModuleTree) { + self.module_map.borrow_mut().insert(url, Rc::new(module)); + } + + pub fn get_module_map(&self) -> &DomRefCell<HashMap<ServoUrl, Rc<ModuleTree>>> { + &self.module_map + } + + pub fn set_inline_module_map(&self, script_id: ScriptId, module: ModuleTree) { + self.inline_module_map + .borrow_mut() + .insert(script_id, Rc::new(module)); + } + + pub fn get_inline_module_map(&self) -> &DomRefCell<HashMap<ScriptId, Rc<ModuleTree>>> { + &self.inline_module_map + } + #[allow(unsafe_code)] pub fn get_cx(&self) -> SafeJSContext { unsafe { SafeJSContext::from_ptr(Runtime::get()) } diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs index 61c6fc1f98e..a75b0292d6f 100644 --- a/components/script/dom/headers.rs +++ b/components/script/dom/headers.rs @@ -100,10 +100,20 @@ impl HeadersMethods for Headers { combined_value.push(b','); } combined_value.extend(valid_value.iter().cloned()); - self.header_list.borrow_mut().insert( - HeaderName::from_str(&valid_name).unwrap(), - HeaderValue::from_bytes(&combined_value).unwrap(), - ); + match HeaderValue::from_bytes(&combined_value) { + Ok(value) => { + self.header_list + .borrow_mut() + .insert(HeaderName::from_str(&valid_name).unwrap(), value); + }, + Err(_) => { + // can't add the header, but we don't need to panic the browser over it + warn!( + "Servo thinks \"{:?}\" is a valid HTTP header value but HeaderValue doesn't.", + combined_value + ); + }, + }; Ok(()) } @@ -197,7 +207,7 @@ impl Headers { for (name, value) in h.header_list.borrow().iter() { self.Append( ByteString::new(Vec::from(name.as_str())), - ByteString::new(Vec::from(value.to_str().unwrap().as_bytes())), + ByteString::new(Vec::from(value.as_bytes())), )?; } Ok(()) @@ -267,13 +277,13 @@ impl Headers { .map_or(vec![], |v| v.as_bytes().to_owned()) } - pub fn sort_header_list(&self) -> Vec<(String, String)> { + pub fn sort_header_list(&self) -> Vec<(String, Vec<u8>)> { let borrowed_header_list = self.header_list.borrow(); let headers_iter = borrowed_header_list.iter(); let mut header_vec = vec![]; for (name, value) in headers_iter { let name = name.as_str().to_owned(); - let value = value.to_str().unwrap().to_owned(); + let value = value.as_bytes().to_vec(); let name_value = (name, value); header_vec.push(name_value); } @@ -293,7 +303,7 @@ impl Iterable for Headers { fn get_value_at_index(&self, n: u32) -> ByteString { let sorted_header_vec = self.sort_header_list(); let value = sorted_header_vec[n as usize].1.clone(); - ByteString::new(value.into_bytes().to_vec()) + ByteString::new(value) } fn get_key_at_index(&self, n: u32) -> ByteString { @@ -345,40 +355,19 @@ pub fn is_forbidden_header_name(name: &str) -> bool { } // There is some unresolved confusion over the definition of a name and a value. -// The fetch spec [1] defines a name as "a case-insensitive byte -// sequence that matches the field-name token production. The token -// productions are viewable in [2]." A field-name is defined as a -// token, which is defined in [3]. -// ISSUE 1: -// It defines a value as "a byte sequence that matches the field-content token production." -// To note, there is a difference between field-content and -// field-value (which is made up of field-content and obs-fold). The -// current definition does not allow for obs-fold (which are white -// space and newlines) in values. So perhaps a value should be defined -// as "a byte sequence that matches the field-value token production." -// However, this would then allow values made up entirely of white space and newlines. -// RELATED ISSUE 2: -// According to a previously filed Errata ID: 4189 in [4], "the -// specified field-value rule does not allow single field-vchar -// surrounded by whitespace anywhere". They provided a fix for the -// field-content production, but ISSUE 1 has still not been resolved. -// The production definitions likely need to be re-written. -// [1] https://fetch.spec.whatwg.org/#concept-header-value -// [2] https://tools.ietf.org/html/rfc7230#section-3.2 -// [3] https://tools.ietf.org/html/rfc7230#section-3.2.6 -// [4] https://www.rfc-editor.org/errata_search.php?rfc=7230 // -// As of December 2019 WHATWG, isn't even using grammar productions for value; +// As of December 2019, WHATWG has no formal grammar production for value; // https://fetch.spec.whatg.org/#concept-header-value just says not to have -// newlines, nulls, or leading/trailing whitespace. +// newlines, nulls, or leading/trailing whitespace. It even allows +// octets that aren't a valid UTF-8 encoding, and WPT tests reflect this. +// The HeaderValue class does not fully reflect this, so headers +// containing bytes with values 1..31 or 127 can't be created, failing +// WPT tests but probably not affecting anything important on the real Internet. fn validate_name_and_value(name: ByteString, value: ByteString) -> Fallible<(String, Vec<u8>)> { let valid_name = validate_name(name)?; - - // this is probably out of date - if !is_field_content(&value) { - return Err(Error::Type("Value is not valid".to_string())); + if !is_legal_header_value(&value) { + return Err(Error::Type("Header value is not valid".to_string())); } - Ok((valid_name, value.into())) } @@ -431,47 +420,40 @@ fn is_field_name(name: &ByteString) -> bool { is_token(&*name) } -// https://tools.ietf.org/html/rfc7230#section-3.2 -// http://www.rfc-editor.org/errata_search.php?rfc=7230 -// Errata ID: 4189 -// field-content = field-vchar [ 1*( SP / HTAB / field-vchar ) -// field-vchar ] -fn is_field_content(value: &ByteString) -> bool { +// https://fetch.spec.whatg.org/#concept-header-value +fn is_legal_header_value(value: &ByteString) -> bool { let value_len = value.len(); - if value_len == 0 { - return false; - } - if !is_field_vchar(value[0]) { - return false; - } - - if value_len > 2 { - for &ch in &value[1..value_len - 1] { - if !is_field_vchar(ch) && !is_space(ch) && !is_htab(ch) { - return false; - } + return true; + } + match value[0] { + b' ' | b'\t' => return false, + _ => {}, + }; + match value[value_len - 1] { + b' ' | b'\t' => return false, + _ => {}, + }; + for &ch in &value[..] { + match ch { + b'\0' | b'\n' | b'\r' => return false, + _ => {}, } } - - if !is_field_vchar(value[value_len - 1]) { - return false; - } - - return true; -} - -fn is_space(x: u8) -> bool { - x == b' ' -} - -fn is_htab(x: u8) -> bool { - x == b'\t' -} - -// https://tools.ietf.org/html/rfc7230#section-3.2 -fn is_field_vchar(x: u8) -> bool { - is_vchar(x) || is_obs_text(x) + true + // If accepting non-UTF8 header values causes breakage, + // removing the above "true" and uncommenting the below code + // would ameliorate it while still accepting most reasonable headers: + //match str::from_utf8(value) { + // Ok(_) => true, + // Err(_) => { + // warn!( + // "Rejecting spec-legal but non-UTF8 header value: {:?}", + // value + // ); + // false + // }, + // } } // https://tools.ietf.org/html/rfc5234#appendix-B.1 diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 1406ceb870b..b7c7da1e9bf 100755 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -34,7 +34,6 @@ enum ButtonType { Submit, Reset, Button, - Menu, } #[dom_struct] @@ -42,6 +41,7 @@ pub struct HTMLButtonElement { htmlelement: HTMLElement, button_type: Cell<ButtonType>, form_owner: MutNullableDom<HTMLFormElement>, + labels_node_list: MutNullableDom<NodeList>, } impl HTMLButtonElement { @@ -59,6 +59,7 @@ impl HTMLButtonElement { ), button_type: Cell::new(ButtonType::Submit), form_owner: Default::default(), + labels_node_list: Default::default(), } } @@ -97,7 +98,7 @@ impl HTMLButtonElementMethods for HTMLButtonElement { } // https://html.spec.whatwg.org/multipage/#dom-button-type - make_enumerated_getter!(Type, "type", "submit", "reset" | "button" | "menu"); + make_enumerated_getter!(Type, "type", "submit", "reset" | "button"); // https://html.spec.whatwg.org/multipage/#dom-button-type make_setter!(SetType, "type"); @@ -150,9 +151,7 @@ impl HTMLButtonElementMethods for HTMLButtonElement { make_setter!(SetValue, "value"); // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> DomRoot<NodeList> { - self.upcast::<HTMLElement>().labels() - } + make_labels_getter!(Labels, labels_node_list); } impl HTMLButtonElement { @@ -216,7 +215,6 @@ impl VirtualMethods for HTMLButtonElement { let value = match &**attr.value() { "reset" => ButtonType::Reset, "button" => ButtonType::Button, - "menu" => ButtonType::Menu, _ => ButtonType::Submit, }; self.button_type.set(value); diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 7bec738f382..c5b7e6d0251 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -4,10 +4,10 @@ use crate::dom::activation::{synthetic_click_activation, ActivationSource}; use crate::dom::attr::Attr; -use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use crate::dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use crate::dom::bindings::codegen::Bindings::HTMLElementBinding; use crate::dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods; +use crate::dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods; use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::error::{Error, ErrorResult}; @@ -29,7 +29,6 @@ use crate::dom::htmlinputelement::{HTMLInputElement, InputType}; use crate::dom::htmllabelelement::HTMLLabelElement; use crate::dom::node::{document_from_node, window_from_node}; use crate::dom::node::{BindContext, Node, NodeFlags, ShadowIncluding}; -use crate::dom::nodelist::NodeList; use crate::dom::text::Text; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; @@ -677,43 +676,48 @@ impl HTMLElement { } // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - pub fn labels(&self) -> DomRoot<NodeList> { - debug_assert!(self.is_labelable_element()); - + // This gets the nth label in tree order. + pub fn label_at(&self, index: u32) -> Option<DomRoot<Node>> { let element = self.upcast::<Element>(); - let window = window_from_node(element); - - // Traverse ancestors for implicitly associated <label> elements - // https://html.spec.whatwg.org/multipage/#the-label-element:attr-label-for-4 - let ancestors = self - .upcast::<Node>() - .ancestors() - .filter_map(DomRoot::downcast::<HTMLElement>) - // If we reach a labelable element, we have a guarantee no ancestors above it - // will be a label for this HTMLElement - .take_while(|elem| !elem.is_labelable_element()) - .filter_map(DomRoot::downcast::<HTMLLabelElement>) - .filter(|elem| !elem.upcast::<Element>().has_attribute(&local_name!("for"))) - .filter(|elem| elem.first_labelable_descendant().as_deref() == Some(self)) - .map(DomRoot::upcast::<Node>); - let id = element.Id(); - let id = match &id as &str { - "" => return NodeList::new_simple_list(&window, ancestors), - id => id, - }; - - // Traverse entire tree for <label> elements with `for` attribute matching `id` + // Traverse entire tree for <label> elements that have + // this as their control. + // There is room for performance optimization, as we don't need + // the actual result of GetControl, only whether the result + // would match self. + // (Even more room for performance optimization: do what + // nodelist ChildrenList does and keep a mutation-aware cursor + // around; this may be hard since labels need to keep working + // even as they get detached into a subtree and reattached to + // a document.) let root_element = element.root_element(); let root_node = root_element.upcast::<Node>(); - let children = root_node + root_node .traverse_preorder(ShadowIncluding::No) - .filter_map(DomRoot::downcast::<Element>) - .filter(|elem| elem.is::<HTMLLabelElement>()) - .filter(|elem| elem.get_string_attribute(&local_name!("for")) == id) - .map(DomRoot::upcast::<Node>); + .filter_map(DomRoot::downcast::<HTMLLabelElement>) + .filter(|elem| match elem.GetControl() { + Some(control) => &*control == self, + _ => false, + }) + .nth(index as usize) + .map(|n| DomRoot::from_ref(n.upcast::<Node>())) + } - NodeList::new_simple_list(&window, children.chain(ancestors)) + // https://html.spec.whatwg.org/multipage/#dom-lfe-labels + // This counts the labels of the element, to support NodeList::Length + pub fn labels_count(&self) -> u32 { + // see label_at comments about performance + let element = self.upcast::<Element>(); + let root_element = element.root_element(); + let root_node = root_element.upcast::<Node>(); + root_node + .traverse_preorder(ShadowIncluding::No) + .filter_map(DomRoot::downcast::<HTMLLabelElement>) + .filter(|elem| match elem.GetControl() { + Some(control) => &*control == self, + _ => false, + }) + .count() as u32 } } diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 9018f05813a..90058f303a9 100755 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -35,7 +35,7 @@ use crate::dom::htmlformelement::{ResetFrom, SubmittedFrom}; use crate::dom::keyboardevent::KeyboardEvent; use crate::dom::mouseevent::MouseEvent; use crate::dom::node::{document_from_node, window_from_node}; -use crate::dom::node::{BindContext, Node, NodeDamage, UnbindContext}; +use crate::dom::node::{BindContext, CloneChildrenFlag, Node, NodeDamage, UnbindContext}; use crate::dom::nodelist::NodeList; use crate::dom::textcontrol::{TextControlElement, TextControlSelection}; use crate::dom::validation::Validatable; @@ -46,7 +46,6 @@ use crate::textinput::KeyReaction::{ }; use crate::textinput::Lines::Single; use crate::textinput::{Direction, SelectionDirection, TextInput, UTF16CodeUnits, UTF8Bytes}; -use caseless::compatibility_caseless_match_str; use dom_struct::dom_struct; use embedder_traits::FilterPattern; use encoding_rs::Encoding; @@ -235,6 +234,7 @@ pub struct HTMLInputElement { filelist: MutNullableDom<FileList>, form_owner: MutNullableDom<HTMLFormElement>, + labels_node_list: MutNullableDom<NodeList>, } #[derive(JSTraceable)] @@ -304,6 +304,7 @@ impl HTMLInputElement { value_dirty: Cell::new(false), filelist: MutNullableDom::new(None), form_owner: Default::default(), + labels_node_list: MutNullableDom::new(None), } } @@ -792,12 +793,18 @@ impl HTMLInputElementMethods for HTMLInputElement { } // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> DomRoot<NodeList> { + // Different from make_labels_getter because this one + // conditionally returns null. + fn GetLabels(&self) -> Option<DomRoot<NodeList>> { if self.input_type() == InputType::Hidden { - let window = window_from_node(self); - NodeList::empty(&window) + None } else { - self.upcast::<HTMLElement>().labels() + Some(self.labels_node_list.or_init(|| { + NodeList::new_labels_list( + self.upcast::<Node>().owner_doc().window(), + self.upcast::<HTMLElement>(), + ) + })) } } @@ -917,7 +924,7 @@ fn in_same_group( // TODO Both a and b are in the same home subtree. other.form_owner().as_deref() == owner && match (other.radio_group_name(), group) { - (Some(ref s1), Some(s2)) => compatibility_caseless_match_str(s1, s2) && s2 != &atom!(""), + (Some(ref s1), Some(s2)) => s1 == s2 && s2 != &atom!(""), _ => false } } @@ -1659,6 +1666,26 @@ impl VirtualMethods for HTMLInputElement { } } } + + // https://html.spec.whatwg.org/multipage/#the-input-element%3Aconcept-node-clone-ext + fn cloning_steps( + &self, + copy: &Node, + maybe_doc: Option<&Document>, + clone_children: CloneChildrenFlag, + ) { + if let Some(ref s) = self.super_type() { + s.cloning_steps(copy, maybe_doc, clone_children); + } + let elem = copy.downcast::<HTMLInputElement>().unwrap(); + elem.value_dirty.set(self.value_dirty.get()); + elem.checked_changed.set(self.checked_changed.get()); + elem.upcast::<Element>() + .set_state(ElementState::IN_CHECKED_STATE, self.Checked()); + elem.textinput + .borrow_mut() + .set_content(self.textinput.borrow().get_content()); + } } impl FormControl for HTMLInputElement { diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs index 0a1401d6283..cca8e0f03c9 100644 --- a/components/script/dom/htmllabelelement.rs +++ b/components/script/dom/htmllabelelement.rs @@ -4,8 +4,11 @@ use crate::dom::activation::{synthetic_click_activation, Activatable, ActivationSource}; use crate::dom::attr::Attr; +use crate::dom::bindings::codegen::Bindings::AttrBinding::AttrMethods; +use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use crate::dom::bindings::codegen::Bindings::HTMLLabelElementBinding; use crate::dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods; +use crate::dom::bindings::codegen::Bindings::NodeBinding::{GetRootNodeOptions, NodeMethods}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; @@ -15,7 +18,7 @@ use crate::dom::event::Event; use crate::dom::eventtarget::EventTarget; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlformelement::{FormControl, FormControlElementHelpers, HTMLFormElement}; -use crate::dom::node::{document_from_node, Node, ShadowIncluding}; +use crate::dom::node::{Node, ShadowIncluding}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; @@ -99,10 +102,6 @@ impl HTMLLabelElementMethods for HTMLLabelElement { // https://html.spec.whatwg.org/multipage/#dom-label-control fn GetControl(&self) -> Option<DomRoot<HTMLElement>> { - if !self.upcast::<Node>().is_in_doc() { - return None; - } - let for_attr = match self .upcast::<Element>() .get_attribute(&ns!(), &local_name!("for")) @@ -111,13 +110,40 @@ impl HTMLLabelElementMethods for HTMLLabelElement { None => return self.first_labelable_descendant(), }; - let for_value = for_attr.value(); - document_from_node(self) - .get_element_by_id(for_value.as_atom()) - .and_then(DomRoot::downcast::<HTMLElement>) - .into_iter() - .filter(|e| e.is_labelable_element()) - .next() + let for_value = for_attr.Value(); + + // "If the attribute is specified and there is an element in the tree + // whose ID is equal to the value of the for attribute, and the first + // such element in tree order is a labelable element, then that + // element is the label element's labeled control." + // Two subtle points here: we need to search the _tree_, which is + // not necessarily the document if we're detached from the document, + // and we only consider one element even if a later element with + // the same ID is labelable. + + let maybe_found = self + .upcast::<Node>() + .GetRootNode(&GetRootNodeOptions::empty()) + .traverse_preorder(ShadowIncluding::No) + .find_map(|e| { + if let Some(htmle) = e.downcast::<HTMLElement>() { + if htmle.upcast::<Element>().Id() == for_value { + Some(DomRoot::from_ref(htmle)) + } else { + None + } + } else { + None + } + }); + // We now have the element that we would return, but only return it + // if it's labelable. + if let Some(ref maybe_labelable) = maybe_found { + if maybe_labelable.is_labelable_element() { + return maybe_found; + } + } + None } } diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 91acd4b97e7..cb93a77a90d 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -2362,6 +2362,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement { label, language, TextTrackMode::Hidden, + None, ); // Step 3 & 4 self.TextTracks().add(&track); diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs index a627d9aee93..780080a6a65 100644 --- a/components/script/dom/htmlmeterelement.rs +++ b/components/script/dom/htmlmeterelement.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLMeterElementBinding::{ self, HTMLMeterElementMethods, }; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::document::Document; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; @@ -17,6 +17,7 @@ use html5ever::{LocalName, Prefix}; #[dom_struct] pub struct HTMLMeterElement { htmlelement: HTMLElement, + labels_node_list: MutNullableDom<NodeList>, } impl HTMLMeterElement { @@ -27,6 +28,7 @@ impl HTMLMeterElement { ) -> HTMLMeterElement { HTMLMeterElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), + labels_node_list: MutNullableDom::new(None), } } @@ -48,7 +50,5 @@ impl HTMLMeterElement { impl HTMLMeterElementMethods for HTMLMeterElement { // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> DomRoot<NodeList> { - self.upcast::<HTMLElement>().labels() - } + make_labels_getter!(Labels, labels_node_list); } diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index 3893aea95ab..4ebb2860a79 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -8,12 +8,14 @@ use crate::dom::bindings::codegen::Bindings::HTMLOptionElementBinding; use crate::dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods; use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelectElementBinding::HTMLSelectElementMethods; use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; +use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::characterdata::CharacterData; use crate::dom::document::Document; -use crate::dom::element::{AttributeMutation, Element}; +use crate::dom::element::{AttributeMutation, CustomElementCreationMode, Element, ElementCreator}; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlformelement::HTMLFormElement; use crate::dom::htmloptgroupelement::HTMLOptGroupElement; @@ -22,8 +24,9 @@ use crate::dom::htmlselectelement::HTMLSelectElement; use crate::dom::node::{BindContext, Node, ShadowIncluding, UnbindContext}; use crate::dom::text::Text; use crate::dom::virtualmethods::VirtualMethods; +use crate::dom::window::Window; use dom_struct::dom_struct; -use html5ever::{LocalName, Prefix}; +use html5ever::{LocalName, Prefix, QualName}; use std::cell::Cell; use style::element_state::ElementState; use style::str::{split_html_space_chars, str_join}; @@ -72,6 +75,37 @@ impl HTMLOptionElement { ) } + // https://html.spec.whatwg.org/multipage/#dom-option + pub fn Option( + window: &Window, + text: DOMString, + value: Option<DOMString>, + default_selected: bool, + selected: bool, + ) -> Fallible<DomRoot<HTMLOptionElement>> { + let element = Element::create( + QualName::new(None, ns!(html), local_name!("option")), + None, + &window.Document(), + ElementCreator::ScriptCreated, + CustomElementCreationMode::Synchronous, + ); + + let option = DomRoot::downcast::<HTMLOptionElement>(element).unwrap(); + + if !text.is_empty() { + option.upcast::<Node>().SetTextContent(Some(text)) + } + + if let Some(val) = value { + option.SetValue(val) + } + + option.SetDefaultSelected(default_selected); + option.set_selectedness(selected); + Ok(option) + } + pub fn set_selectedness(&self, selected: bool) { self.selectedness.set(selected); } diff --git a/components/script/dom/htmloutputelement.rs b/components/script/dom/htmloutputelement.rs index 65b9ae554c8..9314672d3d0 100644 --- a/components/script/dom/htmloutputelement.rs +++ b/components/script/dom/htmloutputelement.rs @@ -22,6 +22,7 @@ use html5ever::{LocalName, Prefix}; pub struct HTMLOutputElement { htmlelement: HTMLElement, form_owner: MutNullableDom<HTMLFormElement>, + labels_node_list: MutNullableDom<NodeList>, } impl HTMLOutputElement { @@ -33,6 +34,7 @@ impl HTMLOutputElement { HTMLOutputElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), form_owner: Default::default(), + labels_node_list: Default::default(), } } @@ -65,9 +67,7 @@ impl HTMLOutputElementMethods for HTMLOutputElement { } // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> DomRoot<NodeList> { - self.upcast::<HTMLElement>().labels() - } + make_labels_getter!(Labels, labels_node_list); } impl VirtualMethods for HTMLOutputElement { diff --git a/components/script/dom/htmlprogresselement.rs b/components/script/dom/htmlprogresselement.rs index 26ee952b2c9..0c4789fdc14 100644 --- a/components/script/dom/htmlprogresselement.rs +++ b/components/script/dom/htmlprogresselement.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLProgressElementBinding::{ self, HTMLProgressElementMethods, }; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::document::Document; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; @@ -17,6 +17,7 @@ use html5ever::{LocalName, Prefix}; #[dom_struct] pub struct HTMLProgressElement { htmlelement: HTMLElement, + labels_node_list: MutNullableDom<NodeList>, } impl HTMLProgressElement { @@ -27,6 +28,7 @@ impl HTMLProgressElement { ) -> HTMLProgressElement { HTMLProgressElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), + labels_node_list: MutNullableDom::new(None), } } @@ -48,7 +50,5 @@ impl HTMLProgressElement { impl HTMLProgressElementMethods for HTMLProgressElement { // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> DomRoot<NodeList> { - self.upcast::<HTMLElement>().labels() - } + make_labels_getter!(Labels, labels_node_list); } diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index fdeca285e30..3a55590c81d 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -12,6 +12,7 @@ use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::settings_stack::AutoEntryScript; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::document::Document; use crate::dom::element::{ @@ -27,6 +28,8 @@ use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; use crate::fetch::create_a_potential_CORS_request; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; +use crate::script_module::fetch_inline_module_script; +use crate::script_module::{fetch_external_module_script, ModuleOwner}; use content_security_policy as csp; use dom_struct::dom_struct; use encoding_rs::Encoding; @@ -35,7 +38,7 @@ use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; use msg::constellation_msg::PipelineId; -use net_traits::request::{CorsSettings, Destination, Referrer, RequestBuilder}; +use net_traits::request::{CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder}; use net_traits::ReferrerPolicy; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; @@ -51,6 +54,10 @@ use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; use uuid::Uuid; +/// An unique id for script element. +#[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, PartialEq)] +pub struct ScriptId(Uuid); + #[dom_struct] pub struct HTMLScriptElement { htmlelement: HTMLElement, @@ -71,6 +78,10 @@ pub struct HTMLScriptElement { /// Track line line_number line_number: u64, + + /// Unique id for each script element + #[ignore_malloc_size_of = "Defined in uuid"] + id: ScriptId, } impl HTMLScriptElement { @@ -81,6 +92,7 @@ impl HTMLScriptElement { creator: ElementCreator, ) -> HTMLScriptElement { HTMLScriptElement { + id: ScriptId(Uuid::new_v4()), htmlelement: HTMLElement::new_inherited(local_name, prefix, document), already_started: Cell::new(false), parser_inserted: Cell::new(creator.is_parser_created()), @@ -105,11 +117,15 @@ impl HTMLScriptElement { HTMLScriptElementBinding::Wrap, ) } + + pub fn get_script_id(&self) -> ScriptId { + self.id.clone() + } } /// Supported script types as defined by /// <https://html.spec.whatwg.org/multipage/#javascript-mime-type>. -static SCRIPT_JS_MIMES: StaticStringVec = &[ +pub static SCRIPT_JS_MIMES: StaticStringVec = &[ "application/ecmascript", "application/javascript", "application/x-ecmascript", @@ -143,7 +159,7 @@ pub struct ScriptOrigin { } impl ScriptOrigin { - fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, @@ -152,7 +168,7 @@ impl ScriptOrigin { } } - fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, @@ -160,6 +176,10 @@ impl ScriptOrigin { type_, } } + + pub fn text(&self) -> DOMString { + self.text.clone() + } } pub type ScriptResult = Result<ScriptOrigin, NetworkError>; @@ -427,7 +447,10 @@ impl HTMLScriptElement { return; } - // TODO: Step 12: nomodule content attribute + // Step 12 + if element.has_attribute(&local_name!("nomodule")) && script_type == ScriptType::Classic { + return; + } // Step 13. if !element.has_attribute(&local_name!("src")) && @@ -441,23 +464,25 @@ impl HTMLScriptElement { } // Step 14. - let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); - let event_attribute = element.get_attribute(&ns!(), &local_name!("event")); - match (for_attribute, event_attribute) { - (Some(ref for_attribute), Some(ref event_attribute)) => { - let for_value = for_attribute.value().to_ascii_lowercase(); - let for_value = for_value.trim_matches(HTML_SPACE_CHARACTERS); - if for_value != "window" { - return; - } + if script_type == ScriptType::Classic { + let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); + let event_attribute = element.get_attribute(&ns!(), &local_name!("event")); + match (for_attribute, event_attribute) { + (Some(ref for_attribute), Some(ref event_attribute)) => { + let for_value = for_attribute.value().to_ascii_lowercase(); + let for_value = for_value.trim_matches(HTML_SPACE_CHARACTERS); + if for_value != "window" { + return; + } - let event_value = event_attribute.value().to_ascii_lowercase(); - let event_value = event_value.trim_matches(HTML_SPACE_CHARACTERS); - if event_value != "onload" && event_value != "onload()" { - return; - } - }, - (_, _) => (), + let event_value = event_attribute.value().to_ascii_lowercase(); + let event_value = event_value.trim_matches(HTML_SPACE_CHARACTERS); + if event_value != "onload" && event_value != "onload()" { + return; + } + }, + (_, _) => (), + } } // Step 15. @@ -469,7 +494,18 @@ impl HTMLScriptElement { // Step 16. let cors_setting = cors_setting_for_element(element); - // TODO: Step 17: Module script credentials mode. + // Step 17. + let credentials_mode = match script_type { + ScriptType::Classic => None, + ScriptType::Module => Some(reflect_cross_origin_attribute(element).map_or( + CredentialsMode::CredentialsSameOrigin, + |attr| match &*attr { + "use-credentials" => CredentialsMode::Include, + "anonymous" => CredentialsMode::CredentialsSameOrigin, + _ => CredentialsMode::CredentialsSameOrigin, + }, + )), + }; // TODO: Step 18: Nonce. @@ -514,6 +550,7 @@ impl HTMLScriptElement { }, }; + // Step 24.6. match script_type { ScriptType::Classic => { // Preparation for step 26. @@ -555,50 +592,69 @@ impl HTMLScriptElement { } }, ScriptType::Module => { - warn!( - "{} is a module script. It should be fixed after #23545 landed.", - url.clone() + fetch_external_module_script( + ModuleOwner::Window(Trusted::new(self)), + url.clone(), + Destination::Script, + integrity_metadata.to_owned(), + credentials_mode.unwrap(), ); - self.global().issue_page_warning(&format!( - "Module scripts are not supported; {} will not be executed.", - url.clone() - )); + + if !r#async && was_parser_inserted { + doc.add_deferred_script(self); + } else if !r#async && !self.non_blocking.get() { + doc.push_asap_in_order_script(self); + } else { + doc.add_asap_script(self); + }; }, } } else { // Step 25. assert!(!text.is_empty()); - // Step 25-1. + // Step 25-1. & 25-2. let result = Ok(ScriptOrigin::internal( text.clone(), base_url.clone(), script_type.clone(), )); - // TODO: Step 25-2. - if let ScriptType::Module = script_type { - warn!( - "{} is a module script. It should be fixed after #23545 landed.", - base_url.clone() - ); - self.global().issue_page_warning( - "Module scripts are not supported; ignoring inline module script.", - ); - return; - } + // Step 25-2. + match script_type { + ScriptType::Classic => { + if was_parser_inserted && + doc.get_current_parser() + .map_or(false, |parser| parser.script_nesting_level() <= 1) && + doc.get_script_blocking_stylesheets_count() > 0 + { + // Step 26.h: classic, has no src, was parser-inserted, is blocked on stylesheet. + doc.set_pending_parsing_blocking_script(self, Some(result)); + } else { + // Step 26.i: otherwise. + self.execute(result); + } + }, + ScriptType::Module => { + // We should add inline module script elements + // into those vectors in case that there's no + // descendants in the inline module script. + if !r#async && was_parser_inserted { + doc.add_deferred_script(self); + } else if !r#async && !self.non_blocking.get() { + doc.push_asap_in_order_script(self); + } else { + doc.add_asap_script(self); + }; - // Step 26. - if was_parser_inserted && - doc.get_current_parser() - .map_or(false, |parser| parser.script_nesting_level() <= 1) && - doc.get_script_blocking_stylesheets_count() > 0 - { - // Step 26.h: classic, has no src, was parser-inserted, is blocked on stylesheet. - doc.set_pending_parsing_blocking_script(self, Some(result)); - } else { - // Step 26.i: otherwise. - self.execute(result); + fetch_inline_module_script( + ModuleOwner::Window(Trusted::new(self)), + text.clone(), + base_url.clone(), + self.id.clone(), + credentials_mode.unwrap(), + ); + }, } } } @@ -656,7 +712,7 @@ impl HTMLScriptElement { } /// <https://html.spec.whatwg.org/multipage/#execute-the-script-block> - pub fn execute(&self, result: Result<ScriptOrigin, NetworkError>) { + pub fn execute(&self, result: ScriptResult) { // Step 1. let doc = document_from_node(self); if self.parser_inserted.get() && &*doc != &*self.parser_document { @@ -674,10 +730,12 @@ impl HTMLScriptElement { Ok(script) => script, }; - self.unminify_js(&mut script); + if script.type_ == ScriptType::Classic { + self.unminify_js(&mut script); + } // Step 3. - let neutralized_doc = if script.external { + let neutralized_doc = if script.external || script.type_ == ScriptType::Module { debug!("loading external script, url = {}", script.url); let doc = document_from_node(self); doc.incr_ignore_destructive_writes_counter(); @@ -690,21 +748,24 @@ impl HTMLScriptElement { let document = document_from_node(self); let old_script = document.GetCurrentScript(); - // Step 5.a.1. - document.set_current_script(Some(self)); - - // Step 5.a.2. - self.run_a_classic_script(&script); - - // Step 6. - document.set_current_script(old_script.as_deref()); + match script.type_ { + ScriptType::Classic => { + document.set_current_script(Some(self)); + self.run_a_classic_script(&script); + document.set_current_script(old_script.as_deref()); + }, + ScriptType::Module => { + assert!(old_script.is_none()); + self.run_a_module_script(&script, false); + }, + } - // Step 7. + // Step 5. if let Some(doc) = neutralized_doc { doc.decr_ignore_destructive_writes_counter(); } - // Step 8. + // Step 6. if script.external { self.dispatch_load_event(); } @@ -736,6 +797,72 @@ impl HTMLScriptElement { ); } + #[allow(unsafe_code)] + /// https://html.spec.whatwg.org/multipage/#run-a-module-script + pub fn run_a_module_script(&self, script: &ScriptOrigin, _rethrow_errors: bool) { + // TODO use a settings object rather than this element's document/window + // Step 2 + let document = document_from_node(self); + if !document.is_fully_active() || !document.is_scripting_enabled() { + return; + } + + // Step 4 + let window = window_from_node(self); + let global = window.upcast::<GlobalScope>(); + let _aes = AutoEntryScript::new(&global); + + if script.external { + let module_map = global.get_module_map().borrow(); + + if let Some(module_tree) = module_map.get(&script.url) { + // Step 6. + { + let module_error = module_tree.get_error().borrow(); + if module_error.is_some() { + module_tree.report_error(&global); + return; + } + } + + let module_record = module_tree.get_record().borrow(); + if let Some(record) = &*module_record { + let evaluated = module_tree.execute_module(global, record.handle()); + + if let Err(exception) = evaluated { + module_tree.set_error(Some(exception.clone())); + module_tree.report_error(&global); + return; + } + } + } + } else { + let inline_module_map = global.get_inline_module_map().borrow(); + + if let Some(module_tree) = inline_module_map.get(&self.id.clone()) { + // Step 6. + { + let module_error = module_tree.get_error().borrow(); + if module_error.is_some() { + module_tree.report_error(&global); + return; + } + } + + let module_record = module_tree.get_record().borrow(); + if let Some(record) = &*module_record { + let evaluated = module_tree.execute_module(global, record.handle()); + + if let Err(exception) = evaluated { + module_tree.set_error(Some(exception.clone())); + module_tree.report_error(&global); + return; + } + } + } + } + } + pub fn queue_error_event(&self) { let window = window_from_node(self); window @@ -818,10 +945,18 @@ impl HTMLScriptElement { self.parser_inserted.set(parser_inserted); } + pub fn get_parser_inserted(&self) -> bool { + self.parser_inserted.get() + } + pub fn set_already_started(&self, already_started: bool) { self.already_started.set(already_started); } + pub fn get_non_blocking(&self) -> bool { + self.non_blocking.get() + } + fn dispatch_event( &self, type_: Atom, @@ -930,6 +1065,11 @@ impl HTMLScriptElementMethods for HTMLScriptElement { // https://html.spec.whatwg.org/multipage/#dom-script-defer make_bool_setter!(SetDefer, "defer"); + // https://html.spec.whatwg.org/multipage/#dom-script-nomodule + make_bool_getter!(NoModule, "nomodule"); + // https://html.spec.whatwg.org/multipage/#dom-script-nomodule + make_bool_setter!(SetNoModule, "nomodule"); + // https://html.spec.whatwg.org/multipage/#dom-script-integrity make_getter!(Integrity, "integrity"); // https://html.spec.whatwg.org/multipage/#dom-script-integrity diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index c71a5442e73..0ef500ccb1a 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -61,6 +61,7 @@ pub struct HTMLSelectElement { htmlelement: HTMLElement, options: MutNullableDom<HTMLOptionsCollection>, form_owner: MutNullableDom<HTMLFormElement>, + labels_node_list: MutNullableDom<NodeList>, } static DEFAULT_SELECT_SIZE: u32 = 0; @@ -80,6 +81,7 @@ impl HTMLSelectElement { ), options: Default::default(), form_owner: Default::default(), + labels_node_list: Default::default(), } } @@ -249,9 +251,7 @@ impl HTMLSelectElementMethods for HTMLSelectElement { } // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> DomRoot<NodeList> { - self.upcast::<HTMLElement>().labels() - } + make_labels_getter!(Labels, labels_node_list); // https://html.spec.whatwg.org/multipage/#dom-select-options fn Options(&self) -> DomRoot<HTMLOptionsCollection> { diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index ed2372fb247..eb8fcab3873 100755 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -52,6 +52,7 @@ pub struct HTMLTextAreaElement { // https://html.spec.whatwg.org/multipage/#concept-textarea-dirty value_dirty: Cell<bool>, form_owner: MutNullableDom<HTMLFormElement>, + labels_node_list: MutNullableDom<NodeList>, } pub trait LayoutHTMLTextAreaElementHelpers { @@ -153,6 +154,7 @@ impl HTMLTextAreaElement { )), value_dirty: Cell::new(false), form_owner: Default::default(), + labels_node_list: Default::default(), } } @@ -316,9 +318,7 @@ impl HTMLTextAreaElementMethods for HTMLTextAreaElement { } // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> DomRoot<NodeList> { - self.upcast::<HTMLElement>().labels() - } + make_labels_getter!(Labels, labels_node_list); // https://html.spec.whatwg.org/multipage/#dom-textarea/input-select fn Select(&self) { diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs index caa8932b415..c67701b3894 100644 --- a/components/script/dom/htmltrackelement.rs +++ b/components/script/dom/htmltrackelement.rs @@ -59,6 +59,7 @@ impl HTMLTrackElement { Default::default(), Default::default(), Default::default(), + None, ); Node::reflect_node( Box::new(HTMLTrackElement::new_inherited( diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index a1941662963..fe578f6f675 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -141,6 +141,21 @@ macro_rules! make_form_action_getter( ); #[macro_export] +macro_rules! make_labels_getter( + ( $attr:ident, $memo:ident ) => ( + fn $attr(&self) -> DomRoot<NodeList> { + use crate::dom::htmlelement::HTMLElement; + use crate::dom::nodelist::NodeList; + self.$memo.or_init(|| NodeList::new_labels_list( + self.upcast::<Node>().owner_doc().window(), + self.upcast::<HTMLElement>() + ) + ) + } + ); +); + +#[macro_export] macro_rules! make_enumerated_getter( ( $attr:ident, $htmlname:tt, $default:expr, $($choices: pat)|+) => ( fn $attr(&self) -> DOMString { diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index 930fedbbec4..88fdd4cb70c 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -7,6 +7,7 @@ use crate::dom::bindings::codegen::Bindings::NodeListBinding; use crate::dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; +use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{ChildrenMutation, Node}; use crate::dom::window::Window; use dom_struct::dom_struct; @@ -17,6 +18,7 @@ use std::cell::Cell; pub enum NodeListType { Simple(Vec<Dom<Node>>), Children(ChildrenList), + Labels(LabelsList), } // https://dom.spec.whatwg.org/#interface-nodelist @@ -65,6 +67,10 @@ impl NodeList { NodeList::new(window, NodeListType::Children(ChildrenList::new(node))) } + pub fn new_labels_list(window: &Window, element: &HTMLElement) -> DomRoot<NodeList> { + NodeList::new(window, NodeListType::Labels(LabelsList::new(element))) + } + pub fn empty(window: &Window) -> DomRoot<NodeList> { NodeList::new(window, NodeListType::Simple(vec![])) } @@ -76,6 +82,7 @@ impl NodeListMethods for NodeList { match self.list_type { NodeListType::Simple(ref elems) => elems.len() as u32, NodeListType::Children(ref list) => list.len(), + NodeListType::Labels(ref list) => list.len(), } } @@ -86,6 +93,7 @@ impl NodeListMethods for NodeList { .get(index as usize) .map(|node| DomRoot::from_ref(&**node)), NodeListType::Children(ref list) => list.item(index), + NodeListType::Labels(ref list) => list.item(index), } } @@ -319,3 +327,33 @@ impl ChildrenList { self.last_index.set(0u32); } } + +// Labels lists: There might room for performance optimization +// analogous to the ChildrenMutation case of a children list, +// in which we can keep information from an older access live +// if we know nothing has happened that would change it. +// However, label relationships can happen from further away +// in the DOM than parent-child relationships, so it's not as simple, +// and it's possible that tracking label moves would end up no faster +// than recalculating labels. +#[derive(JSTraceable, MallocSizeOf)] +#[unrooted_must_root_lint::must_root] +pub struct LabelsList { + element: Dom<HTMLElement>, +} + +impl LabelsList { + pub fn new(element: &HTMLElement) -> LabelsList { + LabelsList { + element: Dom::from_ref(element), + } + } + + pub fn len(&self) -> u32 { + self.element.labels_count() + } + + pub fn item(&self, index: u32) -> Option<DomRoot<Node>> { + self.element.label_at(index) + } +} diff --git a/components/script/dom/promise.rs b/components/script/dom/promise.rs index d2e209b98dd..785c1be8939 100644 --- a/components/script/dom/promise.rs +++ b/components/script/dom/promise.rs @@ -225,7 +225,7 @@ impl Promise { } #[allow(unsafe_code)] - fn promise_obj(&self) -> HandleObject { + pub fn promise_obj(&self) -> HandleObject { let obj = self.reflector().get_jsobject(); unsafe { assert!(IsPromiseObject(obj)); diff --git a/components/script/dom/texttrack.rs b/components/script/dom/texttrack.rs index 88c4859e05e..7c2b54adcd9 100644 --- a/components/script/dom/texttrack.rs +++ b/components/script/dom/texttrack.rs @@ -2,16 +2,18 @@ * 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 crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::TextTrackBinding::{ self, TextTrackKind, TextTrackMethods, TextTrackMode, }; use crate::dom::bindings::error::{Error, ErrorResult}; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; -use crate::dom::bindings::root::{DomRoot, MutNullableDom}; +use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::eventtarget::EventTarget; use crate::dom::texttrackcue::TextTrackCue; use crate::dom::texttrackcuelist::TextTrackCueList; +use crate::dom::texttracklist::TextTrackList; use crate::dom::window::Window; use dom_struct::dom_struct; use std::cell::Cell; @@ -25,6 +27,7 @@ pub struct TextTrack { id: String, mode: Cell<TextTrackMode>, cue_list: MutNullableDom<TextTrackCueList>, + track_list: DomRefCell<Option<Dom<TextTrackList>>>, } impl TextTrack { @@ -34,6 +37,7 @@ impl TextTrack { label: DOMString, language: DOMString, mode: TextTrackMode, + track_list: Option<&TextTrackList>, ) -> TextTrack { TextTrack { eventtarget: EventTarget::new_inherited(), @@ -43,6 +47,7 @@ impl TextTrack { id: id.into(), mode: Cell::new(mode), cue_list: Default::default(), + track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))), } } @@ -53,9 +58,12 @@ impl TextTrack { label: DOMString, language: DOMString, mode: TextTrackMode, + track_list: Option<&TextTrackList>, ) -> DomRoot<TextTrack> { reflect_dom_object( - Box::new(TextTrack::new_inherited(id, kind, label, language, mode)), + Box::new(TextTrack::new_inherited( + id, kind, label, language, mode, track_list, + )), window, TextTrackBinding::Wrap, ) @@ -69,6 +77,14 @@ impl TextTrack { pub fn id(&self) -> &str { &self.id } + + pub fn add_track_list(&self, track_list: &TextTrackList) { + *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list)); + } + + pub fn remove_track_list(&self) { + *self.track_list.borrow_mut() = None; + } } impl TextTrackMethods for TextTrack { diff --git a/components/script/dom/texttracklist.rs b/components/script/dom/texttracklist.rs index f6f9037902e..0e978972d69 100644 --- a/components/script/dom/texttracklist.rs +++ b/components/script/dom/texttracklist.rs @@ -94,6 +94,7 @@ impl TextTrackList { }), &canceller, ); + track.add_track_list(self); } } @@ -101,6 +102,9 @@ impl TextTrackList { // removed from the TextTrackList. #[allow(dead_code)] pub fn remove(&self, idx: usize) { + if let Some(track) = self.dom_tracks.borrow().get(idx) { + track.remove_track_list(); + } self.dom_tracks.borrow_mut().remove(idx); self.upcast::<EventTarget>() .fire_event(atom!("removetrack")); diff --git a/components/script/dom/videotrack.rs b/components/script/dom/videotrack.rs index b1453da0df4..18a383ab816 100644 --- a/components/script/dom/videotrack.rs +++ b/components/script/dom/videotrack.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 crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::VideoTrackBinding::{self, VideoTrackMethods}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; @@ -19,7 +20,7 @@ pub struct VideoTrack { label: DOMString, language: DOMString, selected: Cell<bool>, - track_list: Option<Dom<VideoTrackList>>, + track_list: DomRefCell<Option<Dom<VideoTrackList>>>, } impl VideoTrack { @@ -37,7 +38,7 @@ impl VideoTrack { label: label.into(), language: language.into(), selected: Cell::new(false), - track_list: track_list.map(|t| Dom::from_ref(t)), + track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))), } } @@ -73,6 +74,14 @@ impl VideoTrack { pub fn set_selected(&self, value: bool) { self.selected.set(value); } + + pub fn add_track_list(&self, track_list: &VideoTrackList) { + *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list)); + } + + pub fn remove_track_list(&self) { + *self.track_list.borrow_mut() = None; + } } impl VideoTrackMethods for VideoTrack { @@ -103,7 +112,7 @@ impl VideoTrackMethods for VideoTrack { // https://html.spec.whatwg.org/multipage/#dom-videotrack-selected fn SetSelected(&self, value: bool) { - if let Some(list) = self.track_list.as_ref() { + if let Some(list) = self.track_list.borrow().as_ref() { if let Some(idx) = list.find(self) { list.set_selected(idx, value); } diff --git a/components/script/dom/videotracklist.rs b/components/script/dom/videotracklist.rs index 9654123d3f3..98fa495bfdd 100644 --- a/components/script/dom/videotracklist.rs +++ b/components/script/dom/videotracklist.rs @@ -113,9 +113,14 @@ impl VideoTrackList { self.set_selected(idx, false); } } + track.add_track_list(self); } pub fn clear(&self) { + self.tracks + .borrow() + .iter() + .for_each(|t| t.remove_track_list()); self.tracks.borrow_mut().clear(); } } diff --git a/components/script/dom/webgl_validations/tex_image_2d.rs b/components/script/dom/webgl_validations/tex_image_2d.rs index fc5919132cf..54643e7a2da 100644 --- a/components/script/dom/webgl_validations/tex_image_2d.rs +++ b/components/script/dom/webgl_validations/tex_image_2d.rs @@ -47,10 +47,12 @@ pub enum TexImageValidationError { InvalidOffsets, } -impl std::error::Error for TexImageValidationError { - fn description(&self) -> &str { +impl std::error::Error for TexImageValidationError {} + +impl fmt::Display for TexImageValidationError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { use self::TexImageValidationError::*; - match *self { + let description = match *self { InvalidTextureTarget(_) => "Invalid texture target", TextureTargetNotBound(_) => "Texture was not bound", InvalidCubicTextureDimensions => { @@ -68,17 +70,8 @@ impl std::error::Error for TexImageValidationError { NonPotTexture => "Expected a power of two texture", InvalidCompressionFormat => "Unrecognized texture compression format", InvalidOffsets => "Invalid X/Y texture offset parameters", - } - } -} - -impl fmt::Display for TexImageValidationError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!( - f, - "TexImageValidationError({})", - std::error::Error::description(self) - ) + }; + write!(f, "TexImageValidationError({})", description) } } diff --git a/components/script/dom/webidls/CustomElementRegistry.webidl b/components/script/dom/webidls/CustomElementRegistry.webidl index 6d3a7b436de..3ba49a2082c 100644 --- a/components/script/dom/webidls/CustomElementRegistry.webidl +++ b/components/script/dom/webidls/CustomElementRegistry.webidl @@ -11,6 +11,8 @@ interface CustomElementRegistry { any get(DOMString name); Promise<void> whenDefined(DOMString name); + + [CEReactions] void upgrade(Node root); }; callback CustomElementConstructor = HTMLElement(); diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl index 9476b9c2d6d..7d92ddbd137 100644 --- a/components/script/dom/webidls/Document.webidl +++ b/components/script/dom/webidls/Document.webidl @@ -34,9 +34,10 @@ interface Document : Node { HTMLCollection getElementsByClassName(DOMString classNames); [CEReactions, NewObject, Throws] - Element createElement(DOMString localName, optional ElementCreationOptions options = {}); + Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {}); [CEReactions, NewObject, Throws] - Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional ElementCreationOptions options = {}); + Element createElementNS(DOMString? namespace, DOMString qualifiedName, + optional (DOMString or ElementCreationOptions) options = {}); [NewObject] DocumentFragment createDocumentFragment(); [NewObject] diff --git a/components/script/dom/webidls/HTMLInputElement.webidl b/components/script/dom/webidls/HTMLInputElement.webidl index 48001bc555c..64ee9aa7c2f 100644 --- a/components/script/dom/webidls/HTMLInputElement.webidl +++ b/components/script/dom/webidls/HTMLInputElement.webidl @@ -89,7 +89,7 @@ interface HTMLInputElement : HTMLElement { //boolean reportValidity(); //void setCustomValidity(DOMString error); - readonly attribute NodeList labels; + readonly attribute NodeList? labels; void select(); [SetterThrows] diff --git a/components/script/dom/webidls/HTMLOptionElement.webidl b/components/script/dom/webidls/HTMLOptionElement.webidl index 56a379fc8db..65f37458295 100644 --- a/components/script/dom/webidls/HTMLOptionElement.webidl +++ b/components/script/dom/webidls/HTMLOptionElement.webidl @@ -3,9 +3,9 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://html.spec.whatwg.org/multipage/#htmloptionelement -[Exposed=Window/*, NamedConstructor=Option(optional DOMString text = "", optional DOMString value, +[Exposed=Window, NamedConstructor=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, - optional boolean selected = false)*/] + optional boolean selected = false)] interface HTMLOptionElement : HTMLElement { [HTMLConstructor] constructor(); diff --git a/components/script/dom/webidls/HTMLScriptElement.webidl b/components/script/dom/webidls/HTMLScriptElement.webidl index f7126b7901b..13b69865fa5 100644 --- a/components/script/dom/webidls/HTMLScriptElement.webidl +++ b/components/script/dom/webidls/HTMLScriptElement.webidl @@ -12,6 +12,8 @@ interface HTMLScriptElement : HTMLElement { [CEReactions] attribute DOMString type; [CEReactions] + attribute boolean noModule; + [CEReactions] attribute DOMString charset; [CEReactions] attribute boolean async; diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 2d126933849..7eb958cd095 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -140,11 +140,7 @@ impl Worker { self.terminated.get() } - pub fn handle_message( - address: TrustedWorkerAddress, - origin: String, - data: StructuredSerializedData, - ) { + pub fn handle_message(address: TrustedWorkerAddress, data: StructuredSerializedData) { let worker = address.root(); if worker.is_terminated() { @@ -156,14 +152,7 @@ impl Worker { let _ac = enter_realm(target); rooted!(in(*global.get_cx()) let mut message = UndefinedValue()); if let Ok(ports) = structuredclone::read(&global, data, message.handle_mut()) { - MessageEvent::dispatch_jsval( - target, - &global, - message.handle(), - Some(&origin), - None, - ports, - ); + MessageEvent::dispatch_jsval(target, &global, message.handle(), None, None, ports); } else { // Step 4 of the "port post message steps" of the implicit messageport, fire messageerror. MessageEvent::dispatch_error(target, &global); diff --git a/components/script/dom/xr.rs b/components/script/dom/xr.rs index 72cc573d645..5804918a532 100644 --- a/components/script/dom/xr.rs +++ b/components/script/dom/xr.rs @@ -26,14 +26,14 @@ use crate::dom::xrtest::XRTest; use crate::script_thread::ScriptThread; use crate::task_source::TaskSource; use dom_struct::dom_struct; -use ipc_channel::ipc::IpcSender; +use ipc_channel::ipc::{self as ipc_crate, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; use profile_traits::ipc; use std::cell::Cell; use std::rc::Rc; use webvr_traits::{WebVRDisplayData, WebVRDisplayEvent, WebVREvent, WebVRMsg}; use webvr_traits::{WebVRGamepadData, WebVRGamepadEvent, WebVRGamepadState}; -use webxr_api::{Error as XRError, Session, SessionMode}; +use webxr_api::{Error as XRError, Frame, Session, SessionMode}; #[dom_struct] pub struct XR { @@ -185,12 +185,15 @@ impl XRMethods for XR { .task_manager() .dom_manipulation_task_source_with_canceller(); let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap(); + let (frame_sender, frame_receiver) = ipc_crate::channel().unwrap(); + let mut frame_receiver = Some(frame_receiver); ROUTER.add_route( receiver.to_opaque(), Box::new(move |message| { // router doesn't know this is only called once let trusted = trusted.take().unwrap(); let this = this.clone(); + let frame_receiver = frame_receiver.take().unwrap(); let message: Result<Session, webxr_api::Error> = if let Ok(message) = message.to() { message } else { @@ -199,13 +202,15 @@ impl XRMethods for XR { }; let _ = task_source.queue_with_canceller( task!(request_session: move || { - this.root().session_obtained(message, trusted.root(), mode); + this.root().session_obtained(message, trusted.root(), mode, frame_receiver); }), &canceller, ); }), ); - window.webxr_registry().request_session(mode.into(), sender); + window + .webxr_registry() + .request_session(mode.into(), sender, frame_sender); promise } @@ -222,6 +227,7 @@ impl XR { response: Result<Session, XRError>, promise: Rc<Promise>, mode: XRSessionMode, + frame_receiver: IpcReceiver<Frame>, ) { let session = match response { Ok(session) => session, @@ -231,7 +237,7 @@ impl XR { }, }; - let session = XRSession::new(&self.global(), session, mode); + let session = XRSession::new(&self.global(), session, mode, frame_receiver); if mode == XRSessionMode::Inline { self.active_inline_sessions .borrow_mut() diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 6e076b6daba..a4ced8689a5 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -41,7 +41,7 @@ use crate::dom::xrwebgllayer::XRWebGLLayer; use crate::task_source::TaskSource; use dom_struct::dom_struct; use euclid::{Rect, RigidTransform3D, Transform3D}; -use ipc_channel::ipc::IpcSender; +use ipc_channel::ipc::IpcReceiver; use ipc_channel::router::ROUTER; use metrics::ToMs; use profile_traits::ipc; @@ -73,8 +73,6 @@ pub struct XRSession { next_raf_id: Cell<i32>, #[ignore_malloc_size_of = "closures are hard"] raf_callback_list: DomRefCell<Vec<(i32, Option<Rc<XRFrameRequestCallback>>)>>, - #[ignore_malloc_size_of = "defined in ipc-channel"] - raf_sender: DomRefCell<Option<IpcSender<Frame>>>, input_sources: Dom<XRInputSourceArray>, // Any promises from calling end() #[ignore_malloc_size_of = "promises are hard"] @@ -108,7 +106,6 @@ impl XRSession { next_raf_id: Cell::new(0), raf_callback_list: DomRefCell::new(vec![]), - raf_sender: DomRefCell::new(None), input_sources: Dom::from_ref(input_sources), end_promises: DomRefCell::new(vec![]), ended: Cell::new(false), @@ -116,7 +113,12 @@ impl XRSession { } } - pub fn new(global: &GlobalScope, session: Session, mode: XRSessionMode) -> DomRoot<XRSession> { + pub fn new( + global: &GlobalScope, + session: Session, + mode: XRSessionMode, + frame_receiver: IpcReceiver<Frame>, + ) -> DomRoot<XRSession> { let ivfov = if mode == XRSessionMode::Inline { Some(FRAC_PI_2) } else { @@ -136,7 +138,7 @@ impl XRSession { ); input_sources.set_initial_inputs(&ret); ret.attach_event_handler(); - ret.setup_raf_loop(); + ret.setup_raf_loop(frame_receiver); ret } @@ -153,21 +155,15 @@ impl XRSession { self.mode != XRSessionMode::Inline } - fn setup_raf_loop(&self) { - assert!( - self.raf_sender.borrow().is_none(), - "RAF loop already set up" - ); + fn setup_raf_loop(&self, frame_receiver: IpcReceiver<Frame>) { let this = Trusted::new(self); let global = self.global(); let window = global.as_window(); let (task_source, canceller) = window .task_manager() .dom_manipulation_task_source_with_canceller(); - let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap(); - *self.raf_sender.borrow_mut() = Some(sender); ROUTER.add_route( - receiver.to_opaque(), + frame_receiver.to_opaque(), Box::new(move |message| { let this = this.clone(); let _ = task_source.queue_with_canceller( @@ -179,15 +175,7 @@ impl XRSession { }), ); - self.request_new_xr_frame(); - } - - /// Requests a new https://immersive-web.github.io/webxr/#xr-animation-frame - /// - /// This happens regardless of the presense of rAF callbacks - fn request_new_xr_frame(&self) { - let sender = self.raf_sender.borrow().clone().unwrap(); - self.session.borrow_mut().request_animation_frame(sender); + self.session.borrow_mut().start_render_loop(); } pub fn is_outside_raf(&self) -> bool { @@ -360,8 +348,9 @@ impl XRSession { if self.is_immersive() { base_layer.swap_buffers(); self.session.borrow_mut().render_animation_frame(); + } else { + self.session.borrow_mut().start_render_loop(); } - self.request_new_xr_frame(); // If the canvas element is attached to the DOM, it is now dirty, // and we need to trigger a reflow. diff --git a/components/script/lib.rs b/components/script/lib.rs index 79c0657b996..2ae7f76923a 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -83,6 +83,8 @@ mod microtask; #[warn(deprecated)] mod network_listener; #[warn(deprecated)] +mod script_module; +#[warn(deprecated)] pub mod script_runtime; #[warn(deprecated)] #[allow(unsafe_code)] diff --git a/components/script/script_module.rs b/components/script/script_module.rs new file mode 100644 index 00000000000..4bb60f5a233 --- /dev/null +++ b/components/script/script_module.rs @@ -0,0 +1,1430 @@ +/* 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/. */ + +//! The script module mod contains common traits and structs +//! related to `type=module` for script thread or worker threads. + +use crate::compartments::{enter_realm, AlreadyInCompartment, InCompartment}; +use crate::document_loader::LoadType; +use crate::dom::bindings::cell::DomRefCell; +use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods; +use crate::dom::bindings::conversions::jsstring_to_str; +use crate::dom::bindings::error::report_pending_exception; +use crate::dom::bindings::error::Error; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; +use crate::dom::bindings::reflector::DomObject; +use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::settings_stack::AutoIncumbentScript; +use crate::dom::bindings::str::DOMString; +use crate::dom::bindings::trace::RootedTraceableBox; +use crate::dom::document::Document; +use crate::dom::element::Element; +use crate::dom::globalscope::GlobalScope; +use crate::dom::htmlscriptelement::{HTMLScriptElement, ScriptId}; +use crate::dom::htmlscriptelement::{ScriptOrigin, ScriptType, SCRIPT_JS_MIMES}; +use crate::dom::node::document_from_node; +use crate::dom::performanceresourcetiming::InitiatorType; +use crate::dom::promise::Promise; +use crate::dom::promisenativehandler::{Callback, PromiseNativeHandler}; +use crate::dom::window::Window; +use crate::dom::worker::TrustedWorkerAddress; +use crate::network_listener::{self, NetworkListener}; +use crate::network_listener::{PreInvoke, ResourceTimingListener}; +use crate::task::TaskBox; +use crate::task_source::TaskSourceName; +use encoding_rs::UTF_8; +use hyper_serde::Serde; +use ipc_channel::ipc; +use ipc_channel::router::ROUTER; +use js::glue::{AppendToAutoObjectVector, CreateAutoObjectVector}; +use js::jsapi::Handle as RawHandle; +use js::jsapi::HandleObject; +use js::jsapi::HandleValue as RawHandleValue; +use js::jsapi::{AutoObjectVector, JSAutoRealm, JSObject, JSString}; +use js::jsapi::{GetModuleResolveHook, JSRuntime, SetModuleResolveHook}; +use js::jsapi::{GetRequestedModules, SetModuleMetadataHook}; +use js::jsapi::{GetWaitForAllPromise, ModuleEvaluate, ModuleInstantiate, SourceText}; +use js::jsapi::{Heap, JSContext, JS_ClearPendingException, SetModulePrivate}; +use js::jsapi::{SetModuleDynamicImportHook, SetScriptPrivateReferenceHooks}; +use js::jsval::{JSVal, PrivateValue, UndefinedValue}; +use js::rust::jsapi_wrapped::{CompileModule, JS_GetArrayLength, JS_GetElement}; +use js::rust::jsapi_wrapped::{GetRequestedModuleSpecifier, JS_GetPendingException}; +use js::rust::wrappers::JS_SetPendingException; +use js::rust::CompileOptionsWrapper; +use js::rust::IntoHandle; +use js::rust::{Handle, HandleValue}; +use net_traits::request::{CredentialsMode, Destination, ParserMetadata}; +use net_traits::request::{Referrer, RequestBuilder, RequestMode}; +use net_traits::{FetchMetadata, Metadata}; +use net_traits::{FetchResponseListener, NetworkError}; +use net_traits::{ResourceFetchTiming, ResourceTimingType}; +use servo_url::ServoUrl; +use std::cmp::Ordering; +use std::collections::{HashMap, HashSet}; +use std::ffi; +use std::marker::PhantomData; +use std::ptr; +use std::rc::Rc; +use std::sync::{Arc, Mutex}; +use url::ParseError as UrlParseError; + +use indexmap::IndexSet; + +pub fn get_source_text(source: &[u16]) -> SourceText<u16> { + SourceText { + units_: source.as_ptr() as *const _, + length_: source.len() as u32, + ownsUnits_: false, + _phantom_0: PhantomData, + } +} + +#[allow(unsafe_code)] +unsafe fn gen_type_error(global: &GlobalScope, string: String) -> ModuleError { + rooted!(in(*global.get_cx()) let mut thrown = UndefinedValue()); + Error::Type(string).to_jsval(*global.get_cx(), &global, thrown.handle_mut()); + + return ModuleError::RawException(RootedTraceableBox::from_box(Heap::boxed(thrown.get()))); +} + +#[derive(JSTraceable)] +pub struct ModuleObject(Box<Heap<*mut JSObject>>); + +impl ModuleObject { + #[allow(unsafe_code)] + pub fn handle(&self) -> HandleObject { + unsafe { self.0.handle() } + } +} + +#[derive(JSTraceable)] +pub enum ModuleError { + Network(NetworkError), + RawException(RootedTraceableBox<Heap<JSVal>>), +} + +impl Eq for ModuleError {} + +impl PartialEq for ModuleError { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::Network(_), Self::RawException(_)) | + (Self::RawException(_), Self::Network(_)) => false, + _ => true, + } + } +} + +impl Ord for ModuleError { + fn cmp(&self, other: &Self) -> Ordering { + match (self, other) { + (Self::Network(_), Self::RawException(_)) => Ordering::Greater, + (Self::RawException(_), Self::Network(_)) => Ordering::Less, + _ => Ordering::Equal, + } + } +} + +impl PartialOrd for ModuleError { + fn partial_cmp(&self, other: &Self) -> Option<Ordering> { + Some(self.cmp(other)) + } +} + +impl ModuleError { + #[allow(unsafe_code)] + pub fn handle(&self) -> Handle<JSVal> { + match self { + Self::Network(_) => unreachable!(), + Self::RawException(exception) => exception.handle(), + } + } +} + +impl Clone for ModuleError { + fn clone(&self) -> Self { + match self { + Self::Network(network_error) => Self::Network(network_error.clone()), + Self::RawException(exception) => Self::RawException(RootedTraceableBox::from_box( + Heap::boxed(exception.get().clone()), + )), + } + } +} + +struct ModuleScript { + base_url: ServoUrl, +} + +#[derive(JSTraceable)] +pub struct ModuleTree { + url: ServoUrl, + text: DomRefCell<DOMString>, + record: DomRefCell<Option<ModuleObject>>, + status: DomRefCell<ModuleStatus>, + // The spec maintains load order for descendants, so we use an indexset for descendants and + // parents. This isn't actually necessary for parents however the IndexSet APIs don't + // interop with HashSet, and IndexSet isn't very expensive + // (https://github.com/bluss/indexmap/issues/110) + // + // By default all maps in web specs are ordered maps + // (https://infra.spec.whatwg.org/#ordered-map), however we can usually get away with using + // stdlib maps and sets because we rarely iterate over them. + parent_urls: DomRefCell<IndexSet<ServoUrl>>, + descendant_urls: DomRefCell<IndexSet<ServoUrl>>, + visited_urls: DomRefCell<HashSet<ServoUrl>>, + error: DomRefCell<Option<ModuleError>>, + promise: DomRefCell<Option<Rc<Promise>>>, +} + +impl ModuleTree { + pub fn new(url: ServoUrl) -> Self { + ModuleTree { + url, + text: DomRefCell::new(DOMString::new()), + record: DomRefCell::new(None), + status: DomRefCell::new(ModuleStatus::Initial), + parent_urls: DomRefCell::new(IndexSet::new()), + descendant_urls: DomRefCell::new(IndexSet::new()), + visited_urls: DomRefCell::new(HashSet::new()), + error: DomRefCell::new(None), + promise: DomRefCell::new(None), + } + } + + pub fn get_promise(&self) -> &DomRefCell<Option<Rc<Promise>>> { + &self.promise + } + + pub fn set_promise(&self, promise: Rc<Promise>) { + *self.promise.borrow_mut() = Some(promise); + } + + pub fn get_status(&self) -> ModuleStatus { + self.status.borrow().clone() + } + + pub fn set_status(&self, status: ModuleStatus) { + *self.status.borrow_mut() = status; + } + + pub fn get_record(&self) -> &DomRefCell<Option<ModuleObject>> { + &self.record + } + + pub fn set_record(&self, record: ModuleObject) { + *self.record.borrow_mut() = Some(record); + } + + pub fn get_error(&self) -> &DomRefCell<Option<ModuleError>> { + &self.error + } + + pub fn set_error(&self, error: Option<ModuleError>) { + *self.error.borrow_mut() = error; + } + + pub fn get_text(&self) -> &DomRefCell<DOMString> { + &self.text + } + + pub fn set_text(&self, module_text: DOMString) { + *self.text.borrow_mut() = module_text; + } + + pub fn get_parent_urls(&self) -> &DomRefCell<IndexSet<ServoUrl>> { + &self.parent_urls + } + + pub fn insert_parent_url(&self, parent_url: ServoUrl) { + self.parent_urls.borrow_mut().insert(parent_url); + } + + pub fn append_parent_urls(&self, parent_urls: IndexSet<ServoUrl>) { + self.parent_urls.borrow_mut().extend(parent_urls); + } + + pub fn get_descendant_urls(&self) -> &DomRefCell<IndexSet<ServoUrl>> { + &self.descendant_urls + } + + pub fn append_descendant_urls(&self, descendant_urls: IndexSet<ServoUrl>) { + self.descendant_urls.borrow_mut().extend(descendant_urls); + } + + /// recursively checks if all of the transitive descendants are + /// in the FetchingDescendants or later status + fn recursive_check_descendants( + module_tree: &ModuleTree, + module_map: &HashMap<ServoUrl, Rc<ModuleTree>>, + discovered_urls: &mut HashSet<ServoUrl>, + ) -> bool { + discovered_urls.insert(module_tree.url.clone()); + + let descendant_urls = module_tree.descendant_urls.borrow(); + + for descendant_module in descendant_urls + .iter() + .filter_map(|url| module_map.get(&url.clone())) + { + if discovered_urls.contains(&descendant_module.url) { + continue; + } + + let descendant_status = descendant_module.get_status(); + if descendant_status < ModuleStatus::FetchingDescendants { + return false; + } + + let all_ready_descendants = ModuleTree::recursive_check_descendants( + &descendant_module, + module_map, + discovered_urls, + ); + + if !all_ready_descendants { + return false; + } + } + + return true; + } + + fn has_all_ready_descendants(&self, module_map: &HashMap<ServoUrl, Rc<ModuleTree>>) -> bool { + let mut discovered_urls = HashSet::new(); + + return ModuleTree::recursive_check_descendants(&self, module_map, &mut discovered_urls); + } + + pub fn get_visited_urls(&self) -> &DomRefCell<HashSet<ServoUrl>> { + &self.visited_urls + } + + pub fn append_handler(&self, owner: ModuleOwner, module_url: ServoUrl, is_top_level: bool) { + let promise = self.promise.borrow(); + + let resolve_this = owner.clone(); + let reject_this = owner.clone(); + + let resolved_url = module_url.clone(); + let rejected_url = module_url.clone(); + + let handler = PromiseNativeHandler::new( + &owner.global(), + Some(ModuleHandler::new(Box::new( + task!(fetched_resolve: move || { + resolve_this.finish_module_load(Some(resolved_url), is_top_level); + }), + ))), + Some(ModuleHandler::new(Box::new( + task!(failure_reject: move || { + reject_this.finish_module_load(Some(rejected_url), is_top_level); + }), + ))), + ); + + let _compartment = enter_realm(&*owner.global()); + AlreadyInCompartment::assert(&*owner.global()); + let _ais = AutoIncumbentScript::new(&*owner.global()); + + let promise = promise.as_ref().unwrap(); + + promise.append_native_handler(&handler); + } +} + +#[derive(Clone, Copy, Debug, JSTraceable, PartialEq, PartialOrd)] +pub enum ModuleStatus { + Initial, + Fetching, + FetchingDescendants, + FetchFailed, + Ready, + Finished, +} + +impl ModuleTree { + #[allow(unsafe_code)] + /// https://html.spec.whatwg.org/multipage/#creating-a-module-script + /// Step 7-11. + fn compile_module_script( + &self, + global: &GlobalScope, + module_script_text: DOMString, + url: ServoUrl, + ) -> Result<ModuleObject, ModuleError> { + let module: Vec<u16> = module_script_text.encode_utf16().collect(); + + let url_cstr = ffi::CString::new(url.as_str().as_bytes()).unwrap(); + + let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject()); + + let compile_options = CompileOptionsWrapper::new(*global.get_cx(), url_cstr.as_ptr(), 1); + + rooted!(in(*global.get_cx()) let mut module_script = ptr::null_mut::<JSObject>()); + + let mut source = get_source_text(&module); + + unsafe { + if !CompileModule( + *global.get_cx(), + compile_options.ptr, + &mut source, + &mut module_script.handle_mut(), + ) { + warn!("fail to compile module script of {}", url); + + rooted!(in(*global.get_cx()) let mut exception = UndefinedValue()); + assert!(JS_GetPendingException( + *global.get_cx(), + &mut exception.handle_mut() + )); + JS_ClearPendingException(*global.get_cx()); + + return Err(ModuleError::RawException(RootedTraceableBox::from_box( + Heap::boxed(exception.get()), + ))); + } + + let module_script_data = Box::new(ModuleScript { + base_url: url.clone(), + }); + + SetModulePrivate( + module_script.get(), + &PrivateValue(Box::into_raw(module_script_data) as *const _), + ); + } + + debug!("module script of {} compile done", url); + + self.resolve_requested_module_specifiers( + &global, + module_script.handle().into_handle(), + url.clone(), + ) + .map(|_| ModuleObject(Heap::boxed(*module_script))) + } + + #[allow(unsafe_code)] + pub fn instantiate_module_tree( + &self, + global: &GlobalScope, + module_record: HandleObject, + ) -> Result<(), ModuleError> { + let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject()); + + unsafe { + if !ModuleInstantiate(*global.get_cx(), module_record) { + warn!("fail to instantiate module"); + + rooted!(in(*global.get_cx()) let mut exception = UndefinedValue()); + assert!(JS_GetPendingException( + *global.get_cx(), + &mut exception.handle_mut() + )); + JS_ClearPendingException(*global.get_cx()); + + Err(ModuleError::RawException(RootedTraceableBox::from_box( + Heap::boxed(exception.get()), + ))) + } else { + debug!("module instantiated successfully"); + + Ok(()) + } + } + } + + #[allow(unsafe_code)] + pub fn execute_module( + &self, + global: &GlobalScope, + module_record: HandleObject, + ) -> Result<(), ModuleError> { + let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject()); + + unsafe { + if !ModuleEvaluate(*global.get_cx(), module_record) { + warn!("fail to evaluate module"); + + rooted!(in(*global.get_cx()) let mut exception = UndefinedValue()); + assert!(JS_GetPendingException( + *global.get_cx(), + &mut exception.handle_mut() + )); + JS_ClearPendingException(*global.get_cx()); + + Err(ModuleError::RawException(RootedTraceableBox::from_box( + Heap::boxed(exception.get()), + ))) + } else { + debug!("module evaluated successfully"); + Ok(()) + } + } + } + + #[allow(unsafe_code)] + pub fn report_error(&self, global: &GlobalScope) { + let module_error = self.error.borrow(); + + if let Some(exception) = &*module_error { + unsafe { + JS_SetPendingException(*global.get_cx(), exception.handle()); + report_pending_exception(*global.get_cx(), true); + } + } + } + + /// https://html.spec.whatwg.org/multipage/#fetch-the-descendants-of-a-module-script + /// Step 5. + pub fn resolve_requested_modules( + &self, + global: &GlobalScope, + ) -> Result<IndexSet<ServoUrl>, ModuleError> { + let status = self.get_status(); + + assert_ne!(status, ModuleStatus::Initial); + assert_ne!(status, ModuleStatus::Fetching); + + let record = self.record.borrow(); + + if let Some(raw_record) = &*record { + let valid_specifier_urls = self.resolve_requested_module_specifiers( + &global, + raw_record.handle(), + self.url.clone(), + ); + + return valid_specifier_urls.map(|parsed_urls| { + parsed_urls + .iter() + .filter_map(|parsed_url| { + let mut visited = self.visited_urls.borrow_mut(); + + if !visited.contains(&parsed_url) { + visited.insert(parsed_url.clone()); + + Some(parsed_url.clone()) + } else { + None + } + }) + .collect::<IndexSet<ServoUrl>>() + }); + } + + unreachable!("Didn't have record while resolving its requested module") + } + + #[allow(unsafe_code)] + fn resolve_requested_module_specifiers( + &self, + global: &GlobalScope, + module_object: HandleObject, + base_url: ServoUrl, + ) -> Result<IndexSet<ServoUrl>, ModuleError> { + let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject()); + + let mut specifier_urls = IndexSet::new(); + + unsafe { + rooted!(in(*global.get_cx()) let requested_modules = GetRequestedModules(*global.get_cx(), module_object)); + + let mut length = 0; + + if !JS_GetArrayLength(*global.get_cx(), requested_modules.handle(), &mut length) { + let module_length_error = + gen_type_error(&global, "Wrong length of requested modules".to_owned()); + + return Err(module_length_error); + } + + for index in 0..length { + rooted!(in(*global.get_cx()) let mut element = UndefinedValue()); + + if !JS_GetElement( + *global.get_cx(), + requested_modules.handle(), + index, + &mut element.handle_mut(), + ) { + let get_element_error = + gen_type_error(&global, "Failed to get requested module".to_owned()); + + return Err(get_element_error); + } + + rooted!(in(*global.get_cx()) let specifier = GetRequestedModuleSpecifier( + *global.get_cx(), element.handle() + )); + + let url = ModuleTree::resolve_module_specifier( + *global.get_cx(), + &base_url, + specifier.handle().into_handle(), + ); + + if url.is_err() { + let specifier_error = + gen_type_error(&global, "Wrong module specifier".to_owned()); + + return Err(specifier_error); + } + + specifier_urls.insert(url.unwrap()); + } + } + + Ok(specifier_urls) + } + + /// The following module specifiers are allowed by the spec: + /// - a valid absolute URL + /// - a valid relative URL that starts with "/", "./" or "../" + /// + /// Bareword module specifiers are currently disallowed as these may be given + /// special meanings in the future. + /// https://html.spec.whatwg.org/multipage/#resolve-a-module-specifier + #[allow(unsafe_code)] + fn resolve_module_specifier( + cx: *mut JSContext, + url: &ServoUrl, + specifier: RawHandle<*mut JSString>, + ) -> Result<ServoUrl, UrlParseError> { + let specifier_str = unsafe { jsstring_to_str(cx, *specifier) }; + + // Step 1. + if let Ok(specifier_url) = ServoUrl::parse(&specifier_str) { + return Ok(specifier_url); + } + + // Step 2. + if !specifier_str.starts_with("/") && + !specifier_str.starts_with("./") && + !specifier_str.starts_with("../") + { + return Err(UrlParseError::InvalidDomainCharacter); + } + + // Step 3. + return ServoUrl::parse_with_base(Some(url), &specifier_str.clone()); + } + + /// https://html.spec.whatwg.org/multipage/#finding-the-first-parse-error + fn find_first_parse_error( + global: &GlobalScope, + module_tree: &ModuleTree, + discovered_urls: &mut HashSet<ServoUrl>, + ) -> Option<ModuleError> { + // 3. + discovered_urls.insert(module_tree.url.clone()); + + // 4. + let module_map = global.get_module_map().borrow(); + let record = module_tree.get_record().borrow(); + if record.is_none() { + let module_error = module_tree.get_error().borrow(); + + return module_error.clone(); + } + + // 5-6. + let descendant_urls = module_tree.get_descendant_urls().borrow(); + + for descendant_module in descendant_urls + .iter() + // 7. + .filter_map(|url| module_map.get(&url.clone())) + { + // 8-2. + if discovered_urls.contains(&descendant_module.url) { + continue; + } + + // 8-3. + let child_parse_error = + ModuleTree::find_first_parse_error(&global, &descendant_module, discovered_urls); + + // 8-4. + if child_parse_error.is_some() { + return child_parse_error; + } + } + + // Step 9. + return None; + } +} + +#[derive(JSTraceable, MallocSizeOf)] +struct ModuleHandler { + #[ignore_malloc_size_of = "Measuring trait objects is hard"] + task: DomRefCell<Option<Box<dyn TaskBox>>>, +} + +impl ModuleHandler { + pub fn new(task: Box<dyn TaskBox>) -> Box<dyn Callback> { + Box::new(Self { + task: DomRefCell::new(Some(task)), + }) + } +} + +impl Callback for ModuleHandler { + fn callback(&self, _cx: *mut JSContext, _v: HandleValue) { + let task = self.task.borrow_mut().take().unwrap(); + task.run_box(); + } +} + +/// The owner of the module +/// It can be `worker` or `script` element +#[derive(Clone)] +pub enum ModuleOwner { + #[allow(dead_code)] + Worker(TrustedWorkerAddress), + Window(Trusted<HTMLScriptElement>), +} + +impl ModuleOwner { + pub fn global(&self) -> DomRoot<GlobalScope> { + match &self { + ModuleOwner::Worker(worker) => (*worker.root().clone()).global(), + ModuleOwner::Window(script) => (*script.root()).global(), + } + } + + fn gen_promise_with_final_handler( + &self, + module_url: Option<ServoUrl>, + is_top_level: bool, + ) -> Rc<Promise> { + let resolve_this = self.clone(); + let reject_this = self.clone(); + + let resolved_url = module_url.clone(); + let rejected_url = module_url.clone(); + + let handler = PromiseNativeHandler::new( + &self.global(), + Some(ModuleHandler::new(Box::new( + task!(fetched_resolve: move || { + resolve_this.finish_module_load(resolved_url, is_top_level); + }), + ))), + Some(ModuleHandler::new(Box::new( + task!(failure_reject: move || { + reject_this.finish_module_load(rejected_url, is_top_level); + }), + ))), + ); + + let compartment = enter_realm(&*self.global()); + let comp = InCompartment::Entered(&compartment); + let _ais = AutoIncumbentScript::new(&*self.global()); + + let promise = Promise::new_in_current_compartment(&self.global(), comp); + + promise.append_native_handler(&handler); + + promise + } + + /// https://html.spec.whatwg.org/multipage/#fetch-the-descendants-of-and-link-a-module-script + /// step 4-7. + pub fn finish_module_load(&self, module_url: Option<ServoUrl>, is_top_level: bool) { + match &self { + ModuleOwner::Worker(_) => unimplemented!(), + ModuleOwner::Window(script) => { + let global = self.global(); + + let document = document_from_node(&*script.root()); + + let module_map = global.get_module_map().borrow(); + + let (module_tree, mut load) = if let Some(script_src) = module_url.clone() { + let module_tree = module_map.get(&script_src.clone()).unwrap().clone(); + + let load = Ok(ScriptOrigin::external( + module_tree.get_text().borrow().clone(), + script_src.clone(), + ScriptType::Module, + )); + + debug!( + "Going to finish external script from {}", + script_src.clone() + ); + + (module_tree, load) + } else { + let module_tree = { + let inline_module_map = global.get_inline_module_map().borrow(); + inline_module_map + .get(&script.root().get_script_id()) + .unwrap() + .clone() + }; + + let base_url = document.base_url(); + + let load = Ok(ScriptOrigin::internal( + module_tree.get_text().borrow().clone(), + base_url.clone(), + ScriptType::Module, + )); + + debug!("Going to finish internal script from {}", base_url.clone()); + + (module_tree, load) + }; + + module_tree.set_status(ModuleStatus::Finished); + + if !module_tree.has_all_ready_descendants(&module_map) { + return; + } + + let parent_urls = module_tree.get_parent_urls().borrow(); + let parent_all_ready = parent_urls + .iter() + .filter_map(|parent_url| module_map.get(&parent_url.clone())) + .all(|parent_tree| parent_tree.has_all_ready_descendants(&module_map)); + + if !parent_all_ready { + return; + } + + parent_urls + .iter() + .filter_map(|parent_url| module_map.get(&parent_url.clone())) + .for_each(|parent_tree| { + let parent_promise = parent_tree.get_promise().borrow(); + if let Some(promise) = parent_promise.as_ref() { + promise.resolve_native(&()); + } + }); + + let mut discovered_urls: HashSet<ServoUrl> = HashSet::new(); + let module_error = + ModuleTree::find_first_parse_error(&global, &module_tree, &mut discovered_urls); + + match module_error { + None => { + let module_record = module_tree.get_record().borrow(); + if let Some(record) = &*module_record { + let instantiated = + module_tree.instantiate_module_tree(&global, record.handle()); + + if let Err(exception) = instantiated { + module_tree.set_error(Some(exception.clone())); + } + } + }, + Some(ModuleError::RawException(exception)) => { + module_tree.set_error(Some(ModuleError::RawException(exception))); + }, + Some(ModuleError::Network(network_error)) => { + module_tree.set_error(Some(ModuleError::Network(network_error.clone()))); + + // Change the `result` load of the script into `network` error + load = Err(network_error); + }, + }; + + if is_top_level { + let r#async = script + .root() + .upcast::<Element>() + .has_attribute(&local_name!("async")); + + if !r#async && (&*script.root()).get_parser_inserted() { + document.deferred_script_loaded(&*script.root(), load); + } else if !r#async && !(&*script.root()).get_non_blocking() { + document.asap_in_order_script_loaded(&*script.root(), load); + } else { + document.asap_script_loaded(&*script.root(), load); + }; + } + }, + } + } +} + +/// The context required for asynchronously loading an external module script source. +struct ModuleContext { + /// The owner of the module that initiated the request. + owner: ModuleOwner, + /// The response body received to date. + data: Vec<u8>, + /// The response metadata received to date. + metadata: Option<Metadata>, + /// The initial URL requested. + url: ServoUrl, + /// Destination of current module context + destination: Destination, + /// Credentials Mode of current module context + credentials_mode: CredentialsMode, + /// Indicates whether the request failed, and why + status: Result<(), NetworkError>, + /// Timing object for this resource + resource_timing: ResourceFetchTiming, +} + +impl FetchResponseListener for ModuleContext { + fn process_request_body(&mut self) {} // TODO(cybai): Perhaps add custom steps to perform fetch here? + + fn process_request_eof(&mut self) {} // TODO(cybai): Perhaps add custom steps to perform fetch here? + + fn process_response(&mut self, metadata: Result<FetchMetadata, NetworkError>) { + self.metadata = metadata.ok().map(|meta| match meta { + FetchMetadata::Unfiltered(m) => m, + FetchMetadata::Filtered { unsafe_, .. } => unsafe_, + }); + + let status_code = self + .metadata + .as_ref() + .and_then(|m| match m.status { + Some((c, _)) => Some(c), + _ => None, + }) + .unwrap_or(0); + + self.status = match status_code { + 0 => Err(NetworkError::Internal( + "No http status code received".to_owned(), + )), + 200..=299 => Ok(()), // HTTP ok status codes + _ => Err(NetworkError::Internal(format!( + "HTTP error code {}", + status_code + ))), + }; + } + + fn process_response_chunk(&mut self, mut chunk: Vec<u8>) { + if self.status.is_ok() { + self.data.append(&mut chunk); + } + } + + /// <https://html.spec.whatwg.org/multipage/#fetch-a-single-module-script> + /// Step 9-12 + #[allow(unsafe_code)] + fn process_response_eof(&mut self, response: Result<ResourceFetchTiming, NetworkError>) { + let global = self.owner.global(); + + if let Some(window) = global.downcast::<Window>() { + window + .Document() + .finish_load(LoadType::Script(self.url.clone())); + } + + // Step 9-1 & 9-2. + let load = response.and(self.status.clone()).and_then(|_| { + // Step 9-3. + let meta = self.metadata.take().unwrap(); + + if let Some(content_type) = meta.content_type.map(Serde::into_inner) { + let c = content_type.to_string(); + // The MIME crate includes params (e.g. charset=utf8) in the to_string + // https://github.com/hyperium/mime/issues/120 + if let Some(ty) = c.split(';').next() { + if !SCRIPT_JS_MIMES.contains(&ty) { + return Err(NetworkError::Internal(format!("Invalid MIME type: {}", ty))); + } + } else { + return Err(NetworkError::Internal("Empty MIME type".into())); + } + } else { + return Err(NetworkError::Internal("No MIME type".into())); + } + + // Step 10. + let (source_text, _, _) = UTF_8.decode(&self.data); + Ok(ScriptOrigin::external( + DOMString::from(source_text), + meta.final_url, + ScriptType::Module, + )) + }); + + if let Err(err) = load { + // Step 9. + error!("Failed to fetch {} with error {:?}", self.url.clone(), err); + let module_tree = { + let module_map = global.get_module_map().borrow(); + module_map.get(&self.url.clone()).unwrap().clone() + }; + + module_tree.set_status(ModuleStatus::FetchFailed); + + module_tree.set_error(Some(ModuleError::Network(err))); + + let promise = module_tree.get_promise().borrow(); + promise.as_ref().unwrap().resolve_native(&()); + + return; + } + + // Step 12. + if let Ok(ref resp_mod_script) = load { + let module_tree = { + let module_map = global.get_module_map().borrow(); + module_map.get(&self.url.clone()).unwrap().clone() + }; + + module_tree.set_text(resp_mod_script.text()); + + let compiled_module = module_tree.compile_module_script( + &global, + resp_mod_script.text(), + self.url.clone(), + ); + + match compiled_module { + Err(exception) => { + module_tree.set_error(Some(exception)); + + let promise = module_tree.get_promise().borrow(); + promise.as_ref().unwrap().resolve_native(&()); + + return; + }, + Ok(record) => { + module_tree.set_record(record); + + { + let mut visited = module_tree.get_visited_urls().borrow_mut(); + visited.insert(self.url.clone()); + } + + let descendant_results = fetch_module_descendants_and_link( + &self.owner, + &module_tree, + self.destination.clone(), + self.credentials_mode.clone(), + ); + + // Resolve the request of this module tree promise directly + // when there's no descendant + if descendant_results.is_none() { + module_tree.set_status(ModuleStatus::Ready); + + let promise = module_tree.get_promise().borrow(); + promise.as_ref().unwrap().resolve_native(&()); + } + }, + } + } + } + + fn resource_timing_mut(&mut self) -> &mut ResourceFetchTiming { + &mut self.resource_timing + } + + fn resource_timing(&self) -> &ResourceFetchTiming { + &self.resource_timing + } + + fn submit_resource_timing(&mut self) { + network_listener::submit_timing(self) + } +} + +impl ResourceTimingListener for ModuleContext { + fn resource_timing_information(&self) -> (InitiatorType, ServoUrl) { + let initiator_type = InitiatorType::LocalName("module".to_string()); + (initiator_type, self.url.clone()) + } + + fn resource_timing_global(&self) -> DomRoot<GlobalScope> { + self.owner.global() + } +} + +impl PreInvoke for ModuleContext {} + +#[allow(unsafe_code)] +/// A function to register module hooks (e.g. listening on resolving modules, +/// getting module metadata, getting script private reference and resolving dynamic import) +pub unsafe fn EnsureModuleHooksInitialized(rt: *mut JSRuntime) { + if GetModuleResolveHook(rt).is_some() { + return; + } + + SetModuleResolveHook(rt, Some(HostResolveImportedModule)); + SetModuleMetadataHook(rt, None); + SetScriptPrivateReferenceHooks(rt, None, None); + + SetModuleDynamicImportHook(rt, None); +} + +#[allow(unsafe_code)] +/// https://tc39.github.io/ecma262/#sec-hostresolveimportedmodule +/// https://html.spec.whatwg.org/multipage/#hostresolveimportedmodule(referencingscriptormodule%2C-specifier) +unsafe extern "C" fn HostResolveImportedModule( + cx: *mut JSContext, + reference_private: RawHandleValue, + specifier: RawHandle<*mut JSString>, +) -> *mut JSObject { + let global_scope = GlobalScope::from_context(cx); + + // Step 2. + let mut base_url = global_scope.api_base_url(); + + // Step 3. + let module_data = (reference_private.to_private() as *const ModuleScript).as_ref(); + if let Some(data) = module_data { + base_url = data.base_url.clone(); + } + + // Step 5. + let url = ModuleTree::resolve_module_specifier(*global_scope.get_cx(), &base_url, specifier); + + // Step 6. + assert!(url.is_ok()); + + let parsed_url = url.unwrap(); + + // Step 4 & 7. + let module_map = global_scope.get_module_map().borrow(); + + let module_tree = module_map.get(&parsed_url); + + // Step 9. + assert!(module_tree.is_some()); + + let fetched_module_object = module_tree.unwrap().get_record().borrow(); + + // Step 8. + assert!(fetched_module_object.is_some()); + + // Step 10. + if let Some(record) = &*fetched_module_object { + return record.handle().get(); + } + + unreachable!() +} + +/// https://html.spec.whatwg.org/multipage/#fetch-a-module-script-tree +pub fn fetch_external_module_script( + owner: ModuleOwner, + url: ServoUrl, + destination: Destination, + integrity_metadata: String, + credentials_mode: CredentialsMode, +) -> Rc<Promise> { + // Step 1. + fetch_single_module_script( + owner, + url, + destination, + Referrer::Client, + ParserMetadata::NotParserInserted, + integrity_metadata, + credentials_mode, + None, + true, + ) +} + +/// https://html.spec.whatwg.org/multipage/#fetch-a-single-module-script +pub fn fetch_single_module_script( + owner: ModuleOwner, + url: ServoUrl, + destination: Destination, + referrer: Referrer, + parser_metadata: ParserMetadata, + integrity_metadata: String, + credentials_mode: CredentialsMode, + parent_url: Option<ServoUrl>, + top_level_module_fetch: bool, +) -> Rc<Promise> { + { + // Step 1. + let global = owner.global(); + let module_map = global.get_module_map().borrow(); + + debug!("Start to fetch {}", url); + + if let Some(module_tree) = module_map.get(&url.clone()) { + let status = module_tree.get_status(); + + let promise = module_tree.get_promise().borrow(); + + debug!("Meet a fetched url {} and its status is {:?}", url, status); + + assert!(promise.is_some()); + + module_tree.append_handler(owner.clone(), url.clone(), top_level_module_fetch); + + let promise = promise.as_ref().unwrap(); + + match status { + ModuleStatus::Initial => unreachable!( + "We have the module in module map so its status should not be `initial`" + ), + // Step 2. + ModuleStatus::Fetching => return promise.clone(), + ModuleStatus::FetchingDescendants => { + if module_tree.has_all_ready_descendants(&module_map) { + promise.resolve_native(&()); + } + }, + // Step 3. + ModuleStatus::FetchFailed | ModuleStatus::Ready | ModuleStatus::Finished => { + promise.resolve_native(&()); + }, + } + + return promise.clone(); + } + } + + let global = owner.global(); + + let module_tree = ModuleTree::new(url.clone()); + module_tree.set_status(ModuleStatus::Fetching); + + let promise = owner.gen_promise_with_final_handler(Some(url.clone()), top_level_module_fetch); + + module_tree.set_promise(promise.clone()); + if let Some(parent_url) = parent_url { + module_tree.insert_parent_url(parent_url); + } + + // Step 4. + global.set_module_map(url.clone(), module_tree); + + // Step 5-6. + let mode = match destination.clone() { + Destination::Worker | Destination::SharedWorker if top_level_module_fetch => { + RequestMode::SameOrigin + }, + _ => RequestMode::CorsMode, + }; + + let document: Option<DomRoot<Document>> = match &owner { + ModuleOwner::Worker(_) => None, + ModuleOwner::Window(script) => Some(document_from_node(&*script.root())), + }; + + // Step 7-8. + let request = RequestBuilder::new(url.clone()) + .destination(destination.clone()) + .origin(global.origin().immutable().clone()) + .referrer(Some(referrer)) + .parser_metadata(parser_metadata) + .integrity_metadata(integrity_metadata.clone()) + .credentials_mode(credentials_mode) + .mode(mode); + + let context = Arc::new(Mutex::new(ModuleContext { + owner, + data: vec![], + metadata: None, + url: url.clone(), + destination: destination.clone(), + credentials_mode: credentials_mode.clone(), + status: Ok(()), + resource_timing: ResourceFetchTiming::new(ResourceTimingType::Resource), + })); + + let (action_sender, action_receiver) = ipc::channel().unwrap(); + + let listener = NetworkListener { + context, + task_source: global.networking_task_source(), + canceller: Some(global.task_canceller(TaskSourceName::Networking)), + }; + + ROUTER.add_route( + action_receiver.to_opaque(), + Box::new(move |message| { + listener.notify_fetch(message.to().unwrap()); + }), + ); + + if let Some(doc) = document { + doc.fetch_async(LoadType::Script(url), request, action_sender); + } + + promise +} + +#[allow(unsafe_code)] +/// https://html.spec.whatwg.org/multipage/#fetch-an-inline-module-script-graph +pub fn fetch_inline_module_script( + owner: ModuleOwner, + module_script_text: DOMString, + url: ServoUrl, + script_id: ScriptId, + credentials_mode: CredentialsMode, +) { + let global = owner.global(); + + let module_tree = ModuleTree::new(url.clone()); + + let promise = owner.gen_promise_with_final_handler(None, true); + + module_tree.set_promise(promise.clone()); + + let compiled_module = + module_tree.compile_module_script(&global, module_script_text, url.clone()); + + match compiled_module { + Ok(record) => { + module_tree.set_record(record); + + let descendant_results = fetch_module_descendants_and_link( + &owner, + &module_tree, + Destination::Script, + credentials_mode, + ); + + global.set_inline_module_map(script_id, module_tree); + + if descendant_results.is_none() { + promise.resolve_native(&()); + } + }, + Err(exception) => { + module_tree.set_status(ModuleStatus::Ready); + module_tree.set_error(Some(exception)); + global.set_inline_module_map(script_id, module_tree); + promise.resolve_native(&()); + }, + } +} + +/// https://html.spec.whatwg.org/multipage/#fetch-the-descendants-of-and-link-a-module-script +/// Step 1-3. +#[allow(unsafe_code)] +fn fetch_module_descendants_and_link( + owner: &ModuleOwner, + module_tree: &ModuleTree, + destination: Destination, + credentials_mode: CredentialsMode, +) -> Option<Rc<Promise>> { + let descendant_results = + fetch_module_descendants(owner, module_tree, destination, credentials_mode); + + match descendant_results { + Ok(descendants) => { + if descendants.len() > 0 { + unsafe { + let global = owner.global(); + + let _compartment = enter_realm(&*global); + AlreadyInCompartment::assert(&*global); + let _ais = AutoIncumbentScript::new(&*global); + + let abv = CreateAutoObjectVector(*global.get_cx()); + + for descendant in descendants { + assert!(AppendToAutoObjectVector( + abv as *mut AutoObjectVector, + descendant.promise_obj().get() + )); + } + + rooted!(in(*global.get_cx()) let raw_promise_all = GetWaitForAllPromise(*global.get_cx(), abv)); + + let promise_all = + Promise::new_with_js_promise(raw_promise_all.handle(), global.get_cx()); + + let promise = module_tree.get_promise().borrow(); + let promise = promise.as_ref().unwrap().clone(); + + let resolve_promise = TrustedPromise::new(promise.clone()); + let reject_promise = TrustedPromise::new(promise.clone()); + + let handler = PromiseNativeHandler::new( + &global, + Some(ModuleHandler::new(Box::new( + task!(all_fetched_resolve: move || { + let promise = resolve_promise.root(); + promise.resolve_native(&()); + }), + ))), + Some(ModuleHandler::new(Box::new( + task!(all_failure_reject: move || { + let promise = reject_promise.root(); + promise.reject_native(&()); + }), + ))), + ); + + promise_all.append_native_handler(&handler); + + return Some(promise_all); + } + } + }, + Err(err) => { + module_tree.set_error(Some(err)); + }, + } + + None +} + +#[allow(unsafe_code)] +/// https://html.spec.whatwg.org/multipage/#fetch-the-descendants-of-a-module-script +fn fetch_module_descendants( + owner: &ModuleOwner, + module_tree: &ModuleTree, + destination: Destination, + credentials_mode: CredentialsMode, +) -> Result<Vec<Rc<Promise>>, ModuleError> { + debug!("Start to load dependencies of {}", module_tree.url.clone()); + + let global = owner.global(); + + module_tree.set_status(ModuleStatus::FetchingDescendants); + + module_tree + .resolve_requested_modules(&global) + .map(|requested_urls| { + module_tree.append_descendant_urls(requested_urls.clone()); + + let parent_urls = module_tree.get_parent_urls().borrow(); + + if parent_urls.intersection(&requested_urls).count() > 0 { + return Vec::new(); + } + + requested_urls + .iter() + .map(|requested_url| { + // https://html.spec.whatwg.org/multipage/#internal-module-script-graph-fetching-procedure + // Step 1. + { + let visited = module_tree.get_visited_urls().borrow(); + assert!(visited.get(&requested_url).is_some()); + } + + // Step 2. + fetch_single_module_script( + owner.clone(), + requested_url.clone(), + destination.clone(), + Referrer::Client, + ParserMetadata::NotParserInserted, + "".to_owned(), + credentials_mode.clone(), + Some(module_tree.url.clone()), + false, + ) + }) + .collect() + }) +} diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index 02a6b42b854..284c49312c6 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -30,6 +30,7 @@ use crate::dom::promise::Promise; use crate::dom::promiserejectionevent::PromiseRejectionEvent; use crate::dom::response::Response; use crate::microtask::{EnqueuedPromiseCallback, Microtask, MicrotaskQueue}; +use crate::script_module::EnsureModuleHooksInitialized; use crate::script_thread::trace_thread; use crate::task::TaskBox; use crate::task_source::networking::NetworkingTaskSource; @@ -498,6 +499,8 @@ unsafe fn new_rt_and_cx_with_parent( SetJobQueue(cx, job_queue); SetPromiseRejectionTrackerCallback(cx, Some(promise_rejection_tracker), ptr::null_mut()); + EnsureModuleHooksInitialized(runtime.rt()); + set_gc_zeal_options(cx); // Enable or disable the JITs. @@ -915,16 +918,13 @@ unsafe extern "C" fn consume_stream( let mimetype = unwrapped_source.Headers().extract_mime_type(); //Step 2.3 If mimeType is not `application/wasm`, return with a TypeError and abort these substeps. - match &mimetype[..] { - b"application/wasm" | b"APPLICATION/wasm" | b"APPLICATION/WASM" => {}, - _ => { - throw_dom_exception( - cx, - &global, - Error::Type("Response has unsupported MIME type".to_string()), - ); - return false; - }, + if !&mimetype[..].eq_ignore_ascii_case(b"application/wasm") { + throw_dom_exception( + cx, + &global, + Error::Type("Response has unsupported MIME type".to_string()), + ); + return false; } //Step 2.4 If response is not CORS-same-origin, return with a TypeError and abort these substeps. diff --git a/components/script_plugins/lib.rs b/components/script_plugins/lib.rs index ea2b0fa74a6..f686f64f6fe 100644 --- a/components/script_plugins/lib.rs +++ b/components/script_plugins/lib.rs @@ -216,8 +216,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnrootedPass { let parent_item = map.expect_item(map.get_parent_item(var.id)); if !has_lint_attr(&self.symbols, &parent_item.attrs, self.symbols.must_root) { match var.data { - hir::VariantData::Tuple(ref fields, ..) => { - for ref field in fields { + hir::VariantData::Tuple(fields, ..) => { + for field in fields { let def_id = cx.tcx.hir().local_def_id(field.hir_id); if is_unrooted_ty(&self.symbols, cx, cx.tcx.type_of(def_id), false) { cx.span_lint( diff --git a/components/style/properties/longhands/border.mako.rs b/components/style/properties/longhands/border.mako.rs index 09cbea19a7f..f281fa1a30d 100644 --- a/components/style/properties/longhands/border.mako.rs +++ b/components/style/properties/longhands/border.mako.rs @@ -75,7 +75,7 @@ "BorderCornerRadius", "computed::BorderCornerRadius::zero()", "parse", - engines="gecko servo-2013", + engines="gecko servo-2013 servo-2020", extra_prefixes=prefixes, spec=maybe_logical_spec(corner, "radius"), boxed=True, diff --git a/components/style/properties/shorthands/border.mako.rs b/components/style/properties/shorthands/border.mako.rs index d584e568aed..1f77b905021 100644 --- a/components/style/properties/shorthands/border.mako.rs +++ b/components/style/properties/shorthands/border.mako.rs @@ -239,7 +239,7 @@ pub fn parse_border<'i, 't>( <%helpers:shorthand name="border-radius" - engines="gecko servo-2013" + engines="gecko servo-2013 servo-2020" sub_properties="${' '.join( 'border-%s-radius' % (corner) for corner in ['top-left', 'top-right', 'bottom-right', 'bottom-left'] diff --git a/etc/taskcluster/decision_task.py b/etc/taskcluster/decision_task.py index a3d70653794..6f8d41e3cb8 100644 --- a/etc/taskcluster/decision_task.py +++ b/etc/taskcluster/decision_task.py @@ -181,9 +181,6 @@ def linux_tidy_unit_untrusted(): .with_dockerfile(dockerfile_path("build")) .with_env(**build_env, **unix_build_env, **linux_build_env) .with_repo_bundle() - .with_script("rustup set profile minimal") - # required by components/script_plugins: - .with_script("rustup component add rustc-dev") .with_script(""" ./mach test-tidy --no-progress --all ./mach test-tidy --no-progress --self-test @@ -229,7 +226,6 @@ def linux_docs_check(): linux_build_task("Docs + check") .with_treeherder("Linux x64", "Doc+Check") .with_script(""" - rustup component add rust-docs RUSTDOCFLAGS="--disable-minification" ./mach doc ( cd target/doc @@ -304,11 +300,10 @@ def with_rust_nightly(): modified_build_env["RUSTFLAGS"] = " ".join(flags) return ( - linux_build_task("with Rust Nightly", build_env=modified_build_env, install_rustc_dev=False) + linux_build_task("with Rust Nightly", build_env=modified_build_env) .with_treeherder("Linux x64", "RustNightly") .with_script(""" echo "nightly" > rust-toolchain - rustup component add rustc-dev ./mach build --dev ./mach test-unit """) @@ -850,7 +845,7 @@ def macos_task(name): ) -def linux_build_task(name, *, build_env=build_env, install_rustc_dev=True): +def linux_build_task(name, *, build_env=build_env): task = ( linux_task(name) # https://docs.taskcluster.net/docs/reference/workers/docker-worker/docs/caches @@ -867,14 +862,8 @@ def linux_build_task(name, *, build_env=build_env, install_rustc_dev=True): .with_dockerfile(dockerfile_path("build")) .with_env(**build_env, **unix_build_env, **linux_build_env) .with_repo_bundle() - .with_script(""" - rustup set profile minimal - ./mach bootstrap-gstreamer - """) + .with_script("./mach bootstrap-gstreamer") ) - if install_rustc_dev: - # required by components/script_plugins: - task = task.with_script("rustup component add rustc-dev") return task @@ -884,9 +873,9 @@ def android_build_task(name): # file: NDK parses $(file $SHELL) to tell x64 host from x86 # wget: servo-media-gstreamer’s build script .with_script(""" - apt-get update -q - apt-get install -y --no-install-recommends openjdk-8-jdk-headless file wget - ./mach bootstrap-android --accept-all-licences --build + time apt-get update -q + time apt-get install -y --no-install-recommends openjdk-8-jdk-headless file wget + time ./mach bootstrap-android --accept-all-licences --build """) ) @@ -920,9 +909,6 @@ def windows_build_task(name, package=True, arch="x86_64"): path="python3", ) .with_rustup() - .with_script("rustup set profile minimal") - # required by components/script_plugins: - .with_script("rustup component add rustc-dev") ) if arch in hashes["non-devel"] and arch in hashes["devel"]: task = ( @@ -968,11 +954,6 @@ def macos_build_task(name): .with_repo_bundle(alternate_object_dir="/var/cache/servo.git/objects") .with_python2() .with_rustup() - # Since macOS workers are long-lived and ~/.rustup kept across tasks: - .with_script("rustup self update") - .with_script("rustup set profile minimal") - # required by components/script_plugins: - .with_script("rustup component add rustc-dev") .with_index_and_artifacts_expire_in(build_artifacts_expire_in) # Debugging for surprising generic-worker behaviour .with_early_script("ls") diff --git a/etc/taskcluster/decisionlib.py b/etc/taskcluster/decisionlib.py index b8d878da9d8..2dca9e882ac 100644 --- a/etc/taskcluster/decisionlib.py +++ b/etc/taskcluster/decisionlib.py @@ -693,6 +693,7 @@ class MacOsGenericWorkerTask(UnixTaskMixin, GenericWorkerTask): return self.with_early_script(""" export PATH="$HOME/.cargo/bin:$PATH" which rustup || curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain none -y + rustup self update """) diff --git a/etc/taskcluster/docker/build.dockerfile b/etc/taskcluster/docker/build.dockerfile index c5e148c4df3..e5a1edafc4a 100644 --- a/etc/taskcluster/docker/build.dockerfile +++ b/etc/taskcluster/docker/build.dockerfile @@ -44,7 +44,8 @@ RUN \ # && \ # - # + # Install the version of rustup that is current when this Docker image is being built: + # We want at least 1.21 (increment in this comment to force an image rebuild). curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain none --profile=minimal -y && \ # # diff --git a/python/servo/bootstrap_commands.py b/python/servo/bootstrap_commands.py index 835c7bf21c2..b8a88314609 100644 --- a/python/servo/bootstrap_commands.py +++ b/python/servo/bootstrap_commands.py @@ -281,8 +281,7 @@ class MachCommands(CommandBase): default='1', help='Keep up to this many most recent nightlies') def clean_nightlies(self, force=False, keep=None): - default_toolchain = self.default_toolchain() - print("Current Rust version for Servo: {}".format(default_toolchain)) + print("Current Rust version for Servo: {}".format(self.rust_toolchain())) old_toolchains = [] keep = int(keep) stdout = subprocess.check_output(['git', 'log', '--format=%H', 'rust-toolchain']) diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py index 4630c9a9dbf..2aa70862fd6 100644 --- a/python/servo/build_commands.py +++ b/python/servo/build_commands.py @@ -30,7 +30,7 @@ from mach.decorators import ( from mach.registrar import Registrar from mach_bootstrap import _get_exec_path -from servo.command_base import CommandBase, cd, call, check_call, BIN_SUFFIX, append_to_path_env, gstreamer_root +from servo.command_base import CommandBase, cd, call, check_call, append_to_path_env, gstreamer_root from servo.util import host_triple @@ -237,14 +237,6 @@ class MachCommands(CommandBase): if very_verbose: opts += ["-vv"] - if target: - if self.config["tools"]["use-rustup"] and not uwp: - # 'rustup target add' fails if the toolchain is not installed at all. - self.call_rustup_run(["rustc", "--version"]) - - check_call(["rustup" + BIN_SUFFIX, "target", "add", - "--toolchain", self.toolchain(), target]) - env = self.build_env(target=target, is_build=True, uwp=uwp, features=features) self.ensure_bootstrapped(target=target) self.ensure_clobbered() diff --git a/python/servo/command_base.py b/python/servo/command_base.py index 371eb9844a2..31eb17800ae 100644 --- a/python/servo/command_base.py +++ b/python/servo/command_base.py @@ -345,38 +345,23 @@ class CommandBase(object): # Set default android target self.handle_android_target("armv7-linux-androideabi") - _default_toolchain = None + _rust_toolchain = None - def toolchain(self): - return self.default_toolchain() - - def default_toolchain(self): - if self._default_toolchain is None: + def rust_toolchain(self): + if self._rust_toolchain is None: filename = path.join(self.context.topdir, "rust-toolchain") with open(filename) as f: - self._default_toolchain = f.read().strip() - return self._default_toolchain + self._rust_toolchain = f.read().strip() + + if platform.system() == "Windows": + self._rust_toolchain += "-x86_64-pc-windows-msvc" + + return self._rust_toolchain def call_rustup_run(self, args, **kwargs): if self.config["tools"]["use-rustup"]: - try: - version_line = subprocess.check_output(["rustup" + BIN_SUFFIX, "--version"]) - except OSError as e: - if e.errno == NO_SUCH_FILE_OR_DIRECTORY: - print("It looks like rustup is not installed. See instructions at " - "https://github.com/servo/servo/#setting-up-your-environment") - print() - return 1 - raise - version = tuple(map(int, re.match(b"rustup (\d+)\.(\d+)\.(\d+)", version_line).groups())) - if version < (1, 11, 0): - print("rustup is at version %s.%s.%s, Servo requires 1.11.0 or more recent." % version) - print("Try running 'rustup self update'.") - return 1 - toolchain = self.toolchain() - if platform.system() == "Windows": - toolchain += "-x86_64-pc-windows-msvc" - args = ["rustup" + BIN_SUFFIX, "run", "--install", toolchain] + args + assert self.context.bootstrapped + args = ["rustup" + BIN_SUFFIX, "run", "--install", self.rust_toolchain()] + args else: args[0] += BIN_SUFFIX return call(args, **kwargs) @@ -1009,7 +994,7 @@ install them, let us know by filing a bug!") return True return False - def ensure_bootstrapped(self, target=None): + def ensure_bootstrapped(self, target=None, rustup_components=None): if self.context.bootstrapped: return @@ -1019,8 +1004,44 @@ install them, let us know by filing a bug!") if "msvc" in target_platform: Registrar.dispatch("bootstrap", context=self.context) + if self.config["tools"]["use-rustup"]: + self.ensure_rustup_version() + toolchain = self.rust_toolchain() + + if toolchain.encode("utf-8") not in check_output(["rustup", "toolchain", "list"]): + check_call(["rustup", "toolchain", "install", "--profile", "minimal", toolchain]) + + installed = check_output( + ["rustup", "component", "list", "--installed", "--toolchain", toolchain] + ) + for component in set(rustup_components or []) | {"rustc-dev"}: + if component.encode("utf-8") not in installed: + check_call(["rustup", "component", "add", "--toolchain", toolchain, component]) + + if target and "uwp" not in target and target not in check_output( + ["rustup", "target", "list", "--installed", "--toolchain", toolchain] + ): + check_call(["rustup", "target", "add", "--toolchain", toolchain, target]) + self.context.bootstrapped = True + def ensure_rustup_version(self): + try: + version_line = subprocess.check_output(["rustup" + BIN_SUFFIX, "--version"]) + except OSError as e: + if e.errno == NO_SUCH_FILE_OR_DIRECTORY: + print("It looks like rustup is not installed. See instructions at " + "https://github.com/servo/servo/#setting-up-your-environment") + print() + sys.exit(1) + raise + version = tuple(map(int, re.match(b"rustup (\d+)\.(\d+)\.(\d+)", version_line).groups())) + version_needed = (1, 21, 0) + if version < version_needed: + print("rustup is at version %s.%s.%s, Servo requires %s.%s.%s or more recent." % (version + version_needed)) + print("Try running 'rustup self update'.") + sys.exit(1) + def ensure_clobbered(self, target_dir=None): if target_dir is None: target_dir = self.get_target_dir() diff --git a/python/servo/devenv_commands.py b/python/servo/devenv_commands.py index 45a3f946f38..bc715205523 100644 --- a/python/servo/devenv_commands.py +++ b/python/servo/devenv_commands.py @@ -24,7 +24,7 @@ from mach.decorators import ( Command, ) -from servo.command_base import CommandBase, cd, call, BIN_SUFFIX +from servo.command_base import CommandBase, cd, call from servo.build_commands import notify_build_done from servo.util import get_static_rust_lang_org_dist, get_urlopen_kwargs @@ -49,7 +49,7 @@ class MachCommands(CommandBase): features += self.pick_media_stack(media_stack, target) - self.ensure_bootstrapped() + self.ensure_bootstrapped(target=target) self.ensure_clobbered() env = self.build_env() @@ -213,7 +213,7 @@ class MachCommands(CommandBase): filename = path.join(self.context.topdir, "rust-toolchain") with open(filename, "w") as f: f.write(toolchain + "\n") - return call(["rustup" + BIN_SUFFIX, "component", "add", "rustc-dev"]) + self.ensure_bootstrapped() @Command('fetch', description='Fetch Rust, Cargo and Cargo dependencies', diff --git a/python/servo/post_build_commands.py b/python/servo/post_build_commands.py index a6ab4de647c..0311350e273 100644 --- a/python/servo/post_build_commands.py +++ b/python/servo/post_build_commands.py @@ -241,14 +241,13 @@ class PostBuildCommands(CommandBase): @CommandBase.build_like_command_arguments def doc(self, params, features, target=None, android=False, magicleap=False, media_stack=None, **kwargs): - env = os.environ.copy() - env["RUSTUP_TOOLCHAIN"] = self.toolchain() - rustc_path = check_output(["rustup" + BIN_SUFFIX, "which", "rustc"], env=env) + self.ensure_bootstrapped(rustup_components=["rust-docs"]) + rustc_path = check_output( + ["rustup" + BIN_SUFFIX, "which", "--toolchain", self.rust_toolchain(), "rustc"]) assert path.basename(path.dirname(rustc_path)) == "bin" toolchain_path = path.dirname(path.dirname(rustc_path)) rust_docs = path.join(toolchain_path, "share", "doc", "rust", "html") - self.ensure_bootstrapped() docs = path.join(self.get_target_dir(), "doc") if not path.exists(docs): os.makedirs(docs) diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py index 0c107a1867b..bc29955fd79 100644 --- a/python/servo/testing_commands.py +++ b/python/servo/testing_commands.py @@ -199,7 +199,6 @@ class MachCommands(CommandBase): def test_perf(self, base=None, date=None, submit=False): self.set_software_rendering_env(True, False) - self.ensure_bootstrapped() env = self.build_env() cmd = ["bash", "test_perf.sh"] if base: @@ -298,7 +297,7 @@ class MachCommands(CommandBase): args += ["--", "--nocapture"] err = self.run_cargo_build_like_command("bench" if bench else "test", args, env=env, **kwargs) - if err is not 0: + if err: return err @Command('test-content', @@ -310,6 +309,7 @@ class MachCommands(CommandBase): return 0 def install_rustfmt(self): + self.ensure_bootstrapped() with open(os.devnull, "w") as devnull: if self.call_rustup_run(["cargo", "fmt", "--version", "-q"], stderr=devnull) != 0: @@ -369,8 +369,6 @@ class MachCommands(CommandBase): @CommandArgument('tests', default=None, nargs="...", help="Specific tests to run, relative to the tests directory") def test_webidl(self, quiet, tests): - self.ensure_bootstrapped() - test_file_dir = path.abspath(path.join(PROJECT_TOPLEVEL_PATH, "components", "script", "dom", "bindings", "codegen", "parser")) # For the `import WebIDL` in runtests.py @@ -388,7 +386,6 @@ class MachCommands(CommandBase): category='testing', parser=create_parser_wpt) def test_wpt_failure(self, **kwargs): - self.ensure_bootstrapped() kwargs["pause_after_test"] = False kwargs["include"] = ["infrastructure/failing-test.html"] return not self._test_wpt(**kwargs) @@ -398,7 +395,6 @@ class MachCommands(CommandBase): category='testing', parser=create_parser_wpt) def test_wpt(self, **kwargs): - self.ensure_bootstrapped() ret = self.run_test_list_or_dispatch(kwargs["test_list"], "wpt", self._test_wpt, **kwargs) if kwargs["always_succeed"]: return 0 @@ -498,7 +494,6 @@ class MachCommands(CommandBase): category='testing', parser=updatecommandline.create_parser()) def update_wpt(self, **kwargs): - self.ensure_bootstrapped() run_file = path.abspath(path.join("tests", "wpt", "update.py")) patch = kwargs.get("patch", False) @@ -716,7 +711,6 @@ class MachCommands(CommandBase): str(c1).ljust(width_col3), str(d1).ljust(width_col4))) def jquery_test_runner(self, cmd, release, dev): - self.ensure_bootstrapped() base_dir = path.abspath(path.join("tests", "jquery")) jquery_dir = path.join(base_dir, "jquery") run_file = path.join(base_dir, "run_jquery.py") @@ -736,7 +730,6 @@ class MachCommands(CommandBase): return call([run_file, cmd, bin_path, base_dir]) def dromaeo_test_runner(self, tests, release, dev): - self.ensure_bootstrapped() base_dir = path.abspath(path.join("tests", "dromaeo")) dromaeo_dir = path.join(base_dir, "dromaeo") run_file = path.join(base_dir, "run_dromaeo.py") @@ -969,8 +962,6 @@ testing/web-platform/mozilla/tests for Servo-only tests""" % reference_path) @CommandArgument('--version', default='2.0.0', help='WebGL conformance suite version') def update_webgl(self, version=None): - self.ensure_bootstrapped() - base_dir = path.abspath(path.join(PROJECT_TOPLEVEL_PATH, "tests", "wpt", "mozilla", "tests", "webgl")) run_file = path.join(base_dir, "tools", "import-conformance-tests.py") diff --git a/rust-toolchain b/rust-toolchain index fc40182b3c4..85efddc5ce0 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2019-12-05 +nightly-2019-12-23 diff --git a/tests/wpt/include.ini b/tests/wpt/include.ini index 2f662095640..f11d0d0baa4 100644 --- a/tests/wpt/include.ini +++ b/tests/wpt/include.ini @@ -116,7 +116,11 @@ skip: true [json-module] skip: true [module] - skip: true + skip: false + [dynamic-import] + skip: true + [import-meta] + skip: true [js] skip: false [mediasession] diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index a9e46713244..76b398963ae 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -7,7 +7,7 @@ expected: FAIL [Opening a blob URL in a new window immediately before revoking it works.] - expected: TIMEOUT + expected: FAIL [Opening a blob URL in a noopener about:blank window immediately before revoking it works.] expected: FAIL diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 319c87bd348..0942f7eec75 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -8331,6 +8331,18 @@ {} ] ], + "css/css-pseudo/spelling-error-002-manual.html": [ + [ + "css/css-pseudo/spelling-error-002-manual.html", + {} + ] + ], + "css/css-pseudo/spelling-error-003-manual.html": [ + [ + "css/css-pseudo/spelling-error-003-manual.html", + {} + ] + ], "css/css-regions/animations/animations-001.html": [ [ "css/css-regions/animations/animations-001.html", @@ -129801,6 +129813,342 @@ {} ] ], + "css/css-images/image-orientation/image-orientation-default.html": [ + [ + "css/css-images/image-orientation/image-orientation-default.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-default-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-none-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-from-image-composited.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image-composited.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-from-image-content-images.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image-content-images.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-from-image-dynamic1.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image-dynamic1.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-from-image-dynamic2.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image-dynamic2.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-none-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-from-image-image-document.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image-image-document.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-from-image.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-none-content-images.html": [ + [ + "css/css-images/image-orientation/image-orientation-none-content-images.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-none-image-document.html": [ + [ + "css/css-images/image-orientation/image-orientation-none-image-document.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "css/css-images/image-orientation/image-orientation-none.html": [ + [ + "css/css-images/image-orientation/image-orientation-none.html", + [ + [ + "/css/css-images/image-orientation/reference/image-orientation-none-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], "css/css-images/infinite-radial-gradient-refcrash.html": [ [ "css/css-images/infinite-radial-gradient-refcrash.html", @@ -134289,6 +134637,18 @@ {} ] ], + "css/css-multicol/change-intrinsic-width.html": [ + [ + "css/css-multicol/change-intrinsic-width.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-multicol/column-count-used-001.html": [ [ "css/css-multicol/column-count-used-001.html", @@ -134409,6 +134769,18 @@ {} ] ], + "css/css-multicol/intrinsic-width-change-column-count.html": [ + [ + "css/css-multicol/intrinsic-width-change-column-count.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-multicol/large-actual-column-count.html": [ [ "css/css-multicol/large-actual-column-count.html", @@ -139509,6 +139881,30 @@ {} ] ], + "css/css-position/position-sticky-large-top-2.tentative.html": [ + [ + "css/css-position/position-sticky-large-top-2.tentative.html", + [ + [ + "/css/css-position/position-sticky-large-top-2-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-position/position-sticky-large-top.tentative.html": [ + [ + "css/css-position/position-sticky-large-top.tentative.html", + [ + [ + "/css/css-position/position-sticky-large-top-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-position/position-sticky-nested-inline.html": [ [ "css/css-position/position-sticky-nested-inline.html", @@ -140577,6 +140973,30 @@ {} ] ], + "css/css-pseudo/marker-content-017.html": [ + [ + "css/css-pseudo/marker-content-017.html", + [ + [ + "/css/css-pseudo/marker-content-017-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-pseudo/marker-content-018.html": [ + [ + "css/css-pseudo/marker-content-018.html", + [ + [ + "/css/css-pseudo/marker-content-018-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-pseudo/marker-display-dynamic-001.html": [ [ "css/css-pseudo/marker-display-dynamic-001.html", @@ -143269,6 +143689,54 @@ {} ] ], + "css/css-ruby/ruby-align-001.html": [ + [ + "css/css-ruby/ruby-align-001.html", + [ + [ + "/css/css-ruby/ruby-align-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-align-001a.html": [ + [ + "css/css-ruby/ruby-align-001a.html", + [ + [ + "/css/css-ruby/ruby-align-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-align-002.html": [ + [ + "css/css-ruby/ruby-align-002.html", + [ + [ + "/css/css-ruby/ruby-align-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-align-002a.html": [ + [ + "css/css-ruby/ruby-align-002a.html", + [ + [ + "/css/css-ruby/ruby-align-002-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-ruby/ruby-base-different-size.html": [ [ "css/css-ruby/ruby-base-different-size.html", @@ -143281,6 +143749,306 @@ {} ] ], + "css/css-ruby/ruby-bidi-001.html": [ + [ + "css/css-ruby/ruby-bidi-001.html", + [ + [ + "/css/css-ruby/ruby-bidi-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-bidi-002.html": [ + [ + "css/css-ruby/ruby-bidi-002.html", + [ + [ + "/css/css-ruby/ruby-bidi-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-bidi-003.html": [ + [ + "css/css-ruby/ruby-bidi-003.html", + [ + [ + "/css/css-ruby/ruby-bidi-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-box-generation-001.html": [ + [ + "css/css-ruby/ruby-box-generation-001.html", + [ + [ + "/css/css-ruby/ruby-box-generation-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-box-generation-002.html": [ + [ + "css/css-ruby/ruby-box-generation-002.html", + [ + [ + "/css/css-ruby/ruby-box-generation-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-box-generation-003.html": [ + [ + "css/css-ruby/ruby-box-generation-003.html", + [ + [ + "/css/css-ruby/ruby-box-generation-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-box-generation-004.html": [ + [ + "css/css-ruby/ruby-box-generation-004.html", + [ + [ + "/css/css-ruby/ruby-box-generation-004-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-box-generation-005.html": [ + [ + "css/css-ruby/ruby-box-generation-005.html", + [ + [ + "/css/css-ruby/ruby-box-generation-005-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-dynamic-insertion-001.html": [ + [ + "css/css-ruby/ruby-dynamic-insertion-001.html", + [ + [ + "/css/css-ruby/ruby-dynamic-insertion-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-dynamic-insertion-002.html": [ + [ + "css/css-ruby/ruby-dynamic-insertion-002.html", + [ + [ + "/css/css-ruby/ruby-dynamic-insertion-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-dynamic-insertion-003.html": [ + [ + "css/css-ruby/ruby-dynamic-insertion-003.html", + [ + [ + "/css/css-ruby/ruby-dynamic-insertion-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-dynamic-insertion-004.html": [ + [ + "css/css-ruby/ruby-dynamic-insertion-004.html", + [ + [ + "/css/css-ruby/ruby-dynamic-insertion-004-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-dynamic-insertion-005.html": [ + [ + "css/css-ruby/ruby-dynamic-insertion-005.html", + [ + [ + "/css/css-ruby/ruby-dynamic-insertion-005-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-dynamic-removal-001.html": [ + [ + "css/css-ruby/ruby-dynamic-removal-001.html", + [ + [ + "/css/css-ruby/ruby-dynamic-removal-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-dynamic-removal-002.html": [ + [ + "css/css-ruby/ruby-dynamic-removal-002.html", + [ + [ + "/css/css-ruby/ruby-dynamic-removal-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-dynamic-removal-003.html": [ + [ + "css/css-ruby/ruby-dynamic-removal-003.html", + [ + [ + "/css/css-ruby/ruby-dynamic-removal-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-float-handling-001.html": [ + [ + "css/css-ruby/ruby-float-handling-001.html", + [ + [ + "/css/css-ruby/ruby-float-handling-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-intra-level-whitespace-001.html": [ + [ + "css/css-ruby/ruby-intra-level-whitespace-001.html", + [ + [ + "/css/css-ruby/ruby-intra-level-whitespace-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-intra-level-whitespace-002.html": [ + [ + "css/css-ruby/ruby-intra-level-whitespace-002.html", + [ + [ + "/css/css-ruby/ruby-intra-level-whitespace-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-intra-level-whitespace-003.html": [ + [ + "css/css-ruby/ruby-intra-level-whitespace-003.html", + [ + [ + "/css/css-ruby/ruby-intra-level-whitespace-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-intrinsic-isize-001.html": [ + [ + "css/css-ruby/ruby-intrinsic-isize-001.html", + [ + [ + "/css/css-ruby/ruby-intrinsic-isize-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-intrinsic-isize-002.html": [ + [ + "css/css-ruby/ruby-intrinsic-isize-002.html", + [ + [ + "/css/css-ruby/ruby-intrinsic-isize-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-justification-001.html": [ + [ + "css/css-ruby/ruby-justification-001.html", + [ + [ + "/css/css-ruby/ruby-justification-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-justification-002.html": [ + [ + "css/css-ruby/ruby-justification-002.html", + [ + [ + "/css/css-ruby/ruby-justification-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-lang-specific-style-001.html": [ + [ + "css/css-ruby/ruby-lang-specific-style-001.html", + [ + [ + "/css/css-ruby/ruby-lang-specific-style-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-ruby/ruby-layout-internal-boxes.html": [ [ "css/css-ruby/ruby-layout-internal-boxes.html", @@ -143293,6 +144061,174 @@ {} ] ], + "css/css-ruby/ruby-line-break-suppression-001.html": [ + [ + "css/css-ruby/ruby-line-break-suppression-001.html", + [ + [ + "/css/css-ruby/ruby-line-break-suppression-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-line-break-suppression-002.html": [ + [ + "css/css-ruby/ruby-line-break-suppression-002.html", + [ + [ + "/css/css-ruby/ruby-line-break-suppression-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-line-break-suppression-003.html": [ + [ + "css/css-ruby/ruby-line-break-suppression-003.html", + [ + [ + "/css/css-ruby/ruby-line-break-suppression-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-line-break-suppression-004.html": [ + [ + "css/css-ruby/ruby-line-break-suppression-004.html", + [ + [ + "/css/css-ruby/ruby-line-break-suppression-004-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-line-break-suppression-005.html": [ + [ + "css/css-ruby/ruby-line-break-suppression-005.html", + [ + [ + "/css/css-ruby/ruby-line-break-suppression-005-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-line-breaking-001.html": [ + [ + "css/css-ruby/ruby-line-breaking-001.html", + [ + [ + "/css/css-ruby/ruby-line-breaking-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-line-breaking-002.html": [ + [ + "css/css-ruby/ruby-line-breaking-002.html", + [ + [ + "/css/css-ruby/ruby-line-breaking-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-line-breaking-003.html": [ + [ + "css/css-ruby/ruby-line-breaking-003.html", + [ + [ + "/css/css-ruby/ruby-line-breaking-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-no-transform.html": [ + [ + "css/css-ruby/ruby-no-transform.html", + [ + [ + "/css/css-ruby/ruby-no-transform-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-reflow-001-opaqueruby.html": [ + [ + "css/css-ruby/ruby-reflow-001-opaqueruby.html", + [ + [ + "/css/css-ruby/ruby-reflow-001-noruby.html", + "!=" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-reflow-001-transparentruby.html": [ + [ + "css/css-ruby/ruby-reflow-001-transparentruby.html", + [ + [ + "/css/css-ruby/ruby-reflow-001-noruby.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-span-001.html": [ + [ + "css/css-ruby/ruby-span-001.html", + [ + [ + "/css/css-ruby/ruby-span-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-whitespace-001.html": [ + [ + "css/css-ruby/ruby-whitespace-001.html", + [ + [ + "/css/css-ruby/ruby-whitespace-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-ruby/ruby-whitespace-002.html": [ + [ + "css/css-ruby/ruby-whitespace-002.html", + [ + [ + "/css/css-ruby/ruby-whitespace-002-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-scoping/css-scoping-shadow-assigned-node-with-before-after.html": [ [ "css/css-scoping/css-scoping-shadow-assigned-node-with-before-after.html", @@ -202763,6 +203699,18 @@ {} ] ], + "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html": [ + [ + "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html", + [ + [ + "/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html", + "==" + ] + ], + {} + ] + ], "encoding/eof-shift_jis.html": [ [ "encoding/eof-shift_jis.html", @@ -205907,6 +206855,18 @@ {} ] ], + "html/semantics/document-metadata/the-link-element/link-type-attribute.html": [ + [ + "html/semantics/document-metadata/the-link-element/link-type-attribute.html", + [ + [ + "/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html", + "==" + ] + ], + {} + ] + ], "html/semantics/document-metadata/the-link-element/stylesheet-change-href.html": [ [ "html/semantics/document-metadata/the-link-element/stylesheet-change-href.html", @@ -254432,6 +255392,81 @@ "css/css-images/gradients-with-transparent-ref.html": [ [] ], + "css/css-images/image-orientation/reference/image-orientation-default-ref.html": [ + [] + ], + "css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html": [ + [] + ], + "css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html": [ + [] + ], + "css/css-images/image-orientation/reference/image-orientation-from-image-ref.html": [ + [] + ], + "css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html": [ + [] + ], + "css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html": [ + [] + ], + "css/css-images/image-orientation/reference/image-orientation-none-ref.html": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-1-ul.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-2-ur.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-3-lr.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-4-lol.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-5-lu.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-6-ru.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-7-rl.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-8-llo.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg": [ + [] + ], + "css/css-images/image-orientation/support/exif-orientation-9-u.jpg": [ + [] + ], "css/css-images/infinite-radial-gradient-crash-ref.html": [ [] ], @@ -256124,6 +257159,12 @@ "css/css-position/position-sticky-inline-ref.html": [ [] ], + "css/css-position/position-sticky-large-top-2-ref.html": [ + [] + ], + "css/css-position/position-sticky-large-top-ref.html": [ + [] + ], "css/css-position/position-sticky-nested-inline-ref.html": [ [] ], @@ -256325,6 +257366,12 @@ "css/css-pseudo/marker-content-016-ref.html": [ [] ], + "css/css-pseudo/marker-content-017-ref.html": [ + [] + ], + "css/css-pseudo/marker-content-018-ref.html": [ + [] + ], "css/css-pseudo/marker-font-properties-ref.html": [ [] ], @@ -256349,6 +257396,9 @@ "css/css-pseudo/spelling-error-001-ref.html": [ [] ], + "css/css-pseudo/textpath-selection-011-ref.html": [ + [] + ], "css/css-regions/META.yml": [ [] ], @@ -257045,12 +258095,138 @@ "css/css-ruby/root-ruby-ref.xhtml": [ [] ], + "css/css-ruby/ruby-align-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-align-002-ref.html": [ + [] + ], "css/css-ruby/ruby-base-different-size-ref.html": [ [] ], + "css/css-ruby/ruby-bidi-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-bidi-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-bidi-003-ref.html": [ + [] + ], + "css/css-ruby/ruby-box-generation-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-box-generation-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-box-generation-003-ref.html": [ + [] + ], + "css/css-ruby/ruby-box-generation-004-ref.html": [ + [] + ], + "css/css-ruby/ruby-box-generation-005-ref.html": [ + [] + ], + "css/css-ruby/ruby-dynamic-insertion-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-dynamic-insertion-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-dynamic-insertion-003-ref.html": [ + [] + ], + "css/css-ruby/ruby-dynamic-insertion-004-ref.html": [ + [] + ], + "css/css-ruby/ruby-dynamic-insertion-005-ref.html": [ + [] + ], + "css/css-ruby/ruby-dynamic-removal-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-dynamic-removal-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-dynamic-removal-003-ref.html": [ + [] + ], + "css/css-ruby/ruby-float-handling-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-intra-level-whitespace-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-intra-level-whitespace-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-intra-level-whitespace-003-ref.html": [ + [] + ], + "css/css-ruby/ruby-intrinsic-isize-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-intrinsic-isize-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-justification-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-justification-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-lang-specific-style-001-ref.html": [ + [] + ], "css/css-ruby/ruby-layout-internal-boxes-ref.html": [ [] ], + "css/css-ruby/ruby-line-break-suppression-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-line-break-suppression-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-line-break-suppression-003-ref.html": [ + [] + ], + "css/css-ruby/ruby-line-break-suppression-004-ref.html": [ + [] + ], + "css/css-ruby/ruby-line-break-suppression-005-ref.html": [ + [] + ], + "css/css-ruby/ruby-line-breaking-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-line-breaking-002-ref.html": [ + [] + ], + "css/css-ruby/ruby-line-breaking-003-ref.html": [ + [] + ], + "css/css-ruby/ruby-no-transform-ref.html": [ + [] + ], + "css/css-ruby/ruby-span-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-whitespace-001-ref.html": [ + [] + ], + "css/css-ruby/ruby-whitespace-002-ref.html": [ + [] + ], + "css/css-ruby/support/ruby-common.css": [ + [] + ], + "css/css-ruby/support/ruby-dynamic-insertion.js": [ + [] + ], + "css/css-ruby/support/ruby-dynamic-removal.js": [ + [] + ], "css/css-scoping/META.yml": [ [] ], @@ -268325,6 +269501,9 @@ "dom/nodes/query-target-in-load-event.part.html": [ [] ], + "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html": [ + [] + ], "dom/nodes/selectors.js": [ [] ], @@ -268382,6 +269561,9 @@ "domxpath/README.md": [ [] ], + "domxpath/helpers.js": [ + [] + ], "domxpath/xml_xpath_tests.xml": [ [] ], @@ -270284,6 +271466,18 @@ "fetch/data-urls/resources/data-urls.json": [ [] ], + "fetch/h1-parsing/resources/README.md": [ + [] + ], + "fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis": [ + [] + ], + "fetch/h1-parsing/resources/document-with-0x00-in-header.py": [ + [] + ], + "fetch/h1-parsing/resources/script-with-0x00-in-header.py": [ + [] + ], "fetch/http-cache/README.md": [ [] ], @@ -271736,6 +272930,9 @@ "html/browsers/origin/cross-origin-objects/frame.html": [ [] ], + "html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html": [ + [] + ], "html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html": [ [] ], @@ -275612,6 +276809,9 @@ "html/semantics/document-metadata/the-link-element/link-rel-attribute-ascii-case-insensitive-notref.html": [ [] ], + "html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html": [ + [] + ], "html/semantics/document-metadata/the-link-element/resources/bad.css": [ [] ], @@ -280334,6 +281534,15 @@ "native-file-system/script-tests/FileSystemFileHandle-getFile.js": [ [] ], + "native-file-system/script-tests/FileSystemWritableFileStream-piped.js": [ + [] + ], + "native-file-system/script-tests/FileSystemWritableFileStream-write.js": [ + [] + ], + "native-file-system/script-tests/FileSystemWritableFileStream.js": [ + [] + ], "native-file-system/script-tests/FileSystemWriter.js": [ [] ], @@ -280859,6 +282068,9 @@ "portals/resources/postmessage-referrer.sub.html": [ [] ], + "portals/resources/predecessor-fires-unload-watch-unload.html": [ + [] + ], "portals/resources/simple-portal-adopts-and-activates-predecessor.html": [ [] ], @@ -294245,6 +295457,9 @@ "webxr/resources/webxr_test_constants.js": [ [] ], + "webxr/resources/webxr_test_constants_fake_world.js": [ + [] + ], "webxr/resources/webxr_util.js": [ [] ], @@ -319603,12 +320818,24 @@ {} ] ], + "css/css-align/animation/column-gap-composition.html": [ + [ + "css/css-align/animation/column-gap-composition.html", + {} + ] + ], "css/css-align/animation/column-gap-interpolation.html": [ [ "css/css-align/animation/column-gap-interpolation.html", {} ] ], + "css/css-align/animation/row-gap-composition.html": [ + [ + "css/css-align/animation/row-gap-composition.html", + {} + ] + ], "css/css-align/animation/row-gap-interpolation.html": [ [ "css/css-align/animation/row-gap-interpolation.html", @@ -320689,18 +321916,48 @@ {} ] ], + "css/css-backgrounds/animations/border-bottom-left-radius-composition.html": [ + [ + "css/css-backgrounds/animations/border-bottom-left-radius-composition.html", + {} + ] + ], + "css/css-backgrounds/animations/border-bottom-right-radius-composition.html": [ + [ + "css/css-backgrounds/animations/border-bottom-right-radius-composition.html", + {} + ] + ], + "css/css-backgrounds/animations/border-bottom-width-composition.html": [ + [ + "css/css-backgrounds/animations/border-bottom-width-composition.html", + {} + ] + ], "css/css-backgrounds/animations/border-color-interpolation.html": [ [ "css/css-backgrounds/animations/border-color-interpolation.html", {} ] ], + "css/css-backgrounds/animations/border-image-outset-composition.html": [ + [ + "css/css-backgrounds/animations/border-image-outset-composition.html", + {} + ] + ], "css/css-backgrounds/animations/border-image-outset-interpolation.html": [ [ "css/css-backgrounds/animations/border-image-outset-interpolation.html", {} ] ], + "css/css-backgrounds/animations/border-image-slice-composition.html": [ + [ + "css/css-backgrounds/animations/border-image-slice-composition.html", + {} + ] + ], "css/css-backgrounds/animations/border-image-slice-interpolation-stability.html": [ [ "css/css-backgrounds/animations/border-image-slice-interpolation-stability.html", @@ -320719,18 +321976,54 @@ {} ] ], + "css/css-backgrounds/animations/border-image-width-composition.html": [ + [ + "css/css-backgrounds/animations/border-image-width-composition.html", + {} + ] + ], "css/css-backgrounds/animations/border-image-width-interpolation.html": [ [ "css/css-backgrounds/animations/border-image-width-interpolation.html", {} ] ], + "css/css-backgrounds/animations/border-left-width-composition.html": [ + [ + "css/css-backgrounds/animations/border-left-width-composition.html", + {} + ] + ], "css/css-backgrounds/animations/border-radius-interpolation.html": [ [ "css/css-backgrounds/animations/border-radius-interpolation.html", {} ] ], + "css/css-backgrounds/animations/border-right-width-composition.html": [ + [ + "css/css-backgrounds/animations/border-right-width-composition.html", + {} + ] + ], + "css/css-backgrounds/animations/border-top-left-radius-composition.html": [ + [ + "css/css-backgrounds/animations/border-top-left-radius-composition.html", + {} + ] + ], + "css/css-backgrounds/animations/border-top-right-radius-composition.html": [ + [ + "css/css-backgrounds/animations/border-top-right-radius-composition.html", + {} + ] + ], + "css/css-backgrounds/animations/border-top-width-composition.html": [ + [ + "css/css-backgrounds/animations/border-top-width-composition.html", + {} + ] + ], "css/css-backgrounds/animations/border-width-interpolation.html": [ [ "css/css-backgrounds/animations/border-width-interpolation.html", @@ -321241,18 +322534,66 @@ {} ] ], + "css/css-box/animation/margin-bottom-composition.html": [ + [ + "css/css-box/animation/margin-bottom-composition.html", + {} + ] + ], "css/css-box/animation/margin-interpolation.html": [ [ "css/css-box/animation/margin-interpolation.html", {} ] ], + "css/css-box/animation/margin-left-composition.html": [ + [ + "css/css-box/animation/margin-left-composition.html", + {} + ] + ], + "css/css-box/animation/margin-right-composition.html": [ + [ + "css/css-box/animation/margin-right-composition.html", + {} + ] + ], + "css/css-box/animation/margin-top-composition.html": [ + [ + "css/css-box/animation/margin-top-composition.html", + {} + ] + ], + "css/css-box/animation/padding-bottom-composition.html": [ + [ + "css/css-box/animation/padding-bottom-composition.html", + {} + ] + ], "css/css-box/animation/padding-interpolation.html": [ [ "css/css-box/animation/padding-interpolation.html", {} ] ], + "css/css-box/animation/padding-left-composition.html": [ + [ + "css/css-box/animation/padding-left-composition.html", + {} + ] + ], + "css/css-box/animation/padding-right-composition.html": [ + [ + "css/css-box/animation/padding-right-composition.html", + {} + ] + ], + "css/css-box/animation/padding-top-composition.html": [ + [ + "css/css-box/animation/padding-top-composition.html", + {} + ] + ], "css/css-box/box-chrome-crash-001.html": [ [ "css/css-box/box-chrome-crash-001.html", @@ -325687,6 +327028,18 @@ {} ] ], + "css/css-images/image-orientation/image-orientation-from-image-computed-style.html": [ + [ + "css/css-images/image-orientation/image-orientation-from-image-computed-style.html", + {} + ] + ], + "css/css-images/image-orientation/image-orientation-none-computed-style.html": [ + [ + "css/css-images/image-orientation/image-orientation-none-computed-style.html", + {} + ] + ], "css/css-images/inheritance.html": [ [ "css/css-images/inheritance.html", @@ -328761,18 +330114,36 @@ {} ] ], + "css/css-shadow-parts/style-sharing.html": [ + [ + "css/css-shadow-parts/style-sharing.html", + {} + ] + ], "css/css-shapes/animation/shape-image-threshold-interpolation.html": [ [ "css/css-shapes/animation/shape-image-threshold-interpolation.html", {} ] ], + "css/css-shapes/animation/shape-margin-composition.html": [ + [ + "css/css-shapes/animation/shape-margin-composition.html", + {} + ] + ], "css/css-shapes/animation/shape-margin-interpolation.html": [ [ "css/css-shapes/animation/shape-margin-interpolation.html", {} ] ], + "css/css-shapes/animation/shape-outside-composition.html": [ + [ + "css/css-shapes/animation/shape-outside-composition.html", + {} + ] + ], "css/css-shapes/animation/shape-outside-interpolation.html": [ [ "css/css-shapes/animation/shape-outside-interpolation.html", @@ -329433,36 +330804,72 @@ {} ] ], + "css/css-sizing/animation/height-composition.html": [ + [ + "css/css-sizing/animation/height-composition.html", + {} + ] + ], "css/css-sizing/animation/height-interpolation.html": [ [ "css/css-sizing/animation/height-interpolation.html", {} ] ], + "css/css-sizing/animation/max-height-composition.html": [ + [ + "css/css-sizing/animation/max-height-composition.html", + {} + ] + ], "css/css-sizing/animation/max-height-interpolation.html": [ [ "css/css-sizing/animation/max-height-interpolation.html", {} ] ], + "css/css-sizing/animation/max-width-composition.html": [ + [ + "css/css-sizing/animation/max-width-composition.html", + {} + ] + ], "css/css-sizing/animation/max-width-interpolation.html": [ [ "css/css-sizing/animation/max-width-interpolation.html", {} ] ], + "css/css-sizing/animation/min-height-composition.html": [ + [ + "css/css-sizing/animation/min-height-composition.html", + {} + ] + ], "css/css-sizing/animation/min-height-interpolation.html": [ [ "css/css-sizing/animation/min-height-interpolation.html", {} ] ], + "css/css-sizing/animation/min-width-composition.html": [ + [ + "css/css-sizing/animation/min-width-composition.html", + {} + ] + ], "css/css-sizing/animation/min-width-interpolation.html": [ [ "css/css-sizing/animation/min-width-interpolation.html", {} ] ], + "css/css-sizing/animation/width-composition.html": [ + [ + "css/css-sizing/animation/width-composition.html", + {} + ] + ], "css/css-sizing/animation/width-interpolation.html": [ [ "css/css-sizing/animation/width-interpolation.html", @@ -330621,18 +332028,36 @@ {} ] ], + "css/css-text/animations/letter-spacing-composition.html": [ + [ + "css/css-text/animations/letter-spacing-composition.html", + {} + ] + ], "css/css-text/animations/letter-spacing-interpolation.html": [ [ "css/css-text/animations/letter-spacing-interpolation.html", {} ] ], + "css/css-text/animations/text-indent-composition.html": [ + [ + "css/css-text/animations/text-indent-composition.html", + {} + ] + ], "css/css-text/animations/text-indent-interpolation.html": [ [ "css/css-text/animations/text-indent-interpolation.html", {} ] ], + "css/css-text/animations/word-spacing-composition.html": [ + [ + "css/css-text/animations/word-spacing-composition.html", + {} + ] + ], "css/css-text/animations/word-spacing-interpolation.html": [ [ "css/css-text/animations/word-spacing-interpolation.html", @@ -335105,6 +336530,12 @@ {} ] ], + "css/css-ui/animation/caret-color-composition.html": [ + [ + "css/css-ui/animation/caret-color-composition.html", + {} + ] + ], "css/css-ui/animation/caret-color-interpolation.html": [ [ "css/css-ui/animation/caret-color-interpolation.html", @@ -335117,12 +336548,24 @@ {} ] ], + "css/css-ui/animation/outline-offset-composition.html": [ + [ + "css/css-ui/animation/outline-offset-composition.html", + {} + ] + ], "css/css-ui/animation/outline-offset-interpolation.html": [ [ "css/css-ui/animation/outline-offset-interpolation.html", {} ] ], + "css/css-ui/animation/outline-width-composition.html": [ + [ + "css/css-ui/animation/outline-width-composition.html", + {} + ] + ], "css/css-ui/animation/outline-width-interpolation.html": [ [ "css/css-ui/animation/outline-width-interpolation.html", @@ -336737,6 +338180,12 @@ {} ] ], + "css/cssom-view/getClientRects-inline-inline-child.html": [ + [ + "css/cssom-view/getClientRects-inline-inline-child.html", + {} + ] + ], "css/cssom-view/historical.html": [ [ "css/cssom-view/historical.html", @@ -338217,12 +339666,24 @@ {} ] ], + "css/motion/animation/offset-anchor-composition.html": [ + [ + "css/motion/animation/offset-anchor-composition.html", + {} + ] + ], "css/motion/animation/offset-anchor-interpolation.html": [ [ "css/motion/animation/offset-anchor-interpolation.html", {} ] ], + "css/motion/animation/offset-distance-composition.html": [ + [ + "css/motion/animation/offset-distance-composition.html", + {} + ] + ], "css/motion/animation/offset-distance-interpolation.html": [ [ "css/motion/animation/offset-distance-interpolation.html", @@ -338235,6 +339696,12 @@ {} ] ], + "css/motion/animation/offset-path-composition.html": [ + [ + "css/motion/animation/offset-path-composition.html", + {} + ] + ], "css/motion/animation/offset-path-interpolation-001.html": [ [ "css/motion/animation/offset-path-interpolation-001.html", @@ -338265,12 +339732,24 @@ {} ] ], + "css/motion/animation/offset-position-composition.html": [ + [ + "css/motion/animation/offset-position-composition.html", + {} + ] + ], "css/motion/animation/offset-position-interpolation.html": [ [ "css/motion/animation/offset-position-interpolation.html", {} ] ], + "css/motion/animation/offset-rotate-composition.html": [ + [ + "css/motion/animation/offset-rotate-composition.html", + {} + ] + ], "css/motion/animation/offset-rotate-interpolation.html": [ [ "css/motion/animation/offset-rotate-interpolation.html", @@ -341879,6 +343358,12 @@ {} ] ], + "domxpath/booleans.html": [ + [ + "domxpath/booleans.html", + {} + ] + ], "domxpath/document.tentative.html": [ [ "domxpath/document.tentative.html", @@ -341891,6 +343376,18 @@ {} ] ], + "domxpath/fn-concat.html": [ + [ + "domxpath/fn-concat.html", + {} + ] + ], + "domxpath/fn-contains.html": [ + [ + "domxpath/fn-contains.html", + {} + ] + ], "domxpath/fn-lang.html": [ [ "domxpath/fn-lang.html", @@ -341903,12 +343400,54 @@ {} ] ], + "domxpath/fn-starts-with.html": [ + [ + "domxpath/fn-starts-with.html", + {} + ] + ], + "domxpath/fn-substring-after.html": [ + [ + "domxpath/fn-substring-after.html", + {} + ] + ], + "domxpath/fn-substring-before.html": [ + [ + "domxpath/fn-substring-before.html", + {} + ] + ], + "domxpath/fn-substring.html": [ + [ + "domxpath/fn-substring.html", + {} + ] + ], + "domxpath/fn-translate.html": [ + [ + "domxpath/fn-translate.html", + {} + ] + ], + "domxpath/lexical-structure.html": [ + [ + "domxpath/lexical-structure.html", + {} + ] + ], "domxpath/node-sets.html": [ [ "domxpath/node-sets.html", {} ] ], + "domxpath/numbers.html": [ + [ + "domxpath/numbers.html", + {} + ] + ], "domxpath/predicates.html": [ [ "domxpath/predicates.html", @@ -356606,6 +358145,12 @@ {} ] ], + "fetch/h1-parsing/resources-with-0x00-in-header.window.js": [ + [ + "fetch/h1-parsing/resources-with-0x00-in-header.window.html", + {} + ] + ], "fetch/http-cache/304-update.html": [ [ "fetch/http-cache/304-update.html", @@ -359017,6 +360562,12 @@ {} ] ], + "html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html": [ + [ + "html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html", + {} + ] + ], "html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html": [ [ "html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html", @@ -361743,6 +363294,12 @@ {} ] ], + "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html": [ + [ + "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html", + {} + ] + ], "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html": [ [ "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html", @@ -374455,14 +376012,6 @@ {} ] ], - "layout-instability/observe-layout-shift.html": [ - [ - "layout-instability/observe-layout-shift.html", - { - "testdriver": true - } - ] - ], "layout-instability/partially-clipped-visual-rect.html": [ [ "layout-instability/partially-clipped-visual-rect.html", @@ -374485,6 +376034,14 @@ } ] ], + "layout-instability/recent-input.html": [ + [ + "layout-instability/recent-input.html", + { + "testdriver": true + } + ] + ], "layout-instability/rtl-distance.html": [ [ "layout-instability/rtl-distance.html", @@ -374593,6 +376150,18 @@ {} ] ], + "loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html": [ + [ + "loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html", + {} + ] + ], + "loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html": [ + [ + "loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html", + {} + ] + ], "loading/lazyload/image-loading-lazy-load-event.tentative.html": [ [ "loading/lazyload/image-loading-lazy-load-event.tentative.html", @@ -374617,6 +376186,12 @@ {} ] ], + "loading/lazyload/move-element-and-scroll.tentative.html": [ + [ + "loading/lazyload/move-element-and-scroll.tentative.html", + {} + ] + ], "loading/lazyload/not-rendered-below-viewport-image-loading-lazy.tentative.html": [ [ "loading/lazyload/not-rendered-below-viewport-image-loading-lazy.tentative.html", @@ -374665,6 +376240,12 @@ {} ] ], + "loading/lazyload/remove-element-and-scroll.tentative.html": [ + [ + "loading/lazyload/remove-element-and-scroll.tentative.html", + {} + ] + ], "loading/preloader-css-import-no-quote.tentative.html": [ [ "loading/preloader-css-import-no-quote.tentative.html", @@ -379490,6 +381071,81 @@ } ] ], + "native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js": [ + [ + "native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/native-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-piped.js" + ] + ] + } + ] + ], + "native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js": [ + [ + "native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/native-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-write.js" + ] + ] + } + ] + ], + "native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js": [ + [ + "native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/native-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream.js" + ] + ] + } + ] + ], "native-file-system/native_FileSystemWriter.tentative.https.manual.window.js": [ [ "native-file-system/native_FileSystemWriter.tentative.https.manual.window.html", @@ -379869,6 +381525,134 @@ } ] ], + "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js": [ + [ + "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "../streams/resources/recording-streams.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-piped.js" + ] + ] + } + ], + [ + "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "../streams/resources/recording-streams.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-piped.js" + ] + ] + } + ] + ], + "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js": [ + [ + "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-write.js" + ] + ] + } + ], + [ + "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-write.js" + ] + ] + } + ] + ], + "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js": [ + [ + "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream.js" + ] + ] + } + ], + [ + "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream.js" + ] + ] + } + ] + ], "native-file-system/sandboxed_FileSystemWriter.tentative.https.any.js": [ [ "native-file-system/sandboxed_FileSystemWriter.tentative.https.any.html", @@ -392319,6 +394103,12 @@ {} ] ], + "portals/predecessor-fires-unload.html": [ + [ + "portals/predecessor-fires-unload.html", + {} + ] + ], "preload/avoid-delaying-onload-link-preload.html": [ [ "preload/avoid-delaying-onload-link-preload.html", @@ -431260,6 +433050,14 @@ } ] ], + "webrtc/RTCDataChannel-close.html": [ + [ + "webrtc/RTCDataChannel-close.html", + { + "timeout": "long" + } + ] + ], "webrtc/RTCDataChannel-id.html": [ [ "webrtc/RTCDataChannel-id.html", @@ -431366,6 +433164,12 @@ {} ] ], + "webrtc/RTCPeerConnection-close.html": [ + [ + "webrtc/RTCPeerConnection-close.html", + {} + ] + ], "webrtc/RTCPeerConnection-connectionState.https.html": [ [ "webrtc/RTCPeerConnection-connectionState.https.html", @@ -460110,6 +461914,12 @@ {} ] ], + "css/css-pseudo/textpath-selection-011.html": [ + [ + "css/css-pseudo/textpath-selection-011.html", + {} + ] + ], "css/css-regions/elements/video-001.html": [ [ "css/css-regions/elements/video-001.html", @@ -460218,6 +462028,12 @@ {} ] ], + "css/css-ruby/ruby-reflow-001-noruby.html": [ + [ + "css/css-ruby/ruby-reflow-001-noruby.html", + {} + ] + ], "css/css-sizing/intrinsic-percent-non-replaced-002.html": [ [ "css/css-sizing/intrinsic-percent-non-replaced-002.html", @@ -474350,7 +476166,7 @@ "support" ], "common/security-features/README.md": [ - "98afe1af1be8d6329f9ae687320d4bd4797ca2c8", + "c19874653a7cac4d314fd9dd0bf921082c6f8d70", "support" ], "common/security-features/resources/common.sub.js": [ @@ -557949,10 +559765,18 @@ "bd26585d9e639e3133a650c26d3f3cb93579e4ae", "support" ], + "css/css-align/animation/column-gap-composition.html": [ + "0054206cca8b3448ad5d19e055e9f435a6e123b1", + "testharness" + ], "css/css-align/animation/column-gap-interpolation.html": [ "c2f02d3ba87f4dee555be80caa45d6909e2495ae", "testharness" ], + "css/css-align/animation/row-gap-composition.html": [ + "238253adf0cda81aca80d9345219ac8cd8e0df50", + "testharness" + ], "css/css-align/animation/row-gap-interpolation.html": [ "1d85ffa3b07e8695e7b3a6ad82c02ae4da8d7b21", "testharness" @@ -559073,14 +560897,34 @@ "f6a480c7bd2ccc4a6c46fa2eade5e7231fab4938", "testharness" ], + "css/css-backgrounds/animations/border-bottom-left-radius-composition.html": [ + "87042d1969d59b6865761c60beaeba5219c6148c", + "testharness" + ], + "css/css-backgrounds/animations/border-bottom-right-radius-composition.html": [ + "2b5a72df6914f571ca00418484d9f782cd46aa63", + "testharness" + ], + "css/css-backgrounds/animations/border-bottom-width-composition.html": [ + "5377c0ab42b44623c1d7e0aa81344345db795f68", + "testharness" + ], "css/css-backgrounds/animations/border-color-interpolation.html": [ "3e7843b8a07577970279ef9a4e14bfb83c1816f0", "testharness" ], + "css/css-backgrounds/animations/border-image-outset-composition.html": [ + "e3311711753e34295eb3c7c83d5aee3d4cd684aa", + "testharness" + ], "css/css-backgrounds/animations/border-image-outset-interpolation.html": [ "aebadbbafb236a090aa543ecf82e5661bee7de74", "testharness" ], + "css/css-backgrounds/animations/border-image-slice-composition.html": [ + "d0ccb1a3a64f2b3fe75b4957dc0a75036c3cd392", + "testharness" + ], "css/css-backgrounds/animations/border-image-slice-interpolation-stability.html": [ "26431334e4acf13f6c095868a0e9cee6926a9ef1", "testharness" @@ -559093,14 +560937,38 @@ "60dcfceddc791737487fab07ea7035fac40856d6", "testharness" ], + "css/css-backgrounds/animations/border-image-width-composition.html": [ + "0d0a1dc4ed263c80b472e3ba241fffeaf771d6aa", + "testharness" + ], "css/css-backgrounds/animations/border-image-width-interpolation.html": [ "ea138201b15805cd86d8a63ed37b401b103bfee2", "testharness" ], + "css/css-backgrounds/animations/border-left-width-composition.html": [ + "1b90effbc32cd56e9120fec92158f518a67d6ae8", + "testharness" + ], "css/css-backgrounds/animations/border-radius-interpolation.html": [ "195469e83164c965ee33b6277983870100bda111", "testharness" ], + "css/css-backgrounds/animations/border-right-width-composition.html": [ + "aa9e1dcc66764c2ec8c072cbf9365529e3729d88", + "testharness" + ], + "css/css-backgrounds/animations/border-top-left-radius-composition.html": [ + "1c2056bc010a82228416983897c63676ac3aeb0f", + "testharness" + ], + "css/css-backgrounds/animations/border-top-right-radius-composition.html": [ + "9a26d51375e78bfe54ba7a3689f6b72fe6c36417", + "testharness" + ], + "css/css-backgrounds/animations/border-top-width-composition.html": [ + "475c3930b9d1704267267ff30d747b266ea3d851", + "testharness" + ], "css/css-backgrounds/animations/border-width-interpolation.html": [ "11f92f41652a9f1b167c5a399849d1e1e61c4df7", "testharness" @@ -562821,14 +564689,46 @@ "dde409360faf79a301c3ae3ea34a995d154d7bb4", "support" ], + "css/css-box/animation/margin-bottom-composition.html": [ + "c95f8de23efe6e853dd4b05eed07af01c1d02af7", + "testharness" + ], "css/css-box/animation/margin-interpolation.html": [ "088836cbbd18d0daf203de7dbacfb65733e35813", "testharness" ], + "css/css-box/animation/margin-left-composition.html": [ + "8f3c646dfec219d30d2fefafdcb89c9e7cabb2b5", + "testharness" + ], + "css/css-box/animation/margin-right-composition.html": [ + "c903303313bcc06ecf67f86efc55b21537e4af4c", + "testharness" + ], + "css/css-box/animation/margin-top-composition.html": [ + "5f050bd6c7d9663025d53a04ecd2ec6352275fba", + "testharness" + ], + "css/css-box/animation/padding-bottom-composition.html": [ + "855b5d3dc2948a9dc4ae391aaaa5caee06f88665", + "testharness" + ], "css/css-box/animation/padding-interpolation.html": [ "3bf284117960fe78300e95140244d309f8f439a4", "testharness" ], + "css/css-box/animation/padding-left-composition.html": [ + "417777ae253428cf6c852e6846960494a8ea53f7", + "testharness" + ], + "css/css-box/animation/padding-right-composition.html": [ + "3c80849bb2bc68a68c098f42a1a29b9247e6a224", + "testharness" + ], + "css/css-box/animation/padding-top-composition.html": [ + "b5083ae79b3db8a55f7af45373804d223cbbbc47", + "testharness" + ], "css/css-box/box-chrome-crash-001.html": [ "351df37f1550ab40818b7f7f1c51191cfae5583e", "testharness" @@ -583133,6 +585033,162 @@ "6947515f7e4634fc3f240ffda91c6f5bdac862ce", "visual" ], + "css/css-images/image-orientation/image-orientation-default.html": [ + "36fb1a665ffa858f716195f0cafd04d4d7388c85", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html": [ + "26db7da18453817947a5e974f993222ec4c92b17", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html": [ + "f6474afaa0ab942a3574433ac93492f7ee20bac6", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-from-image-composited.html": [ + "596e497ed3e2b86dfea3e191951b4c3483b0abc4", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-from-image-computed-style.html": [ + "32933244c384063016d4880bc7da2a590275b54b", + "testharness" + ], + "css/css-images/image-orientation/image-orientation-from-image-content-images.html": [ + "36a2a343168ddbec199fe41bc887e2c7719248af", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-from-image-dynamic1.html": [ + "15e05884cf5594702c172b81587ea578714aa4e0", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-from-image-dynamic2.html": [ + "c0df221337e036cd6ebf5dc306b2bc6a00e204ff", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-from-image-image-document.html": [ + "793fc017e6f91746c23078f9f766d04dd1aae22d", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-from-image.html": [ + "f1343e9f23fa0c5eeae8134cff269cfc6e7308d7", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-none-computed-style.html": [ + "49919288b552b760ed5230adcad09eb255a6546b", + "testharness" + ], + "css/css-images/image-orientation/image-orientation-none-content-images.html": [ + "7bcb5ce3394d32678eb9c7e014931cfc62b99b2b", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-none-image-document.html": [ + "29ec30f1431590ce374ab223aa852553de76be57", + "reftest" + ], + "css/css-images/image-orientation/image-orientation-none.html": [ + "03c46c620a028492e6b364c9e6cf96d3c615c4ba", + "reftest" + ], + "css/css-images/image-orientation/reference/image-orientation-default-ref.html": [ + "aa8bede601460a0ed59495af6eb5a11ea0cd807d", + "support" + ], + "css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html": [ + "21fed5fbb66bfa3bc04d0e708204827b355db591", + "support" + ], + "css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html": [ + "d2c7e6916bc1bf07eef4bc400f760a89babd08a8", + "support" + ], + "css/css-images/image-orientation/reference/image-orientation-from-image-ref.html": [ + "d731e837778db1e0ba68745b23a6b453f2ac3230", + "support" + ], + "css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html": [ + "d73c554f3290b3451c88e1bfd2b4c9928763c1a7", + "support" + ], + "css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html": [ + "db84d0e23cf7c727cb989db409d661667bd9ab18", + "support" + ], + "css/css-images/image-orientation/reference/image-orientation-none-ref.html": [ + "8293d6e003d9b55de2b5c1082d875ba54417607c", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg": [ + "d9acd656f92567e31487d6c03b59d2201c1b9756", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-1-ul.jpg": [ + "7c13bf7dc4f4b7cefcbeb20df9fff79ee5d5bd90", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg": [ + "1d06bf3d2f4f3e097428ce9c8561653eb674eadb", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-2-ur.jpg": [ + "2387b05feef33054621217d56c9031d8c368852d", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg": [ + "1c5ce1a8f6f4f4337765f16d6cad65b1891187dc", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-3-lr.jpg": [ + "cb1a82dab1682f6ff24436e8c42de30e3b7bb0f0", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg": [ + "cf71c6a1444ceeec4a0c8afb44deedba274289a0", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-4-lol.jpg": [ + "8f93096803013123ee81f413a36c7d8ccdbfcdb6", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg": [ + "62ddea22e44fa65461ca4a9bd4948d67ee8ac3af", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-5-lu.jpg": [ + "e65d2eb5cc293014e821fecdde6a0c6cc84cbc45", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg": [ + "3d21ec96ec54ee22a6626e00c8d535627177c8d7", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-6-ru.jpg": [ + "6f487dae1358c2c8a399784e835b006502cb0595", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg": [ + "7d49d4f20cca13b2ac943aa7ef15b305b17f39b7", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-7-rl.jpg": [ + "769be7df85388ccbc1cd1a23372576c9b3e44a01", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg": [ + "e88b00c38b6edd14fd833684a37497b74aa5f713", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-8-llo.jpg": [ + "c4a51ed3ff698006649df4c905e2b4bb6102d6dc", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg": [ + "b6b517f6b72561ed93b70cd45103a693ae28928c", + "support" + ], + "css/css-images/image-orientation/support/exif-orientation-9-u.jpg": [ + "1003bfb7c21401063b8460904281299f3ccab7c2", + "support" + ], "css/css-images/infinite-radial-gradient-crash-ref.html": [ "a80236dcf75c22ecd8e43935d004f1fddf0550cb", "support" @@ -586241,6 +588297,10 @@ "434dc52ea3d731bd1393270372294cd007382e59", "testharness" ], + "css/css-multicol/change-intrinsic-width.html": [ + "3df3e1ebc8f9b5780dc858a878bca13dbedcdb35", + "reftest" + ], "css/css-multicol/column-count-used-001.html": [ "2949a1996ebae0c48329906ea7ef34c83080e90f", "reftest" @@ -586305,6 +588365,10 @@ "ce8011b17f82407599ea28a2eaf543ec9d45a98b", "reftest" ], + "css/css-multicol/intrinsic-width-change-column-count.html": [ + "30e7671e41c3879ceef30627b3d5b65dc8c0ff86", + "reftest" + ], "css/css-multicol/large-actual-column-count.html": [ "615e3f2f0598973d66518b7abbabe2fbf2f76bda", "reftest" @@ -589997,6 +592061,22 @@ "5b2d705e2d0721c072bedf1dcc489fae25b2014f", "testharness" ], + "css/css-position/position-sticky-large-top-2-ref.html": [ + "941047901df08a616888746d6c0332d69c9382f9", + "support" + ], + "css/css-position/position-sticky-large-top-2.tentative.html": [ + "1cf9c0dfb43b6bfd71c1496a5d7b3b9428d0c086", + "reftest" + ], + "css/css-position/position-sticky-large-top-ref.html": [ + "075551a6e856112bb12909684f718b0875fec690", + "support" + ], + "css/css-position/position-sticky-large-top.tentative.html": [ + "b00a0d139683717b57633e38bb9ce7f033833b65", + "reftest" + ], "css/css-position/position-sticky-left.html": [ "054cf10eabc256cde34fc738d9fcd7429946849c", "testharness" @@ -590769,6 +592849,22 @@ "9a0585db72206768e2a7ed77f9245f67103d587b", "reftest" ], + "css/css-pseudo/marker-content-017-ref.html": [ + "9628123611d0bfb9dd90ac621ba39177982e8075", + "support" + ], + "css/css-pseudo/marker-content-017.html": [ + "267e519feee6541596f11310e2075419e13cffc2", + "reftest" + ], + "css/css-pseudo/marker-content-018-ref.html": [ + "8107d4297d7349c0b40cfe368da74190a9924433", + "support" + ], + "css/css-pseudo/marker-content-018.html": [ + "0a4a73cd5056415084f9579a2323318c58f1a167", + "reftest" + ], "css/css-pseudo/marker-default-styles.html": [ "05da6f89a9e2f858eadfdfb63e5194feda5ce3fc", "testharness" @@ -590790,7 +592886,7 @@ "reftest" ], "css/css-pseudo/marker-font-variant-numeric-default-ref.html": [ - "3d10621121931859c15ec7552172c7a02fc1cceb", + "be932213b0f1657524df67788130c09f3602cf80", "reftest" ], "css/css-pseudo/marker-font-variant-numeric-default.html": [ @@ -590798,7 +592894,7 @@ "reftest" ], "css/css-pseudo/marker-font-variant-numeric-normal-ref.html": [ - "45ab55d14b86c7f4dc1fc510b1e213cc51bcc0c9", + "b730a24e55a46d307afc0fe41d4517d65e44046f", "reftest" ], "css/css-pseudo/marker-font-variant-numeric-normal.html": [ @@ -590889,6 +592985,22 @@ "a71d6f0155e42ad0ebe33f6ea11aa5755201beaa", "reftest" ], + "css/css-pseudo/spelling-error-002-manual.html": [ + "88fa97038ce0a5791c733cbc50926e4447440259", + "manual" + ], + "css/css-pseudo/spelling-error-003-manual.html": [ + "559a4fe092ebaa72e31e5a07c38abcc0e6ca6122", + "manual" + ], + "css/css-pseudo/textpath-selection-011-ref.html": [ + "d9ba940518e121eeb0e9701ccd4e36772fdfa786", + "support" + ], + "css/css-pseudo/textpath-selection-011.html": [ + "2e42c6be8fbcfc756c578986517efc0b1739d1f3", + "visual" + ], "css/css-regions/META.yml": [ "37bdc98c84c0f4c9a32d3cc5b2f4e3494eb63999", "support" @@ -593153,12 +595265,236 @@ "80f49f0dbcf3e3a76ba6f740243e19a5f627bfd2", "visual" ], + "css/css-ruby/ruby-align-001-ref.html": [ + "eb368b3ae6141ecfa12d57c4c1ed06f388b82b53", + "support" + ], + "css/css-ruby/ruby-align-001.html": [ + "13c96f53f2f30ecef1a9017cd7f63159dfd9a6e7", + "reftest" + ], + "css/css-ruby/ruby-align-001a.html": [ + "6e652f172653867d8a9fce5930463fb7fd1832e5", + "reftest" + ], + "css/css-ruby/ruby-align-002-ref.html": [ + "4c5413aef719dd1e0b5ffb08cbde0a19119495cb", + "support" + ], + "css/css-ruby/ruby-align-002.html": [ + "ec40be5e105b5e1e64802b56b465a5f3286a761b", + "reftest" + ], + "css/css-ruby/ruby-align-002a.html": [ + "dfb7ae37ed90232164728b0d47e2273a9e794b48", + "reftest" + ], "css/css-ruby/ruby-base-different-size-ref.html": [ - "695ab1cdb7125ae75532a58027a361bd882348c4", + "70f47eaa8beb9f23197e2efb3bced5e8ecd0a754", "support" ], "css/css-ruby/ruby-base-different-size.html": [ - "dcfde6c16eab415d24c5c1f0404c982dc21a98d6", + "f71b5644c626b9835f5c9015c04badb626b336a1", + "reftest" + ], + "css/css-ruby/ruby-bidi-001-ref.html": [ + "c714921d32ea97dbda15537f11056ce4603dc732", + "support" + ], + "css/css-ruby/ruby-bidi-001.html": [ + "ba18071150a71aa8dab724eb71f777c1b4825104", + "reftest" + ], + "css/css-ruby/ruby-bidi-002-ref.html": [ + "874284de998dd056ef74d26f106e88c0770eb4cc", + "support" + ], + "css/css-ruby/ruby-bidi-002.html": [ + "d6692a333aefd75d600a136545addb100dcc9676", + "reftest" + ], + "css/css-ruby/ruby-bidi-003-ref.html": [ + "ec00293d861112fa8feef5aa6e3b5a36e55e4344", + "support" + ], + "css/css-ruby/ruby-bidi-003.html": [ + "2510408ec22524069588b8280913fa781c4ec2da", + "reftest" + ], + "css/css-ruby/ruby-box-generation-001-ref.html": [ + "8d836fe23c830d0aa815dc2291033615a62a0c81", + "support" + ], + "css/css-ruby/ruby-box-generation-001.html": [ + "ac58d4d43ab966eb1ac57f56c826e309877cebac", + "reftest" + ], + "css/css-ruby/ruby-box-generation-002-ref.html": [ + "730ab787d30253e11dbe7070ba35a9114829f3a5", + "support" + ], + "css/css-ruby/ruby-box-generation-002.html": [ + "e09ecf1eb252ea773164527e2a82eb0823c050f0", + "reftest" + ], + "css/css-ruby/ruby-box-generation-003-ref.html": [ + "e4c92a498bb61b48aabb1bbd21a3f4aef1632f5c", + "support" + ], + "css/css-ruby/ruby-box-generation-003.html": [ + "6b975afdfbf18db4a8487c4421b4924ee7bf377d", + "reftest" + ], + "css/css-ruby/ruby-box-generation-004-ref.html": [ + "7a27622cac1600d7969856a0df0400b644c95d54", + "support" + ], + "css/css-ruby/ruby-box-generation-004.html": [ + "0f6ed72d717a375b861fff1ff067b52c0c2aedcc", + "reftest" + ], + "css/css-ruby/ruby-box-generation-005-ref.html": [ + "55ba7b2c73faa017ec07203df3284c84667ffece", + "support" + ], + "css/css-ruby/ruby-box-generation-005.html": [ + "c86b697bf9d6b2c145dcb0871234c48779e03887", + "reftest" + ], + "css/css-ruby/ruby-dynamic-insertion-001-ref.html": [ + "0a09924c653d80bfb69124ead3d65d6f2f8e411f", + "support" + ], + "css/css-ruby/ruby-dynamic-insertion-001.html": [ + "be1c5ce50056ecd0ffb3699bd4e47f63c7c6c7bf", + "reftest" + ], + "css/css-ruby/ruby-dynamic-insertion-002-ref.html": [ + "cd85db944e36786e5b0fe18862dfca4f7d11bf3d", + "support" + ], + "css/css-ruby/ruby-dynamic-insertion-002.html": [ + "c2a12a041958ce097c44f2d022e1da25b654fae3", + "reftest" + ], + "css/css-ruby/ruby-dynamic-insertion-003-ref.html": [ + "ef71525479d23fbc221529715b911f001b069899", + "support" + ], + "css/css-ruby/ruby-dynamic-insertion-003.html": [ + "68984b5568ba969f8caae70e6c1abfbc33137b40", + "reftest" + ], + "css/css-ruby/ruby-dynamic-insertion-004-ref.html": [ + "9c8120ee3fa73ca360b67a9e57f2c6ace8455a95", + "support" + ], + "css/css-ruby/ruby-dynamic-insertion-004.html": [ + "9b3c36e3ac88764d44c78b1ba516231a84c9e2d9", + "reftest" + ], + "css/css-ruby/ruby-dynamic-insertion-005-ref.html": [ + "03e5cabe55c7cfd55527a8a79190b8903915969f", + "support" + ], + "css/css-ruby/ruby-dynamic-insertion-005.html": [ + "a684d665c8918f5b5b87b36fd6a7c469b7a1653d", + "reftest" + ], + "css/css-ruby/ruby-dynamic-removal-001-ref.html": [ + "23beda289871a98350d8d0584dd4d2526ee79826", + "support" + ], + "css/css-ruby/ruby-dynamic-removal-001.html": [ + "090ea43c79a11f58908c481651132bc6a21c99f7", + "reftest" + ], + "css/css-ruby/ruby-dynamic-removal-002-ref.html": [ + "f9d2fd7240d12c5453f1a2c3553d48b3f5e2d969", + "support" + ], + "css/css-ruby/ruby-dynamic-removal-002.html": [ + "76846e547bb555956256e3adcf8af8913a6ef397", + "reftest" + ], + "css/css-ruby/ruby-dynamic-removal-003-ref.html": [ + "0067c014f5d6663f17b6ed0bcbf9cc75452e740c", + "support" + ], + "css/css-ruby/ruby-dynamic-removal-003.html": [ + "d35b2b968d651ecb7cc4d8a0e461b83f900ddcfc", + "reftest" + ], + "css/css-ruby/ruby-float-handling-001-ref.html": [ + "245a366172afddb3d8cde9e13b6f03ddb51dbfea", + "support" + ], + "css/css-ruby/ruby-float-handling-001.html": [ + "5cb56e88aca36dce07fcdf17a690edc13ef8b375", + "reftest" + ], + "css/css-ruby/ruby-intra-level-whitespace-001-ref.html": [ + "1d9fbb344fd335316c63bdf8530c4be081694df0", + "support" + ], + "css/css-ruby/ruby-intra-level-whitespace-001.html": [ + "4fceda1fb09b7923bb1eeb27e202e274e8168017", + "reftest" + ], + "css/css-ruby/ruby-intra-level-whitespace-002-ref.html": [ + "c5949dbeb504787dc27f3cce563796aac42c2d66", + "support" + ], + "css/css-ruby/ruby-intra-level-whitespace-002.html": [ + "67aab53bfb0d0542da875db4abe9e7a6d0d4f6a5", + "reftest" + ], + "css/css-ruby/ruby-intra-level-whitespace-003-ref.html": [ + "d1df82371c9f910e713f040b502439de8601ddb3", + "support" + ], + "css/css-ruby/ruby-intra-level-whitespace-003.html": [ + "716f2e3f0b4f2dbfeed1607272e308a5c1baf2fb", + "reftest" + ], + "css/css-ruby/ruby-intrinsic-isize-001-ref.html": [ + "9d2889f8116a36fd141faf871c32c4c9672b9a21", + "support" + ], + "css/css-ruby/ruby-intrinsic-isize-001.html": [ + "84f48e2fc936155628c290bfa83006ef509aa0b7", + "reftest" + ], + "css/css-ruby/ruby-intrinsic-isize-002-ref.html": [ + "d71de26a259d7bc8784c207980676ac6eb0d5b8e", + "support" + ], + "css/css-ruby/ruby-intrinsic-isize-002.html": [ + "741d41bec577bfe1aeb2e3e1e56a7973911f92bf", + "reftest" + ], + "css/css-ruby/ruby-justification-001-ref.html": [ + "eaec8897133ee0527aec706a7a9e1dccc4dcf914", + "support" + ], + "css/css-ruby/ruby-justification-001.html": [ + "edef72874b6b564e0618eb9e795f863ee4cbf20b", + "reftest" + ], + "css/css-ruby/ruby-justification-002-ref.html": [ + "c61dae5c62d903323ac956b6d1d70a36bfd5889a", + "support" + ], + "css/css-ruby/ruby-justification-002.html": [ + "979987c028baed8a7f6cd6de0c481b87ce9f2848", + "reftest" + ], + "css/css-ruby/ruby-lang-specific-style-001-ref.html": [ + "c0655a5310b183080e0afb259fb65546102d9bb1", + "support" + ], + "css/css-ruby/ruby-lang-specific-style-001.html": [ + "3206514f0d44855d3a9376ecfa47a6e9c3b62775", "reftest" ], "css/css-ruby/ruby-layout-internal-boxes-ref.html": [ @@ -593169,6 +595505,126 @@ "cfd271233e20402a20d7e66d174d6b2f05072c4d", "reftest" ], + "css/css-ruby/ruby-line-break-suppression-001-ref.html": [ + "1cd43b80018e896085984d53e5c4d1267efd387c", + "support" + ], + "css/css-ruby/ruby-line-break-suppression-001.html": [ + "11d4d40d43610fbcdbc8df580336eb1a41bfea22", + "reftest" + ], + "css/css-ruby/ruby-line-break-suppression-002-ref.html": [ + "8281ea1d74fa6c17f820cc4e6024fb742aa45049", + "support" + ], + "css/css-ruby/ruby-line-break-suppression-002.html": [ + "394b9c27e536eb7dfc7e9b248f9b27d5b848af20", + "reftest" + ], + "css/css-ruby/ruby-line-break-suppression-003-ref.html": [ + "f8b1e168e11b48e32bb01a584636bb01eb9e392f", + "support" + ], + "css/css-ruby/ruby-line-break-suppression-003.html": [ + "dadfd562a45ac49ad303ea232a04fa5fe5c66621", + "reftest" + ], + "css/css-ruby/ruby-line-break-suppression-004-ref.html": [ + "5aa55829574cd3f395b00262b81b6292906ba6ab", + "support" + ], + "css/css-ruby/ruby-line-break-suppression-004.html": [ + "0314237f07f61c30fa562aa86c3142aaa8057a06", + "reftest" + ], + "css/css-ruby/ruby-line-break-suppression-005-ref.html": [ + "c40780e37dd9dcf8922f2fd389727525f5ab0e13", + "support" + ], + "css/css-ruby/ruby-line-break-suppression-005.html": [ + "10d6690b3d8bbea027f250a3a0cfbbbf72da4c43", + "reftest" + ], + "css/css-ruby/ruby-line-breaking-001-ref.html": [ + "1f3031c59ad413d7fd93b8ce8393a70957e725d2", + "support" + ], + "css/css-ruby/ruby-line-breaking-001.html": [ + "b6b4d861e21e241852bb97d1671a73d160089ccc", + "reftest" + ], + "css/css-ruby/ruby-line-breaking-002-ref.html": [ + "08510f7fb056ad928f40c92977c422b0912c7393", + "support" + ], + "css/css-ruby/ruby-line-breaking-002.html": [ + "dddf41f9309abc3aa0535400a0cd967b97910cdc", + "reftest" + ], + "css/css-ruby/ruby-line-breaking-003-ref.html": [ + "4f3cecb27ce1f243030edae98fa4ea753a6894ad", + "support" + ], + "css/css-ruby/ruby-line-breaking-003.html": [ + "27348d0cf11082e875506b9df6a56b0117538e65", + "reftest" + ], + "css/css-ruby/ruby-no-transform-ref.html": [ + "56afd9366fe787670771a82874f1016335f1b7c6", + "support" + ], + "css/css-ruby/ruby-no-transform.html": [ + "1cdd4f3bbf5af81309805285a25622f7e444a3ee", + "reftest" + ], + "css/css-ruby/ruby-reflow-001-noruby.html": [ + "4c00573422b3954853965a3d86ad1464a53a244f", + "visual" + ], + "css/css-ruby/ruby-reflow-001-opaqueruby.html": [ + "fe4a80423839f6167fa0e42315b6b814cc839b92", + "reftest" + ], + "css/css-ruby/ruby-reflow-001-transparentruby.html": [ + "3e7112c4d61397e74cd1d75519292f3ecca5e9ee", + "reftest" + ], + "css/css-ruby/ruby-span-001-ref.html": [ + "3bf873453cd8df2216cd0a318466464b0518e698", + "support" + ], + "css/css-ruby/ruby-span-001.html": [ + "e7b19667aa9fdbbf25ef662036ed1c0babd8e0fc", + "reftest" + ], + "css/css-ruby/ruby-whitespace-001-ref.html": [ + "d24e207f8676d010cdfef2ddac1412833944faaf", + "support" + ], + "css/css-ruby/ruby-whitespace-001.html": [ + "9df61585700777911c19e8336beed37827ce78d4", + "reftest" + ], + "css/css-ruby/ruby-whitespace-002-ref.html": [ + "8aade20051630ee89d258916b1029a71d91ce0fb", + "support" + ], + "css/css-ruby/ruby-whitespace-002.html": [ + "bc84919a123c0554d9a6f80bea7d78341eb6cafe", + "reftest" + ], + "css/css-ruby/support/ruby-common.css": [ + "cf83123281dfa8896339138faab3c6196943832c", + "support" + ], + "css/css-ruby/support/ruby-dynamic-insertion.js": [ + "0bf6cd969779db94866a58ab7b534d2f53a5b99a", + "support" + ], + "css/css-ruby/support/ruby-dynamic-removal.js": [ + "c703e7601e4f3a84e7d7739baf5841e16a46e3f0", + "support" + ], "css/css-scoping/META.yml": [ "826341652122a40956ccc74288e23f952f1f40e8", "support" @@ -594149,6 +596605,10 @@ "a7f17d9670b137995b0dfc6f43221e16b988376d", "testharness" ], + "css/css-shadow-parts/style-sharing.html": [ + "4af1260b5e992af7816cdbe96056495a9ad7e216", + "testharness" + ], "css/css-shadow-parts/support/shadow-helper.js": [ "94accd6b1f9b095fda0079f7b86b866d88ffee01", "support" @@ -594161,10 +596621,18 @@ "edac744592f76704ba82b0c4a7e5a53c7db6ba79", "testharness" ], + "css/css-shapes/animation/shape-margin-composition.html": [ + "395bad063f4c1bfb036d650d6b0319cd3d572fe2", + "testharness" + ], "css/css-shapes/animation/shape-margin-interpolation.html": [ "48b3d0c460794b18261ce7a6beedf980d8335d36", "testharness" ], + "css/css-shapes/animation/shape-outside-composition.html": [ + "0115148ec1adde1a32b1c1fb4b3c33ea8b56ece0", + "testharness" + ], "css/css-shapes/animation/shape-outside-interpolation.html": [ "3380acdba00db8e9440b33c60275f6fd6340d345", "testharness" @@ -595461,26 +597929,50 @@ "086e654a8e039f259b5e828d024f808c2e95016b", "support" ], + "css/css-sizing/animation/height-composition.html": [ + "094e247dcf22d9bd665b244993b6239265ee73bb", + "testharness" + ], "css/css-sizing/animation/height-interpolation.html": [ "10ceed5b2cc0d5511b8020aeaced36be39834c3a", "testharness" ], + "css/css-sizing/animation/max-height-composition.html": [ + "fb5b241d00865fe68c198a9fee88d932a8977f7e", + "testharness" + ], "css/css-sizing/animation/max-height-interpolation.html": [ "c4cab0e1cf4534d3705801f3159b6b8724977b66", "testharness" ], + "css/css-sizing/animation/max-width-composition.html": [ + "8b6d8b704c8771491419db0aa2a3c783a1dea2b3", + "testharness" + ], "css/css-sizing/animation/max-width-interpolation.html": [ "111199baa7ed89c6023d43b56313413cc5aeeeeb", "testharness" ], + "css/css-sizing/animation/min-height-composition.html": [ + "1e92b0ec2fd664e7b3dd6dc1cd8310c7b9526e7c", + "testharness" + ], "css/css-sizing/animation/min-height-interpolation.html": [ "6fd5b4e2f5366f6b18678f60b982e82905558e51", "testharness" ], + "css/css-sizing/animation/min-width-composition.html": [ + "e8bd41030bbd8a273f7e7c45f5f445d706d044eb", + "testharness" + ], "css/css-sizing/animation/min-width-interpolation.html": [ "d11fb3d5cb139f870d1eb40618bf547176f109b1", "testharness" ], + "css/css-sizing/animation/width-composition.html": [ + "bfe45cb31471d0c8623dbb9e84000bc1208bb76f", + "testharness" + ], "css/css-sizing/animation/width-interpolation.html": [ "d165c994b5de6fe1561498aa04c075196357f5f6", "testharness" @@ -597993,14 +600485,26 @@ "e7914c0fc7ff9e6999f8847dc1800968472483f2", "support" ], + "css/css-text/animations/letter-spacing-composition.html": [ + "c1b614b5ebaa5bc190a080bd8da5694096a2be20", + "testharness" + ], "css/css-text/animations/letter-spacing-interpolation.html": [ "7d4958113915913bb8a3a5af13f5cee90b080825", "testharness" ], + "css/css-text/animations/text-indent-composition.html": [ + "57c528ca271646a284048bb49e11025ac25469da", + "testharness" + ], "css/css-text/animations/text-indent-interpolation.html": [ "2269fdfa5b60f6f4a8d63a7f777e6abbf499c4b7", "testharness" ], + "css/css-text/animations/word-spacing-composition.html": [ + "17aacaef1506eddbc8ef40ade114a856310a508e", + "testharness" + ], "css/css-text/animations/word-spacing-interpolation.html": [ "ffd6bb476ad87976a1183cde70a10892bab77982", "testharness" @@ -611933,6 +614437,10 @@ "7ce4b54a22c78576dc2318ebd651dfd1cce374ad", "support" ], + "css/css-ui/animation/caret-color-composition.html": [ + "6c69578677896e2463331deba85731e13fd94a25", + "testharness" + ], "css/css-ui/animation/caret-color-interpolation.html": [ "b3a4e30130843163d76a0a24196c66853bd4160a", "testharness" @@ -611941,10 +614449,18 @@ "f49aa79a382c8e5a8f4c9d834f5f12aea551818f", "testharness" ], + "css/css-ui/animation/outline-offset-composition.html": [ + "984a63fdc34274fab133308dbb0b9a5c2eca03b9", + "testharness" + ], "css/css-ui/animation/outline-offset-interpolation.html": [ "46c1c51c6eefaa490fc9d55e4cadfb0cb7804337", "testharness" ], + "css/css-ui/animation/outline-width-composition.html": [ + "b770feda61ca6c74467c597749a053d3569af012", + "testharness" + ], "css/css-ui/animation/outline-width-interpolation.html": [ "c024c7cf6a08e0f6e02ccb451ca04d0b4a8c9251", "testharness" @@ -620238,7 +622754,7 @@ "reftest" ], "css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht": [ - "3b1fef0f84e53ad72e61fc1b849ec6521b162968", + "dea13d4238dab838610355056ddaf105e947f3bf", "support" ], "css/css-writing-modes/sizing-orthog-htb-in-vrl-013.xht": [ @@ -623109,6 +625625,10 @@ "f1f6fc5abc679d087d221573456eb9219d1a405c", "testharness" ], + "css/cssom-view/getClientRects-inline-inline-child.html": [ + "9a03ccdbccc80d8a0ce6f701aeaa802b1b4715e4", + "testharness" + ], "css/cssom-view/getClientRects-inline.html": [ "415e34a6f0430e08441ee32b3f7c0ca8cd11a692", "reftest" @@ -625725,10 +628245,18 @@ "20835b48397f136a30b82a62654d389cad326315", "support" ], + "css/motion/animation/offset-anchor-composition.html": [ + "53210fdf38a86ec9f4e852a33527fc88b1eb9fe3", + "testharness" + ], "css/motion/animation/offset-anchor-interpolation.html": [ "9c69c0f0bed2b14c02091ccf63f50ace61f2eb2a", "testharness" ], + "css/motion/animation/offset-distance-composition.html": [ + "4ff6e95b05792505b2f98c511f5a80d64e86624d", + "testharness" + ], "css/motion/animation/offset-distance-interpolation.html": [ "bc0c094a8e5305c970f0a4d44ee8a3726d2965a1", "testharness" @@ -625737,6 +628265,10 @@ "2ee011bd77a975e9b566d24658995693c574f620", "testharness" ], + "css/motion/animation/offset-path-composition.html": [ + "eedd363efafe05b870314ad797d9dc63f2c7409c", + "testharness" + ], "css/motion/animation/offset-path-interpolation-001.html": [ "5b90813bb591d0aa7e17eeddcb1a9e3a908670f0", "testharness" @@ -625757,10 +628289,18 @@ "9924106f4b75ede89e5270a76fe217f85ef20050", "testharness" ], + "css/motion/animation/offset-position-composition.html": [ + "0ee517a73a8e9e673a83a0f81bbdea98d6a3d808", + "testharness" + ], "css/motion/animation/offset-position-interpolation.html": [ "9faaf9487afb20059046e95a8cd5b3a796e8fd42", "testharness" ], + "css/motion/animation/offset-rotate-composition.html": [ + "bf60c19abeffafa36c50f1d1da0e9f9d64b1a151", + "testharness" + ], "css/motion/animation/offset-rotate-interpolation.html": [ "55845108ebf5f3c42a8b0532121199136160d695", "testharness" @@ -635102,15 +637642,15 @@ "reftest" ], "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py": [ - "dd823c78a68d555e3a235cd917edd09297f7c34e", + "12fb6a3ad850b357808c47a90a818dd73be2de5b", "support" ], "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py": [ - "62363a207bd15c3d8733ecd496e73e3f61eb5744", + "527959068762f5a7185bf11bdc2536054d2db258", "support" ], "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py": [ - "b5c59e6f50185f4a63badfb860375959f3af4a02", + "fdbaec052e4e4bdfdcad1e9fc9731bf26a518509", "support" ], "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-010-tests.sh": [ @@ -635118,7 +637658,7 @@ "support" ], "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py": [ - "34e047ab003e0c515cf03e448796aaa5b23a6df7", + "1b1d6fc16f24b91eef28cd99c428f426cc61c349", "support" ], "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-01-ref.html": [ @@ -636162,7 +638702,7 @@ "support" ], "css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py": [ - "75168420287b275af5782891adf73eb4cf7ca2e6", + "6e13861374a6f6d5def71d7c2c1a59fbd57b2895", "support" ], "css/vendor-imports/mozilla/mozilla-central-reftests/text3/text-align-match-parent-01.html": [ @@ -637854,7 +640394,7 @@ "testharness" ], "custom-elements/pseudo-class-defined.html": [ - "60d88cffb517c0062db338e5ba89e98f7748c280", + "24cb5fe4cd392246e292d255c0858aa7f2b5dd0e", "testharness" ], "custom-elements/range-and-constructors.html": [ @@ -638102,7 +640642,7 @@ "testharness" ], "custom-elements/upgrading.html": [ - "d6b8ed387540ae9572774e5557b1168f844a017f", + "ac0fdff7a2111507632ac2c36fd5c60a6f832b20", "testharness" ], "custom-elements/upgrading/Document-importNode.html": [ @@ -639925,6 +642465,14 @@ "d37015ec9f923bfc74319631723defa0b222654d", "testharness" ], + "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html": [ + "98de2b688369099806c525034a6bfc9e63d20a72", + "support" + ], + "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html": [ + "612aed637df48d19f3050844ed418f3e35d8fa91", + "reftest" + ], "dom/nodes/remove-unscopable.html": [ "0238b0fa97a40dd9e5058d4153d1483553552033", "testharness" @@ -640297,6 +642845,10 @@ "918997b1646d73d71a79c302953ab9f0f8ed69cc", "support" ], + "domxpath/booleans.html": [ + "41522edf05f8bc752408eb2cdde10a05bd211a7a", + "testharness" + ], "domxpath/document.tentative.html": [ "b75c0f0d66dacb47a825ae2aa00bb63a19616433", "testharness" @@ -640305,6 +642857,14 @@ "8239d9c395e3c965c5ae2f23ed79156b7b85c01f", "testharness" ], + "domxpath/fn-concat.html": [ + "fe160966aa7983191e81ffa65f5955c86afe7bb9", + "testharness" + ], + "domxpath/fn-contains.html": [ + "a4d8bbfa7b3ce35b574bdcb902c4a0caa9ad39c3", + "testharness" + ], "domxpath/fn-lang.html": [ "c7c102945d070a4ea65cae0e30ea6ec64bb82c95", "testharness" @@ -640313,10 +642873,42 @@ "a9f33a0ee3d153abd6fe05415c6ce6699ce8525c", "testharness" ], + "domxpath/fn-starts-with.html": [ + "99d2df7db6b67c9e186ade1160da6932f8dc90bd", + "testharness" + ], + "domxpath/fn-substring-after.html": [ + "c290914d24b0463d42959ff675f1498a7898806d", + "testharness" + ], + "domxpath/fn-substring-before.html": [ + "69b3f1ef6e45e948a55d49b409c5a58a9cf83381", + "testharness" + ], + "domxpath/fn-substring.html": [ + "3311a15061de49c5337b938d732946358f2245f3", + "testharness" + ], + "domxpath/fn-translate.html": [ + "ee1700d1b427ea80fc5076a22a00f2dd62f4937b", + "testharness" + ], + "domxpath/helpers.js": [ + "0805bd682b48461588250a22018a6bd90990d002", + "support" + ], + "domxpath/lexical-structure.html": [ + "f93820b0e4176d8c96518268b6453024dd43f1df", + "testharness" + ], "domxpath/node-sets.html": [ "a47314fb0869885db01fd13bd8aa35687e283d0d", "testharness" ], + "domxpath/numbers.html": [ + "e847d6cd2e53839914a649ca1cb61953c659e2ed", + "testharness" + ], "domxpath/predicates.html": [ "1786740dbd2522c15325a6e8677b07402a7cd767", "testharness" @@ -646009,6 +648601,26 @@ "be1d1e74cf5f5105619a574c3caa7f2c0a39e7f6", "support" ], + "fetch/h1-parsing/resources-with-0x00-in-header.window.js": [ + "f1afeeb740b1d77bd392e23afb1c5abdf5687302", + "testharness" + ], + "fetch/h1-parsing/resources/README.md": [ + "2175d274088bdaeb2ee636765cc31a2fa6f3b132", + "support" + ], + "fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis": [ + "102340a6313feb75c1cad7f15b4d5a31e9c67568", + "support" + ], + "fetch/h1-parsing/resources/document-with-0x00-in-header.py": [ + "6e8db6195910ef4c85dced8b24541ecde83c5405", + "support" + ], + "fetch/h1-parsing/resources/script-with-0x00-in-header.py": [ + "f4a016a369831ee5dcdb3563468ccf8dd0b0982b", + "support" + ], "fetch/http-cache/304-update.html": [ "d6d8481e87427816113397bbed49f30b3e43c336", "testharness" @@ -646066,7 +648678,7 @@ "support" ], "fetch/http-cache/split-cache.tentative.html": [ - "533dd6a936fef7c6036bba42fbd7d0d71222a192", + "9e557fed7b79bc38ccf6fb016ce0e3258f4dd2ef", "testharness" ], "fetch/http-cache/status.html": [ @@ -649937,6 +652549,10 @@ "a5d8e59406e870c7be80dfe57ef404ddc7b288a4", "manual" ], + "html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html": [ + "919a05ed2a2a5c40f56ce46e1597e8bd763b0921", + "testharness" + ], "html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html": [ "3ad0de6a3a3fd7fb2304154d602226e9d5299724", "testharness" @@ -649953,6 +652569,10 @@ "ca2dd8ebf829d6f677fdf57b4a6db029a4aa457d", "support" ], + "html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html": [ + "10ac8ece0e174b9a180c904c5bcdf6cc514c3a92", + "support" + ], "html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html": [ "a315e21208728ed38155fa0e13c5f4d58dbea496", "support" @@ -657846,11 +660466,15 @@ "testharness" ], "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html": [ - "1d231d52cde8b4758cf834db42231720c374b060", + "ab36eeede733f094d2e6340ddf6ce4d82d7a24d6", + "testharness" + ], + "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html": [ + "42be8ce7a81b824f0e62553490ae406b6b736f9f", "testharness" ], "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html": [ - "5b155c1047da85d2bd8301effaa3ef9d9096b0ad", + "3000032978082356086930b2b5bee96b73947dc8", "testharness" ], "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-dim-ref.html": [ @@ -658297,6 +660921,14 @@ "ae2efa415ee51e4b2b54df2f3f90965746b43ed3", "testharness" ], + "html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html": [ + "f32472105d543a456e1a5ea469f932b8d643c06d", + "support" + ], + "html/semantics/document-metadata/the-link-element/link-type-attribute.html": [ + "80acb9f3dcc2d312fd8a8051b92e6e70ca343bb3", + "reftest" + ], "html/semantics/document-metadata/the-link-element/resources/bad.css": [ "4e1fe36165c52792e3a3816962c36e6090f04f67", "support" @@ -661906,11 +664538,11 @@ "testharness" ], "html/semantics/forms/constraints/form-validation-validity-valid.html": [ - "cec5dcbf0d5cfb340e100a82e723e1d620d16399", + "03655ffd2f5ba24b30e6864c8393ecbf36230aef", "testharness" ], "html/semantics/forms/constraints/form-validation-validity-valueMissing.html": [ - "3c9e4c4cb096bbe93b540c3f704d0d116a055aba", + "2e1c666436a19bc759026ebf55df4a17073ecb5d", "testharness" ], "html/semantics/forms/constraints/form-validation-willValidate.html": [ @@ -661926,7 +664558,7 @@ "testharness" ], "html/semantics/forms/constraints/support/validator.js": [ - "9b28b32309e349a87a5ee6b5b8cced2c501dd6a1", + "33508fb3289be3736f6f467957dc6614bec2bc9b", "support" ], "html/semantics/forms/constraints/tooLong-input-email-delete-manual.html": [ @@ -662754,7 +665386,7 @@ "testharness" ], "html/semantics/forms/the-input-element/time.html": [ - "ad4e38cbc74f50dc764fc958b8cf68f4dd790cbe", + "ec815d4cb302cfb68db7976ba79bec1de762b7b7", "testharness" ], "html/semantics/forms/the-input-element/type-change-file-to-text-crash.html": [ @@ -669154,23 +671786,23 @@ "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini": [ - "d97432ed39c5f161c4e6feeac5b954e63f17e73d", + "c7b3482c786fc4532488f388b802930ccea8dc0e", "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini": [ - "3adcbe6885645fbf3b8cb08e0133de836a3357f0", + "68ccafcec2a1dd55184d234071c809ce1fcc73d8", "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini": [ - "d01525b3cfa16083b00a07060935fe93450028fa", + "5d714dd77733edd0199535f0f1cb20a46237d6dd", "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini": [ - "a87d9f936fdbf5a9d1ac97352ee1417a06bc678a", + "40626b8193ecc99e3e5ec5fe181f5553bfd8473a", "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini": [ - "fe1bf469f4f07575469878ccfb9bedcad32fdca8", + "4f1939a431ae272024f62a4169bf8431efc2c5bb", "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/pause.html.ini": [ @@ -670090,7 +672722,7 @@ "support" ], "interfaces/webaudio.idl": [ - "674673d90b1e8fd3e6d182f25289948fc0290cac", + "9491090337c342fc06a35a97ee6dc6887829c1bc", "support" ], "interfaces/webauthn.idl": [ @@ -670126,7 +672758,7 @@ "support" ], "interfaces/webrtc.idl": [ - "e30fc38fd003a283ebb4184786d181c5b4293dc4", + "49ed6bb0333020a6eee8d5411ae88a4e3a7dbd9a", "support" ], "interfaces/webusb.idl": [ @@ -670762,11 +673394,11 @@ "testharness" ], "layout-instability/buffer-layout-shift.html": [ - "0cfce2f7124226cf4256284c1238ba1ef024c42b", + "b6a33f579b4009d1497fdc104c07633793d53f01", "testharness" ], "layout-instability/buffered-flag.html": [ - "dabc8068931ff3b15eb4b80481ed2102a7725a62", + "cd1260e3613f58c191688ab2f492647b0cc72c0c", "testharness" ], "layout-instability/clip-negative-bottom-margin.html": [ @@ -670797,10 +673429,6 @@ "36475d4c826c11807e9c0a7fbf4457c33c92c2c0", "testharness" ], - "layout-instability/observe-layout-shift.html": [ - "1c35fe2aa234c96fce8798e6a1c35362f418e6f1", - "testharness" - ], "layout-instability/partially-clipped-visual-rect.html": [ "3b18b98dd93312c37b9e2f25918df50266a09243", "testharness" @@ -670813,6 +673441,10 @@ "e2e7a911dc043bb21cebfd4a5b625795f3523a14", "testharness" ], + "layout-instability/recent-input.html": [ + "a4fa0d8b0d92a83984034926de30958b840c1028", + "testharness" + ], "layout-instability/resources/slow-image.py": [ "ee7988c551f6429eea2b929af083ad30cbd5c73d", "support" @@ -670826,11 +673458,11 @@ "testharness" ], "layout-instability/shift-into-viewport.html": [ - "6ace93ad54c2f6b173df060e39be097eca4b6867", + "61267a32648e0389dc32b8166fd1e8d2c1df2320", "testharness" ], "layout-instability/shift-outside-viewport.html": [ - "49242913760a76d124eac0eeb3de8bb4e8eb8a19", + "2d92835b88928fd6586fff00adb16c46308558e1", "testharness" ], "layout-instability/shift-while-scrolled.html": [ @@ -670850,7 +673482,7 @@ "testharness" ], "layout-instability/toJSON.html": [ - "3d39d623e13314b183463fa1c365df3a7b725243", + "374a7de0cd1c4d5d5b089b7d026c8eb5709e91f1", "testharness" ], "layout-instability/transform.html": [ @@ -670914,7 +673546,7 @@ "testharness" ], "lint.whitelist": [ - "d06f4c59bca28d01632cf693062a7d30ecbd5cc8", + "b5a8f80687044b596e449e357f7e731895b3a94d", "support" ], "loading/lazyload/META.yml": [ @@ -670945,6 +673577,14 @@ "76eef3a8f45c131bdbf90028f8bcad75be0e5f32", "testharness" ], + "loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html": [ + "a545410f9787a7e8650fcde54556f407bafffa83", + "testharness" + ], + "loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html": [ + "d316a6ae22bea4b4bf7a1b02ba21c24556923790", + "testharness" + ], "loading/lazyload/image-loading-lazy-load-event.tentative.html": [ "9e56a3150953494533d117841dcdd454aaa039f2", "testharness" @@ -670961,6 +673601,10 @@ "f7d887b18a228e648a5de45b890bfce371963cec", "testharness" ], + "loading/lazyload/move-element-and-scroll.tentative.html": [ + "f9d89807b8c5575982e4d28f156cb604ae0bbd8b", + "testharness" + ], "loading/lazyload/not-rendered-below-viewport-image-loading-lazy.tentative.html": [ "0c40d7dbcd832b379a3d8427f9390fca842439cd", "testharness" @@ -670993,6 +673637,10 @@ "58f8c3a4d5a1e21ce2afd9def3ab9b5870cc272f", "testharness" ], + "loading/lazyload/remove-element-and-scroll.tentative.html": [ + "53708ceac75fa3421c4ecc1a8b91034c5a91c396", + "testharness" + ], "loading/lazyload/resources/image.png": [ "b712825093805d1052b01047b1dbb102f0af8f0f", "support" @@ -676213,6 +678861,18 @@ "16c68c59b273663fb16847f121f38e03bb94cf19", "testharness" ], + "native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js": [ + "2c0299df12e9577261cce2f68d12a1bf744158c2", + "testharness" + ], + "native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js": [ + "0efacf9e607d990bccf185b7d84d5f45220338d8", + "testharness" + ], + "native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js": [ + "caf6fbd1c52a3cef603896f8ee98d9618e4dc92e", + "testharness" + ], "native-file-system/native_FileSystemWriter.tentative.https.manual.window.js": [ "25d8ee995857fa67be2c41f048e882ec473f739d", "testharness" @@ -676254,11 +678914,11 @@ "support" ], "native-file-system/resources/native-fs-test-helpers.js": [ - "5ad8c04724b7a2e7743b43a84efaa05b7e6b703d", + "bcdfd484cf2b8b12632c964e2b60a390c03c4225", "support" ], "native-file-system/resources/opaque-origin-sandbox.html": [ - "937a6c385de2fc16d4afa1fecb762e38f4e2131b", + "07301af1cfaf250e0da67de4021a86f12c7e42e8", "support" ], "native-file-system/resources/sandboxed-fs-test-helpers.js": [ @@ -676305,6 +678965,18 @@ "fb93858fe7934b27244fa0ff828eac75c34b6629", "testharness" ], + "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js": [ + "eed6a561dc40e658b6b6c8d51766cdacc42a024c", + "testharness" + ], + "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js": [ + "7ef0ea0ef82626eae74f152b94f898859aca6832", + "testharness" + ], + "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js": [ + "16dbbe6a808a603c9b81482f733dcf09e84670ff", + "testharness" + ], "native-file-system/sandboxed_FileSystemWriter.tentative.https.any.js": [ "8352e2487fe0823a2d353372757d833d85e98c4b", "testharness" @@ -676345,6 +679017,18 @@ "6b7d9f9a3171c96aaa2e1312451b3a9cac6c2e9b", "support" ], + "native-file-system/script-tests/FileSystemWritableFileStream-piped.js": [ + "59fc1e3d1362b3ec90e3ef7a4f0981bdd4a21340", + "support" + ], + "native-file-system/script-tests/FileSystemWritableFileStream-write.js": [ + "f14d79fd040a0e7fc7f19216fec1aec0ca23dec8", + "support" + ], + "native-file-system/script-tests/FileSystemWritableFileStream.js": [ + "5acf93aec8cee8ef3a8389979e2a402acf5cbc7f", + "support" + ], "native-file-system/script-tests/FileSystemWriter.js": [ "1c51d0b4eb771eec5a606263e72719be589aa317", "support" @@ -685037,6 +687721,10 @@ "70a16436a67f254372be5f861d83d9e9b66f895f", "testharness" ], + "portals/predecessor-fires-unload.html": [ + "6512195eaf613ad556a148d9136425aa20915648", + "testharness" + ], "portals/references/portals-rendering.html": [ "4a8414ab5656593811772c3728e4ee83eb034457", "support" @@ -685161,6 +687849,10 @@ "92aef00380ae4a6180039ad0b10169c81a190441", "support" ], + "portals/resources/predecessor-fires-unload-watch-unload.html": [ + "ada5a64967e9b169209b5cfede256c60ac3f8acc", + "support" + ], "portals/resources/simple-portal-adopts-and-activates-predecessor.html": [ "56bfd10f647fb63597dbc5ec902a8c2b90257b18", "support" @@ -698906,7 +701598,7 @@ "support" ], "resources/chromium/nfc-mock.js": [ - "7eee8ce04c4630ae82d2520def13cfa107b7ef13", + "2c1724b7592eb1d6e66177544998abbec70fbfe6", "support" ], "resources/chromium/sensor.mojom.js": [ @@ -698966,7 +701658,7 @@ "support" ], "resources/chromium/webxr-test.js": [ - "a819a3b425be2aabb83696acb6b26b69211c33dd", + "b45ff20dbc4ec9cf9fbcd36b8e3b7887ba512947", "support" ], "resources/chromium/webxr-test.js.headers": [ @@ -710798,7 +713490,7 @@ "support" ], "tools/requirements_mypy.txt": [ - "50afed2bb2dec184caee69a1074e428d115c5b40", + "f3a56a6dd715ac6d6b01057a609a3e470ba8e303", "support" ], "tools/runner/css/bootstrap-theme.min.css": [ @@ -715158,7 +717850,7 @@ "support" ], "tools/wptrunner/wptrunner/browsers/base.py": [ - "655344581973c15b657729feb736dd2073d79a30", + "fef052dd5ab495dad4342e086491723c761edcfd", "support" ], "tools/wptrunner/wptrunner/browsers/chrome.py": [ @@ -715186,15 +717878,15 @@ "support" ], "tools/wptrunner/wptrunner/browsers/epiphany.py": [ - "8a0e5f578b2feb871ddd50ab08168c6b9d45e4b0", + "f6c4c602a38c043637cf9dbc8bbb5350ec94527e", "support" ], "tools/wptrunner/wptrunner/browsers/firefox.py": [ - "0f8075337813783c76e4be4dec9cc931a4252c41", + "b6ee0f4998e9a2189cfca99b3cce1a6b11ea858c", "support" ], "tools/wptrunner/wptrunner/browsers/firefox_android.py": [ - "33b5d51e54e82adb6cdbe4612263bc30883dd108", + "fee528071f68843ab056f513295146685f8f78f4", "support" ], "tools/wptrunner/wptrunner/browsers/ie.py": [ @@ -715230,11 +717922,11 @@ "support" ], "tools/wptrunner/wptrunner/browsers/webkit.py": [ - "aa2862139450f682e6051c5f617ab8caf1960784", + "1be683ed26e43a9e10a1f82520811c33e90dad05", "support" ], "tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py": [ - "d735f3c0792a6356c6270143205c55b7c02eef47", + "d8b9744bd743e39ce19f008e7f40cbc80e80107c", "support" ], "tools/wptrunner/wptrunner/config.py": [ @@ -715242,7 +717934,7 @@ "support" ], "tools/wptrunner/wptrunner/environment.py": [ - "e79ae3750647f88bba44703181c208229800f658", + "7dcea4aeafabb9c481dccdc1aaf9bd153572bb7d", "support" ], "tools/wptrunner/wptrunner/executors/__init__.py": [ @@ -715270,7 +717962,7 @@ "support" ], "tools/wptrunner/wptrunner/executors/executormarionette.py": [ - "59f7e865a5b8711fa71c9c8955eca731e0048c3f", + "01306397db7944cd0dfadf8f1bf0327dbacf94d6", "support" ], "tools/wptrunner/wptrunner/executors/executoropera.py": [ @@ -715286,7 +717978,7 @@ "support" ], "tools/wptrunner/wptrunner/executors/executorservo.py": [ - "9cef1fb2d7f78e8729e51ff400b3df2402a2e94e", + "9eebfa59febf991bd41db25f2b02ea4c8c00195e", "support" ], "tools/wptrunner/wptrunner/executors/executorservodriver.py": [ @@ -715326,7 +718018,7 @@ "support" ], "tools/wptrunner/wptrunner/executors/test-wait.js": [ - "8a7edb79d62256eef63c71eabd450d42bce7c4d2", + "ad08ad7d76fb0299aadedb572193c38c5055e654", "support" ], "tools/wptrunner/wptrunner/executors/testharness_servodriver.js": [ @@ -715342,11 +718034,11 @@ "support" ], "tools/wptrunner/wptrunner/expectedtree.py": [ - "4d505086bd8d991c953c34d38d8e1fa0cb920f99", + "7521f25b1344f5c50b8182a2b7a68278858f9b47", "support" ], "tools/wptrunner/wptrunner/font.py": [ - "6647a8580be7ab4050bbd37593b2e6595bc3ac72", + "daf0a1c1bfa221aa47981d93239021e4aefa74a9", "support" ], "tools/wptrunner/wptrunner/formatters/__init__.py": [ @@ -715370,23 +718062,23 @@ "support" ], "tools/wptrunner/wptrunner/manifestexpected.py": [ - "eae85b1f6661a67dff59ef78a9ed627e3e3603d8", + "65b53f0ab97b581b2b71277bd8f260f79a1afb12", "support" ], "tools/wptrunner/wptrunner/manifestinclude.py": [ - "d302831a57abbaadd75fe49e094482dc14223ea3", + "79b5b19b3a3f617e5dd40118042da0b3ea8e4115", "support" ], "tools/wptrunner/wptrunner/manifestupdate.py": [ - "af9af18d90715d43bbcd2ae47ce76275bb0e1577", + "3cb1b5107924c4d897efccaf8f5de93df2311609", "support" ], "tools/wptrunner/wptrunner/metadata.py": [ - "c328dcefa7253ddea952549c702723e98b4cadc4", + "aafc7d52250f62fdcd7025858f2273290c77d49e", "support" ], "tools/wptrunner/wptrunner/products.py": [ - "e3117042709f99f4e0443dc0dfaf561ad0b548b0", + "abd84094bb33dbd13b3594a7acbe8467512a99ce", "support" ], "tools/wptrunner/wptrunner/stability.py": [ @@ -715418,7 +718110,7 @@ "support" ], "tools/wptrunner/wptrunner/testloader.py": [ - "fa54ca361576318cb35ec716a1a159bdb532e6c8", + "8fcf66d64ed9cec5979ae2ef3b02320d5782b818", "support" ], "tools/wptrunner/wptrunner/testrunner.py": [ @@ -715446,7 +718138,7 @@ "support" ], "tools/wptrunner/wptrunner/tests/test_expectedtree.py": [ - "2308be9590e9004f41a492682d187a7b4fc57231", + "d71237a42dad58c69b686e6040b65f40064c9437", "support" ], "tools/wptrunner/wptrunner/tests/test_formatters.py": [ @@ -715454,7 +718146,7 @@ "support" ], "tools/wptrunner/wptrunner/tests/test_manifestexpected.py": [ - "525915d1832ac8af1957a799615969e058eefca5", + "f3e4ce796a45c472a88fe022277e0347b4e98948", "support" ], "tools/wptrunner/wptrunner/tests/test_products.py": [ @@ -715466,15 +718158,15 @@ "support" ], "tools/wptrunner/wptrunner/tests/test_testloader.py": [ - "e857cd43db6d281f95414230f52c984aad915118", + "836003d106038ab4303035eecca31774c9a26ce1", "support" ], "tools/wptrunner/wptrunner/tests/test_update.py": [ - "5f199390b64f9d0843df7900cf624a9e674f3dd7", + "a24e4a733dae576bf82f5b6e17a7bbe3f6d351ef", "support" ], "tools/wptrunner/wptrunner/tests/test_wpttest.py": [ - "9bb3e1fd34e37c4430f752b87e4bb4e3bfa7f959", + "1a94a2f3303a7b5a1d5b2c553af6bbd1d8b45bc7", "support" ], "tools/wptrunner/wptrunner/update/__init__.py": [ @@ -715490,7 +718182,7 @@ "support" ], "tools/wptrunner/wptrunner/update/state.py": [ - "64dbf1180604cd8df7a468e036447f95b80371b0", + "f8a83525cbd4706bdfbc99a518d2bac123d34e96", "support" ], "tools/wptrunner/wptrunner/update/sync.py": [ @@ -715514,11 +718206,11 @@ "support" ], "tools/wptrunner/wptrunner/wptcommandline.py": [ - "923bdaa55857e793e8d6e8c587167360aed4ae94", + "91f1161b01b99f31ef1d3dde05333627bf4365b2", "support" ], "tools/wptrunner/wptrunner/wptlogging.py": [ - "69cee744879eb6780cb99ec93123922e166d9e16", + "444d1d962d25873109977b937d96c86cb293cd8f", "support" ], "tools/wptrunner/wptrunner/wptmanifest/__init__.py": [ @@ -715534,7 +718226,7 @@ "support" ], "tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py": [ - "a81ad9d06a144bff7f3cc9ed91a4260cd061b7fb", + "3b11e83012ab50fe0ea240ae056d02c8968b6a60", "support" ], "tools/wptrunner/wptrunner/wptmanifest/backends/static.py": [ @@ -715578,11 +718270,11 @@ "support" ], "tools/wptrunner/wptrunner/wptrunner.py": [ - "cac172a5940ec696e3a3b279170f9712aaf4668d", + "75ce104c7cee335afa2e86592caa2c4caa473bcf", "support" ], "tools/wptrunner/wptrunner/wpttest.py": [ - "67b57583424d08779114dc2fa030390e584d716f", + "d650e98dfbf5976afa0138f0ac166e950e194e82", "support" ], "tools/wptserve/.gitignore": [ @@ -715866,7 +718558,7 @@ "support" ], "tools/wptserve/wptserve/handlers.py": [ - "ca5118009cfc9c4763f99e2a6296d784a6539216", + "efc1a16a93225d033574a22f7ba81e7d3d50bfd9", "support" ], "tools/wptserve/wptserve/logger.py": [ @@ -715874,7 +718566,7 @@ "support" ], "tools/wptserve/wptserve/pipes.py": [ - "ceb34cc3f4f994ed049915c7784f7c69c712abca", + "e5d6e1c96db9c18020ed2b8aee23d41dd503509a", "support" ], "tools/wptserve/wptserve/ranges.py": [ @@ -721098,7 +723790,7 @@ "testharness" ], "wasm/jsapi/constructor/multi-value.any.js": [ - "7fbac5b24f1a50568170e257552bdc7a7783ae25", + "2c53e3611e044c8ba44a5c0436d4409bc9f1af42", "testharness" ], "wasm/jsapi/constructor/validate.any.js": [ @@ -721146,7 +723838,7 @@ "testharness" ], "wasm/jsapi/instanceTestFactory.js": [ - "7ccf06c234a7ce5c17353f3bd74565b66c289952", + "c81672f208b1505430dd1ee909afaf12d9b2db20", "support" ], "wasm/jsapi/interface.any.js": [ @@ -721174,7 +723866,7 @@ "testharness" ], "wasm/jsapi/module/customSections.any.js": [ - "8e9732e5512d3295c445c110e949905cec0efbe6", + "09355979d84ade5385e7b3a5ac265eaa0da500cf", "testharness" ], "wasm/jsapi/module/exports.any.js": [ @@ -721214,7 +723906,7 @@ "testharness" ], "wasm/jsapi/wasm-module-builder.js": [ - "09ff891f52e2b4e9dd80fbc88586129cd0a910b6", + "82c6e04135f1b86df1a1d8e72c5f829c3297bb10", "support" ], "wasm/resources/load_wasm.js": [ @@ -721726,7 +724418,7 @@ "support" ], "web-animations/timing-model/animations/reverse-running-animation.html": [ - "c5179a72c9dc83ce1c4426b5a844d61a039e250b", + "65f89b3e04c0b7ff6af221a100685fa71bcf7591", "reftest" ], "web-animations/timing-model/animations/reversing-an-animation.html": [ @@ -721742,7 +724434,7 @@ "testharness" ], "web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html": [ - "0522c43b16a881a14b339294e5ed56b8ae064f92", + "a1f9e4f3acea04337dd0147fbfa373f950a67409", "testharness" ], "web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html": [ @@ -721934,7 +724626,7 @@ "support" ], "web-nfc/NDEFMessage_constructor.https.html": [ - "1c842f5c7b61c35d09e2cd41014e1b8e04839624", + "4e53828c310976b5b37657f84a89f03c48e7bc59", "testharness" ], "web-nfc/NDEFReader-document-hidden-manual.https.html": [ @@ -721942,7 +724634,7 @@ "manual" ], "web-nfc/NDEFReader_scan.https.html": [ - "a9b1d7516173418243c630817eea22fd0bed2046", + "17b9fdb8569db230c3a3ded22e0258e4f73a69fc", "testharness" ], "web-nfc/NDEFReader_scan_filter.https.html": [ @@ -721954,11 +724646,11 @@ "testharness" ], "web-nfc/NDEFReadingEvent_constructor.https.html": [ - "cc56f8a18bdc6f7a0cde3f9f7246330f8e867dd6", + "5427b75ae2b6d0fa6c45b24af51b02a8737ffd0b", "testharness" ], "web-nfc/NDEFRecord_constructor.https.html": [ - "d46503ab172bf358bff005ce8c2c56941e333eea", + "2da7ca91078aa5ec8232f5347fb276618dad3c3c", "testharness" ], "web-nfc/NDEFWriter-document-hidden-manual.https.html": [ @@ -721966,7 +724658,7 @@ "manual" ], "web-nfc/NDEFWriter_push.https.html": [ - "a6050b8ff7112cc00ec29b596c992cafb3657b7e", + "cb6b3941410035c5c5736e13d59fbbfb85f0d4cc", "testharness" ], "web-nfc/README.md": [ @@ -725189,6 +727881,10 @@ "89f6b1b4d7a425f2d05688d14315227454a3d4be", "testharness" ], + "webrtc/RTCDataChannel-close.html": [ + "9f43dc93c5ba7917c327d642fa6883ff19d74cac", + "testharness" + ], "webrtc/RTCDataChannel-id.html": [ "0cf01976ff0eeb66c51ded321e777123f063b02c", "testharness" @@ -725214,7 +727910,7 @@ "testharness" ], "webrtc/RTCError.html": [ - "4d0726093c19c2828e59e7f61d2f65954c8075fc", + "9c7227521edeb8e9db1c744ce3f6a145bc66314b", "testharness" ], "webrtc/RTCIceCandidate-constructor.html": [ @@ -725261,8 +727957,12 @@ "09ad67751a73a6482415a6ff6c2dac70e049c82c", "testharness" ], + "webrtc/RTCPeerConnection-close.html": [ + "74f816bf3fc0c8970582216e82e9eedc3227def1", + "testharness" + ], "webrtc/RTCPeerConnection-connectionState.https.html": [ - "9ed5808727a6a293eedc705f40abdc7dc62f8eb4", + "a054a1e8cccbd02cc7b55f96ff483219846cf997", "testharness" ], "webrtc/RTCPeerConnection-constructor.html": [ @@ -725514,7 +728214,7 @@ "testharness" ], "webrtc/RTCRtpTransceiver.https.html": [ - "67571895175f19c008743523f035aa31fced9681", + "af84fe2498c9242f49639fa1bd55a4e848affbbf", "testharness" ], "webrtc/RTCSctpTransport-constructor.html": [ @@ -730390,13 +733090,17 @@ "support" ], "webxr/resources/webxr_test_asserts.js": [ - "863b994572441d0efdbe92dbd8aec29f9152069f", + "38f1364ce03ce96890cda97dcc226b8e472dd332", "support" ], "webxr/resources/webxr_test_constants.js": [ "3d9bfa2082baa90670131774920805a7f16cd5a2", "support" ], + "webxr/resources/webxr_test_constants_fake_world.js": [ + "0601f54fce994d027ae17dc958cee6d746440c35", + "support" + ], "webxr/resources/webxr_util.js": [ "85821d4d3d5d7fd953cace5e7ea7bacc9d3b7dab", "support" @@ -730522,7 +733226,7 @@ "testharness" ], "webxr/xrRigidTransform_inverse.https.html": [ - "a314f6b55a21b03abe5fb4ae0b32bc5c458e09f6", + "3098fb64936349e58aa6a919a8ec97d6334e5e02", "testharness" ], "webxr/xrRigidTransform_matrix.https.html": [ @@ -733730,7 +736434,7 @@ "support" ], "xhr/resources/parse-headers.py": [ - "fdc626539e842f6660f533a3684da72e719cef09", + "c661f22c3e9eb6eb8ded5c7160111221dc4ac319", "support" ], "xhr/resources/pass.txt": [ diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/has-instance.html.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/has-instance.html.ini deleted file mode 100644 index 8536f4d7c4a..00000000000 --- a/tests/wpt/metadata/WebIDL/ecmascript-binding/has-instance.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[has-instance.html] - type: testharness - [instanceof must return false across different globals, for platform objects] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-align/animation/column-gap-composition.html.ini b/tests/wpt/metadata/css/css-align/animation/column-gap-composition.html.ini new file mode 100644 index 00000000000..efdef9e8059 --- /dev/null +++ b/tests/wpt/metadata/css/css-align/animation/column-gap-composition.html.ini @@ -0,0 +1,61 @@ +[column-gap-composition.html] + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (0.5) should be [normal\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (0) should be [200px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (-0.3) should be [200px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (1) should be [normal\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (1.5) should be [normal\]] + expected: FAIL + + [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-align/animation/row-gap-composition.html.ini b/tests/wpt/metadata/css/css-align/animation/row-gap-composition.html.ini new file mode 100644 index 00000000000..ea7c97b7b94 --- /dev/null +++ b/tests/wpt/metadata/css/css-align/animation/row-gap-composition.html.ini @@ -0,0 +1,61 @@ +[row-gap-composition.html] + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (1) should be [normal\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (-0.3) should be [200px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (0) should be [200px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (0.5) should be [normal\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (1.5) should be [normal\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]] + expected: FAIL + + [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini new file mode 100644 index 00000000000..737e7291c6f --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini @@ -0,0 +1,64 @@ +[border-bottom-left-radius-composition.html] + [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]] + expected: FAIL + + [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini new file mode 100644 index 00000000000..1604dd021c5 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini @@ -0,0 +1,64 @@ +[border-bottom-right-radius-composition.html] + [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]] + expected: FAIL + + [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini new file mode 100644 index 00000000000..da3928e72bf --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini @@ -0,0 +1,169 @@ +[border-image-outset-composition.html] + [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1) should be [300 500 800 700\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1) should be [100px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.5) should be [50px 50\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1.25) should be [325 550 900 750\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0) should be [100px 150px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.75) should be [77 79 81px 83px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (1.25) should be [200px 250\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (1.25) should be [127 129 131px 133px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (1) should be [102 104 106px 108px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.75) should be [275 450 700 650\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (-0.25) should be [100 150px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.25) should be [27 29 31px 33px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1.25) should be [225 225px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1.25) should be [75px 75px 50px 50px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.5) should be [52 54 56px 58px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (-0.25) should be [125px 125\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.25) should be [100 150px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.25) should be [175px 175px 250px 250px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1) should be [200 200px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.75) should be [200px 250\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.75) should be [175px 225px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (-0.25) should be [75px 125px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.25) should be [225 350 500 550\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.75) should be [175 175px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.5) should be [150px 150px 200px 200px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.25) should be [125 125px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0) should be [100 100px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.25) should be [125px 175px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1.25) should be [0px 0\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0) should be [200 300 400 500\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.5) should be [150 150px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0) should be [2 4 6px 8px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.5) should be [250 400 600 600\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1) should be [0px 0\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0) should be [100 150px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.75) should be [25px 25\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0) should be [100px 100\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (-0.25) should be [75 75px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.75) should be [125px 125px 150px 150px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.5) should be [200px 250\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (-0.25) should be [175 250 300 450\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (-0.25) should be [225px 225px 350px 350px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1) should be [200px 250px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1.25) should be [225px 275px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (1) should be [200px 250\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0) should be [200px 200px 300px 300px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (-0.25) should be [0 0 0px 0px\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.25) should be [75px 75\]] + expected: FAIL + + [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.5) should be [150px 200px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini new file mode 100644 index 00000000000..3b247e9bf05 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini @@ -0,0 +1,169 @@ +[border-image-slice-composition.html] + [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.75) should be [125% 125% 150% 150%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.5) should be [150% 150% 200% 200%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (-0.25) should be [225% 225% 350% 350%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.75) should be [25% 25\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (1.25) should be [325 550 900 750 fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (1.25) should be [0% 0\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (-0.25) should be [75 75%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.25) should be [100 150%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.75) should be [200% 250% fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (1) should be [200 200%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.25) should be [225 350 500 550 fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (1.25) should be [200% 250% fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.5) should be [52 54 56% 58%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.5) should be [250 400 600 600 fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.25) should be [75% 75\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (-0.25) should be [100 150%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (1) should be [0% 0\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (1) should be [300 500 800 700 fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.5) should be [200% 250% fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (-0.25) should be [175 250 300 450 fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.25) should be [175% 175% 250% 250%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.5) should be [50% 50\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.75) should be [77 79 81% 83%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.75) should be [175 175%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.75) should be [200% 250\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (1.25) should be [75% 75% 50% 50%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.25) should be [27 29 31% 33%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (-0.25) should be [0 0 0% 0%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.25) should be [100% 150%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (1) should be [200% 250\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (1.25) should be [200% 250\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0) should be [2 4 6% 8%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0) should be [200 300 400 500 fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.5) should be [200% 250\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (1) should be [200% 250% fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0) should be [200% 200% 300% 300%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (1.25) should be [127 129 131% 133%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.5) should be [150 150%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (1) should be [100%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (-0.25) should be [125% 125\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0) should be [100 150%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (1.25) should be [225 225%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.25) should be [125 125%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0) should be [100% 100\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (-0.25) should be [100% 150%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (1) should be [102 104 106% 108%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.75) should be [275 450 700 650 fill\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0) should be [100% 150%\]] + expected: FAIL + + [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0) should be [100 100%\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini new file mode 100644 index 00000000000..82af1c481b6 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini @@ -0,0 +1,169 @@ +[border-image-width-composition.html] + [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (-0.25) should be [0 0 0px 0%\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.5) should be [52 54 56px 58%\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (1.25) should be [200% 250\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.25) should be [27 29 31px 33%\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1.25) should be [225px 275px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.25) should be [100 150px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.75) should be [175 175px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.75) should be [275 450 700 650\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.25) should be [175px 175px 250px 250px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.25) should be [225 350 500 550\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1.25) should be [75px 75px 50px 50px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (-0.25) should be [125px 125\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1.25) should be [225 225px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.5) should be [150px 200px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1) should be [0px 0\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1) should be [300 500 800 700\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.75) should be [125px 125px 150px 150px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1) should be [200px 250px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (-0.25) should be [75px 125px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (1) should be [102 104 106px 108%\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1) should be [200 200px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0) should be [2 4 6px 8%\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.25) should be [75px 75\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (-0.25) should be [225px 225px 350px 350px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.5) should be [200% 250\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1.25) should be [325 550 900 750\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (-0.25) should be [100 150px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0) should be [200px 200px 300px 300px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.25) should be [125 125px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (1) should be [200% 250\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.75) should be [175px 225px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.75) should be [200% 250\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.5) should be [250 400 600 600\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (1.25) should be [127 129 131px 133%\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (-0.25) should be [175 250 300 450\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.5) should be [150px 150px 200px 200px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1.25) should be [0px 0\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0) should be [100px 150px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.25) should be [125px 175px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.75) should be [77 79 81px 83%\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0) should be [200 300 400 500\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0) should be [100 150px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (-0.25) should be [75 75px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.5) should be [150 150px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0) should be [100 100px\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.75) should be [25px 25\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0) should be [100px 100\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.5) should be [50px 50\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]] + expected: FAIL + + [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1) should be [100px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini new file mode 100644 index 00000000000..25995a6b87f --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini @@ -0,0 +1,64 @@ +[border-top-left-radius-composition.html] + [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]] + expected: FAIL + + [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini new file mode 100644 index 00000000000..682ccbf3446 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini @@ -0,0 +1,64 @@ +[border-top-right-radius-composition.html] + [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]] + expected: FAIL + + [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-default.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-default.html.ini new file mode 100644 index 00000000000..057dabc0515 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-default.html.ini @@ -0,0 +1,2 @@ +[image-orientation-default.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html.ini new file mode 100644 index 00000000000..aa1989bb77c --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html.ini @@ -0,0 +1,2 @@ +[image-orientation-from-image-composited-dynamic1.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html.ini new file mode 100644 index 00000000000..5394b8fab7b --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html.ini @@ -0,0 +1,2 @@ +[image-orientation-from-image-composited-dynamic2.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited.html.ini new file mode 100644 index 00000000000..8a34587ad95 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited.html.ini @@ -0,0 +1,2 @@ +[image-orientation-from-image-composited.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-computed-style.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-computed-style.html.ini new file mode 100644 index 00000000000..57324a9b0df --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-computed-style.html.ini @@ -0,0 +1,4 @@ +[image-orientation-from-image-computed-style.html] + [image-orientation:from-image computed style reports correct values] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-content-images.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-content-images.html.ini new file mode 100644 index 00000000000..35dbe9c5b2c --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-content-images.html.ini @@ -0,0 +1,2 @@ +[image-orientation-from-image-content-images.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html.ini new file mode 100644 index 00000000000..ce44e995bf5 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html.ini @@ -0,0 +1,2 @@ +[image-orientation-from-image-dynamic1.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html.ini new file mode 100644 index 00000000000..f7ee1605d04 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html.ini @@ -0,0 +1,2 @@ +[image-orientation-from-image-dynamic2.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-image-document.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-image-document.html.ini new file mode 100644 index 00000000000..4b8e7851463 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-image-document.html.ini @@ -0,0 +1,2 @@ +[image-orientation-from-image-image-document.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image.html.ini new file mode 100644 index 00000000000..341fd5a2699 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image.html.ini @@ -0,0 +1,2 @@ +[image-orientation-from-image.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-computed-style.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-computed-style.html.ini new file mode 100644 index 00000000000..f0c6302697b --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-computed-style.html.ini @@ -0,0 +1,4 @@ +[image-orientation-none-computed-style.html] + [image-orientation:none computed style reports correct values] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-content-images.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-content-images.html.ini new file mode 100644 index 00000000000..8545087eb40 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-content-images.html.ini @@ -0,0 +1,2 @@ +[image-orientation-none-content-images.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-image-document.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-image-document.html.ini new file mode 100644 index 00000000000..dfbaa35f28c --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-image-document.html.ini @@ -0,0 +1,2 @@ +[image-orientation-none-image-document.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none.html.ini new file mode 100644 index 00000000000..262691575b2 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none.html.ini @@ -0,0 +1,2 @@ +[image-orientation-none.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini new file mode 100644 index 00000000000..e27601fb798 --- /dev/null +++ b/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini @@ -0,0 +1,46 @@ +[letter-spacing-composition.html] + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]] + expected: FAIL + + [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini new file mode 100644 index 00000000000..bf9cc8cda70 --- /dev/null +++ b/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini @@ -0,0 +1,94 @@ +[text-indent-composition.html] + [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0.6) should be [110px hanging each-line\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (1) should be [150px hanging\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0) should be [-100%\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0.3) should be [80px hanging each-line\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.6) should be [20%\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.3) should be [-40%\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0) should be [50px hanging each-line\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (1.5) should be [150px hanging\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0.6) should be [calc(100% + 110px)\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (1) should be [150px hanging each-line\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0.6) should be [180px\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (-0.3) should be [calc(100% + 20px)\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0.3) should be [calc(100% + 80px)\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (1.5) should be [200px hanging each-line\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (1.5) should be [200%\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (1) should be [100px\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0.6) should be [150px hanging\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0) should be [calc(100% + 50px)\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0.3) should be [240px\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (1.5) should be [0px\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (-0.3) should be [20px hanging each-line\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (1.5) should be [calc(100% + 200px)\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (-0.3) should be [300px each-line\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0) should be [300px\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (-0.3) should be [360px\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.5) should be [0%\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (1) should be [100%\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (-0.3) should be [-160%\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0) should be [300px each-line\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (1) should be [calc(100% + 150px)\]] + expected: FAIL + + [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0.3) should be [300px each-line\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini new file mode 100644 index 00000000000..def2fce15d0 --- /dev/null +++ b/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini @@ -0,0 +1,46 @@ +[word-spacing-composition.html] + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]] + expected: FAIL + + [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-ui/animation/caret-color-composition.html.ini b/tests/wpt/metadata/css/css-ui/animation/caret-color-composition.html.ini new file mode 100644 index 00000000000..ae82fda3148 --- /dev/null +++ b/tests/wpt/metadata/css/css-ui/animation/caret-color-composition.html.ini @@ -0,0 +1,31 @@ +[caret-color-composition.html] + [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (-0.3) should be [rgb(120, 120, 120)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (1.5) should be [rgb(250, 250, 250)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (-0.3) should be [rgb(70, 70, 70)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (0) should be [rgb(100, 100, 100)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (1) should be [rgb(200, 200, 200)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (0.5) should be [rgb(200, 200, 200)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (0.5) should be [rgb(150, 150, 150)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (1.5) should be [rgb(255, 255, 255)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (0) should be [rgb(150, 150, 150)\]] + expected: FAIL + + [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (1) should be [rgb(250, 250, 250)\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-ui/animation/outline-offset-composition.html.ini b/tests/wpt/metadata/css/css-ui/animation/outline-offset-composition.html.ini new file mode 100644 index 00000000000..ebb722b54a0 --- /dev/null +++ b/tests/wpt/metadata/css/css-ui/animation/outline-offset-composition.html.ini @@ -0,0 +1,61 @@ +[outline-offset-composition.html] + [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (1.5) should be [calc(-50px + 40em)\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (0) should be [calc(100px + 10em)\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (0.5) should be [calc(50px + 20em)\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (-0.3) should be [calc(130px + 4em)\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (1) should be [30em\]] + expected: FAIL + + [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-ui/animation/outline-width-composition.html.ini b/tests/wpt/metadata/css/css-ui/animation/outline-width-composition.html.ini new file mode 100644 index 00000000000..307f72aadda --- /dev/null +++ b/tests/wpt/metadata/css/css-ui/animation/outline-width-composition.html.ini @@ -0,0 +1,79 @@ +[outline-width-composition.html] + [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (0) should be [calc(100px + 10em)\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (-0.3) should be [19px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (1) should be [30em\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (1.5) should be [1px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (2) should be [0px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (0.5) should be [calc(50px + 20em)\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (0.5) should be [11px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (1) should be [6px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (1.5) should be [calc(-50px + 40em)\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (0) should be [16px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (-0.3) should be [calc(130px + 4em)\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]] + expected: FAIL + + [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/CaretPosition-001.html.ini b/tests/wpt/metadata/css/cssom-view/CaretPosition-001.html.ini new file mode 100644 index 00000000000..4c79907309b --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/CaretPosition-001.html.ini @@ -0,0 +1,4 @@ +[CaretPosition-001.html] + [Element at (400, 100)] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini new file mode 100644 index 00000000000..e38782d8c85 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini @@ -0,0 +1,4 @@ +[elementFromPoint-001.html] + [CSSOM View - 5 - extensions to the Document interface] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini b/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini new file mode 100644 index 00000000000..8ff7d008595 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini @@ -0,0 +1,4 @@ +[getClientRects-inline-inline-child.html] + [sub element in a child inline box should not be included] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini index 0fcea9e70f7..7459d90358e 100644 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini +++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini @@ -1,2 +1,973 @@ [getComputedStyle-insets-absolute.html] - expected: TIMEOUT + [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini index e46b9c445e0..dd428b03af0 100644 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini +++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini @@ -1,2 +1,973 @@ [getComputedStyle-insets-fixed.html] - expected: TIMEOUT + [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-nobox.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-nobox.html.ini deleted file mode 100644 index 7ca66dc0456..00000000000 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-nobox.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[getComputedStyle-insets-nobox.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini index 623f02a9f9a..60a7cddb8e3 100644 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini +++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini @@ -1,2 +1,757 @@ [getComputedStyle-insets-relative.html] - expected: TIMEOUT + [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-static.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-static.html.ini deleted file mode 100644 index 555f2b80aae..00000000000 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-static.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[getComputedStyle-insets-static.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini index 41718a2bea7..ad55e43fe66 100644 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini +++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini @@ -1,2 +1,757 @@ [getComputedStyle-insets-sticky-container-for-abspos.html] - expected: TIMEOUT + [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini index 4723e4371f4..a9bd906e52d 100644 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini +++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini @@ -1,2 +1,757 @@ [getComputedStyle-insets-sticky.html] - expected: TIMEOUT + [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels] + expected: FAIL + + [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels] + expected: FAIL + + [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is] + expected: FAIL + + [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is] + expected: FAIL + + [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels] + expected: FAIL + + [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is] + expected: FAIL + + [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels] + expected: FAIL + + [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels] + expected: FAIL + diff --git a/tests/wpt/metadata/custom-elements/Document-createElement.html.ini b/tests/wpt/metadata/custom-elements/Document-createElement.html.ini index 228fc09afd7..ef2a2e288c1 100644 --- a/tests/wpt/metadata/custom-elements/Document-createElement.html.ini +++ b/tests/wpt/metadata/custom-elements/Document-createElement.html.ini @@ -1,10 +1,3 @@ [Document-createElement.html] - [document.createElement with unknown "is" value should create "undefined" state element] - expected: FAIL - [document.createElement must create an instance of autonomous custom elements when it has is attribute] expected: FAIL - - [document.createElement()'s second argument is to be ignored when it's a string] - expected: FAIL - diff --git a/tests/wpt/metadata/custom-elements/Document-createElementNS.html.ini b/tests/wpt/metadata/custom-elements/Document-createElementNS.html.ini deleted file mode 100644 index eca647d1fac..00000000000 --- a/tests/wpt/metadata/custom-elements/Document-createElementNS.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[Document-createElementNS.html] - [document.createElementNS()'s third argument is to be ignored when it's a string] - expected: FAIL - diff --git a/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini b/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini index 92de0b6d054..196dd3decbd 100644 --- a/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini +++ b/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini @@ -8,437 +8,221 @@ [a: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [a: innerHTML should instantiate a customized built-in element] - expected: FAIL [abbr: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [abbr: innerHTML should instantiate a customized built-in element] - expected: FAIL [address: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [address: innerHTML should instantiate a customized built-in element] - expected: FAIL [area: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [area: innerHTML should instantiate a customized built-in element] - expected: FAIL [article: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [article: innerHTML should instantiate a customized built-in element] - expected: FAIL [aside: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [aside: innerHTML should instantiate a customized built-in element] - expected: FAIL [audio: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [audio: innerHTML should instantiate a customized built-in element] - expected: FAIL [b: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [b: innerHTML should instantiate a customized built-in element] - expected: FAIL [base: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [base: innerHTML should instantiate a customized built-in element] - expected: FAIL [bdi: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [bdi: innerHTML should instantiate a customized built-in element] - expected: FAIL [bdo: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [bdo: innerHTML should instantiate a customized built-in element] - expected: FAIL [blockquote: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [blockquote: innerHTML should instantiate a customized built-in element] - expected: FAIL [body: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [body: document parser should instantiate a customized built-in element] - expected: FAIL [br: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [br: innerHTML should instantiate a customized built-in element] - expected: FAIL [button: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [button: innerHTML should instantiate a customized built-in element] - expected: FAIL [canvas: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [canvas: innerHTML should instantiate a customized built-in element] - expected: FAIL [caption: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [caption: innerHTML should instantiate a customized built-in element] - expected: FAIL [cite: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [cite: innerHTML should instantiate a customized built-in element] - expected: FAIL [code: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [code: innerHTML should instantiate a customized built-in element] - expected: FAIL [col: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [col: innerHTML should instantiate a customized built-in element] - expected: FAIL [colgroup: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [colgroup: innerHTML should instantiate a customized built-in element] - expected: FAIL [data: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [data: innerHTML should instantiate a customized built-in element] - expected: FAIL [datalist: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [datalist: innerHTML should instantiate a customized built-in element] - expected: FAIL [dd: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [dd: innerHTML should instantiate a customized built-in element] - expected: FAIL [del: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [del: innerHTML should instantiate a customized built-in element] - expected: FAIL [details: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [details: innerHTML should instantiate a customized built-in element] - expected: FAIL [dfn: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [dfn: innerHTML should instantiate a customized built-in element] - expected: FAIL [dialog: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [dialog: innerHTML should instantiate a customized built-in element] - expected: FAIL [div: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [div: innerHTML should instantiate a customized built-in element] - expected: FAIL [dl: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [dl: innerHTML should instantiate a customized built-in element] - expected: FAIL [dt: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [dt: innerHTML should instantiate a customized built-in element] - expected: FAIL [em: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [em: innerHTML should instantiate a customized built-in element] - expected: FAIL [embed: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [embed: innerHTML should instantiate a customized built-in element] - expected: FAIL [fieldset: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [fieldset: innerHTML should instantiate a customized built-in element] - expected: FAIL [figcaption: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [figcaption: innerHTML should instantiate a customized built-in element] - expected: FAIL [figure: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [figure: innerHTML should instantiate a customized built-in element] - expected: FAIL [footer: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [footer: innerHTML should instantiate a customized built-in element] - expected: FAIL [form: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [form: innerHTML should instantiate a customized built-in element] - expected: FAIL [h1: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [h1: innerHTML should instantiate a customized built-in element] - expected: FAIL [h2: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [h2: innerHTML should instantiate a customized built-in element] - expected: FAIL [h3: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [h3: innerHTML should instantiate a customized built-in element] - expected: FAIL [h4: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [h4: innerHTML should instantiate a customized built-in element] - expected: FAIL [h5: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [h5: innerHTML should instantiate a customized built-in element] - expected: FAIL [h6: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [h6: innerHTML should instantiate a customized built-in element] - expected: FAIL [header: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [header: innerHTML should instantiate a customized built-in element] - expected: FAIL [hgroup: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [hgroup: innerHTML should instantiate a customized built-in element] - expected: FAIL [hr: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [hr: innerHTML should instantiate a customized built-in element] - expected: FAIL [html: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [html: document parser should instantiate a customized built-in element] - expected: FAIL [i: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [i: innerHTML should instantiate a customized built-in element] - expected: FAIL [iframe: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [iframe: innerHTML should instantiate a customized built-in element] - expected: FAIL [img: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [img: innerHTML should instantiate a customized built-in element] - expected: FAIL [input: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [input: innerHTML should instantiate a customized built-in element] - expected: FAIL [ins: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [ins: innerHTML should instantiate a customized built-in element] - expected: FAIL [kbd: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [kbd: innerHTML should instantiate a customized built-in element] - expected: FAIL [label: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [label: innerHTML should instantiate a customized built-in element] - expected: FAIL [legend: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [legend: innerHTML should instantiate a customized built-in element] - expected: FAIL [li: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [li: innerHTML should instantiate a customized built-in element] - expected: FAIL [link: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [link: innerHTML should instantiate a customized built-in element] - expected: FAIL [main: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [main: innerHTML should instantiate a customized built-in element] - expected: FAIL [map: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [map: innerHTML should instantiate a customized built-in element] - expected: FAIL [mark: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [mark: innerHTML should instantiate a customized built-in element] - expected: FAIL [menu: Define a customized built-in element] expected: FAIL [meta: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [meta: innerHTML should instantiate a customized built-in element] - expected: FAIL [meter: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [meter: innerHTML should instantiate a customized built-in element] - expected: FAIL [nav: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [nav: innerHTML should instantiate a customized built-in element] - expected: FAIL [noscript: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [noscript: innerHTML should instantiate a customized built-in element] - expected: FAIL [object: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [object: innerHTML should instantiate a customized built-in element] - expected: FAIL [ol: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [ol: innerHTML should instantiate a customized built-in element] - expected: FAIL [optgroup: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [optgroup: innerHTML should instantiate a customized built-in element] - expected: FAIL [option: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [option: innerHTML should instantiate a customized built-in element] - expected: FAIL [output: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [output: innerHTML should instantiate a customized built-in element] - expected: FAIL [p: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [p: innerHTML should instantiate a customized built-in element] - expected: FAIL [param: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [param: innerHTML should instantiate a customized built-in element] - expected: FAIL [picture: Define a customized built-in element] expected: FAIL [pre: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [pre: innerHTML should instantiate a customized built-in element] - expected: FAIL [progress: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [progress: innerHTML should instantiate a customized built-in element] - expected: FAIL [q: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [q: innerHTML should instantiate a customized built-in element] - expected: FAIL [rp: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [rp: innerHTML should instantiate a customized built-in element] - expected: FAIL [rt: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [rt: innerHTML should instantiate a customized built-in element] - expected: FAIL [ruby: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [ruby: innerHTML should instantiate a customized built-in element] - expected: FAIL [s: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [s: innerHTML should instantiate a customized built-in element] - expected: FAIL [samp: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [samp: innerHTML should instantiate a customized built-in element] - expected: FAIL [script: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [script: innerHTML should instantiate a customized built-in element] - expected: FAIL [section: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [section: innerHTML should instantiate a customized built-in element] - expected: FAIL [select: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [select: innerHTML should instantiate a customized built-in element] - expected: FAIL [small: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [small: innerHTML should instantiate a customized built-in element] - expected: FAIL [source: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [source: innerHTML should instantiate a customized built-in element] - expected: FAIL [span: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [span: innerHTML should instantiate a customized built-in element] - expected: FAIL [strong: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [strong: innerHTML should instantiate a customized built-in element] - expected: FAIL [style: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [style: innerHTML should instantiate a customized built-in element] - expected: FAIL [sub: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [sub: innerHTML should instantiate a customized built-in element] - expected: FAIL [summary: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [summary: innerHTML should instantiate a customized built-in element] - expected: FAIL [sup: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [sup: innerHTML should instantiate a customized built-in element] - expected: FAIL [table: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [table: innerHTML should instantiate a customized built-in element] - expected: FAIL [tbody: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [tbody: innerHTML should instantiate a customized built-in element] - expected: FAIL [td: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [td: innerHTML should instantiate a customized built-in element] - expected: FAIL [template: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [template: innerHTML should instantiate a customized built-in element] - expected: FAIL [textarea: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [textarea: innerHTML should instantiate a customized built-in element] - expected: FAIL [tfoot: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [tfoot: innerHTML should instantiate a customized built-in element] - expected: FAIL [th: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [th: innerHTML should instantiate a customized built-in element] - expected: FAIL [thead: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [thead: innerHTML should instantiate a customized built-in element] - expected: FAIL [time: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [time: innerHTML should instantiate a customized built-in element] - expected: FAIL [title: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [title: innerHTML should instantiate a customized built-in element] - expected: FAIL [tr: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [tr: innerHTML should instantiate a customized built-in element] - expected: FAIL [track: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [track: innerHTML should instantiate a customized built-in element] - expected: FAIL [u: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [u: innerHTML should instantiate a customized built-in element] - expected: FAIL [ul: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [ul: innerHTML should instantiate a customized built-in element] - expected: FAIL [var: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [var: innerHTML should instantiate a customized built-in element] - expected: FAIL [video: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [video: innerHTML should instantiate a customized built-in element] - expected: FAIL [wbr: Operator 'new' should instantiate a customized built-in element] expected: FAIL - [wbr: innerHTML should instantiate a customized built-in element] - expected: FAIL diff --git a/tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini b/tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini index 3c538145973..f38f6bafb44 100644 --- a/tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini +++ b/tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini @@ -1,16 +1,4 @@ [upgrade.html] - [Upgrading an element directly (example from the spec)] - expected: FAIL - - [Two elements as children of the upgraded node] - expected: FAIL - - [Two elements as descendants of the upgraded node] - expected: FAIL - [Two elements as shadow-including descendants (and not descendants) of the upgraded node] expected: FAIL - [Elements inside a template contents DocumentFragment node] - expected: FAIL - diff --git a/tests/wpt/metadata/custom-elements/upgrading.html.ini b/tests/wpt/metadata/custom-elements/upgrading.html.ini index 8f4577d5b77..e8aee585a04 100644 --- a/tests/wpt/metadata/custom-elements/upgrading.html.ini +++ b/tests/wpt/metadata/custom-elements/upgrading.html.ini @@ -5,3 +5,9 @@ [If definition's disable shadow is true and element's shadow root is non-null, then throw a "NotSupportedError" DOMException.] expected: FAIL + [Infinite constructor recursion with upgrade(this) should not be possible] + expected: FAIL + + [Infinite constructor recursion with appendChild should not be possible] + expected: FAIL + diff --git a/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini b/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini index 589b0d6ff32..e7c91ebb270 100644 --- a/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini +++ b/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini @@ -1,7 +1,4 @@ [Document-importNode.html] - [built-in: document.importNode() should import "undefined" custom elements successfully] - expected: FAIL - [Document-importNode] expected: FAIL diff --git a/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini b/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini deleted file mode 100644 index 503570bcb71..00000000000 --- a/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[Node-cloneNode.html] - [Node.prototype.cloneNode(false) must be able to clone as a customized built-in element when it has an inconsistent "is" attribute] - expected: FAIL diff --git a/tests/wpt/metadata/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html.ini b/tests/wpt/metadata/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html.ini new file mode 100644 index 00000000000..8ab70585687 --- /dev/null +++ b/tests/wpt/metadata/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html.ini @@ -0,0 +1,2 @@ +[remove-from-shadow-host-and-adopt-into-iframe.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.any.js.ini b/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.any.js.ini deleted file mode 100644 index 05bb2f4b081..00000000000 --- a/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.any.js.ini +++ /dev/null @@ -1,23 +0,0 @@ -[request-forbidden-headers.any.html] - type: testharness - [Accept-Encoding is a forbidden request header] - expected: FAIL - - [Access-Control-Request-Headers is a forbidden request header] - expected: FAIL - - [Access-Control-Request-Method is a forbidden request header] - expected: FAIL - - -[request-forbidden-headers.any.worker.html] - type: testharness - [Accept-Encoding is a forbidden request header] - expected: FAIL - - [Access-Control-Request-Headers is a forbidden request header] - expected: FAIL - - [Access-Control-Request-Method is a forbidden request header] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini b/tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini index d366c5a617b..c196a28ec0f 100644 --- a/tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini +++ b/tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini @@ -48,15 +48,6 @@ [fetch() with value %08] expected: FAIL - [fetch() with value %09] - expected: FAIL - - [fetch() with value %0A] - expected: FAIL - - [fetch() with value %0D] - expected: FAIL - [XMLHttpRequest with value %0E] expected: FAIL @@ -164,7 +155,3 @@ [fetch() with value %1F] expected: FAIL - - [fetch() with value %20] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini b/tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini index 64af50663e8..cd59efee25a 100644 --- a/tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini +++ b/tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini @@ -1,10 +1,4 @@ [headers-no-cors.window.html] - ["no-cors" Headers object cannot have accept-language/\x01 as header] - expected: FAIL - - ["no-cors" Headers object cannot have content-language/\x01 as header] - expected: FAIL - ["no-cors" Headers object cannot have content-type set to text/plain;ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, text/plain] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/request/request-headers.html.ini b/tests/wpt/metadata/fetch/api/request/request-headers.html.ini deleted file mode 100644 index 58f805ae0c8..00000000000 --- a/tests/wpt/metadata/fetch/api/request/request-headers.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[request-headers.html] - type: testharness - [Testing empty Request Content-Type header] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini b/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini index d5d77c14514..3340acba7e7 100644 --- a/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini +++ b/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini @@ -3,9 +3,6 @@ [Read Response's body as readableStream] expected: FAIL - [Testing empty Response Content-Type header] - expected: FAIL - [Testing null Response body] expected: FAIL diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini index a424798d044..52662ab4ad3 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -1,7 +1,7 @@ [response.window.html] expected: TIMEOUT [fetch(): combined response Content-Type: text/plain ] - expected: FAIL + expected: NOTRUN [Response: combined response Content-Type: text/plain;charset=gbk text/plain;charset=windows-1252] expected: NOTRUN @@ -64,7 +64,7 @@ expected: NOTRUN [fetch(): combined response Content-Type: text/html text/plain] - expected: FAIL + expected: NOTRUN [Request: combined response Content-Type: text/html;charset=gbk text/plain text/html] expected: NOTRUN @@ -76,13 +76,13 @@ expected: NOTRUN [Response: combined response Content-Type: text/plain ] - expected: FAIL + expected: NOTRUN [fetch(): combined response Content-Type: text/plain;charset=gbk text/plain] expected: NOTRUN [Request: combined response Content-Type: text/html text/plain] - expected: FAIL + expected: NOTRUN [<iframe>: combined response Content-Type: text/plain;charset=gbk text/html;charset=windows-1254] expected: FAIL @@ -115,7 +115,7 @@ expected: NOTRUN [Response: combined response Content-Type: text/html text/plain] - expected: TIMEOUT + expected: NOTRUN [<iframe>: combined response Content-Type: text/plain;charset=gbk text/plain] expected: FAIL @@ -139,7 +139,7 @@ expected: FAIL [Response: combined response Content-Type: text/plain] - expected: FAIL + expected: TIMEOUT [<iframe>: combined response Content-Type: text/plain;charset=gbk text/plain;charset=windows-1252] expected: FAIL @@ -235,7 +235,7 @@ expected: FAIL [Request: combined response Content-Type: text/plain ] - expected: FAIL + expected: NOTRUN [Response: combined response Content-Type: text/html */*;charset=gbk] expected: NOTRUN @@ -271,7 +271,7 @@ expected: FAIL [fetch(): separate response Content-Type: text/html text/plain] - expected: FAIL + expected: NOTRUN [Request: combined response Content-Type: text/html;" text/plain] expected: NOTRUN @@ -309,28 +309,25 @@ [<iframe>: separate response Content-Type: */* text/html] expected: FAIL - [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html] - expected: FAIL - - [<iframe>: combined response Content-Type: text/html */*;charset=gbk] - expected: FAIL - - [<iframe>: combined response Content-Type: */* text/html] + [<iframe>: separate response Content-Type: text/html */*;charset=gbk] expected: FAIL - [<iframe>: combined response Content-Type: text/html;" \\" text/plain] + [<iframe>: combined response Content-Type: text/html;x=" text/plain] expected: FAIL [<iframe>: combined response Content-Type: text/html;" text/plain] expected: FAIL - [<iframe>: separate response Content-Type: text/html */*;charset=gbk] + [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html] expected: FAIL - [<iframe>: separate response Content-Type: text/plain */*] + [fetch(): separate response Content-Type: text/plain ] + expected: NOTRUN + + [<iframe>: combined response Content-Type: */* text/html] expected: FAIL - [<iframe>: combined response Content-Type: text/plain;charset=gbk text/html] + [<iframe>: separate response Content-Type: text/html */*] expected: FAIL [<iframe>: separate response Content-Type: text/html;" \\" text/plain] diff --git a/tests/wpt/metadata/fetch/h1-parsing/resources-with-0x00-in-header.window.js.ini b/tests/wpt/metadata/fetch/h1-parsing/resources-with-0x00-in-header.window.js.ini new file mode 100644 index 00000000000..9b4906adfc8 --- /dev/null +++ b/tests/wpt/metadata/fetch/h1-parsing/resources-with-0x00-in-header.window.js.ini @@ -0,0 +1,4 @@ +[resources-with-0x00-in-header.window.html] + [Expect network error for frame navigation to resource with 0x00 in a header] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini index 87c807a49ff..536384f36e1 100644 --- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini @@ -11,3 +11,6 @@ [X-Content-Type-Options%3A%20nosniff%0C] expected: FAIL + [X-Content-Type-Options%3A%20%2Cnosniff] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini b/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini index 80ebd73cb00..0cb858e8b2e 100644 --- a/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini +++ b/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini @@ -8,14 +8,11 @@ expected: FAIL [Embedded credentials are treated as network errors in new windows.] - expected: TIMEOUT + expected: FAIL [Embedded credentials matching the top-level are treated as network errors for cross-origin URLs.] expected: TIMEOUT - [Embedded credentials matching the top-level are not treated as network errors for same-origin URLs.] - expected: TIMEOUT - [Embedded credentials matching the top-level are not treated as network errors for relative URLs.] expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini deleted file mode 100644 index 87b07c3e670..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_1.html] - [Multiple history traversals from the same task] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini index 75d75b4cda2..385376c7321 100644 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini @@ -1,4 +1,4 @@ -[traverse_the_history_2.html] +[traverse_the_history_4.html] [Multiple history traversals, last would be aborted] expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html.ini b/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html.ini new file mode 100644 index 00000000000..684b01a4733 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html.ini @@ -0,0 +1,4 @@ +[cross-origin-due-to-document-domain-only.html] + [Cross-origin due to document.domain] + expected: FAIL + diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini index c026f0614c0..0a7f3af6a0f 100644 --- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini +++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini @@ -62,9 +62,6 @@ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type] expected: FAIL - [CustomElementRegistry interface: operation upgrade(Node)] - expected: FAIL - [OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled] expected: FAIL @@ -2106,9 +2103,6 @@ [HTMLSelectElement interface: attribute willValidate] expected: FAIL - [HTMLOptionElement interface: named constructor] - expected: FAIL - [HTMLMarqueeElement interface: attribute hspace] expected: FAIL @@ -2253,9 +2247,6 @@ [HTMLInputElement interface: createInput("url") must inherit property "checkValidity()" with the proper type] expected: FAIL - [HTMLOptionElement interface: named constructor prototype property] - expected: FAIL - [HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type] expected: FAIL @@ -2916,9 +2907,6 @@ [HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type] expected: FAIL - [HTMLScriptElement interface: attribute noModule] - expected: FAIL - [HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(long)" with the proper type] expected: FAIL @@ -3147,9 +3135,6 @@ [HTMLInputElement interface: calling stepDown(long) on createInput("password") with too few arguments must throw TypeError] expected: FAIL - [HTMLOptionElement interface: named constructor object] - expected: FAIL - [HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type] expected: FAIL @@ -3261,9 +3246,6 @@ [HTMLMarqueeElement interface: attribute bgColor] expected: FAIL - [Stringification of new Option()] - expected: FAIL - [HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type] expected: FAIL @@ -3309,9 +3291,6 @@ [HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type] expected: FAIL - [HTMLOptionElement interface: new Option() must inherit property "label" with the proper type] - expected: FAIL - [HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type] expected: FAIL @@ -3348,9 +3327,6 @@ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type] expected: FAIL - [HTMLOptionElement interface: new Option() must inherit property "form" with the proper type] - expected: FAIL - [HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity()" with the proper type] expected: FAIL @@ -3441,9 +3417,6 @@ [HTMLSelectElement interface: operation setCustomValidity(DOMString)] expected: FAIL - [HTMLOptionElement interface: named constructor name] - expected: FAIL - [HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type] expected: FAIL @@ -3456,9 +3429,6 @@ [HTMLTableElement interface: attribute rules] expected: FAIL - [HTMLOptionElement interface: named constructor length] - expected: FAIL - [HTMLInputElement interface: createInput("email") must inherit property "stepUp(long)" with the proper type] expected: FAIL @@ -3744,9 +3714,6 @@ [HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type] expected: FAIL - [HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type] - expected: FAIL - [HTMLFieldSetElement interface: attribute name] expected: FAIL @@ -3828,9 +3795,6 @@ [HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type] expected: FAIL - [HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type] - expected: FAIL - [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type] expected: FAIL @@ -3963,9 +3927,6 @@ [HTMLAreaElement interface: attribute noHref] expected: FAIL - [HTMLOptionElement interface: new Option() must inherit property "value" with the proper type] - expected: FAIL - [HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type] expected: FAIL @@ -4182,9 +4143,6 @@ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type] expected: FAIL - [HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type] - expected: FAIL - [HTMLElement interface: attribute contentEditable] expected: FAIL @@ -4290,9 +4248,6 @@ [HTMLFormElement interface: document.createElement("form") must inherit property "rel" with the proper type] expected: FAIL - [HTMLOptionElement must be primary interface of new Option()] - expected: FAIL - [HTMLIFrameElement interface: attribute allowPaymentRequest] expected: FAIL @@ -4350,9 +4305,6 @@ [HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type] expected: FAIL - [HTMLOptionElement interface: new Option() must inherit property "text" with the proper type] - expected: FAIL - [HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type] expected: FAIL @@ -4521,9 +4473,6 @@ [HTMLMediaElement interface: operation getStartDate()] expected: FAIL - [HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type] - expected: FAIL - [HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type] expected: FAIL @@ -5028,3 +4977,6 @@ [SVGAElement includes HTMLHyperlinkElementUtils: member names are unique] expected: FAIL + [HTMLOptionElement interface: named constructor without 'new'] + expected: FAIL + diff --git a/tests/wpt/metadata/html/dom/reflection-misc.html.ini b/tests/wpt/metadata/html/dom/reflection-misc.html.ini index 4a991afe689..9ff7bf5a98b 100644 --- a/tests/wpt/metadata/html/dom/reflection-misc.html.ini +++ b/tests/wpt/metadata/html/dom/reflection-misc.html.ini @@ -17610,102 +17610,6 @@ [script.nonce: IDL set to object "test-valueOf"] expected: FAIL - [script.noModule: typeof IDL attribute] - expected: FAIL - - [script.noModule: IDL get with DOM attribute unset] - expected: FAIL - - [script.noModule: setAttribute() to ""] - expected: FAIL - - [script.noModule: setAttribute() to " foo "] - expected: FAIL - - [script.noModule: setAttribute() to undefined] - expected: FAIL - - [script.noModule: setAttribute() to null] - expected: FAIL - - [script.noModule: setAttribute() to 7] - expected: FAIL - - [script.noModule: setAttribute() to 1.5] - expected: FAIL - - [script.noModule: setAttribute() to true] - expected: FAIL - - [script.noModule: setAttribute() to false] - expected: FAIL - - [script.noModule: setAttribute() to object "[object Object\]"] - expected: FAIL - - [script.noModule: setAttribute() to NaN] - expected: FAIL - - [script.noModule: setAttribute() to Infinity] - expected: FAIL - - [script.noModule: setAttribute() to -Infinity] - expected: FAIL - - [script.noModule: setAttribute() to "\\0"] - expected: FAIL - - [script.noModule: setAttribute() to object "test-toString"] - expected: FAIL - - [script.noModule: setAttribute() to object "test-valueOf"] - expected: FAIL - - [script.noModule: setAttribute() to "noModule"] - expected: FAIL - - [script.noModule: IDL set to ""] - expected: FAIL - - [script.noModule: IDL set to " foo "] - expected: FAIL - - [script.noModule: IDL set to undefined] - expected: FAIL - - [script.noModule: IDL set to null] - expected: FAIL - - [script.noModule: IDL set to 7] - expected: FAIL - - [script.noModule: IDL set to 1.5] - expected: FAIL - - [script.noModule: IDL set to false] - expected: FAIL - - [script.noModule: IDL set to object "[object Object\]"] - expected: FAIL - - [script.noModule: IDL set to NaN] - expected: FAIL - - [script.noModule: IDL set to Infinity] - expected: FAIL - - [script.noModule: IDL set to -Infinity] - expected: FAIL - - [script.noModule: IDL set to "\\0"] - expected: FAIL - - [script.noModule: IDL set to object "test-toString"] - expected: FAIL - - [script.noModule: IDL set to object "test-valueOf"] - expected: FAIL - [menu.type: setAttribute() to "context"] expected: FAIL @@ -19212,9 +19116,6 @@ [undefinedelement.tabIndex: setAttribute() to "5%"] expected: FAIL - [script.noModule: setAttribute() to "5%"] - expected: FAIL - [undefinedelement.dir: setAttribute() to "5%"] expected: FAIL @@ -19416,9 +19317,6 @@ [details.dir: setAttribute() to "5%"] expected: FAIL - [script.noModule: IDL set to "5%"] - expected: FAIL - [summary.dir: IDL set to "5%"] expected: FAIL @@ -19440,9 +19338,6 @@ [script.accessKey: IDL set to "+100"] expected: FAIL - [script.noModule: IDL set to "+100"] - expected: FAIL - [ins.dateTime: IDL set to "+100"] expected: FAIL @@ -19581,9 +19476,6 @@ [details.tabIndex: setAttribute() to "+100"] expected: FAIL - [script.noModule: setAttribute() to "+100"] - expected: FAIL - [script.dir: setAttribute() to ".5"] expected: FAIL @@ -19611,9 +19503,6 @@ [menu.dir: IDL set to ".5"] expected: FAIL - [script.noModule: IDL set to ".5"] - expected: FAIL - [dialog.tabIndex: setAttribute() to "+100"] expected: FAIL @@ -19839,9 +19728,6 @@ [dialog.dir: IDL set to "+100"] expected: FAIL - [script.noModule: setAttribute() to ".5"] - expected: FAIL - [undefinedelement.enterKeyHint: setAttribute() to "+100"] expected: FAIL diff --git a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini b/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini deleted file mode 100644 index 76dbb504708..00000000000 --- a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[htmloptionscollection.html] - type: testharness - [HTMLOptionsCollection.add method insert HTMLOptionElement Option element] - expected: FAIL - diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini index f1aa94c7ced..8b743f36e1d 100644 --- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini +++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini @@ -4,7 +4,7 @@ expected: FAIL [Element with tabindex should support autofocus] - expected: FAIL + expected: TIMEOUT [Host element with delegatesFocus including no focusable descendants should be skipped] expected: NOTRUN @@ -16,5 +16,5 @@ expected: NOTRUN [Non-HTMLElement should not support autofocus] - expected: TIMEOUT + expected: NOTRUN diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/link-type-attribute.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/link-type-attribute.html.ini new file mode 100644 index 00000000000..31c7aa49cfd --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/link-type-attribute.html.ini @@ -0,0 +1,2 @@ +[link-type-attribute.html] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini index 4df5d7a35de..c6f45be1eb2 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini @@ -1,4 +1,5 @@ [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/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini index 5f60c78e73c..f6a7aca3306 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini @@ -1,6 +1,5 @@ [iframe_sandbox_popups_escaping-3.html] type: testharness - expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini index b83b69dd2bc..ee0eac0e9a4 100644 --- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini @@ -1,6 +1,5 @@ [form-validation-checkValidity.html] type: testharness - expected: ERROR [[INPUT in TEXT status\] no constraint] expected: FAIL @@ -427,3 +426,27 @@ [[INPUT in EMAIL status\] not suffering from being too long (in a form)] expected: FAIL + [[select\] no constraint (in a form)] + expected: FAIL + + [[select\] suffering from being missing (in a form)] + expected: FAIL + + [[textarea\] suffering from being missing (in a form)] + expected: FAIL + + [[select\] no constraint] + expected: FAIL + + [[select\] suffering from being missing] + expected: FAIL + + [[textarea\] no constraint] + expected: FAIL + + [[textarea\] suffering from being missing] + expected: FAIL + + [[textarea\] no constraint (in a form)] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini index 4dbcff22c2c..d8114fa0ed1 100644 --- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini @@ -1,6 +1,5 @@ [form-validation-reportValidity.html] type: testharness - expected: ERROR [[INPUT in TEXT status\] no constraint] expected: FAIL @@ -433,3 +432,27 @@ [[INPUT in EMAIL status\] not suffering from being too long (in a form)] expected: FAIL + [[select\] no constraint (in a form)] + expected: FAIL + + [[select\] suffering from being missing (in a form)] + expected: FAIL + + [[textarea\] suffering from being missing (in a form)] + expected: FAIL + + [[select\] no constraint] + expected: FAIL + + [[select\] suffering from being missing] + expected: FAIL + + [[textarea\] no constraint] + expected: FAIL + + [[textarea\] suffering from being missing] + expected: FAIL + + [[textarea\] no constraint (in a form)] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini index e9618f1c032..25ad3f2bd44 100644 --- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini @@ -1,6 +1,5 @@ [form-validation-validity-customError.html] type: testharness - expected: ERROR [[input\] The validity.customError must be true if the custom validity error message is not empty] expected: FAIL @@ -13,3 +12,15 @@ [[button\] The validity.customError must be false if the custom validity error message is empty] expected: FAIL + [[select\] The validity.customError must be false i the custom validity error message is empty] + expected: FAIL + + [[select\] The validity.customError must be true if the custom validity error message is not empty] + expected: FAIL + + [[textarea\] The validity.customError must be false if the custom validity error message is empty] + expected: FAIL + + [[textarea\] The validity.customError must be true if the custom validity error message is not empty] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini index 3f11b627f2a..9fb1fc2bf7a 100644 --- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini @@ -1,6 +1,5 @@ [form-validation-validity-valid.html] type: testharness - expected: ERROR [[INPUT in TEXT status\] validity.valid must be false if validity.tooLong is true] expected: FAIL @@ -154,3 +153,6 @@ [[INPUT in DATETIME-LOCAL status\] validity.valid must be false if validity.valueMissing is true] expected: FAIL + [[textarea\] validity.valid must be false if validity.valueMissing is true] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini index de840378f42..f6390136918 100644 --- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini @@ -1,6 +1,5 @@ [form-validation-validity-valueMissing.html] type: testharness - expected: ERROR [[INPUT in TEXT status\] The required attribute is not set] expected: FAIL @@ -304,3 +303,15 @@ [[INPUT in DATETIME-LOCAL status\] The value attribute is empty string] expected: FAIL + [[textarea\] The value is not empty] + expected: FAIL + + [[textarea\] The value is empty] + expected: FAIL + + [[textarea\] The required attribute is not set] + expected: FAIL + + [[select\] Selected the option with value equals to empty] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini index 599a5aeb57c..3823eb5fe6a 100644 --- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini @@ -1,6 +1,5 @@ [form-validation-willValidate.html] type: testharness - expected: ERROR [[INPUT in HIDDEN status\] Must be barred from the constraint validation] expected: FAIL @@ -268,3 +267,21 @@ [[output\] The willValidate attribute must be false since OUTPUT is not a submittable element] expected: FAIL + [[textarea\] Must be barred from the constraint validation] + expected: FAIL + + [[textarea\] The willValidate attribute must be false if it has a datalist ancestor] + expected: FAIL + + [[textarea\] The willValidate attribute must be true if an element is mutable] + expected: FAIL + + [[select\] The willValidate attribute must be false if it has a datalist ancestor] + expected: FAIL + + [[select\] The willValidate attribute must be true if an element is mutable] + expected: FAIL + + [[select\] Must be barred from the constraint validation] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-menu-historical.html.ini b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-menu-historical.html.ini deleted file mode 100644 index b548f3cb3ed..00000000000 --- a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-menu-historical.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[button-menu-historical.html] - type: testharness - [button.type reflects properly] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/clone.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/clone.html.ini deleted file mode 100644 index 04df058a43f..00000000000 --- a/tests/wpt/metadata/html/semantics/forms/the-input-element/clone.html.ini +++ /dev/null @@ -1,56 +0,0 @@ -[clone.html] - type: testharness - [Checkbox must retain checked state.] - expected: FAIL - - [Checkbox must retain unchecked state.] - expected: FAIL - - [Radiobutton must retain checked state.] - expected: FAIL - - [Radiobutton must retain unchecked state.] - expected: FAIL - - [Text field must retain changed value.] - expected: FAIL - - [Search field must retain changed value.] - expected: FAIL - - [Phone number field must retain changed value.] - expected: FAIL - - [URL field must retain changed value.] - expected: FAIL - - [Email field must retain changed value.] - expected: FAIL - - [Password field must retain changed value.] - expected: FAIL - - [Date field must retain changed value.] - expected: FAIL - - [Month field must retain changed value.] - expected: FAIL - - [Week field must retain changed value.] - expected: FAIL - - [Time field must retain changed value.] - expected: FAIL - - [Datetime (local) field must retain changed value.] - expected: FAIL - - [Number field must retain changed value.] - expected: FAIL - - [Range control must retain changed value.] - expected: FAIL - - [Color picker must retain changed value.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/cloning-steps.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/cloning-steps.html.ini deleted file mode 100644 index c3cb6115f85..00000000000 --- a/tests/wpt/metadata/html/semantics/forms/the-input-element/cloning-steps.html.ini +++ /dev/null @@ -1,14 +0,0 @@ -[cloning-steps.html] - type: testharness - [input element's value should be cloned] - expected: FAIL - - [input element's dirty value flag should be cloned, so setAttribute doesn't affect the cloned input's value] - expected: FAIL - - [input element's checkedness should be cloned] - expected: FAIL - - [input element's dirty checkedness should be cloned, so setAttribute doesn't affect the cloned input's checkedness] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini deleted file mode 100644 index 69e88a9bd4e..00000000000 --- a/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini +++ /dev/null @@ -1,26 +0,0 @@ -[radio-groupname-case.html] - type: testharness - [radio button group name = paSSfield-killroyß] - expected: FAIL - - [Among names like sImPlE, everything must be checkable at the same time] - expected: FAIL - - [Among names like paSSfield-killroyß, everything must be checkable at the same time] - expected: FAIL - - [Among names like глупый, everything must be checkable at the same time] - expected: FAIL - - [Among names like åωk, everything must be checkable at the same time] - expected: FAIL - - [Among names like blah1, everything must be checkable at the same time] - expected: FAIL - - [Among names like tÉdz5アパートFi, everything must be checkable at the same time] - expected: FAIL - - [Among names like ΣΣ, everything must be checkable at the same time] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini b/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini index bb06ff82a5a..a5ca46944d7 100644 --- a/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini @@ -1,31 +1,3 @@ [label-attributes.sub.html] - [The labeled control for a label element that has no 'for' attribute is the first labelable element which is a descendant of that label element.] - expected: FAIL - - [A non-control follows by a control with same ID.] - expected: FAIL - - [A labelable element is moved to outside of nested associated labels.] - expected: FAIL - - [A labelable element is moved to inside of nested associated labels.] - expected: FAIL - - [A labelable element which is a descendant of non-labelable element is moved to outside of associated label.] - expected: FAIL - - [A labelable element is moved to iframe.] - expected: FAIL - - [A div element which contains labelable element is removed.] - expected: FAIL - - [A labelable element not in a document can label element in the same tree.] - expected: FAIL - [A labelable element inside the shadow DOM.] expected: FAIL - - [A form control has an implicit label.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini b/tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini index 8228dc83f92..806e80ede3c 100644 --- a/tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini @@ -2,7 +2,3 @@ type: testharness [Check if the keygen element is a labelable element] expected: FAIL - - [Check if the hidden input element has null 'labels'] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/forms/the-option-element/option-element-constructor.html.ini b/tests/wpt/metadata/html/semantics/forms/the-option-element/option-element-constructor.html.ini deleted file mode 100644 index 25d32bc456c..00000000000 --- a/tests/wpt/metadata/html/semantics/forms/the-option-element/option-element-constructor.html.ini +++ /dev/null @@ -1,35 +0,0 @@ -[option-element-constructor.html] - type: testharness - [Option constructor with no arguments] - expected: FAIL - - [Option constructor with falsy arguments] - expected: FAIL - - [Option constructor creates HTMLOptionElement with specified text and value] - expected: FAIL - - [Option constructor handles selectedness correctly when specified with defaultSelected only] - expected: FAIL - - [Option constructor handles selectedness correctly, even when incongruous with defaultSelected] - expected: FAIL - - [Option constructor treats undefined text and value correctly] - expected: FAIL - - [Option constructor treats empty text and value correctly] - expected: FAIL - - [Option constructor treats falsy selected and defaultSelected correctly] - expected: FAIL - - [Option constructor treats truthy selected and defaultSelected correctly] - expected: FAIL - - [Option constructor does not set dirtiness (so, manipulating the selected content attribute still updates the selected IDL attribute)] - expected: FAIL - - [Prototype of object created with named constructor] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini index 8ee01faecbd..0ea72a3bf48 100644 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini @@ -1,14 +1,13 @@ [utf8.tentative.html] - expected: TIMEOUT [windows-1252] - expected: NOTRUN + expected: FAIL [utf-7] - expected: NOTRUN + expected: FAIL [shift-jis] - expected: NOTRUN + expected: FAIL [utf-8] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini deleted file mode 100644 index d958b30d7f4..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[charset-01.html] - type: testharness - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini index a919b698590..08b105f3507 100644 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini @@ -1,3 +1,7 @@ [charset-02.html] - type: testharness - expected: TIMEOUT + [UTF-16 module script with UTF-16LE BOM] + expected: FAIL + + [UTF-16 module script with UTF-16BE BOM] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini deleted file mode 100644 index 16b43178406..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[charset-03.html] - type: testharness - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html.ini deleted file mode 100644 index 2046faa6ed8..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[choice-of-error-1.html] - [Parse errors in different files should be reported depending on different roots] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html.ini deleted file mode 100644 index 9d55b00ff31..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[choice-of-error-2.html] - [Instantiation errors in different files should be reported depending on different roots] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html.ini deleted file mode 100644 index 19e185bb343..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[choice-of-error-3.html] - [Evaluation errors are cached in intermediate module scripts] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-1.html.ini deleted file mode 100644 index 689887b78e1..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-1.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[compilation-error-1.html] - type: testharness - [Test that syntax errors lead to SyntaxError events on window, and that exceptions are remembered.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-2.html.ini deleted file mode 100644 index 5d518d97d25..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[compilation-error-2.html] - type: testharness - [Test that syntax errors lead to SyntaxError events on window, and that exceptions are remembered.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini index 2e41efe9ac7..1d6ade5a09d 100644 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini @@ -1,3 +1,4 @@ + [credentials.sub.html] type: testharness [Modules should be loaded with or without the credentials based on the same-origin-ness and the crossOrigin attribute] diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/crossorigin.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/crossorigin.html.ini deleted file mode 100644 index 20738173875..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/crossorigin.html.ini +++ /dev/null @@ -1,32 +0,0 @@ -[crossorigin.html] - type: testharness - [Root module, Error in CORS-different-origin script] - expected: FAIL - - [Root module, Error in CORS-same-origin script] - expected: FAIL - - [Root module, Blocked script download, missing CORS ACAO header] - expected: FAIL - - [Root module, Blocked script download, mismatched CORS ACAO header] - expected: FAIL - - [Imported module, Error in CORS-different-origin script] - expected: FAIL - - [Imported module, Error in CORS-same-origin script] - expected: FAIL - - [Imported module, Blocked script download, missing CORS ACAO header] - expected: FAIL - - [Imported module, Blocked script download, mismatched CORS ACAO header] - expected: FAIL - - [Root module, Blocked script download, crossorigin attribute with missing CORS ACAO header] - expected: FAIL - - [Imported module, Blocked script download, crossorigin attribute with missing CORS ACAO header] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/currentScript-null.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/currentScript-null.html.ini deleted file mode 100644 index b3d97af5ba7..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/currentScript-null.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[currentScript-null.html] - type: testharness - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini deleted file mode 100644 index 4a87a4b2bba..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[custom-element-exception.html] - type: testharness - [Test that exceptions from the constructor of a custom element inside a module are propagated as expected.\n] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-1.html.ini deleted file mode 100644 index 53623ca1a01..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-1.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[duplicated-imports-1.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-2.html.ini deleted file mode 100644 index 39e00fd52ce..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-2.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[duplicated-imports-2.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html.ini deleted file mode 100644 index 6af93a6e94e..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[error-and-slow-dependency.html] - type: testharness - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-2.html.ini deleted file mode 100644 index e24139fb1a2..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-2.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[error-type-2.html] - [parse error has higher priority than instantiation error] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-3.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-3.html.ini deleted file mode 100644 index 58cc436ec05..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-3.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[error-type-3.html] - [instantiation error has higher priority than evaluation error] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/errorhandling.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/errorhandling.html.ini deleted file mode 100644 index 6d3d5fdd67c..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/errorhandling.html.ini +++ /dev/null @@ -1,18 +0,0 @@ -[errorhandling.html] - type: testharness - expected: TIMEOUT - [IFrame test: 'iframe_parseError_Root'] - expected: FAIL - - [IFrame test: 'iframe_parseError_Dependent'] - expected: FAIL - - [IFrame test: 'iframe_parseError_DependentMultiple'] - expected: FAIL - - [External root module with non-script mimetype] - expected: NOTRUN - - [Module with imported non-script mimetype] - expected: NOTRUN - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html.ini deleted file mode 100644 index 35ee19e1418..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[evaluation-error-1.html] - type: testharness - [Test that exceptions during evaluation lead to error events on window, and that exceptions are remembered.\n] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html.ini deleted file mode 100644 index f71474208e5..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[evaluation-error-2.html] - type: testharness - [Test that ill-founded cyclic dependencies cause ReferenceError during evaluation, which leads to error events on window, and that exceptions are remembered.\n] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html.ini deleted file mode 100644 index c2cb5cd0442..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[evaluation-error-3.html] - type: testharness - [Test that exceptions during evaluation lead to error events on window, and that exceptions are remembered.\n] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html.ini deleted file mode 100644 index 16e2ac18463..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[evaluation-error-4.html] - type: testharness - [Test that exceptions during evaluation lead to error events on window, and that exceptions are remembered.\n] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/execorder.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/execorder.html.ini deleted file mode 100644 index 6df8f6cb577..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/execorder.html.ini +++ /dev/null @@ -1,21 +0,0 @@ -[execorder.html] - type: testharness - expected: TIMEOUT - [Unordered module script execution (parsed, unordered #1)] - expected: NOTRUN - - [Unordered module script execution (parsed, unordered #2)] - expected: NOTRUN - - [Unordered module script execution (dynamic, unordered #1)] - expected: NOTRUN - - [Unordered module script execution (dynamic, unordered #2)] - expected: NOTRUN - - [Interlaced module/non-module script execution (parsed, async-ordered)] - expected: FAIL - - [Interlaced module/non-module script execution (dynamic, async-ordered)] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-1.html.ini deleted file mode 100644 index 7ad54e37be7..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-1.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[fetch-error-1.html] - type: testharness - [Test that failure to fetch root leads to error event on script.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-2.html.ini deleted file mode 100644 index e6acfd3210b..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[fetch-error-2.html] - type: testharness - [Test that failure to fetch dependency leads to error event on script.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-subgraph-404.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-subgraph-404.html.ini deleted file mode 100644 index c9bcdffbd0d..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-subgraph-404.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[import-subgraph-404.html] - type: testharness - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/imports.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/imports.html.ini deleted file mode 100644 index 8ca41f2b813..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/imports.html.ini +++ /dev/null @@ -1,15 +0,0 @@ -[imports.html] - type: testharness - expected: TIMEOUT - [Import a module that tries to import itself] - expected: NOTRUN - - [Import a module with a cyclical module dependency] - expected: NOTRUN - - [Import a module that validly imports itself] - expected: NOTRUN - - [Import a module with a valid cyclical module dependency] - expected: NOTRUN - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inactive-context-import.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inactive-context-import.html.ini new file mode 100644 index 00000000000..354ea7cb7c8 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inactive-context-import.html.ini @@ -0,0 +1,5 @@ +[inactive-context-import.html] + type: testharness + [dynamic import from inactive context should not crash] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html.ini deleted file mode 100644 index 54dcc064e7e..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[inline-async-execorder.html] - [Inline async module script execution order] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html.ini deleted file mode 100644 index b3fdd6f764e..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[instantiation-error-1.html] - type: testharness - [Test that missing exports lead to SyntaxError events on window and load events on script, and that exceptions are remembered] - expected: FAIL - - [Test that missing exports lead to SyntaxError events on window and load events on script] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-2.html.ini deleted file mode 100644 index c5e6fec931a..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-2.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[instantiation-error-2.html] - type: testharness - [Test that missing exports lead to SyntaxError events on window and load events on script, and that exceptions are remembered] - expected: FAIL - - [Test that missing exports lead to SyntaxError events on window and load events on script] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html.ini deleted file mode 100644 index 25019f2ce0f..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[instantiation-error-3.html] - type: testharness - [Test that unresolvable cycles lead to SyntaxError events on window and load events on script, and that exceptions are remembered] - expected: FAIL - - [Test that unresolvable cycles lead to SyntaxError events on window and load events on script] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini deleted file mode 100644 index 8acedfbc746..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[instantiation-error-4.html] - type: testharness - [Test that loading a graph in which a module is already errored results in that module's error.] - expected: FAIL - - [Test that loading a graph in which a module is already errored results in an error.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini deleted file mode 100644 index 44be8de5091..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[instantiation-error-5.html] - type: testharness - [Test that loading a graph in which a module is already errored results in that module's error.] - expected: FAIL - - [Test that loading a graph in which a module is already errored results an error.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini deleted file mode 100644 index c1729535a19..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[instantiation-error-6.html] - type: testharness - [Test that ambiguous star exports lead to an instantiation error and that the correct module is blamed.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini deleted file mode 100644 index 152942c5092..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[instantiation-error-7.html] - type: testharness - [Test that ambiguous star exports lead to an instantiation error, even when discovered through a star export, and that the correct module is blamed.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini deleted file mode 100644 index 693c8174ed9..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[instantiation-error-8.html] - type: testharness - expected: TIMEOUT - [Instantiate attempt on a tree w/ previously instantiate-failed tree as a sub-tree shouldn't crash.] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini deleted file mode 100644 index 5bcd6c0a462..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[integrity.html] - type: testharness - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-namespace-request.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-namespace-request.html.ini deleted file mode 100644 index 1006d488052..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-namespace-request.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[late-namespace-request.html] - type: testharness - [Test the situation where a module is instantiated without the need for a namespace object, but later on a different module requests the namespace.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-star-export-request.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-star-export-request.html.ini deleted file mode 100644 index 09abe701e73..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-star-export-request.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[late-star-export-request.html] - type: testharness - [Test the situation where a module is instantiated without a use of its star-exports, but later on a different module requests them.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini index e911f6b7fb9..1753a0856d7 100644 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini @@ -1,27 +1,5 @@ + [load-error-events-inline.html] type: testharness - expected: TIMEOUT - [src, 200, parser-inserted, defer, no async] - expected: NOTRUN - - [src, 200, parser-inserted, no defer, async] - expected: NOTRUN - - [src, 200, not parser-inserted, no defer, no async, no non-blocking] - expected: NOTRUN - - [src, 200, not parser-inserted, no defer, async] - expected: NOTRUN - - [src, 404, parser-inserted, defer, no async] - expected: NOTRUN - - [src, 404, parser-inserted, no defer, async] - expected: NOTRUN - - [src, 404, not parser-inserted, no defer, no async, no non-blocking] - expected: NOTRUN - - [src, 404, not parser-inserted, no defer, async] - expected: NOTRUN + expected: CRASH diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini deleted file mode 100644 index b0a60904841..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini +++ /dev/null @@ -1,27 +0,0 @@ -[load-error-events.html] - type: testharness - expected: TIMEOUT - [src, 200, parser-inserted, defer, no async] - expected: NOTRUN - - [src, 200, parser-inserted, no defer, async] - expected: NOTRUN - - [src, 200, not parser-inserted, no defer, no async, no non-blocking] - expected: NOTRUN - - [src, 200, not parser-inserted, no defer, async] - expected: NOTRUN - - [src, 404, parser-inserted, defer, no async] - expected: NOTRUN - - [src, 404, parser-inserted, no defer, async] - expected: NOTRUN - - [src, 404, not parser-inserted, no defer, no async, no non-blocking] - expected: NOTRUN - - [src, 404, not parser-inserted, no defer, async] - expected: NOTRUN - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini deleted file mode 100644 index ad0ec28d799..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini +++ /dev/null @@ -1,5 +0,0 @@ -[module-in-xhtml.xhtml] - type: testharness - [module script in XHTML documents should be evaluated.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html.ini deleted file mode 100644 index d91d145d1dc..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[module-vs-script-1.html] - type: testharness - [Test that evaluating something as classic script does not prevent it from being evaluated as module script.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-2.html.ini deleted file mode 100644 index 4864da5dc6a..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[module-vs-script-2.html] - type: testharness - [Test that evaluating something as classic script does not prevent it from being evaluated as module script.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/nomodule-attribute.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/nomodule-attribute.html.ini deleted file mode 100644 index e595c3421fa..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/nomodule-attribute.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[nomodule-attribute.html] - type: testharness - [Test that 'nomodule' has the desired effect on classic scripts, but no effect on module scripts.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-no-referrer.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-no-referrer.sub.html.ini deleted file mode 100644 index 634cf356318..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-no-referrer.sub.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[referrer-no-referrer.sub.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini index 92d04781a2e..a212c8c0e93 100644 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini @@ -1,2 +1,19 @@ [referrer-origin-when-cross-origin.sub.html] - expected: TIMEOUT + [Importing a remote-origin descendant script from a same-origin top-level script with the origin-when-cross-origin policy.] + expected: FAIL + + [Importing a same-origin descendant script from a same-origin top-level script with the origin-when-cross-origin policy.] + expected: FAIL + + [Importing a remote-origin descendant script from a remote-origin top-level script with the origin-when-cross-origin policy.] + expected: FAIL + + [Importing a same-origin top-level script with the origin-when-cross-origin policy.] + expected: FAIL + + [Importing a same-origin descendant script from a remote-origin top-level script with the origin-when-cross-origin policy.] + expected: FAIL + + [Importing a remote-origin top-level script with the origin-when-cross-origin policy.] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini index 9a2db3d8993..413900f14b9 100644 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini @@ -1,2 +1,19 @@ [referrer-origin.sub.html] - expected: TIMEOUT + [Importing a same-origin descendant script from a same-origin top-level script with the origin policy.] + expected: FAIL + + [Importing a remote-origin descendant script from a same-origin top-level script with the origin policy.] + expected: FAIL + + [Importing a remote-origin descendant script from a remote-origin top-level script with the origin policy.] + expected: FAIL + + [Importing a same-origin descendant script from a remote-origin top-level script with the origin policy.] + expected: FAIL + + [Importing a same-origin top-level script with the origin policy.] + expected: FAIL + + [Importing a remote-origin top-level script with the origin policy.] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini index d499edb6fc8..ce528d7e641 100644 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini @@ -1,2 +1,10 @@ [referrer-same-origin.sub.html] - expected: TIMEOUT + [Importing a same-origin descendant script from a same-origin top-level script with the same-origin policy.] + expected: FAIL + + [Importing a same-origin descendant script from a remote-origin top-level script with the same-origin policy.] + expected: FAIL + + [Importing a same-origin top-level script with the same-origin policy.] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini index 2b700b1c9b4..c1eeb5dcec7 100644 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini @@ -1,2 +1,19 @@ [referrer-unsafe-url.sub.html] - expected: TIMEOUT + [Importing a same-origin descendant script from a remote-origin top-level script with the unsafe-url policy.] + expected: FAIL + + [Importing a same-origin descendant script from a same-origin top-level script with the unsafe-url policy.] + expected: FAIL + + [Importing a remote-origin top-level script with the unsafe-url policy.] + expected: FAIL + + [Importing a remote-origin descendant script from a remote-origin top-level script with the unsafe-url policy.] + expected: FAIL + + [Importing a remote-origin descendant script from a same-origin top-level script with the unsafe-url policy.] + expected: FAIL + + [Importing a same-origin top-level script with the unsafe-url policy.] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/script-for-event.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/script-for-event.html.ini deleted file mode 100644 index 3ad68cd5f47..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/script-for-event.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[script-for-event.html] - type: testharness - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-1.html.ini deleted file mode 100644 index e5b288d78e0..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-1.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[single-evaluation-1.html] - type: testharness - [Test that a module is evaluated only once, and that 'this' is undefined (because of strict mode).] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-2.html.ini deleted file mode 100644 index c47fc9c8a4c..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[single-evaluation-2.html] - type: testharness - [Test that a module is evaluated only once, and that 'this' is undefined (because of strict mode).] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/slow-cycle.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/slow-cycle.html.ini deleted file mode 100644 index 37c99441cc7..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/slow-cycle.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[slow-cycle.html] - type: testharness - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/specifier-error.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/specifier-error.html.ini deleted file mode 100644 index 44e8c1ebac6..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/specifier-error.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[specifier-error.html] - type: testharness - [Test that invalid module specifier leads to TypeError on window.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-reflect.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-reflect.html.ini deleted file mode 100644 index 333bbf3d0e9..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-reflect.html.ini +++ /dev/null @@ -1,32 +0,0 @@ -[nomodule-reflect.html] - type: testharness - [noModule IDL attribute on a parser created classic script element without nomodule content attribute] - expected: FAIL - - [noModule IDL attribute on a parser created classic script element with nomodule content attribute] - expected: FAIL - - [noModule IDL attribute on a parser created module script element without nomodule content attribute] - expected: FAIL - - [noModule IDL attribute on a parser created module script element with nomodule content attribute] - expected: FAIL - - [noModule IDL attribute on a dynamically created script element without nomodule content attribute] - expected: FAIL - - [noModule IDL attribute on a dynamically created script element after nomodule content attribute is set to "nomodule"] - expected: FAIL - - [noModule IDL attribute on a dynamically created script element after nomodule content attribute is set to ""] - expected: FAIL - - [noModule IDL attribute on a dynamically created script element after nomodule content attribute had been removed] - expected: FAIL - - [noModule IDL attribute must add nomodule content attribute on setting to true] - expected: FAIL - - [noModule IDL attribute must remove nomodule content attribute on setting to false] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html.ini deleted file mode 100644 index 2a43be95639..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[nomodule-set-on-async-classic-script.html] - type: testharness - [An asynchronously loaded classic script with noModule set to true must not run] - expected: FAIL - - [An asynchronously loaded classic script with noModule set to false must run] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html.ini deleted file mode 100644 index 926d065aecd..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[nomodule-set-on-external-module-script.html] - type: testharness - [An external module script with nomodule content attribute must run] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html.ini deleted file mode 100644 index cf471744a60..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[nomodule-set-on-inline-classic-scripts.html] - type: testharness - [An inline classic script with nomodule content attribute must not run] - expected: FAIL - - [An inline classic script element dynamically inserted after noModule was set to true must not run.] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html.ini deleted file mode 100644 index 898f25c4217..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[nomodule-set-on-inline-module-script.html] - type: testharness - [An inline module script with nomodule content attribute must run] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html.ini deleted file mode 100644 index 6bb6e4244ff..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[nomodule-set-on-synchronously-loaded-classic-scripts.html] - type: testharness - [A synchronously loaded external classic script with nomodule content attribute must not run] - expected: FAIL - diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini deleted file mode 100644 index ce482a60da8..00000000000 --- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini +++ /dev/null @@ -1,7 +0,0 @@ -[aborted-parser.window.html] - [document.open() after parser is aborted] - expected: FAIL - - [async document.open() after parser is aborted] - expected: FAIL - diff --git a/tests/wpt/metadata/webmessaging/with-ports/017.html.ini b/tests/wpt/metadata/webmessaging/with-ports/017.html.ini deleted file mode 100644 index 064cf47545b..00000000000 --- a/tests/wpt/metadata/webmessaging/with-ports/017.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[017.html] - expected: TIMEOUT - [origin of the script that invoked the method, about:blank] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.html.ini b/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.html.ini deleted file mode 100644 index c810dcf32ed..00000000000 --- a/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[message-event.html] - type: testharness - [Properties of the 'message' event] - expected: FAIL - diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index b259b7bc24d..559e6baff6c 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -19024,7 +19024,7 @@ "testharness" ], "mozilla/interfaces.html": [ - "08e8181e6e639caeaecd84c16d582c0ec3f99474", + "945a8b33a109b0cc37db9351f94b9afd3eac798e", "testharness" ], "mozilla/interfaces.js": [ diff --git a/tests/wpt/mozilla/tests/mozilla/interfaces.html b/tests/wpt/mozilla/tests/mozilla/interfaces.html index 08e8181e6e6..945a8b33a10 100644 --- a/tests/wpt/mozilla/tests/mozilla/interfaces.html +++ b/tests/wpt/mozilla/tests/mozilla/interfaces.html @@ -186,6 +186,7 @@ test_interfaces([ "NodeList", "OfflineAudioCompletionEvent", "OfflineAudioContext", + "Option", "OscillatorNode", "PageTransitionEvent", "PannerNode", diff --git a/tests/wpt/web-platform-tests/common/security-features/README.md b/tests/wpt/web-platform-tests/common/security-features/README.md index 98afe1af1be..c19874653a7 100644 --- a/tests/wpt/web-platform-tests/common/security-features/README.md +++ b/tests/wpt/web-platform-tests/common/security-features/README.md @@ -143,7 +143,7 @@ For examples of spec JSON files, see [referrer-policy/spec.src.json](../../refer * **`excluded_tests`** - List of ```test_expansion``` patterns expanding into selections which get skipped when generating the tests (aka. blacklisting/suppressing) + List of ```test_expansion``` patterns expanding into selections which get skipped when generating the tests (aka. blocklisting/suppressing) * **`test_expansion_schema`** @@ -188,9 +188,9 @@ A **selection** is a single **test instance** (scenario) with explicit values th Taking the spec JSON, the generator follows this algorithm: -* Expand all ```excluded_tests``` to create a blacklist of selections +* Expand all ```excluded_tests``` to create a blocklist of selections -* For each specification requirement: Expand the ```test_expansion``` pattern into selections and check each against the blacklist, if not marked as suppresed, generate the test resources for the selection +* For each specification requirement: Expand the ```test_expansion``` pattern into selections and check each against the blocklist, if not marked as suppresed, generate the test resources for the selection ### Source Contexts diff --git a/tests/wpt/web-platform-tests/css/css-align/animation/column-gap-composition.html b/tests/wpt/web-platform-tests/css/css-align/animation/column-gap-composition.html new file mode 100644 index 00000000000..0054206cca8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-align/animation/column-gap-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>column-gap composition</title> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-column-gap"> +<meta name="assert" content="column-gap supports animation by computed value type"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'column-gap', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'column-gap', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'column-gap', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'column-gap', + underlying: '100px', + addFrom: '100px', + addTo: 'normal', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'normal'}, + {at: 1, expect: 'normal'}, + {at: 1.5, expect: 'normal'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-align/animation/row-gap-composition.html b/tests/wpt/web-platform-tests/css/css-align/animation/row-gap-composition.html new file mode 100644 index 00000000000..238253adf0c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-align/animation/row-gap-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>row-gap composition</title> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-row-gap"> +<meta name="assert" content="row-gap supports animation by computed value type"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'row-gap', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'row-gap', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'row-gap', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'row-gap', + underlying: '100px', + addFrom: '100px', + addTo: 'normal', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'normal'}, + {at: 1, expect: 'normal'}, + {at: 1.5, expect: 'normal'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html new file mode 100644 index 00000000000..87042d1969d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-bottom-left-radius composition</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius"> +<meta name="assert" content="border-bottom-left-radius supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-bottom-left-radius', + underlying: '40px 40px', + addFrom: '60px 60px', + addTo: '160px 160px', +}, [ + {at: -0.25, expect: '75px'}, + {at: 0, expect: '100px'}, + {at: 0.25, expect: '125px'}, + {at: 0.5, expect: '150px'}, + {at: 0.75, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.25, expect: '225px'}, +]); + +test_composition({ + property: 'border-bottom-left-radius', + underlying: '40px 140px', + replaceFrom: '100px 120px', + addTo: '160px 60px', +}, [ + {at: -0.25, expect: '75px 100px'}, + {at: 0, expect: '100px 120px'}, + {at: 0.25, expect: '125px 140px'}, + {at: 0.5, expect: '150px 160px'}, + {at: 0.75, expect: '175px 180px'}, + {at: 1, expect: '200px'}, + {at: 1.25, expect: '225px 220px'}, +]); + +test_composition({ + property: 'border-bottom-left-radius', + underlying: '40px 60px', + addFrom: '60px 140px', + replaceTo: '200px 120px', +}, [ + {at: -0.25, expect: '75px 220px'}, + {at: 0, expect: '100px 200px'}, + {at: 0.25, expect: '125px 180px'}, + {at: 0.5, expect: '150px 160px'}, + {at: 0.75, expect: '175px 140px'}, + {at: 1, expect: '200px 120px'}, + {at: 1.25, expect: '225px 100px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html new file mode 100644 index 00000000000..2b5a72df691 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-bottom-right-radius composition</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius"> +<meta name="assert" content="border-bottom-right-radius supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-bottom-right-radius', + underlying: '40px 40px', + addFrom: '60px 60px', + addTo: '160px 160px', +}, [ + {at: -0.25, expect: '75px'}, + {at: 0, expect: '100px'}, + {at: 0.25, expect: '125px'}, + {at: 0.5, expect: '150px'}, + {at: 0.75, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.25, expect: '225px'}, +]); + +test_composition({ + property: 'border-bottom-right-radius', + underlying: '40px 140px', + replaceFrom: '100px 120px', + addTo: '160px 60px', +}, [ + {at: -0.25, expect: '75px 100px'}, + {at: 0, expect: '100px 120px'}, + {at: 0.25, expect: '125px 140px'}, + {at: 0.5, expect: '150px 160px'}, + {at: 0.75, expect: '175px 180px'}, + {at: 1, expect: '200px'}, + {at: 1.25, expect: '225px 220px'}, +]); + +test_composition({ + property: 'border-bottom-right-radius', + underlying: '40px 60px', + addFrom: '60px 140px', + replaceTo: '200px 120px', +}, [ + {at: -0.25, expect: '75px 220px'}, + {at: 0, expect: '100px 200px'}, + {at: 0.25, expect: '125px 180px'}, + {at: 0.5, expect: '150px 160px'}, + {at: 0.75, expect: '175px 140px'}, + {at: 1, expect: '200px 120px'}, + {at: 1.25, expect: '225px 100px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html new file mode 100644 index 00000000000..5377c0ab42b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-bottom-width composition</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties"> +<meta name="assert" content="border-bottom-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-bottom-width', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'border-bottom-width', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'border-bottom-width', + underlying: '10em', + addFrom: '100px', + addTo: '20em', +}, [ + {at: -0.3, expect: 'calc(130px + 4em)'}, + {at: 0, expect: 'calc(100px + 10em)'}, + {at: 0.5, expect: 'calc(50px + 20em)'}, + {at: 1, expect: '30em'}, + {at: 1.5, expect: 'calc(-50px + 40em)'}, +]); + +test_composition({ + property: 'border-bottom-width', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html new file mode 100644 index 00000000000..e3311711753 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html @@ -0,0 +1,133 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-image-outset composition</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-outset"> +<meta name="assert" content="border-image-outset supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-image-outset', + underlying: '1 2 3 4', + addFrom: '1 2 3 4', + addTo: '101 102 103 104', +}, [ + {at: -0.25, expect: '0'}, // Non-negative. + {at: 0, expect: '2 4 6 8'}, + {at: 0.25, expect: '27 29 31 33'}, + {at: 0.5, expect: '52 54 56 58'}, + {at: 0.75, expect: '77 79 81 83'}, + {at: 1, expect: '102 104 106 108'}, + {at: 1.25, expect: '127 129 131 133'}, +]); + +test_composition({ + property: 'border-image-outset', + underlying: '100 200 300 400', + addFrom: '100', + addTo: '200 300 500', +}, [ + {at: -0.25, expect: '175 250 300 450'}, + {at: 0, expect: '200 300 400 500'}, + {at: 0.25, expect: '225 350 500 550'}, + {at: 0.5, expect: '250 400 600 600'}, + {at: 0.75, expect: '275 450 700 650'}, + {at: 1, expect: '300 500 800 700'}, + {at: 1.25, expect: '325 550 900 750'}, +]); + +test_composition({ + property: 'border-image-outset', + underlying: '1 2 3px 4px', + addFrom: '1 2 3px 4px', + addTo: '101 102 103px 104px', +}, [ + {at: -0.25, expect: '0 0 0px 0px'}, // Non-negative. + {at: 0, expect: '2 4 6px 8px'}, + {at: 0.25, expect: '27 29 31px 33px'}, + {at: 0.5, expect: '52 54 56px 58px'}, + {at: 0.75, expect: '77 79 81px 83px'}, + {at: 1, expect: '102 104 106px 108px'}, + {at: 1.25, expect: '127 129 131px 133px'}, +]); + +test_composition({ + property: 'border-image-outset', + underlying: '10px 20px', + addFrom: '190px 180px 290px 280px', + addTo: '90px 80px', +}, [ + {at: -0.25, expect: '225px 225px 350px 350px'}, + {at: 0, expect: '200px 200px 300px 300px'}, + {at: 0.25, expect: '175px 175px 250px 250px'}, + {at: 0.5, expect: '150px 150px 200px 200px'}, + {at: 0.75, expect: '125px 125px 150px 150px'}, + {at: 1, expect: '100px'}, + {at: 1.25, expect: '75px 75px 50px 50px'}, +]); + +test_composition({ + property: 'border-image-outset', + underlying: '10 20px', + replaceFrom: '100 100px', + addTo: '190 180px', +}, [ + {at: -0.25, expect: '75 75px'}, + {at: 0, expect: '100 100px'}, + {at: 0.25, expect: '125 125px'}, + {at: 0.5, expect: '150 150px'}, + {at: 0.75, expect: '175 175px'}, + {at: 1, expect: '200 200px'}, + {at: 1.25, expect: '225 225px'}, +]); + +test_composition({ + property: 'border-image-outset', + underlying: '10px 20', + addFrom: '90px 80', + replaceTo: '0px 0 0px 0', +}, [ + {at: -0.25, expect: '125px 125'}, + {at: 0, expect: '100px 100'}, + {at: 0.25, expect: '75px 75'}, + {at: 0.5, expect: '50px 50'}, + {at: 0.75, expect: '25px 25'}, + {at: 1, expect: '0px 0'}, + {at: 1.25, expect: '0px 0'}, // Non-negative. +]); + +test_composition({ + property: 'border-image-outset', + underlying: '10 20', + addFrom: '100px 150px', + addTo: '200px 250px', +}, [ + {at: -0.25, expect: '75px 125px'}, + {at: 0, expect: '100px 150px'}, + {at: 0.25, expect: '125px 175px'}, + {at: 0.5, expect: '150px 200px'}, + {at: 0.75, expect: '175px 225px'}, + {at: 1, expect: '200px 250px'}, + {at: 1.25, expect: '225px 275px'}, +]); + +test_composition({ + property: 'border-image-outset', + underlying: '10 20', + addFrom: '100 150px', + addTo: '200px 250', +}, [ + {at: -0.25, expect: '100 150px'}, + {at: 0, expect: '100 150px'}, + {at: 0.25, expect: '100 150px'}, + {at: 0.5, expect: '200px 250'}, + {at: 0.75, expect: '200px 250'}, + {at: 1, expect: '200px 250'}, + {at: 1.25, expect: '200px 250'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html new file mode 100644 index 00000000000..d0ccb1a3a64 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html @@ -0,0 +1,133 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-image-slice composition</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-slice"> +<meta name="assert" content="border-image-slice supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-image-slice', + underlying: '1 2 3 4', + addFrom: '1 2 3 4', + addTo: '101 102 103 104', +}, [ + {at: -0.25, expect: '0'}, // Non-negative. + {at: 0, expect: '2 4 6 8'}, + {at: 0.25, expect: '27 29 31 33'}, + {at: 0.5, expect: '52 54 56 58'}, + {at: 0.75, expect: '77 79 81 83'}, + {at: 1, expect: '102 104 106 108'}, + {at: 1.25, expect: '127 129 131 133'}, +]); + +test_composition({ + property: 'border-image-slice', + underlying: '100 200 300 400 fill', + addFrom: '100 fill', + addTo: '200 300 500 fill', +}, [ + {at: -0.25, expect: '175 250 300 450 fill'}, + {at: 0, expect: '200 300 400 500 fill'}, + {at: 0.25, expect: '225 350 500 550 fill'}, + {at: 0.5, expect: '250 400 600 600 fill'}, + {at: 0.75, expect: '275 450 700 650 fill'}, + {at: 1, expect: '300 500 800 700 fill'}, + {at: 1.25, expect: '325 550 900 750 fill'}, +]); + +test_composition({ + property: 'border-image-slice', + underlying: '1 2 3% 4%', + addFrom: '1 2 3% 4%', + addTo: '101 102 103% 104%', +}, [ + {at: -0.25, expect: '0 0 0% 0%'}, // Non-negative. + {at: 0, expect: '2 4 6% 8%'}, + {at: 0.25, expect: '27 29 31% 33%'}, + {at: 0.5, expect: '52 54 56% 58%'}, + {at: 0.75, expect: '77 79 81% 83%'}, + {at: 1, expect: '102 104 106% 108%'}, + {at: 1.25, expect: '127 129 131% 133%'}, +]); + +test_composition({ + property: 'border-image-slice', + underlying: '10% 20%', + addFrom: '190% 180% 290% 280%', + addTo: '90% 80%', +}, [ + {at: -0.25, expect: '225% 225% 350% 350%'}, + {at: 0, expect: '200% 200% 300% 300%'}, + {at: 0.25, expect: '175% 175% 250% 250%'}, + {at: 0.5, expect: '150% 150% 200% 200%'}, + {at: 0.75, expect: '125% 125% 150% 150%'}, + {at: 1, expect: '100%'}, + {at: 1.25, expect: '75% 75% 50% 50%'}, +]); + +test_composition({ + property: 'border-image-slice', + underlying: '10 20%', + replaceFrom: '100 100%', + addTo: '190 180%', +}, [ + {at: -0.25, expect: '75 75%'}, + {at: 0, expect: '100 100%'}, + {at: 0.25, expect: '125 125%'}, + {at: 0.5, expect: '150 150%'}, + {at: 0.75, expect: '175 175%'}, + {at: 1, expect: '200 200%'}, + {at: 1.25, expect: '225 225%'}, +]); + +test_composition({ + property: 'border-image-slice', + underlying: '10% 20', + addFrom: '90% 80', + replaceTo: '0% 0 0% 0', +}, [ + {at: -0.25, expect: '125% 125'}, + {at: 0, expect: '100% 100'}, + {at: 0.25, expect: '75% 75'}, + {at: 0.5, expect: '50% 50'}, + {at: 0.75, expect: '25% 25'}, + {at: 1, expect: '0% 0'}, + {at: 1.25, expect: '0% 0'}, // Non-negative. +]); + +test_composition({ + property: 'border-image-slice', + underlying: '10 20', + addFrom: '100% 150%', + addTo: '200% 250% fill', +}, [ + {at: -0.25, expect: '100% 150%'}, + {at: 0, expect: '100% 150%'}, + {at: 0.25, expect: '100% 150%'}, + {at: 0.5, expect: '200% 250% fill'}, + {at: 0.75, expect: '200% 250% fill'}, + {at: 1, expect: '200% 250% fill'}, + {at: 1.25, expect: '200% 250% fill'}, +]); + +test_composition({ + property: 'border-image-slice', + underlying: '10 20', + addFrom: '100 150%', + addTo: '200% 250', +}, [ + {at: -0.25, expect: '100 150%'}, + {at: 0, expect: '100 150%'}, + {at: 0.25, expect: '100 150%'}, + {at: 0.5, expect: '200% 250'}, + {at: 0.75, expect: '200% 250'}, + {at: 1, expect: '200% 250'}, + {at: 1.25, expect: '200% 250'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html new file mode 100644 index 00000000000..0d0a1dc4ed2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html @@ -0,0 +1,133 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-image-width composition</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-width"> +<meta name="assert" content="border-image-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-image-width', + underlying: '1 2 3 4', + addFrom: '1 2 3 4', + addTo: '101 102 103 104', +}, [ + {at: -0.25, expect: '0'}, // Non-negative. + {at: 0, expect: '2 4 6 8'}, + {at: 0.25, expect: '27 29 31 33'}, + {at: 0.5, expect: '52 54 56 58'}, + {at: 0.75, expect: '77 79 81 83'}, + {at: 1, expect: '102 104 106 108'}, + {at: 1.25, expect: '127 129 131 133'}, +]); + +test_composition({ + property: 'border-image-width', + underlying: '100 200 300 400', + addFrom: '100', + addTo: '200 300 500', +}, [ + {at: -0.25, expect: '175 250 300 450'}, + {at: 0, expect: '200 300 400 500'}, + {at: 0.25, expect: '225 350 500 550'}, + {at: 0.5, expect: '250 400 600 600'}, + {at: 0.75, expect: '275 450 700 650'}, + {at: 1, expect: '300 500 800 700'}, + {at: 1.25, expect: '325 550 900 750'}, +]); + +test_composition({ + property: 'border-image-width', + underlying: '1 2 3px 4%', + addFrom: '1 2 3px 4%', + addTo: '101 102 103px 104%', +}, [ + {at: -0.25, expect: '0 0 0px 0%'}, // Non-negative. + {at: 0, expect: '2 4 6px 8%'}, + {at: 0.25, expect: '27 29 31px 33%'}, + {at: 0.5, expect: '52 54 56px 58%'}, + {at: 0.75, expect: '77 79 81px 83%'}, + {at: 1, expect: '102 104 106px 108%'}, + {at: 1.25, expect: '127 129 131px 133%'}, +]); + +test_composition({ + property: 'border-image-width', + underlying: '10px 20px', + addFrom: '190px 180px 290px 280px', + addTo: '90px 80px', +}, [ + {at: -0.25, expect: '225px 225px 350px 350px'}, + {at: 0, expect: '200px 200px 300px 300px'}, + {at: 0.25, expect: '175px 175px 250px 250px'}, + {at: 0.5, expect: '150px 150px 200px 200px'}, + {at: 0.75, expect: '125px 125px 150px 150px'}, + {at: 1, expect: '100px'}, + {at: 1.25, expect: '75px 75px 50px 50px'}, +]); + +test_composition({ + property: 'border-image-width', + underlying: '10 20px', + replaceFrom: '100 100px', + addTo: '190 180px', +}, [ + {at: -0.25, expect: '75 75px'}, + {at: 0, expect: '100 100px'}, + {at: 0.25, expect: '125 125px'}, + {at: 0.5, expect: '150 150px'}, + {at: 0.75, expect: '175 175px'}, + {at: 1, expect: '200 200px'}, + {at: 1.25, expect: '225 225px'}, +]); + +test_composition({ + property: 'border-image-width', + underlying: '10px 20', + addFrom: '90px 80', + replaceTo: '0px 0 0px 0', +}, [ + {at: -0.25, expect: '125px 125'}, + {at: 0, expect: '100px 100'}, + {at: 0.25, expect: '75px 75'}, + {at: 0.5, expect: '50px 50'}, + {at: 0.75, expect: '25px 25'}, + {at: 1, expect: '0px 0'}, + {at: 1.25, expect: '0px 0'}, // Non-negative. +]); + +test_composition({ + property: 'border-image-width', + underlying: '10 20', + addFrom: '100px 150px', + addTo: '200px 250px', +}, [ + {at: -0.25, expect: '75px 125px'}, + {at: 0, expect: '100px 150px'}, + {at: 0.25, expect: '125px 175px'}, + {at: 0.5, expect: '150px 200px'}, + {at: 0.75, expect: '175px 225px'}, + {at: 1, expect: '200px 250px'}, + {at: 1.25, expect: '225px 275px'}, +]); + +test_composition({ + property: 'border-image-width', + underlying: '10 20', + addFrom: '100 150px', + addTo: '200% 250', +}, [ + {at: -0.25, expect: '100 150px'}, + {at: 0, expect: '100 150px'}, + {at: 0.25, expect: '100 150px'}, + {at: 0.5, expect: '200% 250'}, + {at: 0.75, expect: '200% 250'}, + {at: 1, expect: '200% 250'}, + {at: 1.25, expect: '200% 250'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html new file mode 100644 index 00000000000..1b90effbc32 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-left-width composition</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties"> +<meta name="assert" content="border-left-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-left-width', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'border-left-width', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'border-left-width', + underlying: '10em', + addFrom: '100px', + addTo: '20em', +}, [ + {at: -0.3, expect: 'calc(130px + 4em)'}, + {at: 0, expect: 'calc(100px + 10em)'}, + {at: 0.5, expect: 'calc(50px + 20em)'}, + {at: 1, expect: '30em'}, + {at: 1.5, expect: 'calc(-50px + 40em)'}, +]); + +test_composition({ + property: 'border-left-width', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html new file mode 100644 index 00000000000..aa9e1dcc667 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-right-width composition</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties"> +<meta name="assert" content="border-right-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-right-width', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'border-right-width', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'border-right-width', + underlying: '10em', + addFrom: '100px', + addTo: '20em', +}, [ + {at: -0.3, expect: 'calc(130px + 4em)'}, + {at: 0, expect: 'calc(100px + 10em)'}, + {at: 0.5, expect: 'calc(50px + 20em)'}, + {at: 1, expect: '30em'}, + {at: 1.5, expect: 'calc(-50px + 40em)'}, +]); + +test_composition({ + property: 'border-right-width', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html new file mode 100644 index 00000000000..1c2056bc010 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-top-left-radius composition</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius"> +<meta name="assert" content="border-top-left-radius supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-top-left-radius', + underlying: '40px 40px', + addFrom: '60px 60px', + addTo: '160px 160px', +}, [ + {at: -0.25, expect: '75px'}, + {at: 0, expect: '100px'}, + {at: 0.25, expect: '125px'}, + {at: 0.5, expect: '150px'}, + {at: 0.75, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.25, expect: '225px'}, +]); + +test_composition({ + property: 'border-top-left-radius', + underlying: '40px 140px', + replaceFrom: '100px 120px', + addTo: '160px 60px', +}, [ + {at: -0.25, expect: '75px 100px'}, + {at: 0, expect: '100px 120px'}, + {at: 0.25, expect: '125px 140px'}, + {at: 0.5, expect: '150px 160px'}, + {at: 0.75, expect: '175px 180px'}, + {at: 1, expect: '200px'}, + {at: 1.25, expect: '225px 220px'}, +]); + +test_composition({ + property: 'border-top-left-radius', + underlying: '40px 60px', + addFrom: '60px 140px', + replaceTo: '200px 120px', +}, [ + {at: -0.25, expect: '75px 220px'}, + {at: 0, expect: '100px 200px'}, + {at: 0.25, expect: '125px 180px'}, + {at: 0.5, expect: '150px 160px'}, + {at: 0.75, expect: '175px 140px'}, + {at: 1, expect: '200px 120px'}, + {at: 1.25, expect: '225px 100px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html new file mode 100644 index 00000000000..9a26d51375e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-top-right-radius composition</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius"> +<meta name="assert" content="border-top-right-radius supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-top-right-radius', + underlying: '40px 40px', + addFrom: '60px 60px', + addTo: '160px 160px', +}, [ + {at: -0.25, expect: '75px'}, + {at: 0, expect: '100px'}, + {at: 0.25, expect: '125px'}, + {at: 0.5, expect: '150px'}, + {at: 0.75, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.25, expect: '225px'}, +]); + +test_composition({ + property: 'border-top-right-radius', + underlying: '40px 140px', + replaceFrom: '100px 120px', + addTo: '160px 60px', +}, [ + {at: -0.25, expect: '75px 100px'}, + {at: 0, expect: '100px 120px'}, + {at: 0.25, expect: '125px 140px'}, + {at: 0.5, expect: '150px 160px'}, + {at: 0.75, expect: '175px 180px'}, + {at: 1, expect: '200px'}, + {at: 1.25, expect: '225px 220px'}, +]); + +test_composition({ + property: 'border-top-right-radius', + underlying: '40px 60px', + addFrom: '60px 140px', + replaceTo: '200px 120px', +}, [ + {at: -0.25, expect: '75px 220px'}, + {at: 0, expect: '100px 200px'}, + {at: 0.25, expect: '125px 180px'}, + {at: 0.5, expect: '150px 160px'}, + {at: 0.75, expect: '175px 140px'}, + {at: 1, expect: '200px 120px'}, + {at: 1.25, expect: '225px 100px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html new file mode 100644 index 00000000000..475c3930b9d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>border-top-width composition</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-width"> +<meta name="assert" content="border-top-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'border-top-width', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'border-top-width', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'border-top-width', + underlying: '10em', + addFrom: '100px', + addTo: '20em', +}, [ + {at: -0.3, expect: 'calc(130px + 4em)'}, + {at: 0, expect: 'calc(100px + 10em)'}, + {at: 0.5, expect: 'calc(50px + 20em)'}, + {at: 1, expect: '30em'}, + {at: 1.5, expect: 'calc(-50px + 40em)'}, +]); + +test_composition({ + property: 'border-top-width', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/margin-bottom-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/margin-bottom-composition.html new file mode 100644 index 00000000000..c95f8de23ef --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-box/animation/margin-bottom-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>margin-bottom composition</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties"> +<meta name="assert" content="margin-bottom supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'margin-bottom', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'margin-bottom', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, +]); + +test_composition({ + property: 'margin-bottom', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'margin-bottom', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'margin-bottom', + underlying: '100px', + addFrom: '100px', + addTo: 'auto', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/margin-left-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/margin-left-composition.html new file mode 100644 index 00000000000..8f3c646dfec --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-box/animation/margin-left-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>margin-left composition</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties"> +<meta name="assert" content="margin-left supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'margin-left', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'margin-left', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, +]); + +test_composition({ + property: 'margin-left', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'margin-left', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'margin-left', + underlying: '100px', + addFrom: '100px', + addTo: 'auto', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/margin-right-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/margin-right-composition.html new file mode 100644 index 00000000000..c903303313b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-box/animation/margin-right-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>margin-right composition</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties"> +<meta name="assert" content="margin-right supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'margin-right', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'margin-right', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, +]); + +test_composition({ + property: 'margin-right', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'margin-right', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'margin-right', + underlying: '100px', + addFrom: '100px', + addTo: 'auto', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/margin-top-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/margin-top-composition.html new file mode 100644 index 00000000000..5f050bd6c7d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-box/animation/margin-top-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>margin-top composition</title> +<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties"> +<meta name="assert" content="margin-top supports animation"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'margin-top', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'margin-top', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, +]); + +test_composition({ + property: 'margin-top', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'margin-top', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'margin-top', + underlying: '100px', + addFrom: '100px', + addTo: 'auto', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/padding-bottom-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/padding-bottom-composition.html new file mode 100644 index 00000000000..855b5d3dc29 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-box/animation/padding-bottom-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>padding-bottom composition</title> +<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-shorthand"> +<meta name="assert" content="padding-bottom supports animation as a list of lengths"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'padding-bottom', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'padding-bottom', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'padding-bottom', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'padding-bottom', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/padding-left-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/padding-left-composition.html new file mode 100644 index 00000000000..417777ae253 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-box/animation/padding-left-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>padding-left composition</title> +<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-shorthand"> +<meta name="assert" content="padding-left supports animation as a list of lengths"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'padding-left', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'padding-left', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'padding-left', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'padding-left', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/padding-right-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/padding-right-composition.html new file mode 100644 index 00000000000..3c80849bb2b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-box/animation/padding-right-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>padding-right composition</title> +<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-shorthand"> +<meta name="assert" content="padding-right supports animation as a list of lengths"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'padding-right', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'padding-right', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'padding-right', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'padding-right', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/padding-top-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/padding-top-composition.html new file mode 100644 index 00000000000..b5083ae79b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-box/animation/padding-top-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>padding-top composition</title> +<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-shorthand"> +<meta name="assert" content="padding-top supports animation as a list of lengths"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'padding-top', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'padding-top', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'padding-top', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'padding-top', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-default.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-default.html new file mode 100644 index 00000000000..36fb1a665ff --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-default.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation defaults to from-image</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-default-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + body { + overflow: hidden; + } + img { + border: 1px solid black; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because + no image-orientation property is given.</p> + <div> + <img src="support/exif-orientation-1-ul.jpg"/> + <br>Normal + </div> + <div> + <img src="support/exif-orientation-2-ur.jpg"/> + <br>Flipped horizontally + </div> + <div> + <img src="support/exif-orientation-3-lr.jpg"/> + <br>Rotated 180° + </div> + <div> + <img src="support/exif-orientation-4-lol.jpg"/> + <br>Flipped vertically + </div> + <div> + <img src="support/exif-orientation-5-lu.jpg"/> + <br>Rotated 90° CCW and flipped vertically + </div> + <div> + <img src="support/exif-orientation-6-ru.jpg"/> + <br>Rotated 90° CW + </div> + <div> + <img src="support/exif-orientation-7-rl.jpg"/> + <br>Rotated 90° CW and flipped vertically + </div> + <div> + <img src="support/exif-orientation-8-llo.jpg"/> + <br>Rotated 90° CCW + </div> + <div> + <img src="support/exif-orientation-9-u.jpg"/> + <br>Undefined (invalid value) + </div> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html new file mode 100644 index 00000000000..26db7da1845 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: change from image-orientation: none to from-image with will-change: transform</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-from-image-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + body { + overflow: hidden;} + img { + will-change: transform; + border: 1px solid black; + image-orientation: none; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +<script> + function runTest() { + for (var i = 1; i <= 9; i++) { + document.getElementById("img" + i).style.imageOrientation = "from-image"; + } + } +</script> +</head> +<body onload="runTest()"> + <p>The images should rotate respecting their EXIF orientation because + image-orientation: from-image is specified.</p> + <div> + <img id="img1" src="support/exif-orientation-1-ul.jpg"/> + <br>Normal + </div> + <div> + <img id="img2" src="support/exif-orientation-2-ur.jpg"/> + <br>Flipped horizontally + </div> + <div> + <img id="img3" src="support/exif-orientation-3-lr.jpg"/> + <br>Rotated 180° + </div> + <div> + <img id="img4" src="support/exif-orientation-4-lol.jpg"/> + <br>Flipped vertically + </div> + <div> + <img id="img5" src="support/exif-orientation-5-lu.jpg"/> + <br>Rotated 90° CCW and flipped vertically + </div> + <div> + <img id="img6" src="support/exif-orientation-6-ru.jpg"/> + <br>Rotated 90° CW + </div> + <div> + <img id="img7" src="support/exif-orientation-7-rl.jpg"/> + <br>Rotated 90° CW and flipped vertically + </div> + <div> + <img id="img8" src="support/exif-orientation-8-llo.jpg"/> + <br>Rotated 90° CCW + </div> + <div> + <img id="img9" src="support/exif-orientation-9-u.jpg"/> + <br>Undefined (invalid value) + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html new file mode 100644 index 00000000000..f6474afaa0a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: change from image-orientation: from-image to none with will-change: transform</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-none-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + body { + overflow: hidden; + } + img { + will-change: transform; + border: 1px solid black; + image-orientation: from-image; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +<script> + function runTest() { + for (var i = 1; i <= 9; i++) { + document.getElementById("img" + i).style.imageOrientation = "none"; + } + } +</script> +</head> +<body onload="runTest()"> + <p>The images should not rotate respecting their EXIF orientation because + image-orientation: none is specified.</p> + <div> + <img id="img1" src="support/exif-orientation-1-ul.jpg"/> + </div> + <div> + <img id="img2" src="support/exif-orientation-2-ur.jpg"/> + </div> + <div> + <img id="img3" src="support/exif-orientation-3-lr.jpg"/> + </div> + <div> + <img id="img4" src="support/exif-orientation-4-lol.jpg"/> + </div> + <div> + <img id="img5" src="support/exif-orientation-5-lu.jpg"/> + </div> + <div> + <img id="img6" src="support/exif-orientation-6-ru.jpg"/> + </div> + <div> + <img id="img7" src="support/exif-orientation-7-rl.jpg"/> + </div> + <div> + <img id="img8" src="support/exif-orientation-8-llo.jpg"/> + </div> + <div> + <img id="img9" src="support/exif-orientation-9-u.jpg"/> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited.html new file mode 100644 index 00000000000..596e497ed3e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: from-image with will-change: transform</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-from-image-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + body { + overflow: hidden; + image-orientation: from-image; + } + img { + will-change: transform; + border: 1px solid black; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because + image-orientation: from-image is specified.</p> + <div> + <img src="support/exif-orientation-1-ul.jpg"/> + <br>Normal + </div> + <div> + <img src="support/exif-orientation-2-ur.jpg"/> + <br>Flipped horizontally + </div> + <div> + <img src="support/exif-orientation-3-lr.jpg"/> + <br>Rotated 180° + </div> + <div> + <img src="support/exif-orientation-4-lol.jpg"/> + <br>Flipped vertically + </div> + <div> + <img src="support/exif-orientation-5-lu.jpg"/> + <br>Rotated 90° CCW and flipped vertically + </div> + <div> + <img src="support/exif-orientation-6-ru.jpg"/> + <br>Rotated 90° CW + </div> + <div> + <img src="support/exif-orientation-7-rl.jpg"/> + <br>Rotated 90° CW and flipped vertically + </div> + <div> + <img src="support/exif-orientation-8-llo.jpg"/> + <br>Rotated 90° CCW + </div> + <div> + <img src="support/exif-orientation-9-u.jpg"/> + <br>Undefined (invalid value) + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-computed-style.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-computed-style.html new file mode 100644 index 00000000000..32933244c38 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-computed-style.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation:none computed style</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + body { + overflow: hidden; + image-orientation: from-image;} + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +<script> +function run_tests() { + test(function() { + for (var i = 1; i <= 4; i++) { + var el = document.getElementById("img" + i); + var computedStyle = window.getComputedStyle(el); + assert_equals(computedStyle.width, "100px"); + assert_equals(computedStyle.height, "50px"); + assert_equals(computedStyle.imageOrientation, "from-image"); + } + for (var i = 5; i <= 8; i++) { + var el = document.getElementById("img" + i); + var computedStyle = window.getComputedStyle(el); + assert_equals(computedStyle.width, "50px"); + assert_equals(computedStyle.height, "100px"); + assert_equals(computedStyle.imageOrientation, "from-image"); + } + var el = document.getElementById("img9"); + var computedStyle = window.getComputedStyle(el); + assert_equals(computedStyle.width, "100px"); + assert_equals(computedStyle.height, "50px"); + assert_equals(computedStyle.imageOrientation, "from-image"); + }, "image-orientation:from-image computed style reports correct values"); +} +</script> +</head> +<body onload="run_tests()"> + <div><img id="img1" src="support/exif-orientation-1-ul.jpg"/></div> + <div><img id="img2" src="support/exif-orientation-2-ur.jpg"/></div> + <div><img id="img3" src="support/exif-orientation-3-lr.jpg"/></div> + <div><img id="img4" src="support/exif-orientation-4-lol.jpg"/></div> + <div><img id="img5" src="support/exif-orientation-5-lu.jpg"/></div> + <div><img id="img6" src="support/exif-orientation-6-ru.jpg"/></div> + <div><img id="img7" src="support/exif-orientation-7-rl.jpg"/></div> + <div><img id="img8" src="support/exif-orientation-8-llo.jpg"/></div> + <div><img id="img9" src="support/exif-orientation-9-u.jpg"/></div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-content-images.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-content-images.html new file mode 100644 index 00000000000..36a2a343168 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-content-images.html @@ -0,0 +1,90 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: from-image for content images</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-from-image-content-images-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + div.image { + display: inline-block; + border: 1px solid black; + } + div.container { + display: inline-block; + width: 100px; + vertical-align: top; + image-orientation: from-image; + } + img { + width: 100px; + height: 100px; + background-repeat: no-repeat; + } + body { + overflow: hidden; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because + image-orientation: from-image is specified.</p> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-1-ul.jpg)"></div> + <br>Normal + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-2-ur.jpg)"></div> + <br>Flipped horizontally + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-3-lr.jpg)"></div> + <br>Rotated 180° + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-4-lol.jpg)"></div> + <br>Flipped vertically + </div> + <br> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-5-lu.jpg)"></div> + <br>Rotated 90° CCW and flipped vertically + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-6-ru.jpg)"></div> + <br>Rotated 90° CW + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-7-rl.jpg)"></div> + <br>Rotated 90° CW and flipped vertically + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-8-llo.jpg)"></div> + <br>Rotated 90° CCW + </div> + <br> + <div class="container"> + <img style="background-image: url(support/exif-orientation-5-lu.jpg)"></img> + <br>Rotated 90° CCW and flipped vertically + </div> + <div class="container"> + <img style="background-image: url(support/exif-orientation-6-ru.jpg)"></img> + <br>Rotated 90° CW + </div> + <div class="container"> + <img style="background-image: url(support/exif-orientation-7-rl.jpg)"></img> + <br>Rotated 90° CW and flipped vertically + </div> + <div class="container"> + <img style="background-image: url(support/exif-orientation-8-llo.jpg)"></img> + <br>Rotated 90° CCW + </div> + <br> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-9-u.jpg)"></div> + <br>Undefined (invalid value) + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html new file mode 100644 index 00000000000..15e05884cf5 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: change from image-orientation: none to from-image</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-from-image-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + body { + overflow: hidden; + } + img { + border: 1px solid black; + image-orientation: none; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +<script> + function runTest() { + for (var i = 1; i <= 9; i++) { + document.getElementById("img" + i).style.imageOrientation = "from-image"; + } + } +</script> +</head> +<body onload="runTest()"> + <p>The images should rotate respecting their EXIF orientation because + image-orientation: from-image is specified.</p> + <div> + <img id="img1" src="support/exif-orientation-1-ul.jpg"/> + <br>Normal + </div> + <div> + <img id="img2" src="support/exif-orientation-2-ur.jpg"/> + <br>Flipped horizontally + </div> + <div> + <img id="img3" src="support/exif-orientation-3-lr.jpg"/> + <br>Rotated 180° + </div> + <div> + <img id="img4" src="support/exif-orientation-4-lol.jpg"/> + <br>Flipped vertically + </div> + <div> + <img id="img5" src="support/exif-orientation-5-lu.jpg"/> + <br>Rotated 90° CCW and flipped vertically + </div> + <div> + <img id="img6" src="support/exif-orientation-6-ru.jpg"/> + <br>Rotated 90° CW + </div> + <div> + <img id="img7" src="support/exif-orientation-7-rl.jpg"/> + <br>Rotated 90° CW and flipped vertically + </div> + <div> + <img id="img8" src="support/exif-orientation-8-llo.jpg"/> + <br>Rotated 90° CCW + </div> + <div> + <img id="img9" src="support/exif-orientation-9-u.jpg"/> + <br>Undefined (invalid value) + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html new file mode 100644 index 00000000000..c0df221337e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: change from image-orientation: from-image to none</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-none-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + body { + overflow: hidden; + } + img { + border: 1px solid black; + image-orientation: from-image; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +<script> + function runTest() { + for (var i = 1; i <= 9; i++) { + document.getElementById("img" + i).style.imageOrientation = "none"; + } + } +</script> +</head> +<body onload="runTest()"> + <p>The images should not rotate respecting their EXIF orientation because + image-orientation: none is specified.</p> + <div> + <img id="img1" src="support/exif-orientation-1-ul.jpg"/> + </div> + <div> + <img id="img2" src="support/exif-orientation-2-ur.jpg"/> + </div> + <div> + <img id="img3" src="support/exif-orientation-3-lr.jpg"/> + </div> + <div> + <img id="img4" src="support/exif-orientation-4-lol.jpg"/> + </div> + <div> + <img id="img5" src="support/exif-orientation-5-lu.jpg"/> + </div> + <div> + <img id="img6" src="support/exif-orientation-6-ru.jpg"/> + </div> + <div> + <img id="img7" src="support/exif-orientation-7-rl.jpg"/> + </div> + <div> + <img id="img8" src="support/exif-orientation-8-llo.jpg"/> + </div> + <div> + <img id="img9" src="support/exif-orientation-9-u.jpg"/> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-image-document.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-image-document.html new file mode 100644 index 00000000000..793fc017e6f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-image-document.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: from-image in image documents</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-from-image-image-document-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + iframe { + display: inline-block; + width: 120px; + height: 110px; + vertical-align: top; + border: 1px solid black; + image-orientation: from-image; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because image + documents always respect the orientation, regardless of the image-orientation + property.</p> + <iframe src="support/exif-orientation-1-ul.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-2-ur.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-3-lr.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-4-lol.jpg" frameborder=0></iframe> + <br> + <iframe src="support/exif-orientation-5-lu.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-6-ru.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-7-rl.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-8-llo.jpg" frameborder=0></iframe> + <br> + <iframe src="support/exif-orientation-9-u.jpg" frameborder=0></iframe> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image.html new file mode 100644 index 00000000000..f1343e9f23f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: from-image</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-from-image-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + body { + overflow: hidden; + image-orientation: from-image; + } + img { + border: 1px solid black; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because + image-orientation: from-image is specified.</p> + <div> + <img src="support/exif-orientation-1-ul.jpg"/> + <br>Normal + </div> + <div> + <img src="support/exif-orientation-2-ur.jpg"/> + <br>Flipped horizontally + </div> + <div> + <img src="support/exif-orientation-3-lr.jpg"/> + <br>Rotated 180° + </div> + <div> + <img src="support/exif-orientation-4-lol.jpg"/> + <br>Flipped vertically + </div> + <div> + <img src="support/exif-orientation-5-lu.jpg"/> + <br>Rotated 90° CCW and flipped vertically + </div> + <div> + <img src="support/exif-orientation-6-ru.jpg"/> + <br>Rotated 90° CW + </div> + <div> + <img src="support/exif-orientation-7-rl.jpg"/> + <br>Rotated 90° CW and flipped vertically + </div> + <div> + <img src="support/exif-orientation-8-llo.jpg"/> + <br>Rotated 90° CCW + </div> + <div> + <img src="support/exif-orientation-9-u.jpg"/> + <br>Undefined (invalid value) + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-computed-style.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-computed-style.html new file mode 100644 index 00000000000..49919288b55 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-computed-style.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: none computed style</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + body { + overflow: hidden; + image-orientation: none; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +<script> +function run_tests() { + test(function() { + for (var i = 1; i <= 9; i++) { + var el = document.getElementById("img" + i); + var computedStyle = window.getComputedStyle(el); + assert_equals(computedStyle.width, "100px"); + assert_equals(computedStyle.height, "50px"); + assert_equals(computedStyle.imageOrientation, "none"); + } + }, "image-orientation:none computed style reports correct values"); + +} +</script> +</head> +<body onload="run_tests()"> + <div><img id="img1" src="support/exif-orientation-1-ul.jpg"/></div> + <div><img id="img2" src="support/exif-orientation-2-ur.jpg"/></div> + <div><img id="img3" src="support/exif-orientation-3-lr.jpg"/></div> + <div><img id="img4" src="support/exif-orientation-4-lol.jpg"/></div> + <div><img id="img5" src="support/exif-orientation-5-lu.jpg"/></div> + <div><img id="img6" src="support/exif-orientation-6-ru.jpg"/></div> + <div><img id="img7" src="support/exif-orientation-7-rl.jpg"/></div> + <div><img id="img8" src="support/exif-orientation-8-llo.jpg"/></div> + <div><img id="img9" src="support/exif-orientation-9-u.jpg"/></div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images.html new file mode 100644 index 00000000000..7bcb5ce3394 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images.html @@ -0,0 +1,77 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: none for content images</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-none-content-images-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + div.image { + display: inline-block; + border: 1px solid black; + } + div.container { + display: inline-block; + width: 100px; + vertical-align: top; + image-orientation: none; + } + img { + width: 100px; + height: 100px; + background-repeat: no-repeat; + } + body { + overflow: hidden; + } +</style> +</head> +<body> + <p>The images should not rotate respecting their EXIF orientation because + image-orientation: none is specified.</p> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-1-ul.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-2-ur.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-3-lr.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-4-lol.jpg)"></div> + </div> + <br> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-5-lu.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-6-ru.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-7-rl.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-8-llo.jpg)"></div> + </div> + <br> + <div class="container"> + <img style="background-image: url(support/exif-orientation-5-lu.jpg)"></img> + </div> + <div class="container"> + <img style="background-image: url(support/exif-orientation-6-ru.jpg)"></img> + </div> + <div class="container"> + <img style="background-image: url(support/exif-orientation-7-rl.jpg)"></img> + </div> + <div class="container"> + <img style="background-image: url(support/exif-orientation-8-llo.jpg)"></img> + </div> + <br> + <div class="container"> + <div class="image" style="content: url(support/exif-orientation-9-u.jpg)"></div> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-image-document.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-image-document.html new file mode 100644 index 00000000000..29ec30f1431 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-image-document.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: none in image documents</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-none-image-document-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + iframe { + display: inline-block; + margin-right: 20px; + margin-bottom: 10px; + width: 120px; + height: 110px; + vertical-align: top; + border: 1px solid black; + image-orientation: none; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because image + documents always respect the orientation, regardless of the image-orientation + property.</p> + <iframe src="support/exif-orientation-1-ul.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-2-ur.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-3-lr.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-4-lol.jpg" frameborder=0></iframe> + <br> + <iframe src="support/exif-orientation-5-lu.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-6-ru.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-7-rl.jpg" frameborder=0></iframe> + <iframe src="support/exif-orientation-8-llo.jpg" frameborder=0></iframe> + <br> + <iframe src="support/exif-orientation-9-u.jpg" frameborder=0></iframe> +</body> +</html> + diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none.html new file mode 100644 index 00000000000..03c46c620a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: none</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/image-orientation-none-ref.html"> +<meta name=fuzzy content="10;100"> +<style> + body { + overflow: hidden; + image-orientation: none; + } + img { + border: 1px solid black; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +</head> +<body> + <p>The images should not rotate respecting their EXIF orientation because + image-orientation: none is specified.</p> + <div><img src="support/exif-orientation-1-ul.jpg"/></div> + <div><img src="support/exif-orientation-2-ur.jpg"/></div> + <div><img src="support/exif-orientation-3-lr.jpg"/></div> + <div><img src="support/exif-orientation-4-lol.jpg"/></div> + <div><img src="support/exif-orientation-5-lu.jpg"/></div> + <div><img src="support/exif-orientation-6-ru.jpg"/></div> + <div><img src="support/exif-orientation-7-rl.jpg"/></div> + <div><img src="support/exif-orientation-8-llo.jpg"/></div> + <div><img src="support/exif-orientation-9-u.jpg"/></div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-default-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-default-ref.html new file mode 100644 index 00000000000..aa8bede6014 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-default-ref.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html> +<head> +<title>CSS Images Module Level 3: image-orientation: from-image</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<style> + body { + overflow: hidden; + } + img { + border: 1px + solid black; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because + no image-orientation property is given.</p> + <div> + <img src="../support/exif-orientation-1-ul-pre-rotated.jpg"> + <br>Normal + </div> + <div> + <img src="../support/exif-orientation-2-ur-pre-rotated.jpg"> + <br>Flipped horizontally + </div> + <div> + <img src="../support/exif-orientation-3-lr-pre-rotated.jpg"> + <br>Rotated 180° + </div> + <div> + <img src="../support/exif-orientation-4-lol-pre-rotated.jpg"> + <br>Flipped vertically + </div> + <div> + <img src="../support/exif-orientation-5-lu-pre-rotated.jpg"> + <br>Rotated 90° CCW and flipped vertically + </div> + <div> + <img src="../support/exif-orientation-6-ru-pre-rotated.jpg"> + <br>Rotated 90° CW + </div> + <div> + <img src="../support/exif-orientation-7-rl-pre-rotated.jpg"> + <br>Rotated 90° CW and flipped vertically + </div> + <div> + <img src="../support/exif-orientation-8-llo-pre-rotated.jpg"> + <br>Rotated 90° CCW + </div> + <div> + <img src="../support/exif-orientation-9-u-pre-rotated.jpg"> + <br>Undefined (invalid value) + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html new file mode 100644 index 00000000000..21fed5fbb66 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html> +<head> +<title>CSS Images Module Level 3: image-orientation: from-image for content images</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<style> + div.image { + display: inline-block; + border: 1px solid black; + } + div.container { + display: inline-block; + width: 100px; + vertical-align: top; + } + img { + width: 100px; + height: 100px; + background-repeat: no-repeat; + } + body { + overflow: hidden; + } +</style> +</head> +<body > + <p>The images should rotate respecting their EXIF orientation because + image-orientation: from-image is specified. + </p> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul-pre-rotated.jpg)"></div> + <br>Normal + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-2-ur-pre-rotated.jpg)"></div> + <br>Flipped horizontally + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-3-lr-pre-rotated.jpg)"></div> + <br>Rotated 180° + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-4-lol-pre-rotated.jpg)"></div> + <br>Flipped vertically + </div> + <br> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-5-lu-pre-rotated.jpg)"></div> + <br>Rotated 90° CCW and flipped vertically + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-6-ru-pre-rotated.jpg)"></div> + <br>Rotated 90° CW + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-7-rl-pre-rotated.jpg)"></div> + <br>Rotated 90° CW and flipped vertically + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-8-llo-pre-rotated.jpg)"></div> + <br>Rotated 90° CCW + </div> + <br> + <div class="container"> + <img style="background-image: url(../support/exif-orientation-5-lu-pre-rotated.jpg)"></img> + <br>Rotated 90° CCW and flipped vertically + </div> + <div class="container"> + <img style="background-image: url(../support/exif-orientation-6-ru-pre-rotated.jpg)"></img> + <br>Rotated 90° CW + </div> + <div class="container"> + <img style="background-image: url(../support/exif-orientation-7-rl-pre-rotated.jpg)"></img> + <br>Rotated 90° CW and flipped vertically + </div> + <div class="container"> + <img style="background-image: url(../support/exif-orientation-8-llo-pre-rotated.jpg)"></img> + <br>Rotated 90° CCW + </div> + <br> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-9-u-pre-rotated.jpg)"></div> + <br>Undefined (invalid value) + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html new file mode 100644 index 00000000000..d2c7e6916bc --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: from-image in image documents</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<style> + iframe { + display: inline-block; + width: 120px; + height: 110px; + vertical-align: top; + border: 1px solid black; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because image + documents always respect the orientation, regardless of the image-orientation + property.</p> + <iframe src="../support/exif-orientation-1-ul-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-2-ur-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-3-lr-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-4-lol-pre-rotated.jpg" frameborder=0></iframe> + <br> + <iframe src="../support/exif-orientation-5-lu-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-6-ru-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-7-rl-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-8-llo-pre-rotated.jpg" frameborder=0></iframe> + <br> + <iframe src="../support/exif-orientation-9-u-pre-rotated.jpg" frameborder=0></iframe> +</body> +</html> + diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html new file mode 100644 index 00000000000..d731e837778 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: from-image</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<style> + body { + overflow: hidden; + } + img { + border: 1px solid black; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because + image-orientation: from-image is specified.</p> + <div> + <img src="../support/exif-orientation-1-ul-pre-rotated.jpg"> + <br>Normal + </div> + <div> + <img src="../support/exif-orientation-2-ur-pre-rotated.jpg"> + <br>Flipped horizontally + </div> + <div> + <img src="../support/exif-orientation-3-lr-pre-rotated.jpg"> + <br>Rotated 180° + </div> + <div> + <img src="../support/exif-orientation-4-lol-pre-rotated.jpg"> + <br>Flipped vertically + </div> + <div> + <img src="../support/exif-orientation-5-lu-pre-rotated.jpg"> + <br>Rotated 90° CCW and flipped vertically + </div> + <div> + <img src="../support/exif-orientation-6-ru-pre-rotated.jpg"> + <br>Rotated 90° CW + </div> + <div> + <img src="../support/exif-orientation-7-rl-pre-rotated.jpg"> + <br>Rotated 90° CW and flipped vertically + </div> + <div> + <img src="../support/exif-orientation-8-llo-pre-rotated.jpg"> + <br>Rotated 90° CCW + </div> + <div> + <img src="../support/exif-orientation-9-u-pre-rotated.jpg"> + <br>Undefined (invalid value) + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html new file mode 100644 index 00000000000..d73c554f329 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html @@ -0,0 +1,74 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: none for content images</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<style> + div.image { + display: inline-block; + border: 1px solid black; + } + div.container { + display: inline-block; + width: 100px; + vertical-align: top; + } + img { + width: 100px; + height: 100px; + background-repeat: no-repeat; + } + body { + overflow: hidden; + } +</style> +</head> +<body> + <p>The images should not rotate respecting their EXIF orientation because + image-orientation: none is specified.</p> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> + <br> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> + <br> + <div class="container"> + <img style="background-image: url(../support/exif-orientation-1-ul.jpg)"></img> + </div> + <div class="container"> + <img style="background-image: url(../support/exif-orientation-1-ul.jpg)"></img> + </div> + <div class="container"> + <img style="background-image: url(../support/exif-orientation-1-ul.jpg)"></img> + </div> + <div class="container"> + <img style="background-image: url(../support/exif-orientation-1-ul.jpg)"></img> + </div> + <br> + <div class="container"> + <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html new file mode 100644 index 00000000000..db84d0e23cf --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: none in image documents</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<style> + iframe { + display: inline-block; + margin-right: 20px; + margin-bottom: 10px; + width: 120px; + height: 110px; + vertical-align: top; + border: 1px solid black; + } +</style> +</head> +<body> + <p>The images should rotate respecting their EXIF orientation because image + documents always respect the orientation, regardless of the image-orientation + property.</p> + <iframe src="../support/exif-orientation-1-ul-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-2-ur-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-3-lr-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-4-lol-pre-rotated.jpg" frameborder=0></iframe> + <br> + <iframe src="../support/exif-orientation-5-lu-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-6-ru-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-7-rl-pre-rotated.jpg" frameborder=0></iframe> + <iframe src="../support/exif-orientation-8-llo-pre-rotated.jpg" frameborder=0></iframe> + <br> + <iframe src="../support/exif-orientation-9-u-pre-rotated.jpg" frameborder=0></iframe> +</body> +</html> + diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-ref.html new file mode 100644 index 00000000000..8293d6e003d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-ref.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: none</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<style> + body { + overflow: hidden; + } + img { + border: 1px solid black; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +</head> +<body> + <p>The images should not rotate respecting their EXIF orientation because + image-orientation: none is specified.</p> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> + <div><img src="../support/exif-orientation-1-ul.jpg"></div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..d9acd656f92 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul.jpg Binary files differnew file mode 100644 index 00000000000..7c13bf7dc4f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..1d06bf3d2f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur.jpg Binary files differnew file mode 100644 index 00000000000..2387b05feef --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..1c5ce1a8f6f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg Binary files differnew file mode 100644 index 00000000000..cb1a82dab16 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..cf71c6a1444 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol.jpg Binary files differnew file mode 100644 index 00000000000..8f930968030 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..62ddea22e44 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu.jpg Binary files differnew file mode 100644 index 00000000000..e65d2eb5cc2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..3d21ec96ec5 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru.jpg Binary files differnew file mode 100644 index 00000000000..6f487dae135 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..7d49d4f20cc --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl.jpg Binary files differnew file mode 100644 index 00000000000..769be7df853 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..e88b00c38b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo.jpg Binary files differnew file mode 100644 index 00000000000..c4a51ed3ff6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg Binary files differnew file mode 100644 index 00000000000..b6b517f6b72 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u.jpg Binary files differnew file mode 100644 index 00000000000..1003bfb7c21 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u.jpg diff --git a/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html b/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html new file mode 100644 index 00000000000..3df3e1ebc8f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#pseudo-algorithm"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1037790"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="columns:2; column-fill:auto; column-gap:0; width:fit-content; height:100px; background:red;"> + <div id="firstChild" style="width:200px; height:100px; background:green;"></div> + <div style="width:50px; height:100px; background:green;"></div> +</div> +<script> + document.body.offsetTop; + firstChild.style.width = "50px"; +</script> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/intrinsic-width-change-column-count.html b/tests/wpt/web-platform-tests/css/css-multicol/intrinsic-width-change-column-count.html new file mode 100644 index 00000000000..30e7671e41c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/intrinsic-width-change-column-count.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#pseudo-algorithm"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1037790"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="width:100px; background:red;"> + <div id="container" style="columns:3; column-gap:0; column-fill:auto; width:fit-content; height:100px; background:green;"> + <div style="width:25px; height:10px;"></div> + </div> +</div> +<script> + document.body.offsetTop; + container.style.columns = "4"; +</script> diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2-ref.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2-ref.html new file mode 100644 index 00000000000..941047901df --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2-ref.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Position Test Reference: Test position:sticky element with large top in an overflow scroll container</title> + <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + .scroll { + border: 5px solid blue; + padding: 5px 3px 0 8px; + overflow: auto; + height: 200px; + width: 200px; + transform: scale(1); + } + + .block { + width: 150px; + height: 200px; + background: yellow; + position: absolute; + top: 55px; + } + + .sticky { + position: absolute; + background: purple; + width: 50px; + height: 50px; + top: 205px; + z-index: 1; + } + </style> + <script> + function runTest() { + document.getElementById("scroll2").scrollTop = 50; + } + </script> + + <body onload="runTest();"> + <div class="scroll"> + <span> + <div class="sticky"></div> + </span> + <div class="block"></div> + </div> + + <div class="scroll" id="scroll2"> + <span> + <div class="sticky"></div> + </span> + <div class="block"></div> + </div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2.tentative.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2.tentative.html new file mode 100644 index 00000000000..1cf9c0dfb43 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2.tentative.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Position Test: Test position:sticky element with large top in an overflow container</title> + <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-position/#sticky-pos"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1598112"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2794"> + <link rel="match" href="position-sticky-large-top-2-ref.html"> + <meta name="assert" content="This test verifies the position of a position:sticky element with large top value can be reached by scrolling the overflow container."> + + <style> + .scroll { + border: 5px solid blue; + padding: 5px 3px 0 8px; + overflow: auto; + height: 200px; + width: 200px; + } + + .block { + width: 150px; + height: 200px; + background: yellow; + } + + .sticky { + position: sticky; + background: purple; + width: 50px; + height: 50px; + top: 200px; + } + </style> + <script> + function runTest() { + document.getElementById("scroll2").scrollTop = 50; + } + </script> + + <body onload="runTest();"> + <!-- test before scroll --> + <div class="scroll"> + <span> + <div class="sticky"></div> + </span> + <div class="block"></div> + </div> + + <!-- test after scroll --> + <div class="scroll" id="scroll2"> + <span> + <div class="sticky"></div> + </span> + <div class="block"></div> + </div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-ref.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-ref.html new file mode 100644 index 00000000000..075551a6e85 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-ref.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Position Test Reference: Test position:sticky element with large top in an overflow scroll container</title> + <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + .scroll { + border: 5px solid blue; + overflow: auto; + height: 200px; + width: 200px; + transform: scale(1); + } + + .block { + width: 100%; + height: 200px; + background: yellow; + position: absolute; + top: 50px; + } + + .sticky { + position: absolute; + background: purple; + width: 50px; + height: 50px; + top: 200px; + z-index: 1; + } + </style> + <script> + function runTest() { + document.getElementById("scroll2").scrollTop = 50; + } + </script> + + <body onload="runTest();"> + <div class="scroll"> + <div class="sticky"></div> + <div class="block"></div> + </div> + + <div class="scroll" id="scroll2"> + <div class="sticky"></div> + <div class="block"></div> + </div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top.tentative.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top.tentative.html new file mode 100644 index 00000000000..b00a0d13968 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top.tentative.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Position Test: Test position:sticky element with large top in an overflow container</title> + <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-position/#sticky-pos"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1598112"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2794"> + <link rel="match" href="position-sticky-large-top-ref.html"> + <meta name="assert" content="This test verifies the position of a position:sticky element with large top value can be reached by scrolling the overflow container."> + + <style> + .scroll { + border: 5px solid blue; + overflow: auto; + height: 200px; + width: 200px; + } + + .block { + width: 100%; + height: 200px; + background: yellow; + } + + .sticky { + position: sticky; + background: purple; + width: 50px; + height: 50px; + top: 200px; + } + </style> + <script> + function runTest() { + document.getElementById("scroll2").scrollTop = 50; + } + </script> + + <body onload="runTest();"> + <!-- test before scroll --> + <div class="scroll"> + <div class="sticky"></div> + <div class="block"></div> + </div> + + <!-- test after scroll --> + <div class="scroll" id="scroll2"> + <div class="sticky"></div> + <div class="block"></div> + </div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017-ref.html new file mode 100644 index 00000000000..9628123611d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: ::marker pseudo elements styled with 'content' property</title> +<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> +<style> +img { + display: list-item; + list-style-type: "[marker]"; +} +img.inside { + list-style-position: inside; +} +</style> +<ol> + <img src="about:invalid" alt="alt" class="inside" /> + <img src="about:invalid" alt="alt" /> + <li value="3">item</li> +</ol> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017.html new file mode 100644 index 00000000000..267e519feee --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: ::marker pseudo elements styled with 'content' property</title> +<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> +<link rel="match" href="marker-content-017-ref.html"> +<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo"> +<link rel="help" href="https://drafts.csswg.org/css-lists/#declaring-a-list-item"> +<meta name="assert" content="Checks that ::marker can be created inside a non-replaced <img>."> +<style> +img { + display: list-item; +} +img.inside { + list-style-position: inside; +} +img::marker { + content: '[marker]'; +} +</style> +<ol> + <img src="about:invalid" alt="alt" class="inside" /> + <img src="about:invalid" alt="alt" /> + <li>item</li> +</ol> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018-ref.html new file mode 100644 index 00000000000..8107d4297d7 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018-ref.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: ::marker pseudo elements styled with 'content' property</title> +<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> +<style> +ol { + float: left; + width: 100px; +} +.inside { + list-style-position: inside; +} +li:nth-child(1) { list-style-type: "1" } +li:nth-child(2) { list-style-type: "1 " } +li:nth-child(3) { list-style-type: "1 " } +li:nth-child(4) { list-style-type: " 1" } +li:nth-child(5) { list-style-type: " 1" } +li:nth-child(6) { list-style-type: " 1 " } +li:nth-child(7) { list-style-type: "1\9 2" } +li:nth-child(8) { list-style-type: "1\a 2" } +</style> +<ol class="inside"> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> +</ol> +<ol class="inside"> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> +</ol> +<ol class="outside"> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> +</ol> +<ol class="outside"> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> +</ol> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018.html new file mode 100644 index 00000000000..0a4a73cd505 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: ::marker pseudo elements styled with 'content' property</title> +<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> +<link rel="match" href="marker-content-018-ref.html"> +<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-rules"> +<meta name="assert" content="Checks that the 'content' property of a ::marker doesn't affect white space."> +<style> +ol { + float: left; + width: 100px; +} +.inside { + list-style-position: inside; +} +li:nth-child(1)::marker { content: "1" } +li:nth-child(2)::marker { content: "1 " } +li:nth-child(3)::marker { content: "1 " } +li:nth-child(4)::marker { content: " 1" } +li:nth-child(5)::marker { content: " 1" } +li:nth-child(6)::marker { content: " 1 " } +li:nth-child(7)::marker { content: "1\9 2" } +li:nth-child(8)::marker { content: "1\a 2" } +</style> +<ol class="inside"> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> +</ol> +<ol class="inside"> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> +</ol> +<ol class="outside"> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> + <li>item</li> +</ol> +<ol class="outside"> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> + <li> item</li> +</ol> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html index 3d106211219..be932213b0f 100644 --- a/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html +++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html @@ -3,6 +3,7 @@ <title>CSS Reftest Reference</title> <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" /> <link rel="mismatch" href="marker-font-variant-numeric-normal-ref.html"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> @font-face { /* This font looks different with 'font-variant-numeric: tabular-nums' */ @@ -17,19 +18,13 @@ ol { list-style-position: inside; font-family: "Exo 2"; } -span { +li:first-child::after { + content: 'X X X X X X X X X'; display: inline-block; + font: 25px/1 Ahem; vertical-align: top; -} -li:first-child::before { - content: '\200B'; /* zero-width space */ -} -li:first-child::after { - content: ''; - position: absolute; - height: 225px; + height: 0; width: 25px; - background: black; } </style> <ol> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html index 45ab55d14b8..b730a24e55a 100644 --- a/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html +++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html @@ -3,6 +3,7 @@ <title>CSS Reftest Reference</title> <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" /> <link rel="mismatch" href="marker-font-variant-numeric-default-ref.html"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> @font-face { /* This font looks different with 'font-variant-numeric: tabular-nums' */ @@ -19,10 +20,10 @@ ol { } span { display: inline-block; + font: 25px/1 Ahem; vertical-align: top; width: 25px; height: 25px; - background: black; } </style> <ol> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-002-manual.html b/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-002-manual.html new file mode 100644 index 00000000000..88fa97038ce --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-002-manual.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> + + <html lang="en"> + + <meta charset="UTF-8"> + + <title>CSS Pseudo-Elements Test: highlighting of spelling error</title> + + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> + <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-selectors"> + <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling"> + + <meta content="" name="flags"> + + <style> + input + { + font-size: 300%; + } + + input::spelling-error + { + color: maroon; + text-decoration: underline dotted red; + } + </style> + + <p>PREREQUISITE: User agent needs to have an enabled and capable spelling error module. If it does not, then this test does not apply to such user agent. + + <p>Test passes if each glyph of "txet" is maroon and if "txet" is underlined with a red dotted line. + + <div><input type="text" value="A txet sample"></div> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-003-manual.html b/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-003-manual.html new file mode 100644 index 00000000000..559a4fe092e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-003-manual.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> + + <html lang="en"> + + <meta charset="UTF-8"> + + <title>CSS Pseudo-Elements Test: highlighting of spelling error</title> + + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> + <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-selectors"> + <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling"> + + <meta content="" name="flags"> + + <style> + textarea + { + font-size: 300%; + } + + textarea::spelling-error + { + color: maroon; + text-decoration: underline dotted red; + } + </style> + + <p>PREREQUISITE: User agent needs to have an enabled and capable spelling error module. If it does not, then this test does not apply to such user agent. + + <p>Test passes if each glyph of "txet" is maroon and if "txet" is underlined with a red dotted line. + + <div><textarea rows="2" cols="20">A txet sample</textarea></div> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011-ref.html new file mode 100644 index 00000000000..d9ba940518e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011-ref.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> + + <meta charset="UTF-8"> + + <title>CSS Reftest Reference</title> + + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> + + <meta content="svg" name="flags"> + + <style> + text + { + fill: green; + /* + fill is the shorthand form for fill-color, + fill-image, fill-origin, fill-position, fill-size + and fill-repeat + https://www.w3.org/TR/fill-stroke-3/#fill-shorthand + */ + stroke: yellow; + /* + stroke is the shorthand form for stroke-color, + stroke-image, stroke-origin, stroke-position, + stroke-size, and stroke-repeat + https://www.w3.org/TR/fill-stroke-3/#stroke-shorthand + */ + stroke-width: 2px; + } + </style> + + <p>Test passes if the glyphs of "Curvy text sample" are green with a yellow outline. + + <div> + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="550" height="300"> + + <path id="pathToApply" + d="M 100 200 + C 100 100 200 0 500 200" fill="none" /> + + <text style="font-size: 48px;"><textPath xlink:href="#pathToApply" id="test">Curvy text sample</textPath></text> + + </svg> + + </div> diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011.html b/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011.html new file mode 100644 index 00000000000..2e42c6be8fb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> + + <meta charset="UTF-8"> + + <title>CSS Test: active selection of text following a path (complex)</title> + + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> + <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-selectors"> + <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling"> + <link rel="help" href="https://www.w3.org/TR/fill-stroke-3/#fill-shorthand"> + <link rel="help" href="https://www.w3.org/TR/fill-stroke-3/#stroke-shorthand"> + + <meta content="svg" name="flags"> + <meta content="This test checks that an SVG application with a text following a text path can be selected and then be styled." name="assert"> + + <style> + ::selected + { + fill: green; + /* + fill is the shorthand form for fill-color, + fill-image, fill-origin, fill-position, fill-size + and fill-repeat + https://www.w3.org/TR/fill-stroke-3/#fill-shorthand + */ + stroke: yellow; + /* + stroke is the shorthand form for stroke-color, + stroke-image, stroke-origin, stroke-position, + stroke-size, and stroke-repeat + https://www.w3.org/TR/fill-stroke-3/#stroke-shorthand + */ + stroke-width: 2px; + } + </style> + + <p>Test passes if the glyphs of "Curvy text sample" are green with a yellow outline. + + <div> + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="550" height="300"> + + <path id="pathToApply" + d="M 100 200 + C 100 100 200 0 500 200" fill="none" /> + + <text fill="red" style="font-size: 48px;"><textPath xlink:href="#pathToApply" id="test">Curvy text sample</textPath></text> + + </svg> + + </div> + + <script> + var targetRange = document.createRange(); + /* We first create an empty range */ + + targetRange.setStart(document.getElementById("test").childNodes[0], 0); + /* + Then we set the start boundary of the range inside textPath#test to + the 1st character, which is "C" + */ + + targetRange.setEnd(document.getElementById("test").childNodes[0], 17); + /* And we set the end boundary of the range inside textPath#test + right after the 18th character which is "e" */ + + window.getSelection().addRange(targetRange); + /* Finally, we now select such range of content */ + </script> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001-ref.html new file mode 100644 index 00000000000..eb368b3ae61 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001-ref.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Tests for ruby-align</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + div { width: 160px; box-sizing: border-box; } +</style> +<body style="font: 16px/3 Ahem"> +<div>X X X</div> +<div style="text-align: center">X X X</div> +<div style="text-align-last: justify">X X X</div> +<!-- 8px = (width: 160px - 5 * font-size: 16px) / + (1 + justification opportunities: 4) / 2 --> +<div style="text-align-last: justify; padding: 0 8px">X X X</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001.html new file mode 100644 index 00000000000..13c96f53f2f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Tests for ruby-align</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-align-property"> +<link rel="match" href="ruby-align-001-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + ruby { line-height: 0; } + rt > div { width: 160px; } +</style> +<body style="font: 16px/3 Ahem"> +<ruby style="ruby-align: start"> + <rb>X X X<rt><div></div></rt> +</ruby><br> +<ruby style="ruby-align: center"> + <rb>X X X<rt><div></div></rt> +</ruby><br> +<ruby style="ruby-align: space-between"> + <rb>X X X<rt><div></div></rt> +</ruby><br> +<ruby style="ruby-align: space-around"> + <rb>X X X<rt><div></div></rt> +</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001a.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001a.html new file mode 100644 index 00000000000..6e652f17265 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001a.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Tests for ruby-align</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-align-property"> +<link rel="match" href="ruby-align-001-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + ruby { line-height: 0; } + rt > div { width: 160px; } +</style> +<body style="font: 16px/3 Ahem"> +<ruby> + <rb style="ruby-align: start">X X X<rt><div></div></rt> +</ruby><br> +<ruby> + <rb style="ruby-align: center">X X X<rt><div></div></rt> +</ruby><br> +<ruby> + <rb style="ruby-align: space-between">X X X<rt><div></div></rt> +</ruby><br> +<ruby> + <rb style="ruby-align: space-around">X X X<rt><div></div></rt> +</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002-ref.html new file mode 100644 index 00000000000..4c5413aef71 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Tests for ruby-align</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + ruby { line-height: 0; } + rt { font-size: 100%; } + rt > div { width: 160px; box-sizing: border-box; } +</style> +<body style="font: 16px/3 Ahem"> +<ruby> + <rt><div>X X X</div></rt> +</ruby><br> +<ruby> + <rt><div style="text-align: center">X X X</div></rt> +</ruby><br> +<ruby> + <rt><div style="text-align-last: justify">X X X</div></rt> +</ruby><br> +<!-- 8px = (width: 160px - 5 * font-size: 16px) / + (1 + justification opportunities: 4) / 2 --> +<ruby> + <rt><div style="text-align-last: justify; padding: 0 8px">X X X</div></rt> +</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002.html new file mode 100644 index 00000000000..ec40be5e105 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Tests for ruby-align</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-align-property"> +<link rel="match" href="ruby-align-002-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + ruby { line-height: 0; } + rt { font-size: 100%; } + rb { font-size: 0; } + rb > div { width: 160px; } +</style> +<body style="font: 16px/3 Ahem"> +<ruby style="ruby-align: start"> + <rb><div></div><rt>X X X</rt> +</ruby><br> +<ruby style="ruby-align: center"> + <rb><div></div><rt>X X X</rt> +</ruby><br> +<ruby style="ruby-align: space-between"> + <rb><div></div><rt>X X X</rt> +</ruby><br> +<ruby style="ruby-align: space-around"> + <rb><div></div><rt>X X X</rt> +</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002a.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002a.html new file mode 100644 index 00000000000..dfb7ae37ed9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002a.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Tests for ruby-align</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-align-property"> +<link rel="match" href="ruby-align-002-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + ruby { line-height: 0; } + rt { font-size: 100%; } + rb { font-size: 0; } + rb > div { width: 160px; } +</style> +<body style="font: 16px/3 Ahem"> +<ruby> + <rb><div></div><rt style="ruby-align: start">X X X</rt> +</ruby><br> +<ruby> + <rb><div></div><rt style="ruby-align: center">X X X</rt> +</ruby><br> +<ruby> + <rb><div></div><rt style="ruby-align: space-between">X X X</rt> +</ruby><br> +<ruby> + <rb><div></div><rt style="ruby-align: space-around">X X X</rt> +</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html index 695ab1cdb71..70f47eaa8be 100644 --- a/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html @@ -3,6 +3,7 @@ <meta charset="UTF-8"> <title>CSS Ruby Reference</title> <link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> <link rel="stylesheet" href="/fonts/ahem.css"> <style> body { diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html index dcfde6c16ea..f71b5644c62 100644 --- a/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html @@ -3,6 +3,7 @@ <meta charset="UTF-8"> <title>CSS Ruby Test: sizing and positioning of ruby containers when size of ruby bases and the base container differ</title> <link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> <link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-layout"> <link rel="match" href="ruby-base-different-size-ref.html"> <link rel="stylesheet" href="/fonts/ahem.css"> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001-ref.html new file mode 100644 index 00000000000..c714921d32e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001-ref.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Position of ruby annotation in RTL text</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> + body { color: transparent; } + rb { background: green; } + rtc { background: red; } + rt { background: cyan; } +</style> +<body style="text-align: right"> + <ruby><rb>base<rtc><rt>text</ruby> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001.html new file mode 100644 index 00000000000..ba18071150a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Position of ruby annotation in RTL text</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#bidi"> +<link rel="match" href="ruby-bidi-001-ref.html"> +<style> + body { color: transparent; } + rb { background: green; } + rtc { background: red; } + rt { background: cyan; } +</style> +<body dir="rtl"> + <ruby><rb>base<rtc><rt>text</ruby> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002-ref.html new file mode 100644 index 00000000000..874284de998 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002-ref.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Bidi reordering of ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> rb { margin: 0 5px; } </style> +<p> + <ruby> + <rb>base1</rb><rb>base2</rb> + <rt>text1</rt><rt>text2</rt> + <rb>base4</rb><rb>base3</rb> + <rt>text4</rt><rt>text3</rt> + </ruby> + <ruby> + <rb>base7</rb><rb>base8</rb> + <rt>text7</rt><rt>text8</rt> + <rb>base6</rb><rb>base5</rb> + <rt>text6</rt><rt>text5</rt> + </ruby> +</p> +<p style="text-align: right"> + <ruby> + <rb>base5</rb><rb>base6</rb> + <rt>text5</rt><rt>text6</rt> + <rb>base8</rb><rb>base7</rb> + <rt>text8</rt><rt>text7</rt> + </ruby> + <ruby> + <rb>base3</rb><rb>base4</rb> + <rt>text3</rt><rt>text4</rt> + <rb>base2</rb><rb>base1</rb> + <rt>text2</rt><rt>text1</rt> + </ruby> +</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002.html new file mode 100644 index 00000000000..d6692a333ae --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Bidi reordering of ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#bidi"> +<link rel="match" href="ruby-bidi-002-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> rb { margin: 0 5px; } </style> +<p> + <ruby> + <rb>base1</rb><rb>base2</rb> + <rtc dir="rtl"> + <rt>text1</rt><rt>text2</rt> + </rtc> + <rbc dir="rtl"> + <rb>base3</rb><rb>base4</rb> + </rbc> + <rt>text3</rt><rt>text4</rt> + </ruby> + <ruby dir="rtl"> + <rb>base5</rb><rb>base6</rb> + <rt>text5</rt><rt>text6</rt> + <rbc dir="ltr"> + <rb>base7</rb><rb>base8</rb> + </rbc> + <rt>text7</rt><rt>text8</rt> + </ruby> +</p> +<p dir="rtl"> + <ruby> + <rb>base1</rb><rb>base2</rb> + <rtc dir="ltr"> + <rt>text1</rt><rt>text2</rt> + </rtc> + <rbc dir="ltr"> + <rb>base3</rb><rb>base4</rb> + </rbc> + <rt>text3</rt><rt>text4</rt> + </ruby> + <ruby dir="ltr"> + <rb>base5</rb><rb>base6</rb> + <rt>text5</rt><rt>text6</rt> + <rbc dir="rtl"> + <rb>base7</rb><rb>base8</rb> + </rbc> + <rt>text7</rt><rt>text8</rt> + </ruby> +</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003-ref.html new file mode 100644 index 00000000000..ec00293d861 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003-ref.html @@ -0,0 +1,6 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Bidirectional text inside ruby content box</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<body dir="rtl" style="font-size: 64px"> +<ruby><div>אב12ג</div><rt><div>אabבג</div></ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003.html new file mode 100644 index 00000000000..2510408ec22 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003.html @@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Bidirectional text inside ruby content box</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#bidi"> +<link rel="match" href="ruby-bidi-003-ref.html"> +<body dir="rtl" style="font-size: 64px"> +<ruby>אב12ג<rt>אabבג</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001-ref.html new file mode 100644 index 00000000000..8d836fe23c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001-ref.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<body class="large"> + + <p>|<ruby><rbc><rb>a</rb><rb><span> </span></rb><rb>b</rb></rbc + ><rtc pseudo><rt>c</rt><rt pseudo><span> </span></rt><rt>d</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>e</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>f</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>g</rb></rbc><rtc><rt>h</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>i</rb><rb><span> <span>j</span> + </span></rb></rbc><rtc pseudo><rt>k</rt></rtc><rbc><rb><span> <span>l</span> + </span></rb></rbc><rbc><rb>m</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>n</rb></rbc + ><rtc><rt>o</rt></rtc><rtc><rt>p</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>q</rb></rbc><rtc pseudo><rt>r</rt></rtc + ><rtc><rt>s</rt></rtc><rtc pseudo><rt>t</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>u</rb></rbc><rbc><rb><span> <span>v</span> + <span>w</span> </span></rb></rbc><rtc><rt>x</rt></rtc><rbc><rb><span> + <span>y</span> </span></rb><rb>z</rb></rbc></ruby>|</p> + + <p>|<span> </span><ruby><rbc><rb>a</rb><rb><span> </span></rb><rb>b</rb></rbc + ><rtc pseudo><rt>c</rt><rt pseudo><span> </span></rt><rt>d</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>e</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>f</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>g</rb></rbc><rtc><rt>h</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>i</rb></rbc></ruby><span> <span>j</span> + </span><ruby><rbc></rbc><rtc pseudo><rt>k</rt></rtc></ruby><span> <span>l</span> + </span><ruby><rbc><rb>m</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>n</rb></rbc + ><rtc><rt>o</rt></rtc><rtc><rt>p</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>q</rb></rbc><rtc pseudo><rt>r</rt></rtc + ><rtc><rt>s</rt></rtc><rtc pseudo><rt>t</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>u</rb></rbc></ruby><span> <span>v</span> + <span>w</span> </span><ruby><rbc></rbc><rtc><rt>x</rt></rtc></ruby><span> + <span>y</span> </span><ruby><rbc><rb>z</rb></rbc></ruby><span> </span>|</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001.html new file mode 100644 index 00000000000..ac58d4d43ab --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="stylesheet" href="support/ruby-common.css"> +<link rel="match" href="ruby-box-generation-001-ref.html"> +<body class="large"> + + <!-- + The tests are written in this way: + there are five different elements may appear in a ruby container: rb, rt, + rbc, rtc, and inline content. + + In each test file, there are two parts: all elements are wrapped inside a + <ruby> in one part, they are directly contained by a <p> in the other part. + + In each part, all permutations of pairs of two adjacent elements are + presented, so there are 5*5+1=26 elements. + + The five test files share the same structure, but with different element + type order. + --> + + <p>|<ruby> + <rb>a</rb> <rb>b</rb> + <rt>c</rt> <rt>d</rt> + <rb>e</rb> <rbc><rb>f</rb></rbc> + <rb>g</rb> <rtc><rt>h</rt></rtc> + <rb>i</rb> <span>j</span> + <rt>k</rt> <span>l</span> + <rbc><rb>m</rb></rbc> <rbc><rb>n</rb></rbc> + <rtc><rt>o</rt></rtc> <rtc><rt>p</rt></rtc> + <rbc><rb>q</rb></rbc> <rt>r</rt> + <rtc><rt>s</rt></rtc> <rt>t</rt> + <rbc><rb>u</rb></rbc> <span>v</span> + <span>w</span> <rtc><rt>x</rt></rtc> + <span>y</span> <rb>z</rb> + </ruby>|</p> + + <p>| <rb>a</rb> <rb>b</rb> + <rt>c</rt> <rt>d</rt> + <rb>e</rb> <rbc><rb>f</rb></rbc> + <rb>g</rb> <rtc><rt>h</rt></rtc> + <rb>i</rb> <span>j</span> + <rt>k</rt> <span>l</span> + <rbc><rb>m</rb></rbc> <rbc><rb>n</rb></rbc> + <rtc><rt>o</rt></rtc> <rtc><rt>p</rt></rtc> + <rbc><rb>q</rb></rbc> <rt>r</rt> + <rtc><rt>s</rt></rtc> <rt>t</rt> + <rbc><rb>u</rb></rbc> <span>v</span> + <span>w</span> <rtc><rt>x</rt></rtc> + <span>y</span> <rb>z</rb> |</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002-ref.html new file mode 100644 index 00000000000..730ab787d30 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002-ref.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<body class="large"> + + <p>|<ruby><rbc></rbc + ><rtc pseudo><rt>a</rt><rt pseudo><span> </span></rt><rt>b</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>c</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>d</rb></rbc + ><rtc pseudo><rt>e</rt></rtc><rtc><rt>f</rt></rtc + ><rtc pseudo><rt>g</rt></rtc><rbc><rb><span> h + </span></rb></rbc><rtc pseudo><rt>i</rt></rtc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>j</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>k</rb></rbc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>l</rb></rbc + ><rtc><rt>m</rt></rtc><rtc><rt>n</rt></rtc><rbc><rb><span> + o p + </span></rb></rbc><rtc><rt>q</rt></rtc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>r</rb></rbc><rbc><rb><span> + s </span></rb></rbc><rbc><rb>t</rb></rbc + ><rtc><rt>u</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>v</rb><rb><span> + </span></rb><rb>w</rb><rb><span> x + </span></rb><rb>y</rb></rbc><rtc pseudo><rt>z</rt></rtc></ruby>|</p> + + <p>|<span> </span><ruby><rbc></rbc + ><rtc pseudo><rt>a</rt><rt pseudo><span> </span></rt><rt>b</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>c</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>d</rb></rbc + ><rtc pseudo><rt>e</rt></rtc><rtc><rt>f</rt></rtc + ><rtc pseudo><rt>g</rt></rtc></ruby><span> h + </span><ruby><rbc></rbc><rtc pseudo><rt>i</rt></rtc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>j</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>k</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>l</rb></rbc + ><rtc><rt>m</rt></rtc><rtc><rt>n</rt></rtc></ruby><span> + o p + </span><ruby><rbc></rbc><rtc><rt>q</rt></rtc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>r</rb></rbc></ruby><span> + s </span><ruby><rbc><rb>t</rb></rbc + ><rtc><rt>u</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>v</rb><rb><span> + </span></rb><rb>w</rb></rbc></ruby><span> x + </span><ruby><rbc><rb>y</rb></rbc><rtc pseudo><rt>z</rt></rtc></ruby><span> </span>|</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002.html new file mode 100644 index 00000000000..e09ecf1eb25 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="stylesheet" href="support/ruby-common.css"> +<link rel="match" href="ruby-box-generation-002-ref.html"> +<body class="large"> + + <!-- + The tests are written in this way: + there are five different elements may appear in a ruby container: rb, rt, + rbc, rtc, and inline content. + + In each test file, there are two parts: all elements are wrapped inside a + <ruby> in one part, they are directly contained by a <p> in the other part. + + In each part, all permutations of pairs of two adjacent elements are + presented, so there are 5*5+1=26 elements. + + The five test files share the same structure, but with different element + type order. + --> + + <p>|<ruby> + <rt>a</rt> <rt>b</rt> + <rbc><rb>c</rb></rbc> <rbc><rb>d</rb></rbc> + <rt>e</rt> <rtc><rt>f</rt></rtc> + <rt>g</rt> <span>h</span> + <rt>i</rt> <rb>j</rb> + <rbc><rb>k</rb></rbc> <rb>l</rb> + <rtc><rt>m</rt></rtc> <rtc><rt>n</rt></rtc> + <span>o</span> <span>p</span> + <rtc><rt>q</rt></rtc> <rbc><rb>r</rb></rbc> + <span>s</span> <rbc><rb>t</rb></rbc> + <rtc><rt>u</rt></rtc> <rb>v</rb> + <rb>w</rb> <span>x</span> + <rb>y</rb> <rt>z</rt> + </ruby>|</p> + + <p>| <rt>a</rt> <rt>b</rt> + <rbc><rb>c</rb></rbc> <rbc><rb>d</rb></rbc> + <rt>e</rt> <rtc><rt>f</rt></rtc> + <rt>g</rt> <span>h</span> + <rt>i</rt> <rb>j</rb> + <rbc><rb>k</rb></rbc> <rb>l</rb> + <rtc><rt>m</rt></rtc> <rtc><rt>n</rt></rtc> + <span>o</span> <span>p</span> + <rtc><rt>q</rt></rtc> <rbc><rb>r</rb></rbc> + <span>s</span> <rbc><rb>t</rb></rbc> + <rtc><rt>u</rt></rtc> <rb>v</rb> + <rb>w</rb> <span>x</span> + <rb>y</rb> <rt>z</rt> |</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003-ref.html new file mode 100644 index 00000000000..e4c92a498bb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003-ref.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<body class="large"> + + <p>|<ruby><rbc><rb>a</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>b</rb></rbc + ><rtc><rt>c</rt></rtc><rtc><rt>d</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>e</rb></rbc><rbc><rb><span> <span>f</span> + </span></rb></rbc><rbc><rb>g</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>h</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>i</rb></rbc><rtc pseudo><rt>j</rt></rtc + ><rtc><rt>k</rt></rtc><rtc pseudo><rt>l</rt></rtc><rbc><rb><span> + <span>m</span> <span>n</span> + </span></rb><rb>o</rb><rb><span> </span></rb><rb>p</rb><rb><span> + <span>q</span> </span></rb></rbc><rtc><rt>r</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>s</rb></rbc><rtc><rt>t</rt></rtc><rbc><rb><span> + <span>u</span> </span></rb></rbc><rtc pseudo><rt>v</rt><rt pseudo><span> + </span></rt><rt>w</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>x</rb></rbc + ><rtc pseudo><rt>y</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>z</rb></rbc + ></ruby>|</p> + + <p>|<span> </span><ruby><rbc><rb>a</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>b</rb></rbc + ><rtc><rt>c</rt></rtc><rtc><rt>d</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>e</rb></rbc></ruby><span> <span>f</span> + </span><ruby><rbc><rb>g</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>h</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>i</rb></rbc><rtc pseudo><rt>j</rt></rtc + ><rtc><rt>k</rt></rtc><rtc pseudo><rt>l</rt></rtc></ruby><span> + <span>m</span> <span>n</span> + </span><ruby><rbc><rb>o</rb><rb><span> </span></rb><rb>p</rb></rbc></ruby><span> + <span>q</span> </span><ruby><rbc></rbc><rtc><rt>r</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>s</rb></rbc><rtc><rt>t</rt></rtc></ruby><span> + <span>u</span> </span><ruby><rbc></rbc><rtc pseudo><rt>v</rt><rt pseudo><span> + </span><rt>w</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>x</rb></rbc + ><rtc pseudo><rt>y</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>z</rb></rbc></ruby + ><span> </span>|</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003.html new file mode 100644 index 00000000000..6b975afdfbf --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="stylesheet" href="support/ruby-common.css"> +<link rel="match" href="ruby-box-generation-003-ref.html"> +<body class="large"> + + <!-- + The tests are written in this way: + there are five different elements may appear in a ruby container: rb, rt, + rbc, rtc, and inline content. + + In each test file, there are two parts: all elements are wrapped inside a + <ruby> in one part, they are directly contained by a <p> in the other part. + + In each part, all permutations of pairs of two adjacent elements are + presented, so there are 5*5+1=26 elements. + + The five test files share the same structure, but with different element + type order. + --> + + <p>|<ruby> + <rbc><rb>a</rb></rbc> <rbc><rb>b</rb></rbc> + <rtc><rt>c</rt></rtc> <rtc><rt>d</rt></rtc> + <rbc><rb>e</rb></rbc> <span>f</span> + <rbc><rb>g</rb></rbc> <rb>h</rb> + <rbc><rb>i</rb></rbc> <rt>j</rt> + <rtc><rt>k</rt></rtc> <rt>l</rt> + <span>m</span> <span>n</span> + <rb>o</rb> <rb>p</rb> + <span>q</span> <rtc><rt>r</rt></rtc> + <rb>s</rb> <rtc><rt>t</rt></rtc> + <span>u</span> <rt>v</rt> + <rt>w</rt> <rb>x</rb> + <rt>y</rt> <rbc><rb>z</rb></rbc> + </ruby>|</p> + + <p>| <rbc><rb>a</rb></rbc> <rbc><rb>b</rb></rbc> + <rtc><rt>c</rt></rtc> <rtc><rt>d</rt></rtc> + <rbc><rb>e</rb></rbc> <span>f</span> + <rbc><rb>g</rb></rbc> <rb>h</rb> + <rbc><rb>i</rb></rbc> <rt>j</rt> + <rtc><rt>k</rt></rtc> <rt>l</rt> + <span>m</span> <span>n</span> + <rb>o</rb> <rb>p</rb> + <span>q</span> <rtc><rt>r</rt></rtc> + <rb>s</rb> <rtc><rt>t</rt></rtc> + <span>u</span> <rt>v</rt> + <rt>w</rt> <rb>x</rb> + <rt>y</rt> <rbc><rb>z</rb></rbc> |</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004-ref.html new file mode 100644 index 00000000000..7a27622cac1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004-ref.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<body class="large"> + + <p>|<ruby><rbc></rbc + ><rtc><rt>a</rt></rtc><rtc><rt>b</rt></rtc><rbc><rb><span> + <span>c</span> <span>d</span> + </span></rb></rbc><rtc><rt>e</rt></rtc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>f</rb></rbc + ><rtc><rt>g</rt></rtc><rtc pseudo><rt>h</rt></rtc + ><rtc><rt>i</rt></rtc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>j</rb></rbc><rbc><rb><span> + <span>k</span> </span></rb></rbc><rbc><rb>l</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>m</rb><rb><span> </span></rb><rb>n</rb></rbc + ><rtc pseudo><rt>o</rt><rt pseudo><span> </span></rt><rt>p</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>q</rb><rb><span> <span>r</span> + </span></rb></rbc><rtc pseudo><rt>s</rt></rtc><rbc><rb><span> <span>t</span> + </span></rb></rbc><rbc><rb>u</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>v</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>w</rb></rbc><rtc pseudo><rt>x</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>y</rb></rbc><rtc><rt>z</rt></rtc + ></ruby>|</p> + + <p>|<span> </span><ruby><rbc></rbc + ><rtc><rt>a</rt></rtc><rtc><rt>b</rt></rtc></ruby><span> + <span>c</span> <span>d</span> + </span><ruby><rbc></rbc><rtc><rt>e</rt></rtc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>f</rb></rbc + ><rtc><rt>g</rt></rtc><rtc pseudo><rt>h</rt></rtc + ><rtc><rt>i</rt></rtc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>j</rb></rbc></ruby><span> + <span>k</span> </span><ruby><rbc><rb>l</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>m</rb><rb><span> </span></rb><rb>n</rb></rbc + ><rtc pseudo><rt>o</rt><rt pseudo><span> </span></rt><rt>p</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>q</rb></rbc></ruby><span> <span>r</span> + </span><ruby><rbc></rbc><rtc pseudo><rt>s</rt></rtc></ruby><span> <span>t</span> + </span><ruby><rbc><rb>u</rb></rbc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>v</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>w</rb></rbc><rtc pseudo><rt>x</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>y</rb></rbc><rtc><rt>z</rt></rtc></ruby + ><span> </span>|</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004.html new file mode 100644 index 00000000000..0f6ed72d717 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="stylesheet" href="support/ruby-common.css"> +<link rel="match" href="ruby-box-generation-004-ref.html"> +<body class="large"> + + <!-- + The tests are written in this way: + there are five different elements may appear in a ruby container: rb, rt, + rbc, rtc, and inline content. + + In each test file, there are two parts: all elements are wrapped inside a + <ruby> in one part, they are directly contained by a <p> in the other part. + + In each part, all permutations of pairs of two adjacent elements are + presented, so there are 5*5+1=26 elements. + + The five test files share the same structure, but with different element + type order. + --> + + <p>|<ruby> + <rtc><rt>a</rt></rtc> <rtc><rt>b</rt></rtc> + <span>c</span> <span>d</span> + <rtc><rt>e</rt></rtc> <rb>f</rb> + <rtc><rt>g</rt></rtc> <rt>h</rt> + <rtc><rt>i</rt></rtc> <rbc><rb>j</rb></rbc> + <span>k</span> <rbc><rb>l</rb></rbc> + <rb>m</rb> <rb>n</rb> + <rt>o</rt> <rt>p</rt> + <rb>q</rb> <span>r</span> + <rt>s</rt> <span>t</span> + <rb>u</rb> <rbc><rb>v</rb></rbc> + <rbc><rb>w</rb></rbc> <rt>x</rt> + <rbc><rb>y</rb></rbc> <rtc><rt>z</rt></rtc> + </ruby>|</p> + + <p>| <rtc><rt>a</rt></rtc> <rtc><rt>b</rt></rtc> + <span>c</span> <span>d</span> + <rtc><rt>e</rt></rtc> <rb>f</rb> + <rtc><rt>g</rt></rtc> <rt>h</rt> + <rtc><rt>i</rt></rtc> <rbc><rb>j</rb></rbc> + <span>k</span> <rbc><rb>l</rb></rbc> + <rb>m</rb> <rb>n</rb> + <rt>o</rt> <rt>p</rt> + <rb>q</rb> <span>r</span> + <rt>s</rt> <span>t</span> + <rb>u</rb> <rbc><rb>v</rb></rbc> + <rbc><rb>w</rb></rbc> <rt>x</rt> + <rbc><rb>y</rb></rbc> <rtc><rt>z</rt></rtc> |</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005-ref.html new file mode 100644 index 00000000000..55ba7b2c73f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005-ref.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<body class="large"> + + <p>|<ruby><rbc><rb><span><span>a</span> <span>b</span> + </span></rb><rb>c</rb><rb><span> </span></rb><rb>d</rb><rb><span> + <span>e</span> </span></rb></rbc><rtc pseudo><rt>f</rt></rtc><rbc><rb><span> + <span>g</span> </span></rb></rbc><rbc><rb>h</rb></rbc><rbc><rb><span> + <span>i</span> </span></rb></rbc><rtc><rt>j</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>k</rb></rbc><rtc><rt>l</rt></rtc + ><rtc pseudo><rt>m</rt><rt pseudo><span> </span></rt><rt>n</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>o</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>p</rb></rbc + ><rtc pseudo><rt>q</rt></rtc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>r</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>s</rb></rbc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>t</rb></rbc + ><rtc pseudo><rt>u</rt></rtc><rtc><rt>v</rt></rtc + ><rtc><rt>w</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>x</rb></rbc + ><rtc><rt>y</rt></rtc><rbc><rb><span> <span>z</span></span></rb></rbc + ></ruby>|</p> + + <p>|<span> <span>a</span> <span>b</span> + </span><ruby + ><rbc><rb>c</rb><rb><span> </span></rb><rb>d</rb></rbc></ruby><span> + <span>e</span> </span><ruby><rbc></rbc><rtc pseudo><rt>f</rt></rtc></ruby><span> + <span>g</span> </span><ruby><rbc><rb>h</rb></rbc></ruby><span> + <span>i</span> </span><ruby><rbc></rbc><rtc><rt>j</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>k</rb></rbc><rtc><rt>l</rt></rtc + ><rtc pseudo><rt>m</rt><rt pseudo><span> </span></rt><rt>n</rt></rtc><rbc><rb><span> + </span></rb></rbc><rbc><rb>o</rb></rbc + ><rbc><rb><span> </span></rb></rbc><rbc><rb>p</rb></rbc + ><rtc pseudo><rt>q</rt></rtc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>r</rb></rbc><rbc><rb><span> + </span></rb></rbc><rbc><rb>s</rb></rbc><rbc><rb><span> </span></rb></rbc + ><rbc><rb>t</rb></rbc + ><rtc pseudo><rt>u</rt></rtc><rtc><rt>v</rt></rtc + ><rtc><rt>w</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>x</rb></rbc + ><rtc><rt>y</rt></rtc></ruby><span> <span>z</span> </span>|</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005.html new file mode 100644 index 00000000000..c86b697bf9d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for pseudo ruby box generation</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="stylesheet" href="support/ruby-common.css"> +<link rel="match" href="ruby-box-generation-005-ref.html"> +<body class="large"> + + <p>|<ruby> + <span>a</span> <span>b</span> + <rb>c</rb> <rb>d</rb> + <span>e</span> <rt>f</rt> + <span>g</span> <rbc><rb>h</rb></rbc> + <span>i</span> <rtc><rt>j</rt></rtc> + <rb>k</rb> <rtc><rt>l</rt></rtc> + <rt>m</rt> <rt>n</rt> + <rbc><rb>o</rb></rbc> <rbc><rb>p</rb></rbc> + <rt>q</rt> <rb>r</rb> + <rbc><rb>s</rb></rbc> <rb>t</rb> + <rt>u</rt> <rtc><rt>v</rt></rtc> + <rtc><rt>w</rt></rtc> <rbc><rb>x</rb></rbc> + <rtc><rt>y</rt></rtc> <span>z</span> + </ruby>|</p> + + <p>| <span>a</span> <span>b</span> + <rb>c</rb> <rb>d</rb> + <span>e</span> <rt>f</rt> + <span>g</span> <rbc><rb>h</rb></rbc> + <span>i</span> <rtc><rt>j</rt></rtc> + <rb>k</rb> <rtc><rt>l</rt></rtc> + <rt>m</rt> <rt>n</rt> + <rbc><rb>o</rb></rbc> <rbc><rb>p</rb></rbc> + <rt>q</rt> <rb>r</rb> + <rbc><rb>s</rb></rbc> <rb>t</rb> + <rt>u</rt> <rtc><rt>v</rt></rtc> + <rtc><rt>w</rt></rtc> <rbc><rb>x</rb></rbc> + <rtc><rt>y</rt></rtc> <span>z</span> |</p> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001-ref.html new file mode 100644 index 00000000000..0a09924c653 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001-ref.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> + +<p>One space should exist between 'a' and 'b':</p> + +<p>a<rbc><rb></rb> <rb></rb></rbc>b</p> +<p>a<ruby><rb></rb> <rb></rb></ruby>b</p> +<p>a<ruby><rbc></rbc> <rbc></rbc></ruby>b</p> +<p>a<rtc><rt></rt> <rt></rt></rtc>b</p> +<p>a<ruby><rt></rt> <rt></rt></ruby>b</p> + +<p>a<rbc><rb></rb> <rb></rb></rbc>b</p> +<p>a<ruby><rb></rb> <rb></rb></ruby>b</p> +<p>a<ruby><rbc></rbc> <rbc></rbc></ruby>b</p> +<p>a<rtc><rt></rt> <rt></rt></rtc>b</p> +<p>a<ruby><rt></rt> <rt></rt></ruby>b</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001.html new file mode 100644 index 00000000000..be1c5ce5005 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-dynamic-insertion-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<script src="support/ruby-dynamic-insertion.js"></script> +<p>One space should exist between 'a' and 'b':</p> + +<!-- leading white space --> +<!-- => inter-base white space --> +<p>a<rbc data-insert="start" data-tag="rb"> <rb></rb></rbc>b</p> +<p>a<ruby data-insert="start" data-tag="rb"> <rb></rb></ruby>b</p> +<!-- => inter-segment white space --> +<p>a<ruby data-insert="start" data-tag="rbc"> <rbc></rbc></ruby>b</p> +<!-- => inter-annotation white space --> +<p>a<rtc data-insert="start" data-tag="rt"> <rt></rt></rtc>b</p> +<p>a<ruby data-insert="start" data-tag="rt"> <rt></rt></ruby>b</p> + +<!-- trailing white space --> +<!-- => inter-base white space --> +<p>a<rbc data-insert="end" data-tag="rb"><rb></rb> </rbc>b</p> +<p>a<ruby data-insert="end" data-tag="rb"><rb></rb> </ruby>b</p> +<!-- => inter-segment white space --> +<p>a<ruby data-insert="end" data-tag="rbc"><rbc></rbc> </ruby>b</p> +<!-- => inter-annotation white space --> +<p>a<rtc data-insert="end" data-tag="rt"><rt></rt> </rtc>b</p> +<p>a<ruby data-insert="end" data-tag="rt"><rt></rt> </ruby>b</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002-ref.html new file mode 100644 index 00000000000..cd85db944e3 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002-ref.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> + +<p>One space should exist between 'a' and 'b':</p> + +<p>a<rb></rb><span></span> <rt></rt>b</p> +<p>a<rb></rb> <span></span><rt></rt>b</p> +<p>a<rb></rb> <rb></rb><rt></rt>b</p> +<p>a<rt></rt><rb></rb> <rb></rb>b</p> +<p>a<rbc></rbc> <rbc></rbc><rt></rt>b</p> +<p>a<rb></rb><rt></rt> <rt></rt>b</p> +<p>a<rt></rt> <rt></rt><rb></rb>b</p> + +<p>a<rb></rb> <rb></rb>b</p> +<p>a<rbc></rbc> <rbc></rbc>b</p> +<p>a<rt></rt> <rt></rt>b</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002.html new file mode 100644 index 00000000000..c2a12a04195 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-dynamic-insertion-002-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<script src="support/ruby-dynamic-insertion.js"></script> +<p>One space should exist between 'a' and 'b':</p> + +<!-- inter-level white space --> +<!-- => normal white space --> +<p>a<rb data-insert="after" data-tag="span"></rb> <rt></rt>b</p> +<p>a<rb></rb> <rt data-insert="before" data-tag="span"></rt>b</p> +<!-- => inter-base white space --> +<p>a<rb></rb> <rt data-insert="before" data-tag="rb"></rt>b</p> +<p>a<rt data-insert="after" data-tag="rb"></rt> <rb></rb>b</p> +<!-- => inter-segment white space --> +<p>a<rbc></rbc> <rt data-insert="before" data-tag="rbc"></rt>b</p> +<!-- => inter-annotation white space --> +<p>a<rb data-insert="after" data-tag="rt"></rb> <rt></rt>b</p> +<p>a<rt></rt> <rb data-insert="before" data-tag="rt"></rb>b</p> + +<!-- insert white space --> +<!-- inter-base white space --> +<p>a<rb data-insert="after" data-text=" "></rb><rb></rb>b</p> +<!-- inter-segment white space --> +<p>a<rbc data-insert="after" data-text=" "></rbc><rbc></rbc>b</p> +<!-- inter-annotation white space --> +<p>a<rt data-insert="after" data-text=" "></rt><rt></rt>b</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003-ref.html new file mode 100644 index 00000000000..ef71525479d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003-ref.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<p>No space should exist between 'a' and 'b':</p> + +<p><span>a</span><rb></rb> <rt></rt>b</p> +<p>a<rb></rb> <rt></rt><span>b</span></p> +<p>a<rb></rb> <rt></rt><rb></rb>b</p> +<p>a<rbc></rbc> <rt></rt><rb></rb>b</p> +<p>a<rt></rt><rb></rb> <rt></rt>b</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003.html new file mode 100644 index 00000000000..68984b5568b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-dynamic-insertion-003-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<script src="support/ruby-dynamic-insertion.js"></script> +<p>No space should exist between 'a' and 'b':</p> + +<!-- inter-level white space --> +<!-- <= normal white space --> +<p><span data-insert="after" data-tag="rb">a</span> <rt></rt>b</p> +<p>a<rb></rb> <span data-insert="before" data-tag="rt">b</span></p> +<!-- <= inter-base white space --> +<p>a<rb></rb> <rb data-insert="before" data-tag="rt"></rb>b</p> +<!-- <= inter-segment white space --> +<p>a<rbc></rbc> <rb data-insert="before" data-tag="rt"></rb>b</p> +<!-- <= inter-annotation white space --> +<p>a<rt data-insert="after" data-tag="rb"></rt> <rt></rt>b</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004-ref.html new file mode 100644 index 00000000000..9c8120ee3fa --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004-ref.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<p>No space should exist between 'a' and 'b':</p> + +<p>a<ruby> <rb></rb></ruby>b</p> +<p>a<rbc> <rb></rb></rbc>b</p> +<p>a<rtc> <rt></rt></rtc>b</p> +<p>a<ruby><rb></rb> </ruby>b</p> +<p>a<rbc><rb></rb> </rbc>b</p> +<p>a<rtc><rt></rt> </rtc>b</p> +<p>a<rb></rb> <rt></rt>b</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004.html new file mode 100644 index 00000000000..9b3c36e3ac8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-dynamic-insertion-004-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<script src="support/ruby-dynamic-insertion.js"></script> +<p>No space should exist between 'a' and 'b':</p> + +<!-- insert white space --> +<!-- leading white space --> +<p>a<ruby data-insert="start" data-text=" "><rb></rb></ruby>b</p> +<p>a<rbc data-insert="start" data-text=" "><rb></rb></rbc>b</p> +<p>a<rtc data-insert="start" data-text=" "><rt></rt></rtc>b</p> +<!-- trailing white space --> +<p>a<ruby data-insert="end" data-text=" "><rb></rb></ruby>b</p> +<p>a<rbc data-insert="end" data-text=" "><rb></rb></rbc>b</p> +<p>a<rtc data-insert="end" data-text=" "><rt></rt></rtc>b</p> +<!-- inter-level white space --> +<p>a<rb data-insert="after" data-text=" "></rb><rt></rt>b</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005-ref.html new file mode 100644 index 00000000000..03e5cabe55c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005-ref.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<p>'a' and 'b' should be paired with 'x' and 'y' respectively:</p> + +<p><rb></rb><span></span><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> +<p><rb></rb><rt></rt><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> +<p><rb>a</rb><rt>x</rt><rb>b</rb><rt>y</rt></p> +<p><rbc><span>a</span><rb></rb>b</rbc><rt>x</rt><rt></rt><rt>y</rt></p> +<p><rb>a</rb><rb></rb><rb>b</rb><rtc><span>x</span><rt></rt>y</rtc></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005.html new file mode 100644 index 00000000000..a684d665c89 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic insertion of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-dynamic-insertion-005-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<script src="support/ruby-dynamic-insertion.js"></script> +<p>'a' and 'b' should be paired with 'x' and 'y' respectively:</p> + +<!-- split --> +<!-- pseudo ruby --> +<p><rb data-insert="after" data-tag="span"></rb><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> +<!-- pseudo ruby base container --> +<p><rb data-insert="after" data-tag="rt"></rb><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> +<!-- pseudo ruby text container --> +<p><rb>a</rb><rt data-insert="after" data-tag="rb" data-text="b">x</rt><rt>y</rt></p> +<!-- pseudo ruby base --> +<p><rbc><span data-insert="after" data-tag="rb">a</span>b</rbc><rt>x</rt><rt></rt><rt>y</rt></p> +<!-- pseudo ruby text --> +<p><rb>a</rb><rb></rb><rb>b</rb><rtc><span data-insert="after" data-tag="rt">x</span>y</rtc></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001-ref.html new file mode 100644 index 00000000000..23beda28987 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001-ref.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic removal of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<p>No space should exist between 'a' and 'b':</p> + +<p>a<ruby> <rb></rb></ruby>b</p> +<p>a<ruby><rb></rb> </ruby>b</p> +<p>a<ruby><rb></rb> <rt></rt></ruby>b</p> + +<p>a<ruby> <rbc></rbc></ruby>b</p> +<p>a<ruby><rbc></rbc> </ruby>b</p> +<p>a<rbc></rbc> <rtc></rtc>b</p> + +<p><rb>a</rb><rb>b</rb><rtc> <rt>x</rt></rtc></p> +<p><rb>a</rb><rb>b</rb><rtc><rt>x</rt> </rtc></p> +<p><rb>a</rb><rb>b</rb> <rt>x</rt></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001.html new file mode 100644 index 00000000000..090ea43c79a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic removal of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-dynamic-removal-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<script src="support/ruby-dynamic-removal.js"></script> +<p>No space should exist between 'a' and 'b':</p> + +<!-- inter-base white space --> +<!-- => leading white space --> +<p>a<ruby><rb class="remove"></rb> <rb></rb></ruby>b</p> +<!-- => trailing white space --> +<p>a<ruby><rb></rb> <rb class="remove"></rb></ruby>b</p> +<!-- => inter-level white space --> +<p>a<ruby><rb></rb> <rb class="remove"></rb><rt></rt></ruby>b</p> + +<!-- inter-segment white space --> +<!-- => leading white space --> +<p>a<ruby><rbc class="remove"></rbc> <rbc></rbc></ruby>b</p> +<!-- => trailing white space --> +<p>a<ruby><rbc></rbc> <rbc class="remove"></rbc></ruby>b</p> +<!-- => inter-level white space --> +<p>a<rbc></rbc> <rbc class="remove"></rbc><rtc></rtc>b</p> + +<!-- inter-annotation white space --> +<!-- => leading white space --> +<p><rb>a</rb><rb>b</rb><rtc><rt class="remove"></rt> <rt>x</rt></rtc></p> +<!-- => trailing white space --> +<p><rb>a</rb><rb>b</rb><rtc><rt>x</rt> <rt class="remove"></rt></rtc></p> +<!-- => inter-level white space --> +<p><rb>a</rb><rb>b</rb><rt class="remove"></rt> <rt>x</rt></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002-ref.html new file mode 100644 index 00000000000..f9d2fd7240d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002-ref.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic removal of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<p>One space should exist between 'a' and 'b':</p> + +<p>a <rt></rt>b</p> +<p>a<rb></rb> b</p> +<p>a<rb></rb> <rb></rb>b</p> +<p>a<rbc></rbc> <rbc></rbc>b</p> +<p><rb>a</rb> <rb>b</rb><rt>x</rt> <rt>y</rt></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002.html new file mode 100644 index 00000000000..76846e547bb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic removal of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-dynamic-removal-002-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<script src="support/ruby-dynamic-removal.js"></script> +<p>One space should exist between 'a' and 'b':</p> + +<!-- inter-level white space --> +<!-- => normal white space --> +<p>a<rb class="remove"></rb> <rt></rt>b</p> +<p>a<rb></rb> <rt class="remove"></rt>b</p> +<!-- => inter-base white space --> +<p>a<rb></rb> <rt class="remove"></rt><rb></rb>b</p> +<!-- => inter-segment white space --> +<p>a<rbc></rbc> <rtc class="remove"></rtc><rbc></rbc>b</p> +<!-- => inter-annotation white space --> +<p><rb>a</rb> <rb>b</rb><rt>x</rt><rb class="remove"></rb> <rt>y</rt></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003-ref.html new file mode 100644 index 00000000000..0067c014f5d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003-ref.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic removal of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<p>'a' and 'b' should be paired with 'x' and 'y' respectively:</p> + + +<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> +<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> +<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> + +<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> +<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p> + +<p>'ab' should be paried with 'xy':</p> + +<p><rbc>ab</rbc><rt>xy</rt></p> +<p><rb>ab</rb><rtc style="letter-spacing: 1px">xy</rtc></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003.html new file mode 100644 index 00000000000..d35b2b968d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for dynamic removal of ruby frames</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-dynamic-removal-003-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<script src="support/ruby-dynamic-removal.js"></script> +<p>'a' and 'b' should be paired with 'x' and 'y' respectively:</p> + +<!-- merge --> +<!-- pseudo ruby --> +<p><rb>a</rb><span class="remove"></span><rb>b</rb><rt>x</rt><rt>y</rt></p> +<!-- pseudo ruby base container --> +<p><rb>a</rb><rt class="remove"></rt><rb>b</rb><rt>x</rt><rt>y</rt></p> +<!-- pseudo ruby text container --> +<p><rb>a</rb><rb>b</rb><rt>x</rt><rb class="remove"></rb><rt>y</rt></p> + +<!-- white space removal --> +<!-- inter-base white space --> +<p><rb class="remove-after">a</rb> <rb>b</rb><rt>x</rt><rt>y</rt></p> +<!-- inter-annotation white space --> +<p><rb>a</rb><rb>b</rb><rt class="remove-after">x</rt> <rt>y</rt></p> + +<p>'ab' should be paried with 'xy':</p> + +<!-- merge --> +<!-- pseudo ruby base --> +<p><rbc>a<rb class="remove"></rb>b</rbc><rt>xy</rt></p> +<!-- pseudo ruby text --> +<!-- letter-spacing is added here to avoid fuzzy on Windows. See bug 1111891 --> +<p><rb>ab</rb><rtc style="letter-spacing: 1px">x<rt class="remove"></rt>y</rtc></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001-ref.html new file mode 100644 index 00000000000..245a366172a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001-ref.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for float handling in ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + ruby div { + width: 10px; height: 10px; + background-color: grey; + margin: 2px; + } + .left { float: left; } + .right { float: right; } +</style> +<div><ruby><rb><div class="left"></div>HELLO WORLD</rb><rt>hello world</rt></ruby></div> +<div><ruby><rb><div class="left"></div>HELLO WORLD</rb><rt>hello world</rt></ruby></div> +<div><ruby><rb><div class="right"></div>HELLO WORLD</rb><rt>hello world</rt></ruby></div> +<div><ruby><rb><div class="right"></div>HELLO WORLD</rb><rt>hello world</rt></ruby></div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001.html new file mode 100644 index 00000000000..5cb56e88aca --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for float handling in ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#formatting-context"> +<link rel="match" href="ruby-float-handling-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + ruby div { + width: 10px; height: 10px; + background-color: grey; + margin: 2px; + } + .left { float: left; } + .right { float: right; } +</style> +<div><ruby><rb>HELLO WORLD</rb><rt><div class="left"></div>hello world</rt></ruby></div> +<div><ruby><rb>HELLO WORLD</rb><rt>hello<div class="left"></div> world</rt></ruby></div> +<div><ruby><rb>HELLO WORLD</rb><rt><div class="right"></div>hello world</rt></ruby></div> +<div><ruby><rb>HELLO WORLD</rb><rt>hello<div class="right"></div> world</rt></ruby></div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001-ref.html new file mode 100644 index 00000000000..1d9fbb344fd --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Intra-level whitespace pairing</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<p><ruby> + <rb>a</rb><rb pseudo><span> </span></rb><rb>b</rb> + <rt>x</rt><rt pseudo><span> </span></rt><rt>y</rt> +</ruby></p> +<p><ruby> + <rb>a</rb><rb pseudo><span> </span></rb><rb>b</rb> + <rt>x</rt><rt></rt><rt>y</rt> +</ruby></p> +<p><ruby> + <rb>a</rb><rb pseudo></rb><rb>b</rb> + <rt>x</rt><rt pseudo><span> </span></rt><rt>y</rt> +</ruby></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001.html new file mode 100644 index 00000000000..4fceda1fb09 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Intra-level whitespace pairing</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-pairing"> +<link rel="match" href="ruby-intra-level-whitespace-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<p><ruby> + <rb>a</rb> <rb>b</rb> + <rt>x</rt> <rt>y</rt> +</ruby></p> +<p><ruby> + <rb>a</rb> <rb>b</rb> + <rt>x</rt><rt>y</rt> +</ruby></p> +<p><ruby> + <rb>a</rb><rb>b</rb> + <rt>x</rt> <rt>y</rt> +</ruby></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002-ref.html new file mode 100644 index 00000000000..c5949dbeb50 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002-ref.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Intra-level whitespace pairing</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + body { font-family: monospace; } + .container { border: 1px solid blue; margin: 20px; } +</style> +<style id="style"></style> +<span id="ref1">12345</span> <span id="ref2">12345 67890</span> +<div class="container"><ruby><rb>12345</rb> <rb>67890</rb><rt>09876</rt><rt>54321</rt></ruby></div> +<div class="container"><ruby><rb>12345</rb><rb>67890</rb><rt>09876</rt> <rt>54321</rt></ruby></div> +<div class="container"><ruby><rb>12345</rb> <rb>67890</rb><rt>09876</rt> <rt>54321</rt></ruby></div> +<script type="text/javascript"> + var ref2 = document.getElementById('ref2'); + var style = document.getElementById('style'); + var width2 = ref2.getBoundingClientRect().width + 'px'; + // This is the same as the script in the corresponding + // testcase, except that here we skip the intermediate + // size and jump straight to the final size. + style.textContent = '.container { width: ' + width2 + '; }'; +</script> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002.html new file mode 100644 index 00000000000..67aab53bfb0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Intra-level whitespace pairing</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-pairing"> +<link rel="match" href="ruby-intra-level-whitespace-002-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + body { font-family: monospace; } + .container { border: 1px solid blue; margin: 20px; } +</style> +<style id="style"></style> +<span id="ref1">12345</span> <span id="ref2">12345 67890</span> +<div class="container"><ruby><rb>12345</rb> <rb>67890</rb><rt>09876</rt><rt>54321</rt></ruby></div> +<div class="container"><ruby><rb>12345</rb><rb>67890</rb><rt>09876</rt> <rt>54321</rt></ruby></div> +<div class="container"><ruby><rb>12345</rb> <rb>67890</rb><rt>09876</rt> <rt>54321</rt></ruby></div> +<script type="text/javascript"> + var ref1 = document.getElementById('ref1'); + var ref2 = document.getElementById('ref2'); + var style = document.getElementById('style'); + var width1 = ref1.getBoundingClientRect().width + 'px'; + var width2 = ref2.getBoundingClientRect().width + 'px'; + // It changes the width of the containers to test incremental + // layout with intra-level whitespace columns being pushed and + // pulled up across a line-break. + style.textContent = '.container { width: ' + width1 + '; }'; + document.body.offsetHeight; // force reflow + style.textContent = '.container { width: ' + width2 + '; }'; + document.body.offsetHeight; // force reflow +</script> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003-ref.html new file mode 100644 index 00000000000..d1df82371c9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003-ref.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Intra-level whitespace pairing</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +|<ruby> + <rbc><rb>before</rb><rb>base</rb><rb> </rb></rbc> + <rtc><rt> </rt><rt>text</rt><rt>after</rt></rtc> +</ruby>| diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003.html new file mode 100644 index 00000000000..716f2e3f0b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Intra-level whitespace pairing</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-pairing"> +<link rel="match" href="ruby-intra-level-whitespace-003-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + rbc::before { + display: ruby-base; + content: "before"; + } + rbc::after { + display: ruby-base; + content: " "; + } + rtc::before { + display: ruby-text; + content: " "; + } + rtc::after { + display: ruby-text; + content: "after"; + } +</style> +<!-- This test ensures that we don't treat all-whitespace + ::before/::after content as intra-level whitespace --> +|<ruby> + <rbc><rb>base</rb></rbc> + <rtc><rt>text</rt></rtc> +</ruby>| diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001-ref.html new file mode 100644 index 00000000000..9d2889f8116 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001-ref.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Intrinsic ISize calculation of ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> + div { + display: inline-block; + border: 1px solid black; + font-kerning: none; /* disable kerning, because in the reference file + it might occur across <span> boundaries */ + } + span { + white-space: nowrap; + } +</style> +<div style="width: min-content"> + <span>ABC</span><span>DEF</span> +</div> +<div style="width: max-content"> + <span>ABC</span><span>DEF</span> +</div> +<br> + +<div style="width: min-content"> + XYZ<span>ABC</span><span>DEF</span>XYZ +</div> +<div style="width: max-content"> + XYZ<span>ABC</span><span>DEF</span>XYZ +</div> +<br> + +<div style="width: min-content"> + <span>あい</span><span>うえ</span> +</div> +<div style="width: max-content"> + <span>あい</span><span>うえ</span> +</div> +<br> + +<div style="width: min-content"> + お<span>あい</span><span>うえ</span>お +</div> +<div style="width: max-content"> + お<span>あい</span><span>うえ</span>お +</div> +<br> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001.html new file mode 100644 index 00000000000..84f48e2fc93 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Intrinsic ISize calculation of ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#line-breaks"> +<link rel="match" href="ruby-intrinsic-isize-001-ref.html"> +<style> + div { + display: inline-block; + border: 1px solid black; + font-kerning: none; /* disable kerning, because in the reference file + it might occur across <span> boundaries */ + } +</style> +<div style="width: min-content"> + <ruby><rb>ABC<rb>DEF</ruby> +</div> +<div style="width: max-content"> + <ruby><rb>ABC<rb>DEF</ruby> +</div> +<br> + +<div style="width: min-content"> + XYZ<ruby><rb>ABC<rb>DEF</ruby>XYZ +</div> +<div style="width: max-content"> + XYZ<ruby><rb>ABC<rb>DEF</ruby>XYZ +</div> +<br> + +<div style="width: min-content"> + <ruby><rb>あい<rb>うえ</ruby> +</div> +<div style="width: max-content"> + <ruby><rb>あい<rb>うえ</ruby> +</div> +<br> + +<div style="width: min-content"> + お<ruby><rb>あい<rb>うえ</ruby>お +</div> +<div style="width: max-content"> + お<ruby><rb>あい<rb>うえ</ruby>お +</div> +<br> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002-ref.html new file mode 100644 index 00000000000..d71de26a259 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002-ref.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Intrinsic ISize calculation of ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> + div { + display: inline-block; + border: 1px solid black; + } +</style> +<p>No line break should happen in any block, and the content should just fit in the block.</p> + +<div> + ABC DEF +</div> +<div> + XYZ ABCDEF XYZ +</div> + +<div> + あい うえ +</div> +<div> + お あいうえ お +</div> +<br> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002.html new file mode 100644 index 00000000000..741d41bec57 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Intrinsic ISize calculation of ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#line-breaks"> +<link rel="match" href="ruby-intrinsic-isize-002-ref.html"> +<style> + div { + display: inline-block; + border: 1px solid black; + } +</style> +<p>No line break should happen in any block, and the content should just fit in the block.</p> + +<div> + <ruby><rb>ABC</rb> <rb>DEF</rb></ruby> +</div> +<div> + XYZ <ruby><rb>ABC</rb><rb>DEF</rb></ruby> XYZ +</div> + +<div> + <ruby><rb>あい</rb> <rb>うえ</rb></ruby> +</div> +<div> + お <ruby><rb>あい</rb><rb>うえ</rb></ruby> お +</div> +<br> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001-ref.html new file mode 100644 index 00000000000..eaec8897133 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001-ref.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Justification with ruby span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + body { line-height: 3; } +</style> +<div style="width: 200px; height: 100px; text-align-last: justify; overflow: auto;"><ruby> + <rb>a</rb><rb>b</rb> +</ruby></div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001.html new file mode 100644 index 00000000000..edef72874b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Justification with ruby span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#base-annotation-pairing"> +<link rel="match" href="ruby-justification-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + body { line-height: 3; } +</style> +<div style="width: 200px; height: 100px; text-align-last: justify; overflow: auto;"><ruby> + <rb>a</rb><rb>b</rb> + <rtc><div style="width: 100px;"></div></rtc> +</ruby></div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002-ref.html new file mode 100644 index 00000000000..c61dae5c62d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002-ref.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Justification with ruby span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + div { + ruby-position: under; + width: 300px; height: 100px; + text-align-last: justify; + overflow: auto; + text-decoration: underline; + } +</style> +<div><rb>仮</rb><rb>名</rb><rt>が</rt><rt>な</rt></div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002.html new file mode 100644 index 00000000000..979987c028b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Justification with ruby span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#base-annotation-pairing"> +<link rel="match" href="ruby-justification-002-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + div { + ruby-position: under; + width: 300px; height: 100px; + text-align-last: justify; + overflow: auto; + text-decoration: underline; + } +</style> +<div> + <rb>仮</rb><rb>名</rb> + <rt>が</rt><rt>な</rt> + <!-- --> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001-ref.html new file mode 100644 index 00000000000..c0655a5310b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001-ref.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for lang-specific default stylesheet for ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<body style="font: 200%/normal Ahem !important"> +<p><ruby><rb>base x x<rt style="ruby-align: space-around; font-size: 50%">text x x</ruby></p> +<p><ruby><rb>base x x<rt style="ruby-align: space-around; font-size: 50%">text x x</ruby></p> +<p><ruby><rb>base x x<rt style="ruby-align: center; font-size: 50%">text x x</ruby></p> +<p><ruby><rb>base x x<rt style="ruby-align: center; font-size: 30%">text x x</ruby></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001.html new file mode 100644 index 00000000000..3206514f0d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for lang-specific default stylesheet for ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#default-stylesheet"> +<link rel="match" href="ruby-lang-specific-style-001-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<body style="font: 200%/normal Ahem !important"> +<p lang="en"><ruby><rb>base x x<rt>text x x</ruby></p> +<p lang="ja"><ruby><rb>base x x<rt>text x x</ruby></p> +<p lang="zh-CN"><ruby><rb>base x x<rt>text x x</ruby></p> +<p lang="zh-TW"><ruby><rb>base x x<rt>text x x</ruby></p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001-ref.html new file mode 100644 index 00000000000..1cd43b80018 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001-ref.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for ruby line break suppression</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<ruby>ab</ruby><br> +<rbc>ab</rbc><br> +<rtc>ab</rtc><br> +<rb>ab</rb><br> +<rt>ab</rt> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001.html new file mode 100644 index 00000000000..11d4d40d436 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for ruby line break suppression</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-line-break-suppression-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<ruby>a<br>b</ruby><br> +<rbc>a<br>b</rbc><br> +<rtc>a<br>b</rtc><br> +<rb>a<br>b</rb><br> +<rt>a<br>b</rt> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002-ref.html new file mode 100644 index 00000000000..8281ea1d74f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002-ref.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for ruby line break suppression</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<div style="width: 1em; border: 1px solid"> + <ruby>aaaaaaaaaabbbbbbbbbb</ruby><br> + <rbc>aaaaaaaaaabbbbbbbbbb</rbc><br> + <rtc>aaaaaaaaaabbbbbbbbbb</rtc><br> + <rb>aaaaaaaaaabbbbbbbbbb</rb><br> + <rt>aaaaaaaaaabbbbbbbbbb</rt><br> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002.html new file mode 100644 index 00000000000..394b9c27e53 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for ruby line break suppression</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-line-break-suppression-002-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<div style="width: 1em; border: 1px solid"> + <ruby>aaaaaaaaaa<div></div>bbbbbbbbbb</ruby><br> + <rbc>aaaaaaaaaa<div></div>bbbbbbbbbb</rbc><br> + <rtc>aaaaaaaaaa<div></div>bbbbbbbbbb</rtc><br> + <rb>aaaaaaaaaa<div></div>bbbbbbbbbb</rb><br> + <rt>aaaaaaaaaa<div></div>bbbbbbbbbb</rt><br> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003-ref.html new file mode 100644 index 00000000000..f8b1e168e11 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for ruby line break suppression</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<ruby><span>a +b</span></ruby><br> +<rbc><span>a +b</span></rbc><br> +<rtc><span>a +b</span></rtc><br> +<rb><span>a +b</span></rb><br> +<rt><span>a +b</span></rt><br> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003.html new file mode 100644 index 00000000000..dadfd562a45 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Test for ruby line break suppression</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-line-break-suppression-003-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + span { white-space: pre; } +</style> +<ruby><span>a +b</span></ruby><br> +<rbc><span>a +b</span></rbc><br> +<rtc><span>a +b</span></rtc><br> +<rb><span>a +b</span></rb><br> +<rt><span>a +b</span></rt><br> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004-ref.html new file mode 100644 index 00000000000..5aa55829574 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004-ref.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Line break suppression on whitespaces wrapped but not contained in ruby boxes</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<span style="white-space: pre"><rb>a</rb><rb> +</rb><rb>b</rb></span> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004.html new file mode 100644 index 00000000000..0314237f07f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Line break suppression on whitespaces wrapped but not contained in ruby boxes</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-line-break-suppression-004-ref.html"> +<span style="white-space: pre"><rb>a</rb> +<rb>b</rb></span> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005-ref.html new file mode 100644 index 00000000000..c40780e37dd --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005-ref.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Line break suppression with soft hyphen</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<body style="width: 1px"> +x<ruby>a</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005.html new file mode 100644 index 00000000000..10d6690b3d8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Line break suppression with soft hyphen</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup"> +<link rel="match" href="ruby-line-break-suppression-005-ref.html"> +<body style="width: 1px"> +x<ruby>a­</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001-ref.html new file mode 100644 index 00000000000..1f3031c59ad --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001-ref.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Meet the specification for line breaking between ruby bases</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + body { line-height: 3; font-kerning: none; } + span { white-space: nowrap; } +</style> +<div style="width: .5em; border: 1px solid silver;"> + <span>「</span><span>な</span><span>に</span><span>、</span><span>誰</span><span>?</span><span>」</span><span>「</span><span>私</span><span>です</span><span>」</span> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001.html new file mode 100644 index 00000000000..b6b4d861e21 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Meet the specification for line breaking between ruby bases</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#break-between"> +<link rel="match" href="ruby-line-breaking-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + body { line-height: 3; font-kerning: none; } +</style> +<div style="width: .5em; border: 1px solid silver;"> + <ruby> + <rb>「<rb>な<rb>に<rb>、<rb>誰<rb>?<rb>」<rb>「<rb>私<rb>です<rb>」</rb> + <!-- Check if ruby text containers are skipped from the text run --> + <rtc><rt> + </ruby> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002-ref.html new file mode 100644 index 00000000000..08510f7fb05 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002-ref.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Line breaking between ruby and preceeding open bracket</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<div style="width: 5em; border: 1px solid silver;"> + の「<span style="font-family: Ahem; padding: 0 10rem;">X</span>」 +</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002.html new file mode 100644 index 00000000000..dddf41f9309 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Line breaking between ruby and preceeding open bracket</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#break-between"> +<link rel="match" href="ruby-line-breaking-002-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="support/ruby-common.css"> +<div style="width: 5em; border: 1px solid silver;"> + の「<ruby style="font-family: Ahem;">X<rt style="font-size: 0;"><div style="width: 21rem"></div></ruby>」 +</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003-ref.html new file mode 100644 index 00000000000..4f3cecb27ce --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003-ref.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Dynamic break point change in ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + #test { + border: 1px solid; + text-align: center; + width: 2.5em; + } +</style> +<div id="test"> + <p>一二三四五六七八</p> + <p>一二三四五六七八</p> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003.html new file mode 100644 index 00000000000..27348d0cf11 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html lang="ja"> +<meta charset="UTF-8"> +<title>Dynamic break point change in ruby</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#break-between"> +<link rel="match" href="ruby-line-breaking-003-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> + #test { + border: 1px solid; + text-align: center; + } +</style> +<div id="test"> + <p><ruby><rb>一<rb>二<rb>三<rb>四<rb>五<rb>六<rb>七<rb>八</ruby></p> + <p><ruby><rbc>一</rbc><rbc>二</rbc><rbc>三</rbc><rbc>四</rbc><rbc>五</rbc><rbc>六</rbc><rbc>七</rbc><rbc>八</rbc></ruby></p> +</div> +<script> + let div = document.getElementById("test"); + document.body.offsetHeight; + test.style.width = "2.5em"; + document.body.offsetHeight; + test.style.width = "4.5em"; + document.body.offsetHeight; + test.style.width = "2.5em"; +</script> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform-ref.html new file mode 100644 index 00000000000..56afd9366fe --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform-ref.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Ruby should not support transform</title> +<link rel="author" title="L. David Baron" href="https://dbaron.org/"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<ruby> + <rbc><rb>a</rb><rb>b</rb></rbc> + <rtc><rt>A</rt><rt>B</rt></rtc> +</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform.html new file mode 100644 index 00000000000..1cdd4f3bbf5 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Ruby should not support transform</title> +<link rel="author" title="L. David Baron" href="https://dbaron.org/"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-transforms-1/#transform-property"> +<link rel="match" href="ruby-no-transform-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> +ruby, rbc, rb, rtc, rt { + transform: translateX(50px); +} +</style> +<ruby> + <rbc><rb>a</rb><rb>b</rb></rbc> + <rtc><rt>A</rt><rt>B</rt></rtc> +</ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-noruby.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-noruby.html new file mode 100644 index 00000000000..4c00573422b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-noruby.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html style="overflow:hidden;"> +<head> +<title>CSS Test: Ruby Base Frames Reflowed</title> +<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="http://www.w3.org/TR/2014/WD-css-ruby-1-20140805/"> +<meta name="assert" content="Test checks that ruby bases are reflowed."> +<meta charset="UTF-8"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> +body { line-height: 3; } +</style> +</head> +<body> +新幹線 +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-opaqueruby.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-opaqueruby.html new file mode 100644 index 00000000000..fe4a8042383 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-opaqueruby.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html style="overflow:hidden;"> +<head> +<title>CSS Test: Ruby Text Frames Visible</title> +<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="http://www.w3.org/TR/2014/WD-css-ruby-1-20140805/"> +<link rel="mismatch" href="ruby-reflow-001-noruby.html"> +<meta name="assert" content="Test checks that ruby text is rendered."> +<meta charset="UTF-8"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> +body { line-height: 3; } +</style> +</head> +<body> +<ruby> + <rbc><rb>新</rb><rb>幹</rb><rb>線</rb></rbc> + <rtc><rt>しん</rt><rt>かん</rt><rt>せん</rt></rtc> +</ruby> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-transparentruby.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-transparentruby.html new file mode 100644 index 00000000000..3e7112c4d61 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-transparentruby.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html style="overflow:hidden;"> +<head> +<title>CSS Test: Ruby Base Frames Reflowed</title> +<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="http://www.w3.org/TR/2014/WD-css-ruby-1-20140805/"> +<link rel="match" href="ruby-reflow-001-noruby.html"> +<meta name="assert" content="Test checks that ruby bases are reflowed."> +<meta charset="UTF-8"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> +body { line-height: 3; } +rtc { color: transparent; } +</style> +</head> +<body> +<ruby> + <rbc><rb>新</rb><rb>幹</rb><rb>線</rb></rbc> + <rtc><rt>しん</rt><rt>かん</rt><rt>せん</rt></rtc> +</ruby> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001-ref.html new file mode 100644 index 00000000000..3bf873453cd --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001-ref.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Ruby span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<ruby><rb>The Ruby Base</rb><rtc><rt>span</rt></rtc></ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001.html new file mode 100644 index 00000000000..e7b19667aa9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Ruby span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-pairing"> +<link rel="match" href="ruby-span-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<ruby><rb>The Ruby Base</rb><rtc>span</rtc></ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001-ref.html new file mode 100644 index 00000000000..d24e207f867 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001-ref.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Ruby whitespace handling</title> +<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> +body { line-height: 5em; } +</style> + +<p> + <ruby><rbc><rb><span> </span></rb><rb><span> </span></rb><rb>Base three</rb></rbc + ><rtc><rt><span> </span></rt><rt><span> </span></rt><rt>Text three</rt></rtc + ><rtc><rt></rt></rtc + ><rbc><rb><span> </span></rb></rbc + ><rbc><rb>Segment two</rb></rbc + ><rtc><rt></rt></rtc></ruby> +</p> + +<p> + <ruby><rbc><rb>Base one</rb><rb><span> </span></rb><rb>Base three</rb></rbc + ><rtc pseudo><rt>Text one</rt><rt pseudo><span> </span></rt><rt>Text three</rt></rtc></ruby> +</p> + +<p> + <ruby><rbc><rb>Segment one</rb></rbc + ><rbc><rb><span> </span></rb></rbc + ><rbc><rb><span> </span></rb><rb><span> </span></rb><rb>Base three</rb></rbc + ><rtc><rt><span> </span></rt><rt><span> </span></rt><rt>Text three</rt></rtc + ><rbc><rb><span> </span></rb></rbc + ><rbc><rb>Base one</rb><rb><span> </span></rb><rb>Base three</rb></rbc + ><rtc><rt>Text one</rt><rt></rt><rt>Text two/three</rt></rtc></ruby> +</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001.html new file mode 100644 index 00000000000..9df61585700 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Ruby whitespace handling</title> +<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#white-space"> +<link rel="match" href="ruby-whitespace-001-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> +<style> +body { line-height: 5em; } +</style> + +<p> + <ruby> + <rbc> <rb> </rb> <rb>Base three</rb> </rbc> + <rtc> <rt> </rt> <rt>Text three</rt> </rtc> <rtc><rt></rt></rtc> + <rbc><rb>Segment two</rb></rbc><rtc><rt></rt></rtc> + </ruby> +</p> + +<p> + <ruby> + <rb>Base one</rb> <rb>Base three</rb> + <rt>Text one</rt> <rt>Text three</rt> + </ruby> +</p> + +<p> + <rb>Segment one</rb> <rbc> <rb> </rb> <rb>Base three</rb> </rbc + > <rtc><rt> </rt> <rt>Text three</rt></rtc> + + <rb>Base one</rb> <rb>Base three</rb> <rt>Text one</rt><rt>Text two/three</rt> +</p> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002-ref.html new file mode 100644 index 00000000000..8aade200516 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002-ref.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Ruby whitespace handling</title> +<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="stylesheet" href="support/ruby-common.css"> + +<!-- Unclear how this should render. See http://lists.w3.org/Archives/Public/www-style/2014Jul/0620.html //--> +abcd<ruby><rbc><rb><span> BASE</span></rb></rbc><rtc pseudo><rt>TEXT</rt></rtc></ruby> + +abcd<ruby><rbc><rb><span>BASE</span></rb></rbc><rtc pseudo><rt>TEXT</rt></rtc></ruby> + +abcd<ruby><rbc><rb><span> BASE</span></rb></rbc><rtc pseudo><rt>TEXT</rt></rtc></ruby> + +<ruby><rbc></rbc></ruby> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002.html new file mode 100644 index 00000000000..bc84919a123 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>Ruby whitespace handling</title> +<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#white-space"> +<link rel="match" href="ruby-whitespace-002-ref.html"> +<link rel="stylesheet" href="support/ruby-common.css"> + +abcd<rbc> BASE</rbc><rt>TEXT</rt> + +abcd<rbc> <span>BASE</span></rbc><rt>TEXT</rt> + +abcd<rbc><span> BASE</span></rbc><rt>TEXT</rt> + +<rbc> </rbc> diff --git a/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-common.css b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-common.css new file mode 100644 index 00000000000..cf83123281d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-common.css @@ -0,0 +1,18 @@ +rbc { + display: ruby-base-container; + unicode-bidi: isolate; +} +[pseudo] { + font-size: inherit; + line-height: inherit; +} +[pseudo] > rt { + font-size: 50%; +} +[pseudo] > rt[pseudo] { + font-size: inherit; +} + +.large { + font-size: 200%; +} diff --git a/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-insertion.js b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-insertion.js new file mode 100644 index 00000000000..0bf6cd96977 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-insertion.js @@ -0,0 +1,42 @@ +window.onload = function() { + // Force a reflow before any changes. + document.body.clientWidth; + + var elems = document.querySelectorAll('[data-insert]'); + Array.from(elems).forEach(function(e) { + var parent, ref; + switch (e.dataset.insert) { + case 'start': + parent = e; + ref = e.firstChild; + break; + + case 'end': + parent = e; + ref = null; + break; + + case 'before': + parent = e.parentNode; + ref = e; + break; + + case 'after': + parent = e.parentNode; + ref = e.nextSibling; + break; + } + + var elem, textnode; + if ('text' in e.dataset) { + textnode = document.createTextNode(e.dataset.text); + } + if ('tag' in e.dataset) { + elem = document.createElement(e.dataset.tag); + if (textnode) { + elem.appendChild(textnode); + } + } + parent.insertBefore(elem ? elem : textnode, ref); + }); +}; diff --git a/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-removal.js b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-removal.js new file mode 100644 index 00000000000..c703e7601e4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-removal.js @@ -0,0 +1,14 @@ +function getElements(className) { + return Array.from(document.getElementsByClassName(className)); +} +window.onload = function() { + // Force a reflow before any changes. + document.body.clientWidth; + + getElements('remove').forEach(function(e) { + e.remove(); + }); + getElements('remove-after').forEach(function(e) { + e.parentNode.removeChild(e.nextSibling); + }); +}; diff --git a/tests/wpt/web-platform-tests/css/css-shadow-parts/style-sharing.html b/tests/wpt/web-platform-tests/css/css-shadow-parts/style-sharing.html new file mode 100644 index 00000000000..4af1260b5e9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-shadow-parts/style-sharing.html @@ -0,0 +1,23 @@ +<!doctype html> +<title>CSS Shadow Parts test: Parts don't incorrectly share style with other elements</title> +<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/"> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="author" href="https://mozilla.org/" title="Mozilla"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style>::part(part1) { color: green; }</style> +<div id="host"></div> +<script> +"use strict"; +test(function() { + host.attachShadow({ mode: "open" }).innerHTML = ` + <div></div> + <div part="part1"></div> + `; + assert_equals( + getComputedStyle(host.shadowRoot.querySelector("[part]")).color, + "rgb(0, 128, 0)", + "Part should be green", + ); +}, "Part in selected host does not incorrectly share style with non-part"); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-margin-composition.html b/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-margin-composition.html new file mode 100644 index 00000000000..395bad063f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-margin-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>shape-margin composition</title> +<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-margin-property"> +<meta name="assert" content="shape-margin supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'shape-margin', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'shape-margin', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'shape-margin', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'shape-margin', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-outside-composition.html b/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-outside-composition.html new file mode 100644 index 00000000000..0115148ec1a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-outside-composition.html @@ -0,0 +1,189 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>shape-outside composition</title> +<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-outside-property"> +<meta name="assert" content="shape-outside supports animation as <basic-shape> or discrete"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'shape-outside', + underlying: 'circle(100px at 25px 25%)', + addFrom: 'circle(10px at 25px 75%)', + addTo: 'circle(50px at 50px center)', +}, [ + {at: -0.3, expect: 'circle(98px at 42.5px 107.5%)'}, + {at: 0, expect: 'circle(110px at 50px 100%)'}, + {at: 0.3, expect: 'circle(122px at 57.5px 92.5%)'}, + {at: 0.6, expect: 'circle(134px at 65px 85%)'}, + {at: 1, expect: 'circle(150px at 75px 75%)'}, + {at: 1.5, expect: 'circle(170px at 87.5px 62.5%)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'circle(100px at 20px 20%)', + addFrom: 'circle(50px at 50px 50%)', + replaceTo: 'circle(50% at 150px 150%)', +}, [ + {at: -0.3, expect: 'circle(calc(195px + -15%) at 46px 46%)'}, + {at: 0, expect: 'circle(calc(150px + 0%) at 70px 70%)'}, + {at: 0.3, expect: 'circle(calc(105px + 15%) at 94px 94%)'}, + {at: 0.6, expect: 'circle(calc(60px + 30%) at 118px 118%)'}, + {at: 1, expect: 'circle(50% at 150px 150%)'}, + {at: 1.5, expect: 'circle(calc(-75px + 75%) at 190px 190%)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'circle(farthest-side at 25px 75%)', + addFrom: 'circle(farthest-side at 25px 75%)', + addTo: 'circle(farthest-side at 50px center)', +}, [ + {at: 0.25, expect: 'circle(farthest-side at 25px 75%)'}, + {at: 0.75, expect: 'circle(farthest-side at 50px 50%)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'circle(50px at 10px 20px)', + addFrom: 'circle(50px at 10px 20px)', + addTo: 'circle(farthest-side at 30px 40px)', +}, [ + {at: 0.25, expect: 'circle(100px at 20px 40px)'}, + {at: 0.75, expect: 'circle(farthest-side at 30px 40px)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'ellipse(10px 20px at 30px 40px)', + addFrom: 'ellipse(40px 30px at 20px 10px)', + addTo: 'ellipse(140px 130px at 120px 110px)', +}, [ + {at: -0.3, expect: 'ellipse(20px 20px at 20px 20px)'}, + {at: 0, expect: 'ellipse(50px 50px at 50px 50px)'}, + {at: 0.3, expect: 'ellipse(80px 80px at 80px 80px)'}, + {at: 0.6, expect: 'ellipse(110px 110px at 110px 110px)'}, + {at: 1, expect: 'ellipse(150px 150px at 150px 150px)'}, + {at: 1.5, expect: 'ellipse(200px 200px at 200px 200px)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'ellipse(10px 20px at 30px 40px)', + replaceFrom: 'ellipse(40px 30px at 20px 10px)', + addTo: 'ellipse(40px 30px at 20px 10px)', +}, [ + {at: -0.3, expect: 'ellipse(37px 24px at 11px -2px)'}, + {at: 0, expect: 'ellipse(40px 30px at 20px 10px)'}, + {at: 0.3, expect: 'ellipse(43px 36px at 29px 22px)'}, + {at: 0.6, expect: 'ellipse(46px 42px at 38px 34px)'}, + {at: 1, expect: 'ellipse(50px 50px at 50px 50px)'}, + {at: 1.5, expect: 'ellipse(55px 60px at 65px 70px)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'ellipse(25px 75%)', + addFrom: 'ellipse()', + addTo: 'ellipse(closest-side farthest-side)', +}, [ + {at: 0.25, expect: 'ellipse(at 50% 50%)'}, + {at: 0.75, expect: 'ellipse(closest-side farthest-side at 50% 50%)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'inset(20px)', + addFrom: 'inset(20px)', + addTo: 'inset(40%)', +}, [ + {at: -0.3, expect: 'inset(calc(46px + -12%))'}, + {at: 0, expect: 'inset(calc(40px + 0%))'}, + {at: 0.3, expect: 'inset(calc(34px + 12%))'}, + {at: 0.6, expect: 'inset(calc(28px + 24%))'}, + {at: 1, expect: 'inset(calc(20px + 40%))'}, + {at: 1.5, expect: 'inset(calc(10px + 60%))'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'inset(1px 2px 3px 4px round 10px 20px 30px 40px / 50px 60px 70px 80px)', + addFrom: 'inset(1px 2px 3px 4px round 10px 20px 30px 40px / 50px 60px 70px 80px)', + replaceTo: 'inset(102px 104px 106px 108px round 120px 140px 160px 180px / 200px 220px 240px 260px)', +}, [ + {at: -0.3, expect: 'inset(-28px -26px -24px -22px round 0px 10px 30px 50px / 70px 90px 110px 130px)'}, + {at: 0, expect: 'inset(2px 4px 6px 8px round 20px 40px 60px 80px / 100px 120px 140px 160px)'}, + {at: 0.25, expect: 'inset(27px 29px 31px 33px round 45px 65px 85px 105px / 125px 145px 165px 185px)'}, + {at: 0.75, expect: 'inset(77px 79px 81px 83px round 95px 115px 135px 155px / 175px 195px 215px 235px)'}, + {at: 1, expect: 'inset(102px 104px 106px 108px round 120px 140px 160px 180px / 200px 220px 240px 260px)'}, + {at: 1.5, expect: 'inset(152px 154px 156px 158px round 170px 190px 210px 230px / 250px 270px 290px 310px)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'inset(1px 2px round 100px 200px)', + addFrom: 'inset(1px 2px round 100px 200px)', + addTo: 'inset(101px 102px 101px 102px)', +}, [ + {at: -0.3, expect: 'inset(-28px -26px round 230px 460px)'}, + {at: 0, expect: 'inset(2px 4px round 200px 400px)'}, + {at: 0.3, expect: 'inset(32px 34px round 170px 340px)'}, + {at: 0.6, expect: 'inset(62px 64px round 140px 280px)'}, + {at: 1, expect: 'inset(102px 104px round 100px 200px)'}, + {at: 1.5, expect: 'inset(152px 154px round 50px 100px)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'polygon(10px 20%, 30px 40%)', + addFrom: 'polygon(10px 20%, 30px 40%)', + addTo: 'polygon(110px 120%, 130px 140%)', +}, [ + {at: -0.3, expect: 'polygon(-10px 10%, 30px 50%)'}, + {at: 0, expect: 'polygon(20px 40%, 60px 80%)'}, + {at: 0.3, expect: 'polygon(50px 70%, 90px 110%)'}, + {at: 0.6, expect: 'polygon(80px 100%, 120px 140%)'}, + {at: 1, expect: 'polygon(120px 140%, 160px 180%)'}, + {at: 1.5, expect: 'polygon(170px 190%, 210px 230%)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'polygon(evenodd, 10px 20px)', + addFrom: 'polygon(evenodd, 10px 20px)', + addTo: 'polygon(evenodd, 110px 120px)', +}, [ + {at: -0.3, expect: 'polygon(evenodd, -10px 10px)'}, + {at: 0, expect: 'polygon(evenodd, 20px 40px)'}, + {at: 0.3, expect: 'polygon(evenodd, 50px 70px)'}, + {at: 0.6, expect: 'polygon(evenodd, 80px 100px)'}, + {at: 1, expect: 'polygon(evenodd, 120px 140px)'}, + {at: 1.5, expect: 'polygon(evenodd, 170px 190px)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'polygon(evenodd, 10px 20px)', + addFrom: 'polygon(evenodd, 10px 20px)', + addTo: 'polygon(nonzero, 30px 40px)', +}, [ + {at: 0.25, expect: 'polygon(evenodd, 20px 40px)'}, + {at: 0.75, expect: 'polygon(30px 40px)'}, +]); + +test_composition({ + property: 'shape-outside', + underlying: 'polygon(10px 20px, 30px 40px)', + addFrom: 'polygon(10px 20px, 30px 40px)', + addTo: 'polygon(30px 40px)', +}, [ + {at: 0.25, expect: 'polygon(20px 40px, 60px 80px)'}, + {at: 0.75, expect: 'polygon(30px 40px)'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/height-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/height-composition.html new file mode 100644 index 00000000000..094e247dcf2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/height-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>height composition</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-height"> +<meta name="assert" content="height supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'height', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'height', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'height', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'height', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'height', + underlying: '100px', + addFrom: '100px', + addTo: 'auto', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-composition.html new file mode 100644 index 00000000000..fb5b241d008 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>max-height composition</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-height"> +<meta name="assert" content="max-height supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'max-height', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'max-height', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'max-height', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'max-height', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'max-height', + underlying: '100px', + addFrom: '100px', + addTo: 'none', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'none'}, + {at: 1, expect: 'none'}, + {at: 1.5, expect: 'none'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-composition.html new file mode 100644 index 00000000000..8b6d8b704c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>max-width composition</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-width"> +<meta name="assert" content="max-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'max-width', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'max-width', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'max-width', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'max-width', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'max-width', + underlying: '100px', + addFrom: '100px', + addTo: 'none', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'none'}, + {at: 1, expect: 'none'}, + {at: 1.5, expect: 'none'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-composition.html new file mode 100644 index 00000000000..1e92b0ec2fd --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>min-height composition</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-height"> +<meta name="assert" content="min-height supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'min-height', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'min-height', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'min-height', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'min-height', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'min-height', + underlying: '100px', + addFrom: '100px', + addTo: 'auto', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-composition.html new file mode 100644 index 00000000000..e8bd41030bb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>min-width composition</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-width"> +<meta name="assert" content="min-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'min-width', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'min-width', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'min-width', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'min-width', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'min-width', + underlying: '100px', + addFrom: '100px', + addTo: 'auto', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/width-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/width-composition.html new file mode 100644 index 00000000000..bfe45cb3147 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/width-composition.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>width composition</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-width"> +<meta name="assert" content="width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'width', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'width', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'width', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'width', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'width', + underlying: '100px', + addFrom: '100px', + addTo: 'auto', +}, [ + {at: -0.3, expect: '200px'}, + {at: 0, expect: '200px'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html new file mode 100644 index 00000000000..c1b614b5eba --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>letter-spacing composition</title> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#letter-spacing-property"> +<meta name="test" content="letter-spacing supports animation by computed value type"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script src="../interpolation/resources/interpolation-test.js"></script> +<script> +test_composition({ + property: 'letter-spacing', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'letter-spacing', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, +]); + +test_composition({ + property: 'letter-spacing', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html new file mode 100644 index 00000000000..57c528ca271 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>letter-spacing composition</title> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#text-indent-property"> +<meta name="test" content="text-indent supports animation by computed value type"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body></body> +<script> +test_composition({ + property: 'text-indent', + underlying: '100%', + addFrom: '50px', + addTo: '150px', +}, [ + {at: -0.3, expect: 'calc(100% + 20px)'}, + {at: 0, expect: 'calc(100% + 50px)'}, + {at: 0.3, expect: 'calc(100% + 80px)'}, + {at: 0.6, expect: 'calc(100% + 110px)'}, + {at: 1, expect: 'calc(100% + 150px)'}, + {at: 1.5, expect: 'calc(100% + 200px)'}, +]); + +test_composition({ + property: 'text-indent', + underlying: '250px', + addFrom: '50px', + replaceTo: '100px', +}, [ + {at: -0.3, expect: '360px'}, + {at: 0, expect: '300px'}, + {at: 0.3, expect: '240px'}, + {at: 0.6, expect: '180px'}, + {at: 1, expect: '100px'}, + {at: 1.5, expect: '0px'}, +]); + +test_composition({ + property: 'text-indent', + underlying: '50%', + replaceFrom: '-100%', + addTo: '50%', +}, [ + {at: -0.3, expect: '-160%'}, + {at: 0, expect: '-100%'}, + {at: 0.3, expect: '-40%'}, + {at: 0.5, expect: '0%'}, + {at: 0.6, expect: '20%'}, + {at: 1, expect: '100%'}, + {at: 1.5, expect: '200%'}, +]); + +test_composition({ + property: 'text-indent', + underlying: '250px', + addFrom: '50px each-line hanging', + replaceTo: '150px hanging each-line', +}, [ + {at: -0.3, expect: '20px hanging each-line'}, + {at: 0, expect: '50px hanging each-line'}, + {at: 0.3, expect: '80px hanging each-line'}, + {at: 0.6, expect: '110px hanging each-line'}, + {at: 1, expect: '150px hanging each-line'}, + {at: 1.5, expect: '200px hanging each-line'}, +]); + +test_composition({ + property: 'text-indent', + underlying: '250px each-line', + addFrom: '50px each-line', + replaceTo: '150px hanging', +}, [ + {at: -0.3, expect: '300px each-line'}, + {at: 0, expect: '300px each-line'}, + {at: 0.3, expect: '300px each-line'}, + {at: 0.6, expect: '150px hanging'}, + {at: 1, expect: '150px hanging'}, + {at: 1.5, expect: '150px hanging'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html new file mode 100644 index 00000000000..17aacaef150 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>word-spacing composition</title> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#word-spacing-property"> +<meta name="test" content="word-spacing supports animation by computed value type"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'word-spacing', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'word-spacing', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, +]); + +test_composition({ + property: 'word-spacing', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ui/animation/caret-color-composition.html b/tests/wpt/web-platform-tests/css/css-ui/animation/caret-color-composition.html new file mode 100644 index 00000000000..6c695786778 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ui/animation/caret-color-composition.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>caret-color composition</title> +<link rel="help" href="https://drafts.csswg.org/css-ui-3/#propdef-caret-color"> +<meta name="assert" content="caret-color supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<style> +.target { + display: inline-block; + font-size: 60pt; + color: rgb(50, 50, 50); +} + +.expected { + margin-right: 15px; +} +</style> +<body contenteditable> +<template id="target-template">T</template> +<script src="../interpolation/resources/interpolation-test.js"></script> +<script> +test_composition({ + property: 'caret-color', + underlying: 'rgb(50, 50, 50)', + addFrom: 'rgb(100, 100, 100)', + addTo: 'rgb(200, 200, 200)', +}, [ + {at: -0.3, expect: 'rgb(120, 120, 120)'}, + {at: 0, expect: 'rgb(150, 150, 150)'}, + {at: 0.5, expect: 'rgb(200, 200, 200)'}, + {at: 1, expect: 'rgb(250, 250, 250)'}, + {at: 1.5, expect: 'rgb(255, 255, 255)'}, +]); + +test_composition({ + property: 'caret-color', + underlying: 'auto', + addFrom: 'rgb(100, 100, 100)', + addTo: 'rgb(200, 200, 200)', +}, [ + {at: -0.3, expect: 'rgb(70, 70, 70)'}, + {at: 0, expect: 'rgb(100, 100, 100)'}, + {at: 0.5, expect: 'rgb(150, 150, 150)'}, + {at: 1, expect: 'rgb(200, 200, 200)'}, + {at: 1.5, expect: 'rgb(250, 250, 250)'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ui/animation/outline-offset-composition.html b/tests/wpt/web-platform-tests/css/css-ui/animation/outline-offset-composition.html new file mode 100644 index 00000000000..984a63fdc34 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ui/animation/outline-offset-composition.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>outline-offset composition</title> +<link rel="help" href="https://drafts.csswg.org/css-ui-3/#outline-offset"> +<meta name="assert" content="outline-offset supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'outline-offset', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'outline-offset', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, +]); + +test_composition({ + property: 'outline-offset', + underlying: '10em', + addFrom: '100px', + addTo: '20em', +}, [ + {at: -0.3, expect: 'calc(130px + 4em)'}, + {at: 0, expect: 'calc(100px + 10em)'}, + {at: 0.5, expect: 'calc(50px + 20em)'}, + {at: 1, expect: '30em'}, + {at: 1.5, expect: 'calc(-50px + 40em)'}, +]); + +test_composition({ + property: 'outline-offset', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-ui/animation/outline-width-composition.html b/tests/wpt/web-platform-tests/css/css-ui/animation/outline-width-composition.html new file mode 100644 index 00000000000..b770feda61c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-ui/animation/outline-width-composition.html @@ -0,0 +1,85 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>outline-width composition</title> +<link rel="help" href="https://drafts.csswg.org/css-ui-3/#outline-width"> +<meta name="assert" content="outline-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<style> +.target { + /* If outline-style is none (the default), the computed style of outline-width is 0. */ + outline-style: solid; +} +</style> +<script> +test_composition({ + property: 'outline-width', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'outline-width', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, // Value clamping should happen after composition. +]); + +test_composition({ + property: 'outline-width', + underlying: '10em', + addFrom: '100px', + addTo: '20em', +}, [ + {at: -0.3, expect: 'calc(130px + 4em)'}, + {at: 0, expect: 'calc(100px + 10em)'}, + {at: 0.5, expect: 'calc(50px + 20em)'}, + {at: 1, expect: '30em'}, + {at: 1.5, expect: 'calc(-50px + 40em)'}, +]); + +test_composition({ + property: 'outline-width', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); + +test_composition({ + property: 'outline-width', + underlying: 'thick', // 5px + addFrom: '11px', + addTo: 'thin', // 1px +}, [ + {at: -0.3, expect: '19px'}, + {at: 0, expect: '16px'}, + {at: 0.5, expect: '11px'}, + {at: 1, expect: '6px'}, + {at: 1.5, expect: '1px'}, + {at: 2, expect: '0px'}, // CSS outline-width can't be negative. +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht b/tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht index 3b1fef0f84e..dea13d4238d 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht @@ -9,13 +9,14 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <meta name="DC.date.created" content="2016-12-22T09:54:03+11:00" scheme="W3CDTF" /> - <meta name="DC.date.modified" content="2016-12-30T09:54:03+11:00" scheme="W3CDTF" /> + <meta name="DC.date.modified" content="2019-12-18T09:54:03+11:00" scheme="W3CDTF" /> <meta content="" name="flags" /> <style type="text/css"><![CDATA[ html { + direction: rtl; width: calc(52px + 100vw + 52px); } @@ -29,6 +30,7 @@ table { border-spacing: 0px; + direction: ltr; position: absolute; width: calc(52px + 100% + 52px); } @@ -55,6 +57,7 @@ display: block; } ]]></style> + </head> <body> diff --git a/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html b/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html new file mode 100644 index 00000000000..9a03ccdbccc --- /dev/null +++ b/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/cssom-view-1/#dom-element-getclientrects"> +<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> + <div> + <span>test</span> + <span id="vertical-align-sub-as-grand-child" + title="sub element in a child inline box should not be included"> + <span> + <sub class="not-include" style="vertical-align: sub">subscript</sub> + </span> + </span> + <span>test</span> + </div> +<script> +testTargetDoesNotInclude('vertical-align-sub-as-grand-child'); + +function testTargetDoesNotInclude(target) { + target = document.getElementById(target); + test(() => { + let target_rects = target.getClientRects(); + + let not_include_rects = []; + for (let element of target.querySelectorAll('.not-include')) { + for (let rect of element.getClientRects()) + not_include_rects.push(rect); + } + for (let rect of target_rects) { + for (let not_include_rect of not_include_rects) { + assert_rect_not_equals(rect, not_include_rect); + } + } + }, target.title); +} + +function assert_rect_not_equals(rect1, rect2) { + assert_false(rectEquals(rect1, rect2), + `${rectToString(rect1)} and ${rectToString(rect2)} are not equal`); +} + +function rectEquals(rect1, rect2) { + return rect1.x === rect2.x && rect1.y === rect2.y && + rect1.width === rect2.width && rect1.height === rect2.height; +} + +function rectToString(rect) { + return `{${rect.x}, ${rect.y} ${rect.width}x${rect.height}}`; +} +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html new file mode 100644 index 00000000000..53210fdf38a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>offset-anchor composition</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-anchor-property"> +<meta name="assert" content="offset-anchor supports animation."> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.target { + width: 200px; + height: 200px; +} +</style> +<body> +<script> +test_composition({ + property: 'offset-anchor', + underlying: '40px 60px', + addFrom: '60px 40px', + addTo: '160px 140px', +}, [ + {at: -0.25, expect: '75px 75px'}, + {at: 0, expect: '100px 100px'}, + {at: 0.25, expect: '125px 125px'}, + {at: 0.5, expect: '150px 150px'}, + {at: 0.75, expect: '175px 175px'}, + {at: 1, expect: '200px 200px'}, + {at: 1.25, expect: '225px 225px'}, +]); + +test_composition({ + property: 'offset-anchor', + underlying: 'top 20% left 40%', + addFrom: 'left 60% top 80%', + addTo: 'right 80% bottom 40%', +}, [ + {at: -0.25, expect: '110% 105%'}, + {at: 0, expect: '100% 100%'}, + {at: 0.25, expect: '90% 95%'}, + {at: 0.5, expect: '80% 90%'}, + {at: 0.75, expect: '70% 85%'}, + {at: 1, expect: '60% 80%'}, + {at: 1.25, expect: '50% 75%'}, +]); + +test_composition({ + property: 'offset-anchor', + underlying: '40px 60px', + replaceFrom: '100px 200px', + addTo: '160px 40px', +}, [ + {at: -0.25, expect: '75px 225px'}, + {at: 0, expect: '100px 200px'}, + {at: 0.25, expect: '125px 175px'}, + {at: 0.5, expect: '150px 150px'}, + {at: 0.75, expect: '175px 125px'}, + {at: 1, expect: '200px 100px'}, + {at: 1.25, expect: '225px 75px'}, +]); + +test_composition({ + property: 'offset-anchor', + underlying: '40px 60px', + addFrom: '60px 140px', + replaceTo: '200px 100px', +}, [ + {at: -0.25, expect: '75px 225px'}, + {at: 0, expect: '100px 200px'}, + {at: 0.25, expect: '125px 175px'}, + {at: 0.5, expect: '150px 150px'}, + {at: 0.75, expect: '175px 125px'}, + {at: 1, expect: '200px 100px'}, + {at: 1.25, expect: '225px 75px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html new file mode 100644 index 00000000000..4ff6e95b057 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>offset-distance composition</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property"> +<meta name="assert" content="offset-distance supports animation."> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +test_composition({ + property: 'offset-distance', + underlying: '50px', + addFrom: '100px', + addTo: '200px', +}, [ + {at: -0.3, expect: '120px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '200px'}, + {at: 1, expect: '250px'}, + {at: 1.5, expect: '300px'}, +]); + +test_composition({ + property: 'offset-distance', + underlying: '100px', + addFrom: '10px', + addTo: '2px', +}, [ + {at: -0.5, expect: '114px'}, + {at: 0, expect: '110px'}, + {at: 0.5, expect: '106px'}, + {at: 1, expect: '102px'}, + {at: 1.5, expect: '98px'}, +]); + +test_composition({ + property: 'offset-distance', + underlying: '10%', + addFrom: '100px', + addTo: '20%', +}, [ + {at: -0.3, expect: 'calc(130px + 4%)'}, + {at: 0, expect: 'calc(100px + 10%)'}, + {at: 0.5, expect: 'calc(50px + 20%)'}, + {at: 1, expect: '30%'}, + {at: 1.5, expect: 'calc(-50px + 40%)'}, +]); + +test_composition({ + property: 'offset-distance', + underlying: '50px', + addFrom: '100px', + replaceTo: '200px', +}, [ + {at: -0.3, expect: '135px'}, + {at: 0, expect: '150px'}, + {at: 0.5, expect: '175px'}, + {at: 1, expect: '200px'}, + {at: 1.5, expect: '225px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html new file mode 100644 index 00000000000..eedd363efaf --- /dev/null +++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html @@ -0,0 +1,120 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>offset-distance composition</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property"> +<meta name="assert" content="offset-distance supports animation."> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +// TODO(ericwilligers) Support additive animation for path strings crbug.com/699308 + +// Ray paths compose. +test_composition({ + property: 'offset-path', + underlying: 'ray(20deg sides)', + addFrom: 'ray(10deg sides)', + addTo: 'ray(20deg sides)', +}, [ + {at: -0.3, expect: 'ray(27deg sides)'}, + {at: 0, expect: 'ray(30deg sides)'}, + {at: 0.3, expect: 'ray(33deg sides)'}, + {at: 0.6, expect: 'ray(36deg sides)'}, + {at: 1, expect: 'ray(40deg sides)'}, + {at: 1.5, expect: 'ray(45deg sides)'}, +]); + +// Ray paths without contain don't compose with underlying contain. +test_composition({ + property: 'offset-path', + underlying: 'ray(20deg closest-corner contain)', + addFrom: 'ray(10deg closest-corner)', + addTo: 'ray(20deg closest-corner)', +}, [ + {at: -0.3, expect: 'ray(7deg closest-corner)'}, + {at: 0, expect: 'ray(10deg closest-corner)'}, + {at: 0.3, expect: 'ray(13deg closest-corner)'}, + {at: 0.6, expect: 'ray(16deg closest-corner)'}, + {at: 1, expect: 'ray(20deg closest-corner)'}, + {at: 1.5, expect: 'ray(25deg closest-corner)'}, +]); + +// Ray paths don't compose when underlying has different size. +test_composition({ + property: 'offset-path', + underlying: 'ray(20deg closest-side)', + addFrom: 'ray(10deg closest-corner)', + addTo: 'ray(20deg closest-corner)', +}, [ + {at: -0.3, expect: 'ray(7deg closest-corner)'}, + {at: 0, expect: 'ray(10deg closest-corner)'}, + {at: 0.3, expect: 'ray(13deg closest-corner)'}, + {at: 0.6, expect: 'ray(16deg closest-corner)'}, + {at: 1, expect: 'ray(20deg closest-corner)'}, + {at: 1.5, expect: 'ray(25deg closest-corner)'}, +]); + +// Ray contain paths compose with underlying contain. +test_composition({ + property: 'offset-path', + underlying: 'ray(20deg farthest-side contain)', + addFrom: 'ray(190deg farthest-side contain)', + addTo: 'ray(20deg farthest-side contain)', +}, [ + {at: -0.3, expect: 'ray(261deg farthest-side contain)'}, + {at: 0, expect: 'ray(210deg farthest-side contain)'}, + {at: 0.3, expect: 'ray(159deg farthest-side contain)'}, + {at: 0.6, expect: 'ray(108deg farthest-side contain)'}, + {at: 1, expect: 'ray(40deg farthest-side contain)'}, + {at: 1.5, expect: 'ray(-45deg farthest-side contain)'}, +]); + +// When we can't interpolate, we can't compose. +test_composition({ + property: 'offset-path', + underlying: 'ray(20deg farthest-corner)', + addFrom: 'ray(190deg farthest-corner contain)', + addTo: 'ray(20deg farthest-corner)', +}, [ + {at: -0.3, expect: 'ray(190deg farthest-corner contain)'}, + {at: 0, expect: 'ray(190deg farthest-corner contain)'}, + {at: 0.3, expect: 'ray(190deg farthest-corner contain)'}, + {at: 0.6, expect: 'ray(40deg farthest-corner)'}, + {at: 1, expect: 'ray(40deg farthest-corner)'}, + {at: 1.5, expect: 'ray(40deg farthest-corner)'}, +]); + +test_composition({ + property: 'offset-path', + underlying: 'ray(20deg sides)', + replaceFrom: 'ray(190deg sides contain)', + addTo: 'ray(20deg sides)', +}, [ + {at: -0.3, expect: 'ray(190deg sides contain)'}, + {at: 0, expect: 'ray(190deg sides contain)'}, + {at: 0.3, expect: 'ray(190deg sides contain)'}, + {at: 0.6, expect: 'ray(40deg sides)'}, + {at: 1, expect: 'ray(40deg sides)'}, + {at: 1.5, expect: 'ray(40deg sides)'}, +]); + +// Ray paths compose with underlying. +test_composition({ + property: 'offset-path', + underlying: 'ray(20deg closest-side)', + addFrom: 'ray(10deg closest-side)', + replaceTo: 'ray(10deg closest-side)', +}, [ + {at: -0.3, expect: 'ray(36deg closest-side)'}, + {at: 0, expect: 'ray(30deg closest-side)'}, + {at: 0.3, expect: 'ray(24deg closest-side)'}, + {at: 0.6, expect: 'ray(18deg closest-side)'}, + {at: 1, expect: 'ray(10deg closest-side)'}, + {at: 1.5, expect: 'ray(0deg closest-side)'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html new file mode 100644 index 00000000000..0ee517a73a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>offset-position composition</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-position-property"> +<meta name="assert" content="offset-position supports <position> animation."> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.target { + width: 200px; + height: 200px; +} +</style> +<body> +<script> +test_composition({ + property: 'offset-position', + underlying: '40px 60px', + addFrom: '60px 40px', + addTo: '160px 140px', +}, [ + {at: -0.25, expect: '75px 75px'}, + {at: 0, expect: '100px 100px'}, + {at: 0.25, expect: '125px 125px'}, + {at: 0.5, expect: '150px 150px'}, + {at: 0.75, expect: '175px 175px'}, + {at: 1, expect: '200px 200px'}, + {at: 1.25, expect: '225px 225px'}, +]); + +test_composition({ + property: 'offset-position', + underlying: 'top 20% left 40%', + addFrom: 'left 60% top 80%', + addTo: 'right 80% bottom 40%', +}, [ + {at: -0.25, expect: '110% 105%'}, + {at: 0, expect: '100% 100%'}, + {at: 0.25, expect: '90% 95%'}, + {at: 0.5, expect: '80% 90%'}, + {at: 0.75, expect: '70% 85%'}, + {at: 1, expect: '60% 80%'}, + {at: 1.25, expect: '50% 75%'}, +]); + +test_composition({ + property: 'offset-position', + underlying: '40px 60px', + replaceFrom: '100px 200px', + addTo: '160px 40px', +}, [ + {at: -0.25, expect: '75px 225px'}, + {at: 0, expect: '100px 200px'}, + {at: 0.25, expect: '125px 175px'}, + {at: 0.5, expect: '150px 150px'}, + {at: 0.75, expect: '175px 125px'}, + {at: 1, expect: '200px 100px'}, + {at: 1.25, expect: '225px 75px'}, +]); + +test_composition({ + property: 'offset-position', + underlying: '40px 60px', + addFrom: '60px 140px', + replaceTo: '200px 100px', +}, [ + {at: -0.25, expect: '75px 225px'}, + {at: 0, expect: '100px 200px'}, + {at: 0.25, expect: '125px 175px'}, + {at: 0.5, expect: '150px 150px'}, + {at: 0.75, expect: '175px 125px'}, + {at: 1, expect: '200px 100px'}, + {at: 1.25, expect: '225px 75px'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html new file mode 100644 index 00000000000..bf60c19abef --- /dev/null +++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>offset-rotate composition</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property"> +<meta name="assert" content="offset-rotate supports animation."> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +// Angle rotations compose. +test_composition({ + property: 'offset-rotate', + underlying: '20deg', + addFrom: '10deg', + addTo: '20deg', +}, [ + {at: -0.3, expect: '27deg'}, + {at: 0, expect: '30deg'}, + {at: 0.3, expect: '33deg'}, + {at: 0.6, expect: '36deg'}, + {at: 1, expect: '40deg'}, + {at: 1.5, expect: '45deg'}, +]); + +// Angle rotations don't compose with underlying 'auto'. +test_composition({ + property: 'offset-rotate', + underlying: 'auto 20deg', + addFrom: '10deg', + addTo: '20deg', +}, [ + {at: -0.3, expect: '7deg'}, + {at: 0, expect: '10deg'}, + {at: 0.3, expect: '13deg'}, + {at: 0.6, expect: '16deg'}, + {at: 1, expect: '20deg'}, + {at: 1.5, expect: '25deg'}, +]); + +// Auto rotations compose with underlying 'auto'. +test_composition({ + property: 'offset-rotate', + underlying: 'auto 20deg', + addFrom: 'reverse 10deg', + addTo: 'auto 20deg', +}, [ + {at: -0.3, expect: 'auto 261deg'}, + {at: 0, expect: 'auto 210deg'}, + {at: 0.3, expect: 'auto 159deg'}, + {at: 0.6, expect: 'auto 108deg'}, + {at: 1, expect: 'auto 40deg'}, + {at: 1.5, expect: 'auto -45deg'}, +]); + +// When we can't interpolate, we can't compose. +test_composition({ + property: 'offset-rotate', + underlying: '20deg', + addFrom: 'reverse 10deg', + addTo: '20deg', +}, [ + {at: -0.3, expect: 'auto 190deg'}, + {at: 0, expect: 'auto 190deg'}, + {at: 0.3, expect: 'auto 190deg'}, + {at: 0.6, expect: '40deg'}, + {at: 1, expect: '40deg'}, + {at: 1.5, expect: '40deg'}, +]); + +test_composition({ + property: 'offset-rotate', + underlying: '20deg', + replaceFrom: 'reverse 10deg', + addTo: '20deg', +}, [ + {at: -0.3, expect: 'auto 190deg'}, + {at: 0, expect: 'auto 190deg'}, + {at: 0.3, expect: 'auto 190deg'}, + {at: 0.6, expect: '40deg'}, + {at: 1, expect: '40deg'}, + {at: 1.5, expect: '40deg'}, +]); + +// Angle rotations compose with underlying angle. +test_composition({ + property: 'offset-rotate', + underlying: '20deg', + addFrom: '10deg', + replaceTo: '10deg', +}, [ + {at: -0.3, expect: '36deg'}, + {at: 0, expect: '30deg'}, + {at: 0.3, expect: '24deg'}, + {at: 0.6, expect: '18deg'}, + {at: 1, expect: '10deg'}, + {at: 1.5, expect: '0deg'}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py index dd823c78a68..12fb6a3ad85 100644 --- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py +++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py @@ -8,7 +8,7 @@ script outputs a list of all tests it generated in the format of Mozilla reftest.list to the stdout. """ -from __future__ import unicode_literals +from __future__ import unicode_literals, print_function, absolute_import TEST_FILE = 'text-emphasis-line-height-{:03}{}.html' TEST_TEMPLATE = '''<!DOCTYPE html> diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py index 62363a207bd..52795906876 100644 --- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py +++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py @@ -9,7 +9,7 @@ test files are generated by this script. It also outputs a list of all tests it generated in the format of Mozilla reftest.list to the stdout. """ -from __future__ import unicode_literals +from __future__ import unicode_literals, print_function, absolute_import import itertools diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py index b5c59e6f501..fdbaec052e4 100644 --- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py +++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py @@ -7,7 +7,7 @@ emphasis marks with ruby in four directions. It outputs a list of all tests it generated in the format of Mozilla reftest.list to the stdout. """ -from __future__ import unicode_literals +from __future__ import unicode_literals, print_function, absolute_import TEST_FILE = 'text-emphasis-ruby-{:03}{}.html' TEST_TEMPLATE = '''<!DOCTYPE html> diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py index 34e047ab003..1b1d6fc16f2 100644 --- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py +++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py @@ -8,7 +8,7 @@ and <string>, with horizontal writing mode. It outputs a list of all tests it generated in the format of Mozilla reftest.list to the stdout. """ -from __future__ import unicode_literals +from __future__ import unicode_literals, print_function, absolute_import TEST_FILE = 'text-emphasis-style-property-{:03}{}.html' TEST_TEMPLATE = '''<!DOCTYPE html> diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py index 75168420287..6e13861374a 100644 --- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py +++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py @@ -18,7 +18,7 @@ So there are 49 different combinations. It outputs a list of all tests it generated in the format of Mozilla reftest.list to the stdout. """ -from __future__ import unicode_literals +from __future__ import unicode_literals, print_function, absolute_import TEST_FILE = 'segment-break-transformation-rules-{:03}.html' TEST_TEMPLATE = '''<!DOCTYPE html> diff --git a/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html b/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html index 60d88cffb51..24cb5fe4cd3 100644 --- a/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html +++ b/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html @@ -90,4 +90,22 @@ function test_defined(expected, element, description) { assert_equals(style.color, expected ? defined : not_defined, 'getComputedStyle'); }, `${description} should ${expected ? 'be' : 'not be'} :defined`); } + +test(function () { + var log = []; + var instance = document.createElement('my-custom-element-2'); + document.body.appendChild(instance); + customElements.define('my-custom-element-2',class extends HTMLElement { + constructor() { + super(); + log.push([this, 'begin']); + assert_false(this.matches(":defined"), "During construction, this should not match :defined"); + log.push([this, 'end']); + } + }); + assert_equals(log.length, 2); + assert_array_equals(log[0], [instance, 'begin']); + assert_array_equals(log[1], [instance, 'end']); +}, 'this.matches(:defined) should not match during an upgrade'); + </script> diff --git a/tests/wpt/web-platform-tests/custom-elements/upgrading.html b/tests/wpt/web-platform-tests/custom-elements/upgrading.html index d6b8ed38754..ac0fdff7a21 100644 --- a/tests/wpt/web-platform-tests/custom-elements/upgrading.html +++ b/tests/wpt/web-platform-tests/custom-elements/upgrading.html @@ -12,6 +12,9 @@ <script src="resources/custom-elements-helpers.js"></script> </head> <body> +<infinite-cloning-element-1></infinite-cloning-element-1> +<infinite-cloning-element-2 id="a"></infinite-cloning-element-2> +<infinite-cloning-element-2 id="b"></infinite-cloning-element-2> <div id="log"></div> <script> setup({allow_uncaught_exception:true}); @@ -203,6 +206,53 @@ test(() => { }, 'If definition\'s disable shadow is true and element\'s shadow root is ' + 'non-null, then throw a "NotSupportedError" DOMException.'); +test(() => { + var log = []; + + customElements.define('infinite-cloning-element-1',class extends HTMLElement { + constructor() { + super(); + log.push([this, 'begin']); + // Potential infinite recursion: + customElements.upgrade(this); + log.push([this, 'end']); + } + }); + + assert_equals(log.length, 2); + const instance = document.querySelector("infinite-cloning-element-1"); + assert_array_equals(log[0], [instance, 'begin']); + assert_array_equals(log[1], [instance, 'end']); +}, 'Infinite constructor recursion with upgrade(this) should not be possible'); + +test(() => { + var log = []; + + customElements.define('infinite-cloning-element-2',class extends HTMLElement { + constructor() { + super(); + log.push([this, 'begin']); + const b = document.querySelector("#b"); + b.remove(); + // While this constructor is running for "a", "b" is still + // undefined, and so inserting it into the document will enqueue a + // second upgrade reaction for "b" in addition to the one enqueued + // by defining x-foo. + document.body.appendChild(b); + log.push([this, 'end']); + } + }); + + assert_equals(log.length, 4); + const instanceA = document.querySelector("#a"); + const instanceB = document.querySelector("#b"); + assert_array_equals(log[0], [instanceA, 'begin']); + assert_array_equals(log[1], [instanceB, 'begin']); + assert_array_equals(log[2], [instanceB, 'end']); + assert_array_equals(log[3], [instanceA, 'end']); +}, 'Infinite constructor recursion with appendChild should not be possible'); + + </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html b/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html new file mode 100644 index 00000000000..98de2b68836 --- /dev/null +++ b/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html @@ -0,0 +1,4 @@ +<!doctype html> +<title>DOM Test Reference</title> +<p>You should see the word PASS below.</p> +<div>PASS</div> diff --git a/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html b/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html new file mode 100644 index 00000000000..612aed637df --- /dev/null +++ b/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html @@ -0,0 +1,29 @@ +<!doctype html> +<html class="reftest-wait"> + <head> + <title>Adopting a shadow host child into an iframe</title> + <link rel="help" href="https://dom.spec.whatwg.org/#concept-node-adopt"> + <link rel="match" href="remove-from-shadow-host-and-adopt-into-iframe-ref.html"> + <style> + iframe { border: 0; } + </style> + <script src="/common/reftest-wait.js"></script> + <script> + onload = () => { + const root = host.attachShadow({mode:"open"}); + root.innerHTML = "<slot>"; + // force a layout + host.offsetTop; + iframe.contentWindow.document.body.style.margin = 0; + iframe.contentWindow.document.body.appendChild(adopted); + host.remove(); + takeScreenshot(); + } + </script> + </head> + <body> + <p>You should see the word PASS below.</p> + <iframe id="iframe"></iframe> + <div id="host"><span id="adopted">PASS</span></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/domxpath/booleans.html b/tests/wpt/web-platform-tests/domxpath/booleans.html new file mode 100644 index 00000000000..41522edf05f --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/booleans.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans"> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_true(evaluateBoolean('(./span)[4] or ./br[2]', context)); +}, '"or" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_true(evaluateBoolean('count((./span)[3]) = count(./br[2])', context)); +}, '"=" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_false(evaluateBoolean('count((./span)[3]) != count(./br[2])', context)); +}, '"!=" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_true(evaluateBoolean('count((./span)[3]) < count(./br)', context)); +}, '"<" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_false(evaluateBoolean('count((./span)[3]) > count(./br[2])', context)); +}, '">" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_false(evaluateBoolean('count((./span)[3]) >= count(./br)', context)); +}, '">=" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_true(evaluateBoolean('count((./span)[3]) <= count(./br[2])', context)); +}, '"<=" operator depending on the context node'); + +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/fn-concat.html b/tests/wpt/web-platform-tests/domxpath/fn-concat.html new file mode 100644 index 00000000000..fe160966aa7 --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/fn-concat.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-concat"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<body> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span>foo</span><span>bar</span><b>ber</b>'; + assert_equals(evaluateString('concat((./span)[2], ./b)', context), 'barber'); +}, 'concat() arguments depending on the context node'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/fn-contains.html b/tests/wpt/web-platform-tests/domxpath/fn-contains.html new file mode 100644 index 00000000000..a4d8bbfa7b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/fn-contains.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-contains"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<body> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span>bar bar</span><span>bar<b>ber</b></span><b>bar</b>'; + assert_true(evaluateBoolean('contains((./span)[1], ./b)', context)); +}, 'contains() arguments depending on the context node'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/fn-starts-with.html b/tests/wpt/web-platform-tests/domxpath/fn-starts-with.html new file mode 100644 index 00000000000..99d2df7db6b --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/fn-starts-with.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-starts-with"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<body> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span>foo</span><span>bar<b>ber</b></span><b>bar</b>'; + assert_true(evaluateBoolean('starts-with((./span)[2], ./b)', context)); +}, 'starts-with() arguments depending on the context node'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/fn-substring-after.html b/tests/wpt/web-platform-tests/domxpath/fn-substring-after.html new file mode 100644 index 00000000000..c290914d24b --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/fn-substring-after.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-substring-after"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<body> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span>^^^bar$$$</span><span>bar<b>^</b></span><b>bar</b>'; + assert_equals(evaluateString('substring-after((./span)[1], ./b)', context), '$$$'); +}, 'substring-after() arguments depending on the context node'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/fn-substring-before.html b/tests/wpt/web-platform-tests/domxpath/fn-substring-before.html new file mode 100644 index 00000000000..69b3f1ef6e4 --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/fn-substring-before.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-substring-before"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<body> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span>^^^bar$$$</span><span>bar<b>$</b></span><b>bar</b>'; + assert_equals(evaluateString('substring-before((./span)[1], ./b)', context), '^^^'); +}, 'substring-before() arguments depending on the context node'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/fn-substring.html b/tests/wpt/web-platform-tests/domxpath/fn-substring.html new file mode 100644 index 00000000000..3311a15061d --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/fn-substring.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-substring"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<body> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span>^^^bar$$$</span><span></span><br><br><br><br>'; + assert_equals(evaluateString('substring((./span)[1], count(./br))', context), 'bar$$$'); +}, 'substring() arguments depending on the context node'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/fn-translate.html b/tests/wpt/web-platform-tests/domxpath/fn-translate.html new file mode 100644 index 00000000000..ee1700d1b42 --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/fn-translate.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-translate"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<body> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span>^^^bar$$$</span><span><b>^^^</b></span><b>bar</b><b>foo</b>'; + assert_equals(evaluateString('translate((./span)[1], (./b)[1], ./b[2])', context), '^^^foo$$$'); +}, 'translate() arguments depending on the context node'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/helpers.js b/tests/wpt/web-platform-tests/domxpath/helpers.js new file mode 100644 index 00000000000..0805bd682b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/helpers.js @@ -0,0 +1,14 @@ +function evaluateBoolean(expression, context) { + let doc = context.ownerDocument || context; + return doc.evaluate(expression, context, null, XPathResult.BOOLEAN_TYPE, null).booleanValue; +} + +function evaluateNumber(expression, context) { + let doc = context.ownerDocument || context; + return doc.evaluate(expression, context, null, XPathResult.NUMBER_TYPE, null).numberValue; +} + +function evaluateString(expression, context) { + let doc = context.ownerDocument || context; + return doc.evaluate(expression, context, null, XPathResult.STRING_TYPE, null).stringValue; +} diff --git a/tests/wpt/web-platform-tests/domxpath/lexical-structure.html b/tests/wpt/web-platform-tests/domxpath/lexical-structure.html new file mode 100644 index 00000000000..f93820b0e41 --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/lexical-structure.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#exprlex"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +function parse(expression) { + document.evaluate(expression, document, null, XPathResult.ANY_TYPE, null); +} + +// https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-Literal +test(() => { + parse(' \'a"bc\' '); + parse(' "a\'bc" '); + + assert_throws(new SyntaxError(), () => { parse(' \u2019xyz\u2019 '); }); +}, 'Literal: Only \' and " should be handled as literal quotes.'); + +// https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-ExprWhitespace +test(() => { + parse(' \t\r\n.\r\n\t '); + + assert_throws(new SyntaxError(), () => { parse('\x0B\x0C .'); }); + assert_throws(new SyntaxError(), () => { parse('\x0E\x0F .'); }); + assert_throws(new SyntaxError(), () => { parse('\u3000 .'); }); + assert_throws(new SyntaxError(), () => { parse('\u2029 .'); }); +}, 'ExprWhitespace: Only #x20 #x9 #xD or #xA must be handled as a whitespace.'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/domxpath/numbers.html b/tests/wpt/web-platform-tests/domxpath/numbers.html new file mode 100644 index 00000000000..e847d6cd2e5 --- /dev/null +++ b/tests/wpt/web-platform-tests/domxpath/numbers.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#numbers"> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="helpers.js"></script> +<div id="context"></div> +<script> +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_equals(evaluateNumber('count((./span)[1]) + count(./br)', context), 3); +}, '"+" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_equals(evaluateNumber('count((./span)[1]) - count(./br)', context), -1); +}, '"-" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_equals(evaluateNumber('count((./span)[1]) * count(./br)', context), 2); +}, '"*" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_equals(evaluateNumber('count((./span)[1]) div count(./br)', context), 0.5); +}, '"div" operator depending on the context node'); + +test(() => { + const context = document.querySelector('#context'); + context.innerHTML = '<span></span><span></span><span></span><br><br>'; + assert_equals(evaluateNumber('count((./span)[1]) mod count(./br)', context), 1); +}, '"mod" operator depending on the context node'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources-with-0x00-in-header.window.js b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources-with-0x00-in-header.window.js new file mode 100644 index 00000000000..f1afeeb740b --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources-with-0x00-in-header.window.js @@ -0,0 +1,31 @@ +async_test(t => { + const script = document.createElement("script"); + t.add_cleanup(() => script.remove()); + script.src = "resources/script-with-0x00-in-header.py"; + script.onerror = t.step_func_done(); + script.onload = t.unreached_func(); + document.body.append(script); +}, "Expect network error for script with 0x00 in a header"); + +async_test(t => { + const frame = document.createElement("iframe"); + t.add_cleanup(() => frame.remove()); + frame.src = "resources/document-with-0x00-in-header.py"; + // If network errors result in load events for frames per + // https://github.com/whatwg/html/issues/125 and https://github.com/whatwg/html/issues/1230 this + // should be changed to use the load event instead. + t.step_timeout(() => { + assert_equals(frame.contentDocument, null); + t.done(); + }, 1000); + document.body.append(frame); +}, "Expect network error for frame navigation to resource with 0x00 in a header"); + +async_test(t => { + const img = document.createElement("img"); + t.add_cleanup(() => img.remove()); + img.src = "resources/blue-with-0x00-in-a-header.asis"; + img.onerror = t.step_func_done(); + img.onload = t.unreached_func(); + document.body.append(img); +}, "Expect network error for image with 0x00 in a header"); diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/README.md b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/README.md new file mode 100644 index 00000000000..2175d274088 --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/README.md @@ -0,0 +1,6 @@ +`blue-with-0x00-in-a-header.asis` is a copy from `../../images/blue.png` with the following prepended using Control Pictures to signify actual newlines and 0x00: +``` +HTTP/1.1 200 AN IMAGE␍␊ +Content-Type: image/png␍␊ +Custom: ␀␍␊␍␊ +``` diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis Binary files differnew file mode 100644 index 00000000000..102340a6313 --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/document-with-0x00-in-header.py b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/document-with-0x00-in-header.py new file mode 100644 index 00000000000..6e8db619591 --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/document-with-0x00-in-header.py @@ -0,0 +1,4 @@ +def main(request, response): + response.headers.set("Content-Type", "text/html") + response.headers.set("Custom", "\0") + return "<!doctype html><b>This is a document.</b>" diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/script-with-0x00-in-header.py b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/script-with-0x00-in-header.py new file mode 100644 index 00000000000..f4a016a3698 --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/script-with-0x00-in-header.py @@ -0,0 +1,4 @@ +def main(request, response): + response.headers.set("Content-Type", "text/javascript") + response.headers.set("Custom", "\0") + return "var thisIsJavaScript = 0" diff --git a/tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html b/tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html index 533dd6a936f..9e557fed7b7 100644 --- a/tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html +++ b/tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html @@ -16,7 +16,7 @@ const host = get_host_info(); // We run this entire test twice: first with a same-origin then with a cross-origin popup function performFullTest(is_same_origin_test) { - const POPUP_HTTP_ORIGIN = is_same_origin_test ? host.HTTP_ORIGIN : host.HTTP_REMOTE_ORIGIN + const POPUP_HTTP_ORIGIN = is_same_origin_test ? host.HTTP_ORIGIN : host.HTTP_NOTSAMESITE_ORIGIN const LOCAL_HTTP_ORIGIN = host.HTTP_ORIGIN const popupBaseURL = POPUP_HTTP_ORIGIN + window.location.pathname.replace(/\/[^\/]*$/, '/') ; diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html new file mode 100644 index 00000000000..919a05ed2a2 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html @@ -0,0 +1,33 @@ +<!doctype html> +<title>Cross-origin due to document.domain</title> +<meta charset=utf-8> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id=log></div> +<iframe src=resources/cross-origin-due-to-document-domain-only-helper.html></iframe> +<script> +async_test(t => { + onload = t.step_func_done(() => { + const frame = document.querySelector("iframe"); + const innerSelf = self[0]; + const innerLocation = innerSelf.location; + const innerDocument = innerSelf.document; + assert_equals(innerLocation.host, location.host); + assert_true(innerSelf.expandosForever); + assert_true(innerLocation.expandosForever); + assert_equals(frame.contentWindow, innerSelf); + assert_equals(frame.contentDocument, innerDocument); + innerSelf.setDocumentDomain(); + assert_throws("SecurityError", () => innerSelf.expandosForever); + assert_throws("SecurityError", () => innerLocation.expandosForever); + assert_throws("SecurityError", () => innerLocation.host); + assert_equals(innerSelf.parent, self); + assert_throws("SecurityError", () => innerSelf.frameElement); + assert_throws("SecurityError", () => innerLocation.reload()); + assert_equals(frame.contentWindow, innerSelf); + assert_equals(frame.contentDocument, null); + // Cross-origin Document object obtained before it became cross-origin has no protections + assert_equals(innerDocument.URL, frame.src); + }); +}); +</script> diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html new file mode 100644 index 00000000000..10ac8ece0e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html @@ -0,0 +1,9 @@ +<!doctype html> +<meta charset=utf-8> +<script> +self.expandosForever = true +self.location.expandosForever = true +function setDocumentDomain() { + document.domain = document.domain +} +</script> diff --git a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html index 1d231d52cde..ab36eeede73 100644 --- a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html +++ b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html @@ -1,5 +1,5 @@ <!doctype html> -<title>Canvas width and height attributes are used to infer aspect-ratio</title> +<title>Canvas width and height attributes are used as the surface size</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <style> @@ -11,7 +11,7 @@ </style> <body> <script> -let t = async_test("Canvas width and height attributes are used to infer aspect-ratio"); +let t = async_test("Canvas width and height attributes are used as the surface size"); function assert_ratio(img, expected) { let epsilon = 0.001; assert_approx_equals(parseInt(getComputedStyle(img).width, 10) / parseInt(getComputedStyle(img).height, 10), expected, epsilon); diff --git a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html new file mode 100644 index 00000000000..42be8ce7a81 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html @@ -0,0 +1,25 @@ +<!doctype html> +<title>div with content style's width and height attributes are not used to infer aspect-ratio</title> +<link rel="help" href="https://bugs.webkit.org/show_bug.cgi?id=201641#c22"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + video { + width: 100%; + max-width: 100px; + height: auto; + } +</style> +<body> +<script> +// Create and append a div with content style and immediately check the height. +let t = test(function() { + var div = document.createElement("div"); + div.setAttribute("style", "content: url('/images/blue.png')"); + div.setAttribute("width", "250"); + div.setAttribute("height", "100"); + document.body.appendChild(div); + assert_equals(getComputedStyle(div).height, "0px"); +}, "div with content style's width and height attributes are not used to infer aspect-ratio"); + +</script> diff --git a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html index 5b155c1047d..30000329780 100644 --- a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html +++ b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html @@ -12,6 +12,8 @@ <img src="/images/green.png"> <img src="/images/green.png" width=100 height=125> <img src="" width=100 height=125> +<img src="error.png" width=100 height=125> +<img src="error.png"> <script> let t = async_test("Image width and height attributes are used to infer aspect-ratio"); function assert_ratio(img, expected) { @@ -47,9 +49,10 @@ t.step(function() { onload = t.step_func_done(function() { let images = document.querySelectorAll("img"); - assert_ratio(images[3], 1.266); // 1.266 is the original aspect ratio of blue.png - assert_equals(getComputedStyle(images[2]).height, "0px"); // aspect-ratio doesn't override intrinsic size of images that don't have any src. - assert_ratio(images[1], 2.0); // 2.0 is the original aspect ratio of green.png assert_ratio(images[0], 2.0); // Loaded image's aspect ratio, at least by default, overrides width / height ratio. + assert_ratio(images[1], 2.0); // 2.0 is the original aspect ratio of green.png + assert_equals(getComputedStyle(images[2]).height, "0px"); // aspect-ratio doesn't override intrinsic size of images that don't have any src. + assert_equals(getComputedStyle(images[3]).height, getComputedStyle(images[4]).height); // aspect-ratio doesn't override intrinsic size of error images. + assert_ratio(images[5], 1.266); // 1.266 is the original aspect ratio of blue.png }); </script> diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html new file mode 100644 index 00000000000..f32472105d5 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html @@ -0,0 +1,3 @@ +<!DOCTYPE html> +<p>You should see a green rectangle below</p> +<div style="width:100px;height:100px;background-color:green"></div> diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute.html new file mode 100644 index 00000000000..80acb9f3dcc --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<link rel=match href=link-type-attribute-ref.html> +<link rel="stylesheet" type="application/javascript" href="data:text/css,div { background-color: red !important; }"> +<link rel="stylesheet" type="ABCtext/css" href="data:text/css,div { background-color: red !important; }"> +<link rel="stylesheet" type="text/cssDEF" href="data:text/css,div { background-color: red !important; }"> +<link rel="stylesheet" type="text/invalid" href="data:text/css,div { background-color: red !important; }"> +<link rel="stylesheet" type="invalid" href="data:text/css,div { background-color: red !important; }"> +<p>You should see a green rectangle below</p> +<div style="width:100px;height:100px;background-color:green"></div> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html index cec5dcbf0d5..03655ffd2f5 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html @@ -15,7 +15,7 @@ types: ["text", "search", "tel", "password"], testData: [ {conditions: {pattern: "[A-Z]", value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -24,7 +24,7 @@ testData: [ {conditions: {pattern: "http://www.example.com", value: "http://www.example.net"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"}, {conditions: {value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.typeMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -33,7 +33,7 @@ testData: [ {conditions: {pattern: "test@example.com", value: "test@example.net"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"}, {conditions: {value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.typeMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -43,7 +43,7 @@ {conditions: {max: "2000-01-01T12:00:00", value: "2001-01-01T12:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"}, {conditions: {min: "2001-01-01T12:00:00", value: "2000-01-01T12:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"}, {conditions: {step: 2 * 60 * 1000, value: "2001-01-01T12:03:00"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -53,7 +53,7 @@ {conditions: {max: "2000-01-01", value: "2001-01-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"}, {conditions: {min: "2001-01-01", value: "2000-01-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"}, {conditions: {step: 2 * 1 * 86400000, value: "2000-01-03"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -64,7 +64,7 @@ {conditions: {min: "2001-01", value: "2000-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"}, // Step checks that "months since Jan 1970" is evenly divisible by `step` {conditions: {step: 3, value: "2001-02"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -74,7 +74,7 @@ {conditions: {max: "2000-W01", value: "2001-W01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"}, {conditions: {min: "2001-W01", value: "2000-W01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"}, {conditions: {step: 2 * 1 * 604800000, value: "2001-W03"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -84,7 +84,7 @@ {conditions: {max: "12:00:00", value: "13:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"}, {conditions: {min: "12:00:00", value: "11:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"}, {conditions: {step: 2 * 60 * 1000, value: "12:03:00"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -94,7 +94,7 @@ {conditions: {max: "5", value: "6"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"}, {conditions: {min: "5", value: "4"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"}, {conditions: {step: 2 * 1 * 1, value: "3"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"}, - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] }, { @@ -122,7 +122,7 @@ tag: "textarea", types: [], testData: [ - {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"} + {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"} ] } ]; diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html index 3c9e4c4cb09..2e1c666436a 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html @@ -16,7 +16,7 @@ testData: [ {conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"}, {conditions: {required: true, value: "abc"}, expected: false, name: "[target] The value is not empty and required is true"}, - {conditions: {required: true, value: ""}, expected: true, name: "[target] The value is empty and required is true"} + {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value is empty and required is true"} ] }, { @@ -27,13 +27,13 @@ {conditions: {required: true, value: "2000-12-10T12:00:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10T12:00:00)"}, {conditions: {required: true, value: "2000-12-10 12:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10 12:00)"}, {conditions: {required: true, value: "1979-10-14T12:00:00.001"}, expected: false, name: "[target] Valid local date and time string(1979-10-14T12:00:00.001)"}, - {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"}, - {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"}, - {conditions: {required: true, value: "1979-10-99 99:99"}, expected: true, name: "[target] Invalid local date and time string(1979-10-99 99:99)"}, + {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"}, + {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"}, + {conditions: {required: true, value: "1979-10-99 99:99"}, expected: true, expectedImmutable: false, name: "[target] Invalid local date and time string(1979-10-99 99:99)"}, {conditions: {required: true, value: "1979-10-14 12:00:00"}, expected: false, name: "[target] Valid local date and time string(1979-10-14 12:00:00)"}, - {conditions: {required: true, value: "2001-12-21 12:00"}, expected: true, name: "[target] Invalid local date and time string(2001-12-21 12:00)-two white space"}, - {conditions: {required: true, value: "abc"}, expected: true, name: "[target] the value attribute is a string(abc)"}, - {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"} + {conditions: {required: true, value: "2001-12-21 12:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid local date and time string(2001-12-21 12:00)-two white space"}, + {conditions: {required: true, value: "abc"}, expected: true, expectedImmutable: false, name: "[target] the value attribute is a string(abc)"}, + {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"} ] }, { @@ -43,12 +43,12 @@ {conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"}, {conditions: {required: true, value: "2000-12-10"}, expected: false, name: "[target] Valid date string(2000-12-10)"}, {conditions: {required: true, value: "9999-01-01"}, expected: false, name: "[target] Valid date string(9999-01-01)"}, - {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"}, - {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"}, - {conditions: {required: true, value: "9999-99-99"}, expected: true, name: "[target] Invalid date string(9999-99-99)"}, - {conditions: {required: true, value: "37/01/01"}, expected: true, name: "[target] Invalid date string(37-01-01)"}, - {conditions: {required: true, value: "2000/01/01"}, expected: true, name: "[target] Invalid date string(2000/01/01)"}, - {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"} + {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"}, + {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"}, + {conditions: {required: true, value: "9999-99-99"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(9999-99-99)"}, + {conditions: {required: true, value: "37/01/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(37-01-01)"}, + {conditions: {required: true, value: "2000/01/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(2000/01/01)"}, + {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"} ] }, { @@ -58,12 +58,12 @@ {conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"}, {conditions: {required: true, value: "2000-12"}, expected: false, name: "[target] Valid month string(2000-12)"}, {conditions: {required: true, value: "9999-01"}, expected: false, name: "[target] Valid month string(9999-01)"}, - {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"}, - {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"}, - {conditions: {required: true, value: "2000-99"}, expected: true, name: "[target] Invalid month string(2000-99)"}, - {conditions: {required: true, value: "37-01"}, expected: true, name: "[target] Invalid month string(37-01)"}, - {conditions: {required: true, value: "2000/01"}, expected: true, name: "[target] Invalid month string(2000/01)"}, - {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"} + {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"}, + {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"}, + {conditions: {required: true, value: "2000-99"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(2000-99)"}, + {conditions: {required: true, value: "37-01"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(37-01)"}, + {conditions: {required: true, value: "2000/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(2000/01)"}, + {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"} ] }, { @@ -73,12 +73,12 @@ {conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"}, {conditions: {required: true, value: "2000-W12"}, expected: false, name: "[target] Valid week string(2000-W12)"}, {conditions: {required: true, value: "9999-W01"}, expected: false, name: "[target] Valid week string(9999-W01)"}, - {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"}, - {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"}, - {conditions: {required: true, value: "2000-W99"}, expected: true, name: "[target] Invalid week string(2000-W99)"}, - {conditions: {required: true, value: "2000-W00"}, expected: true, name: "[target] invalid week string(2000-W00)"}, - {conditions: {required: true, value: "2000-w01"}, expected: true, name: "[target] invalid week string(2000-w01)"}, - {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"} + {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"}, + {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"}, + {conditions: {required: true, value: "2000-W99"}, expected: true, expectedImmutable: false, name: "[target] Invalid week string(2000-W99)"}, + {conditions: {required: true, value: "2000-W00"}, expected: true, expectedImmutable: false, name: "[target] invalid week string(2000-W00)"}, + {conditions: {required: true, value: "2000-w01"}, expected: true, expectedImmutable: false, name: "[target] invalid week string(2000-w01)"}, + {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"} ] }, { @@ -91,13 +91,13 @@ {conditions: {required: true, value: "12:00:00.001"}, expected: false, name: "[target] Valid time string(12:00:60.001)"}, {conditions: {required: true, value: "12:00:00.01"}, expected: false, name: "[target] Valid time string(12:00:60.01)"}, {conditions: {required: true, value: "12:00:00.1"}, expected: false, name: "[target] Valid time string(12:00:60.1)"}, - {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"}, - {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a time object"}, - {conditions: {required: true, value: "25:00:00"}, expected: true, name: "[target] Invalid time string(25:00:00)"}, - {conditions: {required: true, value: "12:60:00"}, expected: true, name: "[target] Invalid time string(12:60:00)"}, - {conditions: {required: true, value: "12:00:60"}, expected: true, name: "[target] Invalid time string(12:00:60)"}, - {conditions: {required: true, value: "12:00:00:001"}, expected: true, name: "[target] Invalid time string(12:00:00:001)"}, - {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"} + {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"}, + {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a time object"}, + {conditions: {required: true, value: "25:00:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(25:00:00)"}, + {conditions: {required: true, value: "12:60:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:60:00)"}, + {conditions: {required: true, value: "12:00:60"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:00:60)"}, + {conditions: {required: true, value: "12:00:00:001"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:00:00:001)"}, + {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"} ] }, { @@ -110,11 +110,11 @@ {conditions: {required: true, value: "123.01e-10"}, expected: false, name: "[target] Value is a number in scientific notation form(e is in lowercase)"}, {conditions: {required: true, value: "123.01E+10"}, expected: false, name: "[target] Value is a number in scientific notation form(E is in uppercase)"}, {conditions: {required: true, value: "-0"}, expected: false, name: "[target] Value is -0"}, - {conditions: {required: true, value: " 123 "}, expected: true, name: "[target] Value is a number with some white spaces"}, - {conditions: {required: true, value: Math.pow(2, 1024)}, expected: true, name: "[target] Value is Math.pow(2, 1024)"}, - {conditions: {required: true, value: Math.pow(-2, 1024)}, expected: true, name: "[target] Value is Math.pow(-2, 1024)"}, - {conditions: {required: true, value: "abc"}, expected: true, name: "[target] Value is a string that cannot be converted to a number"}, - {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"} + {conditions: {required: true, value: " 123 "}, expected: true, expectedImmutable: false, name: "[target] Value is a number with some white spaces"}, + {conditions: {required: true, value: Math.pow(2, 1024)}, expected: true, expectedImmutable: false, name: "[target] Value is Math.pow(2, 1024)"}, + {conditions: {required: true, value: Math.pow(-2, 1024)}, expected: true, expectedImmutable: false, name: "[target] Value is Math.pow(-2, 1024)"}, + {conditions: {required: true, value: "abc"}, expected: true, expectedImmutable: false, name: "[target] Value is a string that cannot be converted to a number"}, + {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"} ] }, { @@ -159,7 +159,7 @@ testData: [ {conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"}, {conditions: {required: true, value: "abc"}, expected: false, name: "[target] The value is not empty"}, - {conditions: {required: true, value: ""}, expected: true , name: "[target] The value is empty"} + {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value is empty"} ] } ]; diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js index 9b28b32309e..33508fb3289 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js +++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js @@ -4,12 +4,9 @@ var validator = { var self = this; test(function() { self.pre_check(ctl, 'tooLong'); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.dirty) - self.set_dirty(ctl); - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.tooLong, 'The validity.tooLong should be true' + condStr); @@ -25,12 +22,9 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "tooShort"); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.dirty) - self.set_dirty(ctl); - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.tooShort, 'The validity.tooShort should be true' + condStr); @@ -46,10 +40,9 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "patternMismatch"); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.patternMismatch, 'The validity.patternMismatch should be true' + condStr); @@ -65,10 +58,9 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "valueMissing"); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.valueMissing, 'The validity.valueMissing should be true' + condStr); @@ -84,10 +76,9 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "typeMismatch"); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.typeMismatch, 'The validity.typeMismatch should be true' + condStr); @@ -103,10 +94,9 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "rangeOverflow"); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.rangeOverflow, 'The validity.rangeOverflow should be true' + condStr); @@ -122,10 +112,9 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "rangeUnderflow"); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.rangeUnderflow, 'The validity.rangeUnderflow should be true' + condStr); @@ -141,10 +130,9 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "stepMismatch"); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.stepMismatch, 'The validity.stepMismatch should be true' + condStr); @@ -160,10 +148,9 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "badInput"); - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.badInput, 'The validity.badInput should be true' + condStr); @@ -179,17 +166,24 @@ var validator = { var self = this; test(function () { self.pre_check(ctl, "customError"); - ctl.setCustomValidity(data.conditions.message); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.expected) { + const {ctl, expected, condStr} = val; + if (expected) { assert_true( ctl.validity.customError, 'The validity.customError attribute should be true' + condStr); - assert_equals( - ctl.validationMessage, data.conditions.message, - 'The validationMessage attribute should be \'' + - data.conditions.message + '\'' + condStr); + // validationMessage returns the empty string if ctl is barred from + // constraint validation, which happens if ctl is disabled or readOnly. + if (ctl.disabled || ctl.readOnly) { + assert_equals( + ctl.validationMessage, '', + 'The validationMessage attribute must be empty' + condStr); + } else { + assert_equals( + ctl.validationMessage, data.conditions.message, + 'The validationMessage attribute should be \'' + + data.conditions.message + '\'' + condStr); + } } else { assert_false( ctl.validity.customError, @@ -205,12 +199,9 @@ var validator = { test_isValid: function(ctl, data) { var self = this; test(function () { - self.set_conditions(ctl, data.conditions); self.iterate_over(ctl, data).forEach(function(val) { - const {ctl, data, condStr} = val; - if (data.dirty) - self.set_dirty(ctl); - if (data.expected) + const {ctl, expected, condStr} = val; + if (expected) assert_true( ctl.validity.valid, 'The validity.valid should be true' + condStr); @@ -352,7 +343,9 @@ var validator = { ctl.removeAttribute(item); }); for (var attr in obj) { - if (attr === "checked" || obj[attr] || obj[attr] === "") + if (attr === "message") + ctl.setCustomValidity(obj[attr]); + else if (attr === "checked" || obj[attr] || obj[attr] === "") ctl[attr] = obj[attr]; } }, @@ -396,24 +389,54 @@ var validator = { }, iterate_over: function(ctl, data) { - // Iterate over normal, disabled, readonly, and both. + // Iterate over normal, disabled, readonly, and both (if applicable). + var ctlNormal = ctl.cloneNode(true); + this.set_conditions(ctlNormal, data.conditions); + if (data.dirty) + this.set_dirty(ctlNormal); + var ctlDisabled = ctl.cloneNode(true); + this.set_conditions(ctlDisabled, data.conditions); + if (data.dirty) + this.set_dirty(ctlDisabled); ctlDisabled.disabled = true; - var ctlReadonly = ctl.cloneNode(true); - ctlReadonly.readonly = true; - var ctlBoth = ctl.cloneNode(true); - ctlBoth.disabled = true; - ctlBoth.readonly = true; - return [ - {ctl: ctl, data: data, condStr: '.'}, - {ctl: ctlDisabled, data: data, condStr: ', when control is disabled.'}, - {ctl: ctlReadonly, data: data, condStr: ', when control is readonly.'}, - { + + var expectedImmutable = + data.expectedImmutable !== undefined ? data.expectedImmutable : data.expected; + + var variants = [ + {ctl: ctlNormal, expected: data.expected, condStr: '.'}, + {ctl: ctlDisabled, expected: expectedImmutable, condStr: ', when control is disabled.'}, + ]; + + if ('readOnly' in ctl) { + var ctlReadonly = ctl.cloneNode(true); + this.set_conditions(ctlReadonly, data.conditions); + if (data.dirty) + this.set_dirty(ctlReadonly); + ctlReadonly.readOnly = true; + + var ctlBoth = ctl.cloneNode(true); + this.set_conditions(ctlBoth, data.conditions); + if (data.dirty) + this.set_dirty(ctlBoth); + ctlBoth.disabled = true; + ctlBoth.readOnly = true; + + variants.push({ + ctl: ctlReadonly, + expected: expectedImmutable, + condStr: ', when control is readonly.' + }); + + variants.push({ ctl: ctlBoth, - data: data, + expected: expectedImmutable, condStr: ', when control is disabled & readonly.' - }, - ] + }); + } + + return variants; }, run_test: function(testee, method) { diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html index ad4e38cbc74..ec815d4cb30 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html @@ -291,8 +291,11 @@ test(function(){ } , "stepDown stop so lower than the minimum value"); test(function(){ + // Set min value to ensure that 15:01 - base is a multiple of 2 min (i.e., a + // valid value). + _StepTest.min = "14:01"; _StepTest.max = "15:01"; - this.add_cleanup(function() { _StepTest.max = ""; }); + this.add_cleanup(function() { _StepTest.min = _StepTest.max = ""; }); _StepTest.value = "15:00"; _StepTest.step = "120"; _StepTest.stepUp(); diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini index d97432ed39c..c7b3482c786 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini @@ -1,5 +1,3 @@ [multiTouchPoints.html] - disabled: - if product == "chrome" and os != "mac": https://github.com/web-platform-tests/wpt/issues/20838 expected: if product == "firefox" or product == "safari" or product == "epiphany" or product == "webkit": ERROR diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini index 3adcbe68856..68ccafcec2a 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini @@ -1,5 +1,3 @@ [multiTouchPointsReleaseFirstPoint.html] - disabled: - if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838 expected: if product == "firefox" or product == "safari": ERROR diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini index d01525b3cfa..5d714dd7773 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini @@ -1,5 +1,3 @@ [multiTouchPointsReleaseSecondPoint.html] - disabled: - if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838 expected: if product == "firefox" or product == "safari": ERROR diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini index a87d9f936fd..40626b8193e 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini @@ -1,5 +1,3 @@ [multiTouchPointsTwoTouchStarts.html] - disabled: - if product == "chrome" and os != "mac": https://github.com/web-platform-tests/wpt/issues/20838 - expected: - if product == "firefox" or product == "safari": ERROR + expected: + if product == "firefox" or product == "safari": ERROR diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini index fe1bf469f4f..4f1939a431a 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini @@ -1,5 +1,3 @@ [multiTouchPointsWithPause.html] - disabled: - if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838 expected: if product == "firefox" or product == "safari": ERROR diff --git a/tests/wpt/web-platform-tests/interfaces/webaudio.idl b/tests/wpt/web-platform-tests/interfaces/webaudio.idl index 674673d90b1..9491090337c 100644 --- a/tests/wpt/web-platform-tests/interfaces/webaudio.idl +++ b/tests/wpt/web-platform-tests/interfaces/webaudio.idl @@ -26,28 +26,36 @@ interface BaseAudioContext : EventTarget { AnalyserNode createAnalyser (); BiquadFilterNode createBiquadFilter (); - AudioBuffer createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate); + AudioBuffer createBuffer (unsigned long numberOfChannels, + unsigned long length, + float sampleRate); AudioBufferSourceNode createBufferSource (); ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6); - ChannelSplitterNode createChannelSplitter (optional unsigned long numberOfOutputs = 6); + ChannelSplitterNode createChannelSplitter ( + optional unsigned long numberOfOutputs = 6); ConstantSourceNode createConstantSource (); ConvolverNode createConvolver (); DelayNode createDelay (optional double maxDelayTime = 1.0); DynamicsCompressorNode createDynamicsCompressor (); GainNode createGain (); - IIRFilterNode createIIRFilter (sequence<double> feedforward, sequence<double> feedback); + IIRFilterNode createIIRFilter (sequence<double> feedforward, + sequence<double> feedback); OscillatorNode createOscillator (); PannerNode createPanner (); - PeriodicWave createPeriodicWave (sequence<float> real, sequence<float> imag, optional PeriodicWaveConstraints constraints = {}); - ScriptProcessorNode createScriptProcessor(optional unsigned long bufferSize = 0, - optional unsigned long numberOfInputChannels = 2, - optional unsigned long numberOfOutputChannels = 2); + PeriodicWave createPeriodicWave (sequence<float> real, + sequence<float> imag, + optional PeriodicWaveConstraints constraints = {}); + ScriptProcessorNode createScriptProcessor( + optional unsigned long bufferSize = 0, + optional unsigned long numberOfInputChannels = 2, + optional unsigned long numberOfOutputChannels = 2); StereoPannerNode createStereoPanner (); WaveShaperNode createWaveShaper (); - Promise<AudioBuffer> decodeAudioData (ArrayBuffer audioData, - optional DecodeSuccessCallback? successCallback, - optional DecodeErrorCallback? errorCallback); + Promise<AudioBuffer> decodeAudioData ( + ArrayBuffer audioData, + optional DecodeSuccessCallback? successCallback, + optional DecodeErrorCallback? errorCallback); }; enum AudioContextLatencyCategory { @@ -67,7 +75,8 @@ interface AudioContext : BaseAudioContext { Promise<void> close (); MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement); MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream); - MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (MediaStreamTrack mediaStreamTrack); + MediaStreamTrackAudioSourceNode createMediaStreamTrackSource ( + MediaStreamTrack mediaStreamTrack); MediaStreamAudioDestinationNode createMediaStreamDestination (); }; @@ -116,8 +125,14 @@ interface AudioBuffer { readonly attribute double duration; readonly attribute unsigned long numberOfChannels; Float32Array getChannelData (unsigned long channel); - void copyFromChannel (Float32Array destination, unsigned long channelNumber, optional unsigned long bufferOffset = 0); - void copyToChannel (Float32Array source, unsigned long channelNumber, optional unsigned long bufferOffset = 0); + void copyFromChannel (Float32Array destination, + unsigned long channelNumber, + optional unsigned long bufferOffset = 0); + void copyToChannel (Float32Array source, + + unsigned long channelNumber, + + optional unsigned long bufferOffset = 0); }; dictionary AudioBufferOptions { @@ -136,7 +151,9 @@ interface AudioNode : EventTarget { void disconnect (unsigned long output); void disconnect (AudioNode destinationNode); void disconnect (AudioNode destinationNode, unsigned long output); - void disconnect (AudioNode destinationNode, unsigned long output, unsigned long input); + void disconnect (AudioNode destinationNode, + unsigned long output, + unsigned long input); void disconnect (AudioParam destinationParam); void disconnect (AudioParam destinationParam, unsigned long output); readonly attribute BaseAudioContext context; @@ -180,7 +197,11 @@ interface AudioParam { AudioParam linearRampToValueAtTime (float value, double endTime); AudioParam exponentialRampToValueAtTime (float value, double endTime); AudioParam setTargetAtTime (float target, double startTime, float timeConstant); - AudioParam setValueCurveAtTime (sequence<float> values, double startTime, double duration); + AudioParam setValueCurveAtTime (sequence<float> values, + + double startTime, + + double duration); AudioParam cancelScheduledValues (double cancelTime); AudioParam cancelAndHoldAtTime (double cancelTime); }; @@ -215,7 +236,8 @@ dictionary AnalyserOptions : AudioNodeOptions { [Exposed=Window] interface AudioBufferSourceNode : AudioScheduledSourceNode { - constructor (BaseAudioContext context, optional AudioBufferSourceOptions options = {}); + constructor (BaseAudioContext context, + optional AudioBufferSourceOptions options = {}); attribute AudioBuffer? buffer; readonly attribute AudioParam playbackRate; readonly attribute AudioParam detune; @@ -289,7 +311,9 @@ interface BiquadFilterNode : AudioNode { readonly attribute AudioParam detune; readonly attribute AudioParam Q; readonly attribute AudioParam gain; - void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse); + void getFrequencyResponse (Float32Array frequencyHz, + Float32Array magResponse, + Float32Array phaseResponse); }; dictionary BiquadFilterOptions : AudioNodeOptions { @@ -353,7 +377,8 @@ dictionary DelayOptions : AudioNodeOptions { [Exposed=Window] interface DynamicsCompressorNode : AudioNode { - constructor (BaseAudioContext context, optional DynamicsCompressorOptions options = {}); + constructor (BaseAudioContext context, + optional DynamicsCompressorOptions options = {}); readonly attribute AudioParam threshold; readonly attribute AudioParam knee; readonly attribute AudioParam ratio; @@ -383,7 +408,9 @@ dictionary GainOptions : AudioNodeOptions { [Exposed=Window] interface IIRFilterNode : AudioNode { constructor (BaseAudioContext context, IIRFilterOptions options); - void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse); + void getFrequencyResponse (Float32Array frequencyHz, + Float32Array magResponse, + Float32Array phaseResponse); }; dictionary IIRFilterOptions : AudioNodeOptions { @@ -555,7 +582,8 @@ callback AudioWorkletProcessorConstructor = AudioWorkletProcessor (object option [Global=(Worklet, AudioWorklet), Exposed=AudioWorklet] interface AudioWorkletGlobalScope : WorkletGlobalScope { - void registerProcessor (DOMString name, AudioWorkletProcessorConstructor processorCtor); + void registerProcessor (DOMString name, + AudioWorkletProcessorConstructor processorCtor); readonly attribute unsigned long long currentFrame; readonly attribute double currentTime; readonly attribute float sampleRate; diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc.idl b/tests/wpt/web-platform-tests/interfaces/webrtc.idl index e30fc38fd00..49ed6bb0333 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc.idl @@ -13,7 +13,7 @@ dictionary RTCConfiguration { }; enum RTCIceCredentialType { - "password", + "password" }; dictionary RTCIceServer { diff --git a/tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html b/tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html index 0cfce2f7124..b6a33f579b4 100644 --- a/tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html +++ b/tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html @@ -8,38 +8,35 @@ <div id='myDiv'></div> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<!-- Delay onload by inserting a slow image.--> -<img src="resources/slow-image.py"> +<script src="resources/util.js"></script> <script> - async_test(function (t) { - if (!window.LayoutShift) - assert_unreached('LayoutShift entries are not supported'); - const startTime = performance.now(); - new PerformanceObserver(list => { - const endTime = performance.now(); - assert_equals(list.getEntries().length, 1); - const entry = list.getEntries()[0]; - assert_equals(entry.entryType, "layout-shift"); - assert_equals(entry.name, ""); - assert_greater_than_equal(entry.startTime, startTime) - assert_less_than_equal(entry.startTime, endTime) - assert_equals(entry.duration, 0.0); - const maxDimension = Math.max(document.documentElement.clientWidth, - document.documentElement.clientHeight); - // The layout shift value should be: - // 300 * (100 + 60) * (60 / maxDimension) / viewport size. - assert_equals(entry.value, 300 * (100 + 60) * (60 / maxDimension) / - (document.documentElement.clientWidth * document.documentElement.clientHeight)); +async_test(async function(t) { + assert_precondition(window.LayoutShift, 'LayoutShift entries are not supported'); + // Wait for the initial render to complete. + await waitForAnimationFrames(2); - // The entry should not be available via getEntries* methods. - assert_equals(performance.getEntriesByType('layout-shift').length, 0, 'getEntriesByType should have no layout-shift entries'); - assert_equals(performance.getEntriesByName('', 'layout-shift').length, 0, 'getEntriesByName should have no layout-shift entries'); - assert_equals(performance.getEntries().filter(e => e.entryType === 'layout-shift').length, 0, 'getEntries should have no layout-shift entries'); - t.done(); - }).observe({type: 'layout-shift'}); - // Modify the position of the div. - document.getElementById('myDiv').style = "top: 60px"; - }, 'Layout shift before onload is not buffered into the performance timeline.'); + const startTime = performance.now(); + new PerformanceObserver(t.step_func_done(list => { + const endTime = performance.now(); + assert_equals(list.getEntries().length, 1); + const entry = list.getEntries()[0]; + assert_equals(entry.entryType, "layout-shift"); + assert_equals(entry.name, ""); + assert_greater_than_equal(entry.startTime, startTime); + assert_less_than_equal(entry.startTime, endTime); + assert_equals(entry.duration, 0.0); + // The layout shift value should be: + // 300 * (100 + 60) * (60 / maxDimension) / viewport size. + assert_equals(entry.value, computeExpectedScore(300 * (100 + 60), 60)); + + // The entry should not be available via getEntries* methods. + assert_equals(performance.getEntriesByType('layout-shift').length, 0, 'getEntriesByType should have no layout-shift entries'); + assert_equals(performance.getEntriesByName('', 'layout-shift').length, 0, 'getEntriesByName should have no layout-shift entries'); + assert_equals(performance.getEntries().filter(e => e.entryType === 'layout-shift').length, 0, 'getEntries should have no layout-shift entries'); + })).observe({type: 'layout-shift'}); + // Modify the position of the div. + document.getElementById('myDiv').style = "top: 60px"; +}, 'Layout shift before onload is not buffered into the performance timeline.'); </script> </body> diff --git a/tests/wpt/web-platform-tests/layout-instability/buffered-flag.html b/tests/wpt/web-platform-tests/layout-instability/buffered-flag.html index dabc8068931..cd1260e3613 100644 --- a/tests/wpt/web-platform-tests/layout-instability/buffered-flag.html +++ b/tests/wpt/web-platform-tests/layout-instability/buffered-flag.html @@ -8,10 +8,13 @@ <div id='myDiv'></div> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="resources/util.js"></script> <script> -async_test(t => { - if (!window.LayoutShift) - assert_unreached('LayoutShift entries are not supported'); +async_test(async function(t) { + assert_precondition(window.LayoutShift, 'LayoutShift entries are not supported'); + // Wait for the initial render to complete. + await waitForAnimationFrames(2); + const startTime = performance.now(); // First observer creates second in callback to ensure the entry has been dispatched by the time // the second observer begins observing. @@ -22,9 +25,10 @@ async_test(t => { assert_equals(list.getEntries().length, 1); const entry = list.getEntries()[0]; assert_equals(entry.entryType, "layout-shift"); - assert_greater_than_equal(entry.startTime, startTime) - assert_less_than_equal(entry.startTime, endTime) + assert_greater_than_equal(entry.startTime, startTime); + assert_less_than_equal(entry.startTime, endTime); assert_equals(entry.duration, 0.0); + assert_equals(entry.value, computeExpectedScore(300 * (100 + 60), 60)); })).observe({'type': 'layout-shift', buffered: true}); }).observe({type: 'layout-shift'}); // Modify the position of the div to cause a layout-shift entry. diff --git a/tests/wpt/web-platform-tests/layout-instability/observe-layout-shift.html b/tests/wpt/web-platform-tests/layout-instability/observe-layout-shift.html deleted file mode 100644 index 1c35fe2aa23..00000000000 --- a/tests/wpt/web-platform-tests/layout-instability/observe-layout-shift.html +++ /dev/null @@ -1,111 +0,0 @@ -<!DOCTYPE HTML> -<meta charset=utf-8> -<title>Layout Instability: observe layout shift value via PerformanceObserver</title> -<body> -<style> -#myDiv { position: relative; width: 300px; height: 100px; } - -/* Disable the button's focus ring, which otherwise expands its visual rect by - * 1px on all sides, triggering a layout shift event. - */ -#button { outline: none; } -</style> -<div id='myDiv'></div> -<button id='button'>Generate a 'click' event</button> -<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> - let timeAfterClick; - function mainThreadBusy(duration) { - const now = performance.now(); - while (performance.now() < now + duration); - } - - function clickOnElement(id, callback) { - const element = document.getElementById(id); - const rect = element.getBoundingClientRect(); - const xCenter = rect.x + rect.width / 2; - const yCenter = rect.y + rect.height / 2; - const leftButton = 0; - const clickHandler = () => { - mainThreadBusy(120); - if (callback) - callback(); - element.removeEventListener("mousedown", clickHandler); - }; - element.addEventListener("mousedown", clickHandler); - test_driver.click(element); - } - - function clickAndBlockMain(id) { - return new Promise((resolve, reject) => { - clickOnElement(id, resolve); - }); - } - - async_test(function (t) { - if (!window.LayoutShift) - assert_unreached('LayoutShift entries are not supported'); - const startTime = performance.now(); - const observer = new PerformanceObserver( - t.step_func_done(function(entryList) { - const endTime = performance.now(); - assert_equals(entryList.getEntries().length, 1); - const entry = entryList.getEntries()[0]; - assert_equals(entry.entryType, "layout-shift"); - assert_equals(entry.name, ""); - assert_greater_than_equal(entry.startTime, startTime) - assert_less_than_equal(entry.startTime, endTime) - assert_equals(entry.duration, 0.0); - const maxDimension = Math.max(document.documentElement.clientWidth, - document.documentElement.clientHeight); - // The layout shift value should be: - // 300 * (100 + 60) * (60 / maxDimension) / viewport size. - assert_equals(entry.value, 300 * (100 + 60) * (60 / maxDimension) / - (document.documentElement.clientWidth * document.documentElement.clientHeight)); - }) - ); - observer.observe({entryTypes: ['layout-shift']}); - window.onload = () => { - // Modify the position of the div. - document.getElementById('myDiv').style = "top: 60px"; - }; - }, 'Layout shift is observable via PerformanceObserver.'); - - async_test(function (t) { - const startTime = performance.now(); - const observer = new PerformanceObserver( - t.step_func_done(function(entryList) { - const endTime = performance.now(); - assert_equals(entryList.getEntries().length, 1); - const entry = entryList.getEntries()[0]; - assert_equals(entry.entryType, "layout-shift"); - assert_equals(entry.name, ""); - assert_greater_than_equal(entry.startTime, startTime) - assert_less_than_equal(entry.startTime, endTime) - assert_equals(entry.duration, 0.0); - const maxDimension = Math.max(document.documentElement.clientWidth, - document.documentElement.clientHeight); - // The layout shift value should be: - // 300 * (100 + 60) * (60 / maxDimension) / viewport size. - assert_equals(entry.value, 300 * (100 + 60) * (60 / maxDimension) / - (document.documentElement.clientWidth * document.documentElement.clientHeight)); - // We should see that there was a click input entry - assert_equals(entry.hadRecentInput, true); - assert_greater_than_equal(timeAfterClick, entry.lastInputTime); - }) - ); - observer.observe({entryTypes: ['layout-shift']}); - window.onload = () => { - // User input event - clickAndBlockMain('button').then( () => { - timeAfterClick = performance.now(); - // Modify the position of the div. - document.getElementById('myDiv').style = "top: 60px"; - }); - }; - }, 'Layout shift within user input is observable via PerformanceObserver.'); -</script> - -</body> diff --git a/tests/wpt/web-platform-tests/layout-instability/recent-input.html b/tests/wpt/web-platform-tests/layout-instability/recent-input.html new file mode 100644 index 00000000000..a4fa0d8b0d9 --- /dev/null +++ b/tests/wpt/web-platform-tests/layout-instability/recent-input.html @@ -0,0 +1,58 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<title>Layout Instability: observe after user input</title> +<body> +<style> +#myDiv { position: relative; width: 300px; height: 100px; } + +/* Disable the button's focus ring, which otherwise expands its visual rect by + * 1px on all sides, triggering a layout shift event. + */ +#button { outline: none; } +</style> +<div id='myDiv'></div> +<button id='button'>Generate a 'click' event</button> +<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/util.js></script> +<script src=/event-timing/resources/event-timing-test-utils.js></script> +<script> +let timeAfterClick; + +async_test(async function(t) { + assert_precondition(window.LayoutShift, 'LayoutShift entries are not supported'); + // Wait for the initial render to complete. + await waitForAnimationFrames(2); + + const startTime = performance.now(); + const observer = new PerformanceObserver( + t.step_func_done(function(entryList) { + const endTime = performance.now(); + assert_equals(entryList.getEntries().length, 1); + const entry = entryList.getEntries()[0]; + assert_equals(entry.entryType, "layout-shift"); + assert_equals(entry.name, ""); + assert_greater_than_equal(entry.startTime, startTime); + assert_less_than_equal(entry.startTime, endTime); + assert_equals(entry.duration, 0.0); + // The layout shift value should be: + // 300 * (100 + 60) * (60 / maxDimension) / viewport size. + assert_equals(entry.value, computeExpectedScore(300 * (100 + 60), 60)); + // We should see that there was a click input entry. + assert_equals(entry.hadRecentInput, true); + assert_greater_than_equal(timeAfterClick, entry.lastInputTime); + }) + ); + observer.observe({entryTypes: ['layout-shift']}); + // User input event + clickAndBlockMain('button').then(() => { + timeAfterClick = performance.now(); + // Modify the position of the div. + document.getElementById('myDiv').style = "top: 60px"; + }); +}, 'Layout shift right after user input is observable via PerformanceObserver.'); +</script> + +</body> diff --git a/tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html b/tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html index 6ace93ad54c..61267a32648 100644 --- a/tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html +++ b/tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html @@ -4,7 +4,7 @@ <style> body { margin: 0; } -#j { position: relative; width: 600px; height: 200px; top: 600px; } +#j { position: absolute; width: 600px; height: 200px; top: 100%; } </style> <div id='j'></div> @@ -19,7 +19,9 @@ promise_test(async () => { // Wait for the initial render to complete. await waitForAnimationFrames(2); - document.querySelector("#j").style.top = "400px"; + // Move div partially into viewport. + document.querySelector("#j").style.top = + document.documentElement.clientHeight - 200 + "px"; // The element moves from outside the viewport to within the viewport, which // should generate a shift. diff --git a/tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html b/tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html index 49242913760..2d92835b889 100644 --- a/tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html +++ b/tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html @@ -4,7 +4,7 @@ <style> body { margin: 0; } -#j { position: relative; width: 600px; height: 200px; top: 600px; } +#j { position: absolute; width: 600px; height: 200px; top: 100%; } </style> <div id='j'></div> @@ -19,7 +19,9 @@ promise_test(async () => { // Wait for the initial render to complete. await waitForAnimationFrames(2); - document.querySelector("#j").style.top = "800px"; + // Move div even further out of viewport. + document.querySelector("#j").style.top = + document.documentElement.clientHeight + 200 + "px"; // Since the element moves entirely outside of the viewport, it shouldn't // generate a score. diff --git a/tests/wpt/web-platform-tests/layout-instability/toJSON.html b/tests/wpt/web-platform-tests/layout-instability/toJSON.html index 3d39d623e13..374a7de0cd1 100644 --- a/tests/wpt/web-platform-tests/layout-instability/toJSON.html +++ b/tests/wpt/web-platform-tests/layout-instability/toJSON.html @@ -8,35 +8,38 @@ <div id='myDiv'></div> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="resources/util.js"></script> <script> - async_test(function (t) { - if (!window.LayoutShift) - assert_unreached('LayoutShift entries are not supported'); - const observer = new PerformanceObserver( - t.step_func_done(function(entryList) { - const entry = entryList.getEntries()[0]; - assert_equals(typeof(entry.toJSON), 'function'); - const json = entry.toJSON(); - assert_equals(typeof(json), 'object'); - const keys = [ - // PerformanceEntry - 'name', - 'entryType', - 'startTime', - 'duration', - // LayoutShift - 'value', - 'hadRecentInput', - 'lastInputTime', - ]; - for (const key of keys) { - assert_equals(json[key], entry[key], - 'LayoutShift ${key} entry does not match its toJSON value'); - } - }) - ); - observer.observe({type: 'layout-shift'}); - document.getElementById('myDiv').style = "top: 60px"; - }, 'Test toJSON() in LayoutShift.'); +async_test(async function(t) { + assert_precondition(window.LayoutShift, 'LayoutShift entries are not supported'); + // Wait for the initial render to complete. + await waitForAnimationFrames(2); + + const observer = new PerformanceObserver( + t.step_func_done(function(entryList) { + const entry = entryList.getEntries()[0]; + assert_equals(typeof(entry.toJSON), 'function'); + const json = entry.toJSON(); + assert_equals(typeof(json), 'object'); + const keys = [ + // PerformanceEntry + 'name', + 'entryType', + 'startTime', + 'duration', + // LayoutShift + 'value', + 'hadRecentInput', + 'lastInputTime', + ]; + for (const key of keys) { + assert_equals(json[key], entry[key], + 'LayoutShift ${key} entry does not match its toJSON value'); + } + }) + ); + observer.observe({type: 'layout-shift'}); + document.getElementById('myDiv').style = "top: 60px"; +}, 'Test toJSON() in LayoutShift.'); </script> </body> diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist index d06f4c59bca..b5a8f806870 100644 --- a/tests/wpt/web-platform-tests/lint.whitelist +++ b/tests/wpt/web-platform-tests/lint.whitelist @@ -77,6 +77,7 @@ AHEM COPY: css/vendor-imports/mozilla/mozilla-central-reftests/*/Ahem.ttf # Intentional use of CRLF CR AT EOL: WebIDL/valid/idl/documentation-dos.widl CR AT EOL: cors/resources/cors-headers.asis +CR AT EOL: fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis CR AT EOL: html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html CR AT EOL: html/semantics/forms/the-textarea-element/multiline-placeholder-crlf.html CR AT EOL: html/semantics/forms/the-input-element/multiline-placeholder-cr.html diff --git a/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html new file mode 100644 index 00000000000..a545410f978 --- /dev/null +++ b/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<head> + <title>Below viewport images with loading='lazy' and changed to + loading='eager' load and do not block the window load event</title> + <link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"> + <link rel="help" href="https://github.com/scott-little/lazyload"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<!-- +Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed. +--> + +<script> + const t = async_test("Test that below viewport images with loading='lazy' " + + "and changed to loading='eager' load and do not block " + + "the window load event."); + + let has_below_viewport_loaded = false; + let has_window_loaded = false; + + window.addEventListener("load", t.step_func(function() { + assert_false(has_window_loaded, + "The window.load() event should only fire once."); + has_window_loaded = true; + })); + + const below_viewport_img_onload = t.step_func_done(function() { + assert_false(has_below_viewport_loaded, + "The in_viewport element should load only once."); + assert_true(has_window_loaded, + "The window.load() event should have fired before " + + "below_viewport loaded."); + has_below_viewport_loaded = true; + }); +</script> + +<body> + <div style="height:10000px;"></div> + <img id="below_viewport" src="resources/image.png?pipe=trickle(d2)" + loading="lazy" onload="below_viewport_img_onload();"> + <script> + assert_false(has_window_loaded, + "The window.load() event should not fire before " + + "changing below_viewport to loading='eager'."); + document.getElementById("below_viewport").loading = 'eager'; + </script> +</body> diff --git a/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html new file mode 100644 index 00000000000..d316a6ae22b --- /dev/null +++ b/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<head> + <title>In viewport images with loading='lazy' and changed to loading='eager' + do not block the window load event</title> + <link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"> + <link rel="help" href="https://github.com/scott-little/lazyload"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<!-- +Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed. +--> + +<script> + const t = async_test("Test that in viewport images with loading='lazy' and " + + "changed to loading='eager' do not block the window " + + "load event."); + + let has_in_viewport_loaded = false; + let has_window_loaded = false; + + const in_viewport_img_onload = t.step_func_done(function() { + assert_false(has_in_viewport_loaded, + "The in_viewport element should load only once."); + assert_true(has_window_loaded, + "The window.load() event should fire before in_viewport image loads."); + has_in_viewport_loaded = true; + }); + + window.addEventListener("load", t.step_func(function() { + assert_false(has_window_loaded, + "The window.load() event should only fire once."); + has_window_loaded = true; + })); +</script> + +<body> + <img id="in_viewport" src="resources/image.png?pipe=trickle(d2)" + loading="lazy" onload="in_viewport_img_onload();"> + <script> + document.getElementById("in_viewport").loading = 'eager'; + </script> +</body> diff --git a/tests/wpt/web-platform-tests/loading/lazyload/move-element-and-scroll.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/move-element-and-scroll.tentative.html new file mode 100644 index 00000000000..f9d89807b8c --- /dev/null +++ b/tests/wpt/web-platform-tests/loading/lazyload/move-element-and-scroll.tentative.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<head> + <title>Images with loading='lazy' load being moved to another document + and then scrolled to</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="common.js"></script> +</head> + +<!-- +Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed. +--> + +<body> + <div id="tall_div" style="height:1000vh"></div> + <div id="below_viewport_div"></div> + <img id="below_viewport" src='resources/image.png?below_viewport' loading="lazy"> + + <script> + const tall_div = document.getElementById("tall_div"); + const below_viewport_element = document.getElementById("below_viewport"); + const below_viewport_div = document.getElementById("below_viewport_div"); + + async_test(function(t) { + below_viewport_element.onload = + t.unreached_func("The below viewport image should not load"); + t.step_timeout(t.step_func_done(), 1000); + const iframe = document.createElement('iframe'); + iframe.setAttribute("style", "display:none"); + iframe.srcdoc = "<body></body>"; + iframe.onload = () => { + const adopted_img = iframe.contentDocument.adoptNode(below_viewport_element); + iframe.contentDocument.body.appendChild(adopted_img); + below_viewport_div.scrollIntoView(); + }; + document.body.insertBefore(iframe, tall_div); + }, "Test that <img> below viewport is not loaded when moved to another " + + "document and then scrolled to"); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/loading/lazyload/remove-element-and-scroll.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/remove-element-and-scroll.tentative.html new file mode 100644 index 00000000000..53708ceac75 --- /dev/null +++ b/tests/wpt/web-platform-tests/loading/lazyload/remove-element-and-scroll.tentative.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<head> + <title>Images with loading='lazy' load being removed and then scrolled to</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="common.js"></script> +</head> + +<!-- +Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed. +--> + +<body> + <img id="in_viewport" src='resources/image.png?in_viewport&pipe=trickle(d1)'> + <div style="height:1000vh"></div> + <div id="below_viewport_div"></div> + <img id="below_viewport" src='resources/image.png?below_viewport' loading="lazy"> + + <script> + const in_viewport_element = document.getElementById("in_viewport"); + const below_viewport_element = document.getElementById("below_viewport"); + const below_viewport_div = document.getElementById("below_viewport_div"); + + async_test(t => { + below_viewport_element.onload = t.unreached_func("Removed loading=lazy image " + + "should not load when its old position is scrolled to."); + below_viewport_element.remove(); + + in_viewport_element.onload = () => { + below_viewport_div.scrollIntoView(); + t.step_timeout(t.step_func_done(), 2000); + }; + }, "Test that <img> below viewport is not loaded when removed from the " + + "document and then scrolled to"); + </script> +</body> diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js new file mode 100644 index 00000000000..2c0299df12e --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js @@ -0,0 +1,4 @@ +// META: script=/resources/testdriver.js +// META: script=resources/test-helpers.js +// META: script=resources/native-fs-test-helpers.js +// META: script=script-tests/FileSystemWritableFileStream-piped.js diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js new file mode 100644 index 00000000000..0efacf9e607 --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js @@ -0,0 +1,4 @@ +// META: script=/resources/testdriver.js +// META: script=resources/test-helpers.js +// META: script=resources/native-fs-test-helpers.js +// META: script=script-tests/FileSystemWritableFileStream-write.js diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js new file mode 100644 index 00000000000..caf6fbd1c52 --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js @@ -0,0 +1,4 @@ +// META: script=/resources/testdriver.js +// META: script=resources/test-helpers.js +// META: script=resources/native-fs-test-helpers.js +// META: script=script-tests/FileSystemWritableFileStream.js diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js b/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js index 5ad8c04724b..bcdfd484cf2 100644 --- a/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js +++ b/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js @@ -14,7 +14,7 @@ const directory_promise = (async () => { await window.test_driver.bless( 'show a file picker.<br />Please select an empty directory'); - const entries = await self.chooseFileSystemEntries({type: 'openDirectory'}); + const entries = await self.chooseFileSystemEntries({type: 'open-directory'}); assert_true(entries instanceof FileSystemHandle); assert_true(entries instanceof FileSystemDirectoryHandle); for await (const entry of entries.getEntries()) { diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html b/tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html index 937a6c385de..07301af1cfa 100644 --- a/tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html +++ b/tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html @@ -16,7 +16,7 @@ } try { - window.chooseFileSystemEntries({ type: 'openDirectory' }) + window.chooseFileSystemEntries({ type: 'open-directory' }) .then(() => { post_message('chooseFileSystemEntries(): FULFILLED'); }).catch(error => { diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js new file mode 100644 index 00000000000..eed6a561dc4 --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js @@ -0,0 +1,4 @@ +// META: script=resources/test-helpers.js +// META: script=resources/sandboxed-fs-test-helpers.js +// META: script=../streams/resources/recording-streams.js +// META: script=script-tests/FileSystemWritableFileStream-piped.js diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js new file mode 100644 index 00000000000..7ef0ea0ef82 --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js @@ -0,0 +1,3 @@ +// META: script=resources/test-helpers.js +// META: script=resources/sandboxed-fs-test-helpers.js +// META: script=script-tests/FileSystemWritableFileStream-write.js diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js new file mode 100644 index 00000000000..16dbbe6a808 --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js @@ -0,0 +1,3 @@ +// META: script=resources/test-helpers.js +// META: script=resources/sandboxed-fs-test-helpers.js +// META: script=script-tests/FileSystemWritableFileStream.js diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-piped.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-piped.js new file mode 100644 index 00000000000..59fc1e3d136 --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-piped.js @@ -0,0 +1,135 @@ +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'foo_string.txt', root); + const wfs = await handle.createWritable(); + + const rs = recordingReadableStream({ + start(controller) { + controller.enqueue('foo_string'); + controller.close(); + } + }); + + await rs.pipeTo(wfs, { preventCancel: true }); + assert_equals(await getFileContents(handle), 'foo_string'); + assert_equals(await getFileSize(handle), 10); +}, 'can be piped to with a string'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'foo_arraybuf.txt', root); + const wfs = await handle.createWritable(); + const buf = new ArrayBuffer(3); + const intView = new Uint8Array(buf); + intView[0] = 0x66; + intView[1] = 0x6f; + intView[2] = 0x6f; + + const rs = recordingReadableStream({ + start(controller) { + controller.enqueue(buf); + controller.close(); + } + }); + + await rs.pipeTo(wfs, { preventCancel: true }); + assert_equals(await getFileContents(handle), 'foo'); + assert_equals(await getFileSize(handle), 3); +}, 'can be piped to with an ArrayBuffer'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'foo_blob.txt', root); + const wfs = await handle.createWritable(); + + const rs = recordingReadableStream({ + start(controller) { + controller.enqueue(new Blob(['foo'])); + controller.close(); + } + }); + + await rs.pipeTo(wfs, { preventCancel: true }); + assert_equals(await getFileContents(handle), 'foo'); + assert_equals(await getFileSize(handle), 3); +}, 'can be piped to with a Blob'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'foo_write_param.txt', root); + const wfs = await handle.createWritable(); + + const rs = recordingReadableStream({ + start(controller) { + controller.enqueue({type: 'write', data: 'foobar'}); + controller.close(); + } + }); + + await rs.pipeTo(wfs, { preventCancel: true }); + assert_equals(await getFileContents(handle), 'foobar'); + assert_equals(await getFileSize(handle), 6); +}, 'can be piped to with a param object with write command'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'foo_write_param.txt', root); + const wfs = await handle.createWritable(); + + const rs = recordingReadableStream({ + start(controller) { + controller.enqueue({type: 'write', data: 'foobar'}); + controller.enqueue({type: 'truncate', size: 10}); + controller.enqueue({type: 'write', position: 0, data: 'baz'}); + controller.close(); + } + }); + + await rs.pipeTo(wfs, { preventCancel: true }); + assert_equals(await getFileContents(handle), 'bazbar\0\0\0\0'); + assert_equals(await getFileSize(handle), 10); +}, 'can be piped to with a param object with multiple commands'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'foo_write_queued.txt', root); + const wfs = await handle.createWritable(); + + const rs = recordingReadableStream({ + start(controller) { + controller.enqueue('foo'); + controller.enqueue('bar'); + controller.enqueue('baz'); + controller.close(); + } + }); + + await rs.pipeTo(wfs, { preventCancel: true }); + assert_equals(await getFileContents(handle), 'foobarbaz'); + assert_equals(await getFileSize(handle), 9); +}, 'multiple operations can be queued'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'fetched.txt', root); + const wfs = await handle.createWritable(); + + const response = await fetch('data:text/plain,fetched from far'); + const body = await response.body; + await body.pipeTo(wfs, { preventCancel: true }); + assert_equals(await getFileContents(handle), 'fetched from far'); + assert_equals(await getFileSize(handle), 16); +}, 'plays well with fetch'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'aborted should_be_empty.txt', root); + const wfs = await handle.createWritable(); + + const response = await fetch('data:text/plain,fetched from far'); + const body = await response.body; + + const abortController = new AbortController(); + const signal = abortController.signal; + + const promise = body.pipeTo(wfs, { signal }); + await abortController.abort(); + + await promise_rejects(t, 'AbortError', promise, 'stream is aborted'); + await promise_rejects(t, TypeError(), wfs.close(), 'stream cannot be closed to flush writes'); + + assert_equals(await getFileContents(handle), ''); + assert_equals(await getFileSize(handle), 0); +}, 'abort() aborts write'); diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js new file mode 100644 index 00000000000..f14d79fd040 --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js @@ -0,0 +1,337 @@ +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'empty_blob', root); + const stream = await handle.createWritable(); + + await stream.write(new Blob([])); + await stream.close(); + + assert_equals(await getFileContents(handle), ''); + assert_equals(await getFileSize(handle), 0); +}, 'write() with an empty blob to an empty file'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'valid_blob', root); + const stream = await handle.createWritable(); + + await stream.write(new Blob(['1234567890'])); + await stream.close(); + + assert_equals(await getFileContents(handle), '1234567890'); + assert_equals(await getFileSize(handle), 10); +}, 'write() a blob to an empty file'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'write_param_empty', root); + const stream = await handle.createWritable(); + + await stream.write({type: 'write', data: '1234567890'}); + await stream.close(); + + assert_equals(await getFileContents(handle), '1234567890'); + assert_equals(await getFileSize(handle), 10); +}, 'write() with WriteParams without position to an empty file'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'string_zero_offset', root); + const stream = await handle.createWritable(); + + await stream.write({type: 'write', position: 0, data: '1234567890'}); + await stream.close(); + + assert_equals(await getFileContents(handle), '1234567890'); + assert_equals(await getFileSize(handle), 10); +}, 'write() a string to an empty file with zero offset'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'blob_zero_offset', root); + const stream = await handle.createWritable(); + + await stream.write({type: 'write', position: 0, data: new Blob(['1234567890'])}); + await stream.close(); + + assert_equals(await getFileContents(handle), '1234567890'); + assert_equals(await getFileSize(handle), 10); +}, 'write() a blob to an empty file with zero offset'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'write_appends', root); + const stream = await handle.createWritable(); + + await stream.write('12345'); + await stream.write('67890'); + await stream.close(); + + assert_equals(await getFileContents(handle), '1234567890'); + assert_equals(await getFileSize(handle), 10); +}, 'write() called consecutively appends'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'write_appends_object_string', root); + const stream = await handle.createWritable(); + + await stream.write('12345'); + await stream.write({type: 'write', data: '67890'}); + await stream.close(); + + assert_equals(await getFileContents(handle), '1234567890'); + assert_equals(await getFileSize(handle), 10); +}, 'write() WriteParams without position and string appends'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'write_appends_object_blob', root); + const stream = await handle.createWritable(); + + await stream.write('12345'); + await stream.write({type: 'write', data: new Blob(['67890'])}); + await stream.close(); + + assert_equals(await getFileContents(handle), '1234567890'); + assert_equals(await getFileSize(handle), 10); +}, 'write() WriteParams without position and blob appends'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'string_with_offset', root); + const stream = await handle.createWritable(); + + await stream.write('1234567890'); + await stream.write({type: 'write', position: 4, data: 'abc'}); + await stream.close(); + + assert_equals(await getFileContents(handle), '1234abc890'); + assert_equals(await getFileSize(handle), 10); +}, 'write() called with a string and a valid offset'); + +directory_test(async (t, root) => { +const handle = await createEmptyFile(t, 'blob_with_offset', root); +const stream = await handle.createWritable(); + +await stream.write('1234567890'); +await stream.write({type: 'write', position: 4, data: new Blob(['abc'])}); +await stream.close(); + +assert_equals(await getFileContents(handle), '1234abc890'); +assert_equals(await getFileSize(handle), 10); +}, 'write() called with a blob and a valid offset'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'bad_offset', root); + const stream = await handle.createWritable(); + + await promise_rejects( + t, 'InvalidStateError', stream.write({type: 'write', position: 4, data: new Blob(['abc'])})); + await promise_rejects( + t, TypeError(), stream.close(), 'stream is already closed'); + + assert_equals(await getFileContents(handle), ''); + assert_equals(await getFileSize(handle), 0); +}, 'write() called with an invalid offset'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'empty_string', root); + const stream = await handle.createWritable(); + + await stream.write(''); + await stream.close(); + assert_equals(await getFileContents(handle), ''); + assert_equals(await getFileSize(handle), 0); +}, 'write() with an empty string to an empty file'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'valid_utf8_string', root); + const stream = await handle.createWritable(); + + await stream.write('foo🤘'); + await stream.close(); + assert_equals(await getFileContents(handle), 'foo🤘'); + assert_equals(await getFileSize(handle), 7); +}, 'write() with a valid utf-8 string'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'string_with_unix_line_ending', root); + const stream = await handle.createWritable(); + + await stream.write('foo\n'); + await stream.close(); + assert_equals(await getFileContents(handle), 'foo\n'); + assert_equals(await getFileSize(handle), 4); +}, 'write() with a string with unix line ending preserved'); + +directory_test(async (t, root) => { + const handle = + await createEmptyFile(t, 'string_with_windows_line_ending', root); + const stream = await handle.createWritable(); + + await stream.write('foo\r\n'); + await stream.close(); + assert_equals(await getFileContents(handle), 'foo\r\n'); + assert_equals(await getFileSize(handle), 5); +}, 'write() with a string with windows line ending preserved'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'empty_array_buffer', root); + const stream = await handle.createWritable(); + + const buf = new ArrayBuffer(0); + await stream.write(buf); + await stream.close(); + assert_equals(await getFileContents(handle), ''); + assert_equals(await getFileSize(handle), 0); +}, 'write() with an empty array buffer to an empty file'); + +directory_test(async (t, root) => { + const handle = + await createEmptyFile(t, 'valid_string_typed_byte_array', root); + const stream = await handle.createWritable(); + + const buf = new ArrayBuffer(3); + const intView = new Uint8Array(buf); + intView[0] = 0x66; + intView[1] = 0x6f; + intView[2] = 0x6f; + await stream.write(buf); + await stream.close(); + assert_equals(await getFileContents(handle), 'foo'); + assert_equals(await getFileSize(handle), 3); +}, 'write() with a valid typed array buffer'); + +directory_test(async (t, root) => { + const dir = await createDirectory(t, 'parent_dir', root); + const file_name = 'close_fails_when_dir_removed.txt'; + const handle = await createEmptyFile(t, file_name, dir); + const stream = await handle.createWritable(); + await stream.write('foo'); + + await root.removeEntry('parent_dir', {recursive: true}); + await promise_rejects(t, 'NotFoundError', stream.close()); +}, 'atomic writes: close() fails when parent directory is removed'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'atomic_writes.txt', root); + const stream = await handle.createWritable(); + await stream.write('foox'); + + const stream2 = await handle.createWritable(); + await stream2.write('bar'); + + assert_equals(await getFileSize(handle), 0); + + await stream2.close(); + assert_equals(await getFileContents(handle), 'bar'); + assert_equals(await getFileSize(handle), 3); + + await stream.close(); + assert_equals(await getFileContents(handle), 'foox'); + assert_equals(await getFileSize(handle), 4); +}, 'atomic writes: writable file streams make atomic changes on close'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'atomic_write_after_close.txt', root); + const stream = await handle.createWritable(); + await stream.write('foo'); + + await stream.close(); + assert_equals(await getFileContents(handle), 'foo'); + assert_equals(await getFileSize(handle), 3); + + await promise_rejects( + t, TypeError(), stream.write('abc')); +}, 'atomic writes: write() after close() fails'); + +directory_test(async (t, root) => { + const handle = + await createEmptyFile(t, 'atomic_truncate_after_close.txt', root); + const stream = await handle.createWritable(); + await stream.write('foo'); + + await stream.close(); + assert_equals(await getFileContents(handle), 'foo'); + assert_equals(await getFileSize(handle), 3); + + await promise_rejects(t, TypeError(), stream.truncate(0)); +}, 'atomic writes: truncate() after close() fails'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'atomic_close_after_close.txt', root); + const stream = await handle.createWritable(); + await stream.write('foo'); + + await stream.close(); + assert_equals(await getFileContents(handle), 'foo'); + assert_equals(await getFileSize(handle), 3); + + await promise_rejects(t, TypeError(), stream.close()); +}, 'atomic writes: close() after close() fails'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'there_can_be_only_one.txt', root); + const stream = await handle.createWritable(); + await stream.write('foo'); + + // This test might be flaky if there is a race condition allowing + // close() to be called multiple times. + const success_promises = + [...Array(100)].map(() => stream.close().then(() => 1).catch(() => 0)); + const close_attempts = await Promise.all(success_promises); + const success_count = close_attempts.reduce((x, y) => x + y); + assert_equals(success_count, 1); +}, 'atomic writes: only one close() operation may succeed'); + +directory_test(async (t, root) => { + const dir = await createDirectory(t, 'parent_dir', root); + const file_name = 'atomic_writable_file_stream_persists_removed.txt'; + const handle = await createFileWithContents(t, file_name, 'foo', dir); + + const stream = await handle.createWritable(); + await stream.write('bar'); + + await dir.removeEntry(file_name); + await promise_rejects(t, 'NotFoundError', getFileContents(handle)); + + await stream.close(); + assert_equals(await getFileContents(handle), 'bar'); + assert_equals(await getFileSize(handle), 3); +}, 'atomic writes: writable file stream persists file on close, even if file is removed'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'writer_written', root); + const stream = await handle.createWritable(); + const writer = stream.getWriter(); + + await writer.write('foo'); + await writer.write(new Blob(['bar'])); + await writer.write({type: 'seek', position: 0}); + await writer.write({type: 'write', data: 'baz'}); + await writer.close(); + + assert_equals(await getFileContents(handle), 'bazbar'); + assert_equals(await getFileSize(handle), 6); +}, 'getWriter() can be used'); + +directory_test(async (t, root) => { + const handle = await createFileWithContents( + t, 'content.txt', 'very long string', root); + const stream = await handle.createWritable(); + + await promise_rejects( + t, SyntaxError(), stream.write({type: 'truncate'}), 'truncate without size'); + +}, 'WriteParams: truncate missing size param'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'content.txt', root); + const stream = await handle.createWritable(); + + await promise_rejects( + t, SyntaxError(), stream.write({type: 'write'}), 'write without data'); + +}, 'WriteParams: write missing data param'); + +directory_test(async (t, root) => { + const handle = await createFileWithContents( + t, 'content.txt', 'seekable', root); + const stream = await handle.createWritable(); + + await promise_rejects( + t, SyntaxError(), stream.write({type: 'seek'}), 'seek without position'); + +}, 'WriteParams: seek missing position param'); diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js new file mode 100644 index 00000000000..5acf93aec8c --- /dev/null +++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js @@ -0,0 +1,117 @@ +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'trunc_shrink', root); + const stream = await handle.createWritable(); + + await stream.write('1234567890'); + await stream.truncate(5); + await stream.close(); + + assert_equals(await getFileContents(handle), '12345'); + assert_equals(await getFileSize(handle), 5); +}, 'truncate() to shrink a file'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'trunc_grow', root); + const stream = await handle.createWritable(); + + await stream.write('abc'); + await stream.truncate(5); + await stream.close(); + + assert_equals(await getFileContents(handle), 'abc\0\0'); + assert_equals(await getFileSize(handle), 5); +}, 'truncate() to grow a file'); + +directory_test(async (t, root) => { + const dir = await createDirectory(t, 'parent_dir', root); + const file_name = 'create_writable_fails_when_dir_removed.txt'; + const handle = await createEmptyFile(t, file_name, dir); + + await root.removeEntry('parent_dir', {recursive: true}); + await promise_rejects(t, 'NotFoundError', handle.createWritable()); +}, 'createWritable() fails when parent directory is removed'); + +directory_test(async (t, root) => { + const dir = await createDirectory(t, 'parent_dir', root); + const file_name = 'write_fails_when_dir_removed.txt'; + const handle = await createEmptyFile(t, file_name, dir); + const stream = await handle.createWritable(); + + await root.removeEntry('parent_dir', {recursive: true}); + await promise_rejects(t, 'NotFoundError', stream.write('foo')); +}, 'write() fails when parent directory is removed'); + +directory_test(async (t, root) => { + const dir = await createDirectory(t, 'parent_dir', root); + const file_name = 'truncate_fails_when_dir_removed.txt'; + const handle = await createEmptyFile(t, file_name, dir); + const stream = await handle.createWritable(); + + await root.removeEntry('parent_dir', {recursive: true}); + await promise_rejects(t, 'NotFoundError', stream.truncate(0)); +}, 'truncate() fails when parent directory is removed'); + +directory_test(async (t, root) => { + const handle = await createFileWithContents( + t, 'atomic_file_is_copied.txt', 'fooks', root); + const stream = await handle.createWritable({keepExistingData: true}); + + await stream.write('bar'); + await stream.close(); + assert_equals(await getFileContents(handle), 'barks'); + assert_equals(await getFileSize(handle), 5); +}, 'createWritable({keepExistingData: true}): atomic writable file stream initialized with source contents'); + +directory_test(async (t, root) => { + const handle = await createFileWithContents( + t, 'atomic_file_is_not_copied.txt', 'very long string', root); + const stream = await handle.createWritable({keepExistingData: false}); + + await stream.write('bar'); + assert_equals(await getFileContents(handle), 'very long string'); + await stream.close(); + assert_equals(await getFileContents(handle), 'bar'); + assert_equals(await getFileSize(handle), 3); +}, 'createWritable({keepExistingData: false}): atomic writable file stream initialized with empty file'); + +directory_test(async (t, root) => { + const handle = await createFileWithContents( + t, 'trunc_smaller_offset.txt', '1234567890', root); + const stream = await handle.createWritable({keepExistingData: true}); + + await stream.truncate(5); + await stream.write('abc'); + await stream.close(); + + assert_equals(await getFileContents(handle), 'abc45'); + assert_equals(await getFileSize(handle), 5); +}, 'cursor position: truncate size > offset'); + +directory_test(async (t, root) => { + const handle = await createFileWithContents( + t, 'trunc_bigger_offset.txt', '1234567890', root); + const stream = await handle.createWritable({keepExistingData: true}); + + await stream.seek(6); + await stream.truncate(5); + await stream.write('abc'); + await stream.close(); + + assert_equals(await getFileContents(handle), '12345abc'); + assert_equals(await getFileSize(handle), 8); +}, 'cursor position: truncate size < offset'); + +directory_test(async (t, root) => { + const handle = await createEmptyFile(t, 'contents', root); + const stream = await handle.createWritable(); + + stream.write('abc'); + stream.write('def'); + stream.truncate(9); + stream.seek(0); + stream.write('xyz'); + await stream.close(); + + assert_equals(await getFileContents(handle), 'xyzdef\0\0\0'); + assert_equals(await getFileSize(handle), 9); +}, 'commands are queued'); diff --git a/tests/wpt/web-platform-tests/portals/predecessor-fires-unload.html b/tests/wpt/web-platform-tests/portals/predecessor-fires-unload.html new file mode 100644 index 00000000000..6512195eaf6 --- /dev/null +++ b/tests/wpt/web-platform-tests/portals/predecessor-fires-unload.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/open-blank-host.js"></script> +<script> +function nextEvent(target, type) { + return new Promise((resolve, reject) => target.addEventListener(type, e => resolve(e), {once: true})); +} + +function timePasses(delay) { + return new Promise((resolve, reject) => step_timeout(() => resolve(), delay)); +} + +promise_test(async () => { + const w = await openBlankPortalHost(); + try { + const portal = w.document.createElement('portal'); + portal.src = new URL('resources/simple-portal.html', location.href); + w.document.body.appendChild(portal); + const pagehideFired = nextEvent(w, 'pagehide'); + const unloadFired = nextEvent(w, 'unload'); + await portal.activate(); + assert_true((await pagehideFired) instanceof w.PageTransitionEvent); + assert_true((await unloadFired) instanceof w.Event); + } finally { + w.close(); + } +}, "pagehide and unload should fire if the predecessor is not adopted"); + +promise_test(async () => { + localStorage.setItem('predecessor-fires-unload-events', ''); + window.open('resources/predecessor-fires-unload-watch-unload.html', '_blank', 'noopener'); + while (localStorage.getItem('predecessor-fires-unload-events') != 'pagehide unload') { + await timePasses(50); + } +}, "pagehide and unload should fire if the predecessor is not adopted, even without a window/opener association"); +</script> diff --git a/tests/wpt/web-platform-tests/portals/resources/predecessor-fires-unload-watch-unload.html b/tests/wpt/web-platform-tests/portals/resources/predecessor-fires-unload-watch-unload.html new file mode 100644 index 00000000000..ada5a64967e --- /dev/null +++ b/tests/wpt/web-platform-tests/portals/resources/predecessor-fires-unload-watch-unload.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<body> +<script> +function nextEvent(target, type) { + return new Promise((resolve, reject) => target.addEventListener(type, e => resolve(e), {once: true})); +} + +onload = function() { + const portal = document.createElement('portal'); + portal.src = new URL('simple-portal.html', location.href); + document.body.appendChild(portal); + + let firedEvents = []; + for (let type of ['pagehide', 'unload']) { + nextEvent(window, type).then(() => { + firedEvents.push(type); + localStorage.setItem('predecessor-fires-unload-events', firedEvents.join(' ')); + }); + } + + portal.activate(); +} +</script> +</body> diff --git a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js index 7eee8ce04c4..2c1724b7592 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js +++ b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js @@ -24,6 +24,14 @@ function toMojoNDEFMessage(message) { function toMojoNDEFRecord(record) { let nfcRecord = new device.mojom.NDEFRecord(); + if (record.recordType.search(':') != -1) { + // Simply checks the existence of ':' to decide whether it's an external + // type. As a mock, no need to really implement the validation algo at + // https://w3c.github.io/web-nfc/#dfn-validate-external-type. + nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kExternal; + } else { + nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kStandardized; + } nfcRecord.recordType = record.recordType; nfcRecord.mediaType = record.mediaType; nfcRecord.id = record.id; @@ -162,6 +170,7 @@ var WebNFCTest = (() => { this.reading_messages_ = []; this.operations_suspended_ = false; this.is_formatted_tag_ = false; + this.data_transfer_failed_ = false; } // NFC delegate functions. @@ -184,6 +193,9 @@ var WebNFCTest = (() => { // Resolves with NotAllowedError if there are NDEF records on the device // and overwrite is false. resolve(createNDEFError(device.mojom.NDEFErrorType.NOT_ALLOWED)); + } else if (this.data_transfer_failed_) { + // Resolves with NetworkError if data transfer fails. + resolve(createNDEFError(device.mojom.NDEFErrorType.IO_ERROR)); } else { resolve(createNDEFError(null)); } @@ -282,6 +294,7 @@ var WebNFCTest = (() => { this.operations_suspended_ = false; this.cancelPendingPushOperation(); this.is_formatted_tag_ = false; + this.data_transfer_failed_ = false; } cancelPendingPushOperation() { @@ -357,6 +370,10 @@ var WebNFCTest = (() => { setIsFormattedTag(isFormatted) { this.is_formatted_tag_ = isFormatted; } + + simulateDataTransferFails() { + this.data_transfer_failed_ = true; + } } let testInternal = { diff --git a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js index a819a3b425b..b45ff20dbc4 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js +++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js @@ -228,7 +228,7 @@ class MockRuntime { this.framesOfReference = {}; - this.input_sources_ = []; + this.input_sources_ = new Map(); this.next_input_source_index_ = 1; let supportedModes = []; @@ -421,7 +421,7 @@ class MockRuntime { this.next_input_source_index_++; let source = new MockXRInputSource(fakeInputSourceInit, index, this); - this.input_sources_.push(source); + this.input_sources_.set(index, source); return source; } @@ -540,17 +540,13 @@ class MockRuntime { // These methods are intended to be used by MockXRInputSource only. addInputSource(source) { - let index = this.input_sources_.indexOf(source); - if (index == -1) { - this.input_sources_.push(source); + if(!this.input_sources_.has(source.source_id_)) { + this.input_sources_.set(source.source_id_, source); } } removeInputSource(source) { - let index = this.input_sources_.indexOf(source); - if (index >= 0) { - this.input_sources_.splice(index, 1); - } + this.input_sources_.delete(source.source_id_); } // Mojo function implementations. @@ -561,7 +557,6 @@ class MockRuntime { this.send_mojo_space_reset_ = false; if (this.pose_) { this.pose_.poseIndex++; - } // Setting the input_state to null tests a slightly different path than @@ -569,10 +564,10 @@ class MockRuntime { // code always sends up an empty array, but it's also valid mojom to send // up a null array. let input_state = null; - if (this.input_sources_.length > 0) { + if (this.input_sources_.size > 0) { input_state = []; - for (let i = 0; i < this.input_sources_.length; i++) { - input_state.push(this.input_sources_[i].getInputSourceState()); + for (let input_source of this.input_sources_.values()) { + input_state.push(input_source.getInputSourceState()); } } @@ -739,12 +734,14 @@ class MockXRInputSource { } setGripOrigin(transform, emulatedPosition = false) { + // grip_origin was renamed to mojo_from_input in mojo this.mojo_from_input_ = new gfx.mojom.Transform(); this.mojo_from_input_.matrix = getMatrixFromTransform(transform); this.emulated_position_ = emulatedPosition; } clearGripOrigin() { + // grip_origin was renamed to mojo_from_input in mojo if (this.mojo_from_input_ != null) { this.mojo_from_input_ = null; this.emulated_position_ = false; @@ -752,6 +749,7 @@ class MockXRInputSource { } setPointerOrigin(transform, emulatedPosition = false) { + // pointer_origin was renamed to input_from_pointer in mojo this.desc_dirty_ = true; this.input_from_pointer_ = new gfx.mojom.Transform(); this.input_from_pointer_.matrix = getMatrixFromTransform(transform); diff --git a/tests/wpt/web-platform-tests/tools/requirements_mypy.txt b/tests/wpt/web-platform-tests/tools/requirements_mypy.txt index 50afed2bb2d..f3a56a6dd71 100644 --- a/tests/wpt/web-platform-tests/tools/requirements_mypy.txt +++ b/tests/wpt/web-platform-tests/tools/requirements_mypy.txt @@ -1,3 +1,3 @@ -mypy==0.760 +mypy==0.761 mypy-extensions==0.4.3 typed-ast==1.4.0 diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py index 65534458197..fef052dd5ab 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py @@ -3,6 +3,7 @@ import platform import socket from abc import ABCMeta, abstractmethod from copy import deepcopy +from six import iteritems from ..wptcommandline import require_arg # noqa: F401 @@ -199,5 +200,5 @@ class ExecutorBrowser(object): up the browser from the runner process. """ def __init__(self, **kwargs): - for k, v in kwargs.iteritems(): + for k, v in iteritems(kwargs): setattr(self, k, v) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py index 8a0e5f578b2..f6c4c602a38 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py @@ -2,7 +2,8 @@ from .base import get_timeout_multiplier, maybe_add_args, certificate_domain_lis from .webkit import WebKitBrowser from ..executors import executor_kwargs as base_executor_kwargs from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 - WebDriverRefTestExecutor) # noqa: F401 + WebDriverRefTestExecutor, # noqa: F401 + WebDriverCrashtestExecutor) # noqa: F401 from ..executors.executorwebkit import WebKitDriverWdspecExecutor # noqa: F401 __wptrunner__ = {"product": "epiphany", @@ -11,7 +12,8 @@ __wptrunner__ = {"product": "epiphany", "browser_kwargs": "browser_kwargs", "executor": {"testharness": "WebDriverTestharnessExecutor", "reftest": "WebDriverRefTestExecutor", - "wdspec": "WebKitDriverWdspecExecutor"}, + "wdspec": "WebKitDriverWdspecExecutor", + "crashtest": "WebDriverCrashtestExecutor"}, "executor_kwargs": "executor_kwargs", "env_extras": "env_extras", "env_options": "env_options", diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py index 0f807533781..b6ee0f4998e 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py @@ -168,17 +168,13 @@ def run_info_extras(**kwargs): "wasm": kwargs.get("wasm", True), "verify": kwargs["verify"], "headless": kwargs.get("headless", False) or "MOZ_HEADLESS" in os.environ, + "sw-e10s": True, "fission": get_bool_pref("fission.autostart")} # The value of `sw-e10s` defaults to whether the "parent_intercept" # implementation is enabled for the current build. This value, however, # can be overridden by explicitly setting the pref with the `--setpref` CLI - # flag, which is checked here. If not supplied, the default value of - # `sw-e10s` will be filled in in `RunInfo`'s constructor. - # - # We can't capture the default value right now because (currently), it - # defaults to the value of `nightly_build`, which isn't known until - # `RunInfo`'s constructor. + # flag, which is checked here. sw_e10s_override = get_bool_pref_if_exists("dom.serviceWorkers.parent_intercept") if sw_e10s_override is not None: rv["sw-e10s"] = sw_e10s_override diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py index 33b5d51e54e..fee528071f6 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py @@ -8,7 +8,8 @@ from .base import (get_free_port, cmd_arg, browser_command) from ..executors.executormarionette import (MarionetteTestharnessExecutor, # noqa: F401 - MarionetteRefTestExecutor) # noqa: F401 + MarionetteRefTestExecutor, # noqa: F401 + MarionetteCrashtestExecutor) # noqa: F401 from .firefox import (get_timeout_multiplier, # noqa: F401 run_info_extras as fx_run_info_extras, update_properties, # noqa: F401 @@ -20,7 +21,8 @@ __wptrunner__ = {"product": "firefox_android", "check_args": "check_args", "browser": "FirefoxAndroidBrowser", "executor": {"testharness": "MarionetteTestharnessExecutor", - "reftest": "MarionetteRefTestExecutor"}, + "reftest": "MarionetteRefTestExecutor", + "crashtest": "MarionetteCrashtestExecutor"}, "browser_kwargs": "browser_kwargs", "executor_kwargs": "executor_kwargs", "env_extras": "env_extras", diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py index aa286213945..1be683ed26e 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py @@ -2,7 +2,8 @@ from .base import Browser, ExecutorBrowser, require_arg from .base import get_timeout_multiplier, certificate_domain_list # noqa: F401 from ..executors import executor_kwargs as base_executor_kwargs from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 - WebDriverRefTestExecutor) # noqa: F401 + WebDriverRefTestExecutor, # noqa: F401 + WebDriverCrashtestExecutor) # noqa: F401 from ..executors.executorwebkit import WebKitDriverWdspecExecutor # noqa: F401 from ..webdriver_server import WebKitDriverServer @@ -13,7 +14,8 @@ __wptrunner__ = {"product": "webkit", "browser_kwargs": "browser_kwargs", "executor": {"testharness": "WebDriverTestharnessExecutor", "reftest": "WebDriverRefTestExecutor", - "wdspec": "WebKitDriverWdspecExecutor"}, + "wdspec": "WebKitDriverWdspecExecutor", + "crashtest": "WebDriverCrashtestExecutor"}, "executor_kwargs": "executor_kwargs", "env_extras": "env_extras", "env_options": "env_options", diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py index d735f3c0792..d8b9744bd74 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py @@ -2,7 +2,8 @@ from .base import get_timeout_multiplier, maybe_add_args, certificate_domain_lis from .webkit import WebKitBrowser from ..executors import executor_kwargs as base_executor_kwargs from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 - WebDriverRefTestExecutor) # noqa: F401 + WebDriverRefTestExecutor, # noqa: F401 + WebDriverCrashtestExecutor) # noqa: F401 from ..executors.executorwebkit import WebKitDriverWdspecExecutor # noqa: F401 __wptrunner__ = {"product": "webkitgtk_minibrowser", @@ -11,7 +12,8 @@ __wptrunner__ = {"product": "webkitgtk_minibrowser", "browser_kwargs": "browser_kwargs", "executor": {"testharness": "WebDriverTestharnessExecutor", "reftest": "WebDriverRefTestExecutor", - "wdspec": "WebKitDriverWdspecExecutor"}, + "wdspec": "WebKitDriverWdspecExecutor", + "crashtest": "WebDriverCrashtestExecutor"}, "executor_kwargs": "executor_kwargs", "env_extras": "env_extras", "env_options": "env_options", diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py index e79ae375064..7dcea4aeafa 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py @@ -5,6 +5,7 @@ import signal import socket import sys import time +from six import iteritems from mozlog import get_default_logger, handlers, proxy @@ -98,7 +99,7 @@ class TestEnvironment(object): def __exit__(self, exc_type, exc_val, exc_tb): self.process_interrupts() - for scheme, servers in self.servers.iteritems(): + for scheme, servers in iteritems(self.servers): for port, server in servers: server.kill() for cm in self.env_extras_cms: @@ -194,7 +195,7 @@ class TestEnvironment(object): route_builder.add_handler(b"GET", b"/resources/testdriver.js", StringHandler(data, "text/javascript")) - for url_base, paths in self.test_paths.iteritems(): + for url_base, paths in iteritems(self.test_paths): if url_base == "/": continue route_builder.add_mount_point(url_base, paths["tests_path"]) @@ -220,7 +221,7 @@ class TestEnvironment(object): def test_servers(self): failed = [] host = self.config["server_host"] - for scheme, servers in self.servers.iteritems(): + for scheme, servers in iteritems(self.servers): for port, server in servers: if self.test_server_port: s = socket.socket() diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py index 59f7e865a5b..01306397db7 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -991,15 +991,16 @@ class MarionetteCrashtestExecutor(CrashtestExecutor): if not success: status = data[0] + extra = None if self.debug and (success or status not in ("CRASH", "INTERNAL-ERROR")): assertion_count = self.protocol.asserts.get() if assertion_count is not None: - data["extra"] = {"assertion_count": assertion_count} + extra = {"assertion_count": assertion_count} if success: return self.convert_result(test, data) - return (test.result_cls(**data), []) + return (test.result_cls(extra=extra, *data), []) def do_crashtest(self, protocol, url, timeout): if self.protocol.coverage.is_enabled: diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py index 9cef1fb2d7f..9eebfa59feb 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py @@ -7,6 +7,7 @@ import tempfile import threading import traceback import uuid +from six import iteritems from mozprocess import ProcessHandler @@ -45,7 +46,7 @@ def build_servo_command(test, test_url_func, browser, binary, pause_after_test, args += ["-Z", debug_opts] for stylesheet in browser.user_stylesheets: args += ["--user-stylesheet", stylesheet] - for pref, value in test.environment.get('prefs', {}).iteritems(): + for pref, value in iteritems(test.environment.get('prefs', {})): args += ["--pref", "%s=%s" % (pref, value)] if browser.ca_certificate_path: args += ["--certificate-path", browser.ca_certificate_path] diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js index 8a7edb79d62..ad08ad7d76f 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js @@ -32,7 +32,8 @@ function wait_paints() { } function screenshot_if_ready() { - if (root.classList.contains("%(classname)s") && + if (root && + root.classList.contains("%(classname)s") && observer === null) { observer = new MutationObserver(wait_paints); observer.observe(root, {attributes: true}); diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py index 4d505086bd8..7521f25b134 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py @@ -1,5 +1,6 @@ from math import log from collections import defaultdict +from six import iteritems, itervalues class Node(object): def __init__(self, prop, value): @@ -33,7 +34,7 @@ def entropy(results): result_counts = defaultdict(int) total = float(len(results)) - for values in results.itervalues(): + for values in itervalues(results): # Not sure this is right, possibly want to treat multiple values as # distinct from multiple of the same value? for value in values: @@ -41,7 +42,7 @@ def entropy(results): entropy_sum = 0 - for count in result_counts.itervalues(): + for count in itervalues(result_counts): prop = float(count) / total entropy_sum -= prop * log(prop, 2) @@ -52,7 +53,7 @@ def split_results(prop, results): """Split a dictionary of results into a dictionary of dictionaries where each sub-dictionary has a specific value of the given property""" by_prop = defaultdict(dict) - for run_info, value in results.iteritems(): + for run_info, value in iteritems(results): by_prop[run_info[prop]][run_info] = value return by_prop @@ -77,13 +78,13 @@ def build_tree(properties, dependent_props, results, tree=None): prop_index = {prop: i for i, prop in enumerate(properties)} all_results = defaultdict(int) - for result_values in results.itervalues(): - for result_value, count in result_values.iteritems(): + for result_values in itervalues(results): + for result_value, count in iteritems(result_values): all_results[result_value] += count # If there is only one result we are done if not properties or len(all_results) == 1: - for value, count in all_results.iteritems(): + for value, count in iteritems(all_results): tree.result_values[value] += count tree.run_info |= set(results.keys()) return tree @@ -99,7 +100,7 @@ def build_tree(properties, dependent_props, results, tree=None): continue new_entropy = 0. results_sets_entropy = [] - for prop_value, result_set in result_sets.iteritems(): + for prop_value, result_set in iteritems(result_sets): results_sets_entropy.append((entropy(result_set), prop_value, result_set)) new_entropy += (float(len(result_set)) / len(results)) * results_sets_entropy[-1][0] @@ -109,7 +110,7 @@ def build_tree(properties, dependent_props, results, tree=None): # In the case that no properties partition the space if not results_partitions: - for value, count in all_results.iteritems(): + for value, count in iteritems(all_results): tree.result_values[value] += count tree.run_info |= set(results.keys()) return tree diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py index 6647a8580be..daf0a1c1bfa 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py @@ -1,5 +1,4 @@ import ctypes -import logging import os import platform import plistlib @@ -12,7 +11,8 @@ SYSTEM = platform.system().lower() class FontInstaller(object): - def __init__(self, font_dir=None, **fonts): + def __init__(self, logger, font_dir=None, **fonts): + self.logger = logger self.font_dir = font_dir self.installed_fonts = False self.created_dir = False @@ -26,14 +26,13 @@ class FontInstaller(object): font_name = font_path.split('/')[-1] install = getattr(self, 'install_%s_font' % SYSTEM, None) if not install: - logging.warning('Font installation not supported on %s', - SYSTEM) + self.logger.warning('Font installation not supported on %s' % SYSTEM) return False if install(font_name, font_path): self.installed_fonts = True - logging.info('Installed font: %s', font_name) + self.logger.info('Installed font: %s' % font_name) else: - logging.warning('Unable to install font: %s', font_name) + self.logger.warning('Unable to install font: %s' % font_name) def __exit__(self, exc_type, exc_val, exc_tb): if not self.installed_fonts: @@ -43,12 +42,12 @@ class FontInstaller(object): font_name = font_path.split('/')[-1] remove = getattr(self, 'remove_%s_font' % SYSTEM, None) if not remove: - logging.warning('Font removal not supported on %s', SYSTEM) + self.logger.warning('Font removal not supported on %s' % SYSTEM) return False if remove(font_name, font_path): - logging.info('Removed font: %s', font_name) + self.logger.info('Removed font: %s' % font_name) else: - logging.warning('Unable to remove font: %s', font_name) + self.logger.warning('Unable to remove font: %s' % font_name) def install_linux_font(self, font_name, font_path): if not self.font_dir: @@ -62,7 +61,7 @@ class FontInstaller(object): fc_cache_returncode = call('fc-cache') return not fc_cache_returncode except OSError: # If fontconfig doesn't exist, return False - logging.error('fontconfig not available on this Linux system.') + self.logger.error('fontconfig not available on this Linux system.') return False def install_darwin_font(self, font_name, font_path): @@ -110,7 +109,7 @@ class FontInstaller(object): fc_cache_returncode = call('fc-cache') return not fc_cache_returncode except OSError: # If fontconfig doesn't exist, return False - logging.error('fontconfig not available on this Linux system.') + self.logger.error('fontconfig not available on this Linux system.') return False def remove_darwin_font(self, font_name, _): diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py index eae85b1f666..65b53f0ab97 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py @@ -1,6 +1,7 @@ import os from six.moves.urllib.parse import urljoin from collections import deque +from six import text_type from .wptmanifest.backends import static from .wptmanifest.backends.base import ManifestItem @@ -57,7 +58,7 @@ def tags(node): """Set of tags that have been applied to the test""" try: value = node.get("tags") - if isinstance(value, (str, unicode)): + if isinstance(value, text_type): return {value} return set(value) except KeyError: @@ -66,7 +67,7 @@ def tags(node): def prefs(node): def value(ini_value): - if isinstance(ini_value, (str, unicode)): + if isinstance(ini_value, text_type): return tuple(pref_piece.strip() for pref_piece in ini_value.split(':', 1)) else: # this should be things like @Reset, which are apparently type 'object' @@ -74,7 +75,7 @@ def prefs(node): try: node_prefs = node.get("prefs") - if type(node_prefs) in (str, unicode): + if isinstance(node_prefs, text_type): rv = dict(value(node_prefs)) else: rv = dict(value(item) for item in node_prefs) @@ -86,7 +87,7 @@ def prefs(node): def set_prop(name, node): try: node_items = node.get(name) - if isinstance(node_items, (str, unicode)): + if isinstance(node_items, text_type): rv = {node_items} else: rv = set(node_items) @@ -99,7 +100,7 @@ def leak_threshold(node): rv = {} try: node_items = node.get("leak-threshold") - if isinstance(node_items, (str, unicode)): + if isinstance(node_items, text_type): node_items = [node_items] for item in node_items: process, value = item.rsplit(":", 1) @@ -156,7 +157,7 @@ def fuzzy_prop(node): if not isinstance(value, list): value = [value] for item in value: - if not isinstance(item, (str, unicode)): + if not isinstance(item, text_type): rv.append(item) continue parts = item.rsplit(":", 1) @@ -478,7 +479,7 @@ def get_manifest(metadata_root, test_path, url_base, run_info): """ manifest_path = expected.expected_path(metadata_root, test_path) try: - with open(manifest_path) as f: + with open(manifest_path, "rb") as f: return static.compile(f, run_info, data_cls_getter=data_cls_getter, @@ -497,7 +498,7 @@ def get_dir_manifest(path, run_info): values should be computed. """ try: - with open(path) as f: + with open(path, "rb") as f: return static.compile(f, run_info, data_cls_getter=lambda x,y: DirectoryManifest) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py index d302831a57a..79b5b19b3a3 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py @@ -6,6 +6,7 @@ be included or excluded. """ import glob import os +from six import iteritems from six.moves.urllib.parse import urlparse, urlsplit from .wptmanifest.node import DataNode @@ -94,7 +95,7 @@ class IncludeManifest(ManifestItem): if paths: urls = [] for path in paths: - for manifest, data in test_manifests.iteritems(): + for manifest, data in iteritems(test_manifests): found = False rel_path = os.path.relpath(path, data["tests_path"]) iterator = manifest.iterpath if os.path.isfile(path) else manifest.iterdir @@ -150,5 +151,5 @@ class IncludeManifest(ManifestItem): def get_manifest(manifest_path): - with open(manifest_path) as f: + with open(manifest_path, "rb") as f: return conditional.compile(f, data_cls_getter=lambda x, y: IncludeManifest) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py index af9af18d907..3cb1b510792 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py @@ -3,7 +3,7 @@ import os from six.moves.urllib.parse import urljoin, urlsplit from collections import namedtuple, defaultdict, deque from math import ceil -from six import iterkeys, itervalues, iteritems +from six import integer_types, iterkeys, itervalues, iteritems, string_types, text_type from .wptmanifest import serialize from .wptmanifest.node import (DataNode, ConditionalNode, BinaryExpressionNode, @@ -411,7 +411,7 @@ class PropertyUpdate(object): for e in errors: if disable_intermittent: condition = e.cond.children[0] if e.cond else None - msg = disable_intermittent if isinstance(disable_intermittent, (str, unicode)) else "unstable" + msg = disable_intermittent if isinstance(disable_intermittent, string_types+(text_type,)) else "unstable" self.node.set("disabled", msg, condition) self.node.new_disabled = True else: @@ -513,7 +513,7 @@ class PropertyUpdate(object): top_level_props, dependent_props = self.node.root.run_info_properties update_properties = set(top_level_props) for item in itervalues(dependent_props): - update_properties |= set(dependent_props) + update_properties |= set(item) for condition in current_conditions: if ((not condition.variables.issubset(update_properties) and not run_info_by_condition[condition])): @@ -774,7 +774,7 @@ class AppendOnlyListUpdate(PropertyUpdate): for item in new: if item is None: continue - elif isinstance(item, (str, unicode)): + elif isinstance(item, text_type): rv.add(item) else: rv |= item @@ -897,10 +897,10 @@ def make_expr(prop_set, rhs): def make_node(value): - if type(value) in (int, float, long): + if isinstance(value, integer_types+(float,)): node = NumberNode(value) - elif type(value) in (str, unicode): - node = StringNode(unicode(value)) + elif isinstance(value, text_type): + node = StringNode(text_type(value)) elif hasattr(value, "__iter__"): node = ListNode() for item in value: @@ -909,10 +909,10 @@ def make_node(value): def make_value_node(value): - if type(value) in (int, float, long): + if isinstance(value, integer_types+(float,)): node = ValueNode(value) - elif type(value) in (str, unicode): - node = ValueNode(unicode(value)) + elif isinstance(value, text_type): + node = ValueNode(text_type(value)) elif hasattr(value, "__iter__"): node = ListNode() for item in value: diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py index c328dcefa72..aafc7d52250 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py @@ -4,6 +4,7 @@ import os from collections import defaultdict, namedtuple from mozlog import structuredlog +from six import ensure_str, ensure_text, iteritems, iterkeys, itervalues, text_type from six.moves import intern from . import manifestupdate @@ -43,11 +44,11 @@ class RunInfo(object): return self.canonical_repr == other.canonical_repr def iteritems(self): - for key, value in self.data.iteritems(): + for key, value in iteritems(self.data): yield key, value def items(self): - return list(self.iteritems()) + return list(iteritems(self)) def update_expected(test_paths, serve_root, log_file_names, @@ -238,7 +239,7 @@ def pack_result(data): def unpack_result(data): if isinstance(data, int): return (status_intern.get(data), None) - if isinstance(data, unicode): + if isinstance(data, text_type): return (data, None) # Unpack multiple statuses into a tuple to be used in the Results named tuple below, # separating `status` and `known_intermittent`. @@ -285,10 +286,10 @@ def update_results(id_test_map, disable_intermittent, update_intermittent, remove_intermittent): - test_file_items = set(id_test_map.itervalues()) + test_file_items = set(itervalues(id_test_map)) default_expected_by_type = {} - for test_type, test_cls in wpttest.manifest_test_cls.iteritems(): + for test_type, test_cls in iteritems(wpttest.manifest_test_cls): if test_cls.result_cls: default_expected_by_type[(test_type, False)] = test_cls.result_cls.default_expected if test_cls.subtest_result_cls: @@ -426,7 +427,7 @@ class ExpectedUpdater(object): action_map["lsan_leak"](item) mozleak_data = data.get("mozleak", {}) - for scope, scope_data in mozleak_data.iteritems(): + for scope, scope_data in iteritems(mozleak_data): for key, action in [("objects", "mozleak_object"), ("total", "mozleak_total")]: for item in scope_data.get(key, []): @@ -438,7 +439,7 @@ class ExpectedUpdater(object): self.run_info = run_info_intern.store(RunInfo(data["run_info"])) def test_start(self, data): - test_id = intern(data["test"].encode("utf8")) + test_id = intern(ensure_str(data["test"])) try: self.id_test_map[test_id] except KeyError: @@ -448,8 +449,8 @@ class ExpectedUpdater(object): self.tests_visited[test_id] = set() def test_status(self, data): - test_id = intern(data["test"].encode("utf8")) - subtest = intern(data["subtest"].encode("utf8")) + test_id = intern(ensure_str(data["test"])) + subtest = intern(ensure_str(data["subtest"])) test_data = self.id_test_map.get(test_id) if test_data is None: return @@ -466,7 +467,7 @@ class ExpectedUpdater(object): if data["status"] == "SKIP": return - test_id = intern(data["test"].encode("utf8")) + test_id = intern(ensure_str(data["test"])) test_data = self.id_test_map.get(test_id) if test_data is None: return @@ -479,7 +480,7 @@ class ExpectedUpdater(object): del self.tests_visited[test_id] def assertion_count(self, data): - test_id = intern(data["test"].encode("utf8")) + test_id = intern(ensure_str(data["test"])) test_data = self.id_test_map.get(test_id) if test_data is None: return @@ -490,7 +491,7 @@ class ExpectedUpdater(object): def test_for_scope(self, data): dir_path = data.get("scope", "/") - dir_id = intern(os.path.join(dir_path, "__dir__").replace(os.path.sep, "/").encode("utf8")) + dir_id = intern(ensure_str(os.path.join(dir_path, "__dir__").replace(os.path.sep, "/"))) if dir_id.startswith("/"): dir_id = dir_id[1:] return dir_id, self.id_test_map[dir_id] @@ -529,13 +530,13 @@ def create_test_tree(metadata_path, test_manifest): assert all_types > exclude_types include_types = all_types - exclude_types for item_type, test_path, tests in test_manifest.itertypes(*include_types): - test_file_data = TestFileData(intern(test_manifest.url_base.encode("utf8")), - intern(item_type.encode("utf8")), + test_file_data = TestFileData(intern(ensure_str(test_manifest.url_base)), + intern(ensure_str(item_type)), metadata_path, test_path, tests) for test in tests: - id_test_map[intern(test.id.encode("utf8"))] = test_file_data + id_test_map[intern(ensure_str(test.id))] = test_file_data dir_path = os.path.split(test_path)[0].replace(os.path.sep, "/") while True: @@ -543,9 +544,9 @@ def create_test_tree(metadata_path, test_manifest): dir_id = dir_path + "/__dir__" else: dir_id = "__dir__" - dir_id = intern((test_manifest.url_base + dir_id).lstrip("/").encode("utf8")) + dir_id = intern(ensure_str((test_manifest.url_base + dir_id).lstrip("/"))) if dir_id not in id_test_map: - test_file_data = TestFileData(intern(test_manifest.url_base.encode("utf8")), + test_file_data = TestFileData(intern(ensure_str(test_manifest.url_base)), None, metadata_path, dir_id, @@ -614,7 +615,7 @@ class TestFileData(object): self.item_type = item_type self.test_path = test_path self.metadata_path = metadata_path - self.tests = {intern(item.id.encode("utf8")) for item in tests} + self.tests = {intern(ensure_str(item.id)) for item in tests} self._requires_update = False self.data = defaultdict(lambda: defaultdict(PackedResultList)) @@ -655,11 +656,11 @@ class TestFileData(object): # Return subtest nodes present in the expected file, but missing from the data rv = [] - for test_id, subtests in self.data.iteritems(): - test = expected.get_test(test_id.decode("utf8")) + for test_id, subtests in iteritems(self.data): + test = expected.get_test(ensure_text(test_id)) if not test: continue - seen_subtests = set(item.decode("utf8") for item in subtests.iterkeys() if item is not None) + seen_subtests = set(ensure_text(item) for item in iterkeys(subtests) if item is not None) missing_subtests = set(test.subtests.keys()) - seen_subtests for item in missing_subtests: expected_subtest = test.get_subtest(item) @@ -673,6 +674,29 @@ class TestFileData(object): return rv + def filter_unknown_props(self, update_properties, subtests): + # Remove subtests which have some conditions that aren't in update_properties + # since removing these may be inappropriate + top_level_props, dependent_props = update_properties + all_properties = set(top_level_props) + for item in itervalues(dependent_props): + all_properties |= set(item) + + filtered = [] + for subtest in subtests: + include = True + for key, _ in subtest.iter_properties(): + conditions = subtest.get_conditions(key) + for condition in conditions: + if not condition.variables.issubset(all_properties): + include = False + break + if not include: + break + if include: + filtered.append(subtest) + return filtered + def update(self, default_expected_by_type, update_properties, full_update=False, disable_intermittent=None, update_intermittent=False, remove_intermittent=False): @@ -687,6 +711,7 @@ class TestFileData(object): if full_update: orphans = self.orphan_subtests(expected) + orphans = self.filter_unknown_props(update_properties, orphans) if not self.requires_update and not orphans: return @@ -704,9 +729,9 @@ class TestFileData(object): test_expected = expected.get_test(test_id) expected_by_test[test_id] = test_expected - for test_id, test_data in self.data.iteritems(): - test_id = test_id.decode("utf8") - for subtest_id, results_list in test_data.iteritems(): + for test_id, test_data in iteritems(self.data): + test_id = ensure_str(test_id) + for subtest_id, results_list in iteritems(test_data): for prop, run_info, value in results_list: # Special case directory metadata if subtest_id is None and test_id.endswith("__dir__"): @@ -722,8 +747,7 @@ class TestFileData(object): if subtest_id is None: item_expected = test_expected else: - if isinstance(subtest_id, str): - subtest_id = subtest_id.decode("utf8") + subtest_id = ensure_text(subtest_id) item_expected = test_expected.get_subtest(subtest_id) if prop == "status": diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py index e3117042709..abd84094bb3 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py @@ -1,5 +1,6 @@ import importlib import imp +from six import iteritems from .browsers import product_list @@ -44,7 +45,7 @@ class Product(object): self.get_timeout_multiplier = getattr(module, data["timeout_multiplier"]) self.executor_classes = {} - for test_type, cls_name in data["executor"].iteritems(): + for test_type, cls_name in iteritems(data["executor"]): cls = getattr(module, cls_name) self.executor_classes[test_type] = cls diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py index fa54ca36157..8fcf66d64ed 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py @@ -5,6 +5,8 @@ from abc import ABCMeta, abstractmethod from six.moves.queue import Empty from collections import defaultdict, deque from multiprocessing import Queue +from six import ensure_binary, iteritems +from six.moves import xrange from . import manifestinclude from . import manifestexpected @@ -49,7 +51,7 @@ class HashChunker(TestChunker): def __call__(self, manifest): chunk_index = self.chunk_number - 1 for test_type, test_path, tests in manifest: - h = int(hashlib.md5(test_path).hexdigest(), 16) + h = int(hashlib.md5(ensure_binary(test_path)).hexdigest(), 16) if h % self.total_chunks == chunk_index: yield test_type, test_path, tests @@ -63,7 +65,7 @@ class DirectoryHashChunker(TestChunker): def __call__(self, manifest): chunk_index = self.chunk_number - 1 for test_type, test_path, tests in manifest: - h = int(hashlib.md5(os.path.dirname(test_path)).hexdigest(), 16) + h = int(hashlib.md5(ensure_binary(os.path.dirname(test_path))).hexdigest(), 16) if h % self.total_chunks == chunk_index: yield test_type, test_path, tests @@ -124,7 +126,7 @@ class ManifestLoader(object): def load(self): rv = {} - for url_base, paths in self.test_paths.iteritems(): + for url_base, paths in iteritems(self.test_paths): manifest_file = self.load_manifest(url_base=url_base, **paths) path_data = {"url_base": url_base} @@ -236,7 +238,7 @@ class TestLoader(object): manifest_items = self.chunker(manifest_items) for test_type, test_path, tests in manifest_items: - manifest_file = manifests_by_url_base[iter(tests).next().url_base] + manifest_file = manifests_by_url_base[next(iter(tests)).url_base] metadata_path = self.manifests[manifest_file]["metadata_path"] inherit_metadata, test_metadata = self.load_metadata(manifest_file, metadata_path, test_path) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py index 2308be9590e..d71237a42da 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py @@ -1,7 +1,3 @@ -import sys - -import pytest - from .. import expectedtree, metadata from collections import defaultdict @@ -32,8 +28,6 @@ def results_object(results): return results_obj -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_build_tree_0(): # Pass if debug results = [({"os": "linux", "version": "18.04", "debug": True}, "FAIL"), @@ -53,8 +47,6 @@ def test_build_tree_0(): assert dump_tree(tree) == expected -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_build_tree_1(): # Pass if linux or windows 10 results = [({"os": "linux", "version": "18.04", "debug": True}, "PASS"), @@ -77,8 +69,6 @@ def test_build_tree_1(): assert dump_tree(tree) == expected -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_build_tree_2(): # Fails in a specific configuration results = [({"os": "linux", "version": "18.04", "debug": True}, "PASS"), @@ -104,8 +94,6 @@ def test_build_tree_2(): assert dump_tree(tree) == expected -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_build_tree_3(): results = [({"os": "linux", "version": "18.04", "debug": True, "unused": False}, "PASS"), @@ -118,8 +106,6 @@ def test_build_tree_3(): assert dump_tree(tree) == expected -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_build_tree_4(): # Check counts for multiple statuses results = [({"os": "linux", "version": "18.04", "debug": False}, "FAIL"), diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py index 525915d1832..f3e4ce796a4 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py @@ -1,4 +1,3 @@ -import sys from io import BytesIO import pytest @@ -6,8 +5,6 @@ import pytest from .. import manifestexpected -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") @pytest.mark.parametrize("fuzzy, expected", [ (b"ref.html:1;200", [("ref.html", ((1, 1), (200, 200)))]), (b"ref.html:0-1;100-200", [("ref.html", ((0, 1), (100, 200)))]), @@ -25,7 +22,7 @@ from .. import manifestexpected ((u"test.html", u"ref1.html", "=="), ((5,10), (100, 100)))]), ]) def test_fuzzy(fuzzy, expected): - data = """ + data = b""" [test.html] fuzzy: %s""" % fuzzy f = BytesIO(data) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py index e857cd43db6..836003d1060 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py @@ -20,8 +20,6 @@ skip: true @pytest.mark.xfail(sys.platform == "win32", reason="NamedTemporaryFile cannot be reopened on Win32") -@pytest.mark.xfail(sys.version[0] == "3", - reason="wptmanifest.parser doesn't support py3") def test_filter_unicode(): tests = make_mock_manifest(("test", "a", 10), ("test", "a/b", 10), ("test", "c", 10)) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py index 5f199390b64..a24e4a733da 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py @@ -66,7 +66,7 @@ def update(tests, *logs, **kwargs): updater.update_from_log(log) update_properties = (["debug", "os", "version", "processor"], - {"os": ["version"], "processor": "bits"}) + {"os": ["version"], "processor": ["bits"]}) expected_data = {} metadata.load_expected = lambda _, __, test_path, *args: expected_data.get(test_path) @@ -108,7 +108,7 @@ def create_log(entries): getattr(logger, action)(**kwargs) logger.remove_handler(handler) else: - json.dump(entries, data) + data.write(json.dumps(entries).encode()) data.seek(0) return data @@ -132,11 +132,9 @@ def create_test_manifest(tests, url_base="/"): return m -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_0(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: FAIL""")] @@ -154,11 +152,9 @@ def test_update_0(): assert updated[0][1].is_empty -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_1(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: ERROR""")] @@ -177,11 +173,9 @@ def test_update_1(): assert new_manifest.get_test(test_id).children[0].get("expected", default_run_info) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_known_intermittent_1(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: PASS""")] @@ -218,11 +212,9 @@ def test_update_known_intermittent_1(): "expected", default_run_info) == ["PASS", "FAIL"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_known_intermittent_2(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: PASS""")] @@ -243,11 +235,9 @@ def test_update_known_intermittent_2(): "expected", default_run_info) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_existing_known_intermittent(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: [PASS, FAIL]""")] @@ -286,11 +276,9 @@ def test_update_existing_known_intermittent(): "expected", default_run_info) == ["PASS", "ERROR", "FAIL"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_remove_previous_intermittent(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: [PASS, FAIL]""")] @@ -334,8 +322,6 @@ def test_update_remove_previous_intermittent(): "expected", default_run_info) == ["PASS", "ERROR"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_new_test_with_intermittent(): tests = [("path/to/test.htm", [test_id], "testharness", None)] @@ -373,8 +359,6 @@ def test_update_new_test_with_intermittent(): "expected", default_run_info) == ["PASS", "FAIL"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_expected_tie_resolution(): tests = [("path/to/test.htm", [test_id], "testharness", None)] @@ -402,11 +386,9 @@ def test_update_expected_tie_resolution(): "expected", default_run_info) == ["PASS", "FAIL"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_reorder_expected(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: [PASS, FAIL]""")] @@ -445,10 +427,8 @@ def test_update_reorder_expected(): "expected", default_run_info) == ["FAIL", "PASS"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_and_preserve_unchanged_expected_intermittent(): - tests = [("path/to/test.htm", [test_id], "testharness", """ + tests = [("path/to/test.htm", [test_id], "testharness", b""" [test.htm] expected: if os == "android": [PASS, FAIL] @@ -488,11 +468,9 @@ def test_update_and_preserve_unchanged_expected_intermittent(): "expected", default_run_info) == "PASS" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_test_with_intermittent_to_one_expected_status(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: [PASS, FAIL]""")] @@ -513,10 +491,8 @@ def test_update_test_with_intermittent_to_one_expected_status(): "expected", default_run_info) == "ERROR" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_intermittent_with_conditions(): - tests = [("path/to/test.htm", [test_id], "testharness", """ + tests = [("path/to/test.htm", [test_id], "testharness", b""" [test.htm] expected: if os == "android": [PASS, FAIL]""")] @@ -548,10 +524,8 @@ def test_update_intermittent_with_conditions(): "expected", run_info_1) == ["PASS", "TIMEOUT", "FAIL"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_and_remove_intermittent_with_conditions(): - tests = [("path/to/test.htm", [test_id], "testharness", """ + tests = [("path/to/test.htm", [test_id], "testharness", b""" [test.htm] expected: if os == "android": [PASS, FAIL]""")] @@ -583,11 +557,9 @@ def test_update_and_remove_intermittent_with_conditions(): "expected", run_info_1) == ["PASS", "TIMEOUT"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_intermittent_full(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: if os == "mac": [FAIL, TIMEOUT] @@ -623,11 +595,9 @@ def test_update_intermittent_full(): "expected", default_run_info) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_intermittent_full_remove(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: if os == "mac": [FAIL, TIMEOUT, PASS] @@ -674,11 +644,9 @@ def test_update_intermittent_full_remove(): "expected", default_run_info) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_full_update(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: if os == "mac": [FAIL, TIMEOUT] @@ -714,11 +682,9 @@ def test_full_update(): "expected", default_run_info) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_full_orphan(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: FAIL [subsub test] @@ -747,11 +713,9 @@ def test_full_orphan(): assert len(new_manifest.get_test(test_id).children) == 1 -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_reorder_expected_full_conditions(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: if os == "mac": [FAIL, TIMEOUT] @@ -808,11 +772,9 @@ def test_update_reorder_expected_full_conditions(): "expected", default_run_info) == ["PASS", "FAIL"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_skip_0(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: FAIL""")] @@ -828,10 +790,8 @@ def test_skip_0(): assert not updated -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_new_subtest(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: FAIL""")] @@ -853,10 +813,8 @@ def test_new_subtest(): assert new_manifest.get_test(test_id).children[1].get("expected", default_run_info) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_multiple_0(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: FAIL""")] @@ -892,10 +850,8 @@ def test_update_multiple_0(): "expected", {"debug": False, "os": "linux"}) == "TIMEOUT" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_multiple_1(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: FAIL""")] @@ -936,10 +892,8 @@ def test_update_multiple_1(): "expected", run_info_3) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_multiple_2(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: FAIL""")] @@ -976,10 +930,8 @@ def test_update_multiple_2(): "expected", run_info_2) == "TIMEOUT" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_multiple_3(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: if debug: FAIL @@ -1018,10 +970,8 @@ def test_update_multiple_3(): "expected", run_info_2) == "TIMEOUT" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_ignore_existing(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: if debug: TIMEOUT @@ -1060,8 +1010,6 @@ def test_update_ignore_existing(): "expected", run_info_2) == "NOTRUN" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_new_test(): tests = [("path/to/test.htm", [test_id], "testharness", None)] @@ -1084,10 +1032,8 @@ def test_update_new_test(): "expected", run_info_1) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_duplicate(): - tests = [("path/to/test.htm", [test_id], "testharness", """ + tests = [("path/to/test.htm", [test_id], "testharness", b""" [test.htm] expected: ERROR""")] @@ -1106,10 +1052,8 @@ def test_update_duplicate(): "expected", run_info_1) == "ERROR" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_disable_intermittent(): - tests = [("path/to/test.htm", [test_id], "testharness", """ + tests = [("path/to/test.htm", [test_id], "testharness", b""" [test.htm] expected: ERROR""")] @@ -1128,10 +1072,8 @@ def test_update_disable_intermittent(): "disabled", run_info_1) == "Some message" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_stability_conditional_instability(): - tests = [("path/to/test.htm", [test_id], "testharness", """ + tests = [("path/to/test.htm", [test_id], "testharness", b""" [test.htm] expected: ERROR""")] @@ -1164,10 +1106,8 @@ def test_update_stability_conditional_instability(): "expected", run_info_2) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_full(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: if debug: TIMEOUT @@ -1216,10 +1156,8 @@ def test_update_full(): "expected", run_info_2) == "ERROR" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_full_unknown(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: if release_or_beta: ERROR @@ -1259,11 +1197,29 @@ def test_update_full_unknown(): "expected", run_info_2) == "ERROR" +def test_update_full_unknown_missing(): + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] + [subtest_deleted] + expected: + if release_or_beta: ERROR + FAIL +""")] + + log_0 = suite_log([("test_start", {"test": test_id}), + ("test_status", {"test": test_id, + "subtest": "test1", + "status": "PASS", + "expected": "PASS"}), + ("test_end", {"test": test_id, + "status": "OK"})], + run_info={"debug": False, "release_or_beta": False}) + + updated = update(tests, log_0, full_update=True) + assert len(updated) == 0 + -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_default(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] [test1] expected: if os == "mac": FAIL @@ -1293,10 +1249,8 @@ def test_update_default(): assert new_manifest.is_empty -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_default_1(): - tests = [("path/to/test.htm", [test_id], "testharness", """ + tests = [("path/to/test.htm", [test_id], "testharness", b""" [test.htm] expected: if os == "mac": TIMEOUT @@ -1325,10 +1279,8 @@ def test_update_default_1(): "expected", run_info_2) == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_default_2(): - tests = [("path/to/test.htm", [test_id], "testharness", """ + tests = [("path/to/test.htm", [test_id], "testharness", b""" [test.htm] expected: if os == "mac": TIMEOUT @@ -1357,10 +1309,8 @@ def test_update_default_2(): "expected", run_info_2) == "TIMEOUT" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_assertion_count_0(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] max-asserts: 4 min-asserts: 2 """)] @@ -1381,10 +1331,8 @@ def test_update_assertion_count_0(): assert new_manifest.get_test(test_id).get("min-asserts") == "2" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_assertion_count_1(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] max-asserts: 4 min-asserts: 2 """)] @@ -1405,10 +1353,8 @@ def test_update_assertion_count_1(): assert new_manifest.get_test(test_id).has_key("min-asserts") is False -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_assertion_count_2(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] max-asserts: 4 min-asserts: 2 """)] @@ -1425,10 +1371,8 @@ def test_update_assertion_count_2(): assert not updated -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_assertion_count_3(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm] max-asserts: 4 min-asserts: 2 """)] @@ -1459,10 +1403,8 @@ def test_update_assertion_count_3(): assert new_manifest.get_test(test_id).get("min-asserts") == "2" -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_assertion_count_4(): - tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]""")] + tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]""")] log_0 = suite_log([("test_start", {"test": test_id}), ("assertion_count", {"test": test_id, @@ -1490,11 +1432,9 @@ def test_update_assertion_count_4(): assert new_manifest.get_test(test_id).has_key("min-asserts") is False -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_lsan_0(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, "")] + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b"")] log_0 = suite_log([("lsan_leak", {"scope": "path/to/", "frames": ["foo", "bar"]})]) @@ -1507,11 +1447,9 @@ def test_update_lsan_0(): assert new_manifest.get("lsan-allowed") == ["foo"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_lsan_1(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, """ + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b""" lsan-allowed: [foo]""")] log_0 = suite_log([("lsan_leak", {"scope": "path/to/", @@ -1527,13 +1465,11 @@ lsan-allowed: [foo]""")] assert new_manifest.get("lsan-allowed") == ["baz", "foo"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_lsan_2(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/__dir__", ["path/__dir__"], None, """ + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/__dir__", ["path/__dir__"], None, b""" lsan-allowed: [foo]"""), - ("path/to/__dir__", [dir_id], None, "")] + ("path/to/__dir__", [dir_id], None, b"")] log_0 = suite_log([("lsan_leak", {"scope": "path/to/", "frames": ["foo", "bar"], @@ -1549,11 +1485,9 @@ lsan-allowed: [foo]"""), assert new_manifest.get("lsan-allowed") == ["baz"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_lsan_3(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, "")] + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b"")] log_0 = suite_log([("lsan_leak", {"scope": "path/to/", "frames": ["foo", "bar"]})], @@ -1571,11 +1505,9 @@ def test_update_lsan_3(): assert new_manifest.get("lsan-allowed") == ["baz", "foo"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_wptreport_0(): tests = [("path/to/test.htm", [test_id], "testharness", - """[test.htm] + b"""[test.htm] [test1] expected: FAIL""")] @@ -1593,11 +1525,9 @@ def test_update_wptreport_0(): assert updated[0][1].is_empty -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_wptreport_1(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, "")] + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b"")] log = {"run_info": default_run_info.copy(), "results": [], @@ -1610,11 +1540,9 @@ def test_update_wptreport_1(): assert updated[0][1].get("lsan-allowed") == ["baz"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_leak_total_0(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, "")] + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b"")] log_0 = suite_log([("mozleak_total", {"scope": "path/to/", "process": "default", @@ -1629,11 +1557,9 @@ def test_update_leak_total_0(): assert new_manifest.get("leak-threshold") == ['default:51200'] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_leak_total_1(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, "")] + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b"")] log_0 = suite_log([("mozleak_total", {"scope": "path/to/", "process": "default", @@ -1645,11 +1571,9 @@ def test_update_leak_total_1(): assert not updated -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_leak_total_2(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, """ + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b""" leak-total: 110""")] log_0 = suite_log([("mozleak_total", {"scope": "path/to/", @@ -1662,11 +1586,9 @@ leak-total: 110""")] assert not updated -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_leak_total_3(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, """ + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b""" leak-total: 100""")] log_0 = suite_log([("mozleak_total", {"scope": "path/to/", @@ -1682,11 +1604,9 @@ leak-total: 100""")] assert new_manifest.get("leak-threshold") == ['default:51200'] -@pytest.mark.xfail(sys.version[0] == "3", - reason="metadata doesn't support py3") def test_update_leak_total_4(): - tests = [("path/to/test.htm", [test_id], "testharness", ""), - ("path/to/__dir__", [dir_id], None, """ + tests = [("path/to/test.htm", [test_id], "testharness", b""), + ("path/to/__dir__", [dir_id], None, b""" leak-total: 110""")] log_0 = suite_log([ @@ -1715,8 +1635,6 @@ class UpdateRunner(StepRunner): steps = [TestStep] -@pytest.mark.xfail(sys.version[0] == "3", - reason="update.state doesn't support py3") def test_update_pickle(): logger = structuredlog.StructuredLogger("expected_test") args = { diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py index 9bb3e1fd34e..1a94a2f3303 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py @@ -1,5 +1,3 @@ -import pytest -import sys from io import BytesIO from mock import Mock @@ -7,29 +5,29 @@ from manifest import manifest as wptmanifest from manifest.item import TestharnessTest from .. import manifestexpected, wpttest -dir_ini_0 = """\ +dir_ini_0 = b"""\ prefs: [a:b] """ -dir_ini_1 = """\ +dir_ini_1 = b"""\ prefs: [@Reset, b:c] max-asserts: 2 min-asserts: 1 tags: [b, c] """ -dir_ini_2 = """\ +dir_ini_2 = b"""\ lsan-max-stack-depth: 42 """ -test_0 = """\ +test_0 = b"""\ [0.html] prefs: [c:d] max-asserts: 3 tags: [a, @Reset] """ -test_1 = """\ +test_1 = b"""\ [1.html] prefs: if os == 'win': [a:b, c:d] @@ -37,12 +35,12 @@ test_1 = """\ if os == 'win': FAIL """ -test_2 = """\ +test_2 = b"""\ [2.html] lsan-max-stack-depth: 42 """ -test_3 = """\ +test_3 = b"""\ [3.html] [subtest1] expected: [PASS, FAIL] @@ -54,32 +52,32 @@ test_3 = """\ expected: FAIL """ -test_4 = """\ +test_4 = b"""\ [4.html] expected: FAIL """ -test_5 = """\ +test_5 = b"""\ [5.html] """ -test_6 = """\ +test_6 = b"""\ [6.html] expected: [OK, FAIL] """ -test_7 = """\ +test_7 = b"""\ [7.html] blink_expect_any_subtest_status: yep """ -test_fuzzy = """\ +test_fuzzy = b"""\ [fuzzy.html] fuzzy: fuzzy-ref.html:1;200 """ -testharness_test = """<script src="/resources/testharness.js"></script> +testharness_test = b"""<script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script>""" @@ -117,8 +115,6 @@ def make_test_object(test_name, return wpttest.from_manifest(tests, test, inherit_metadata, test_metadata.get_test(test.id)) -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_metadata_inherit(): items = [("test", "a", 10), ("test", "a/b", 10), ("test", "c", 10)] inherit_metadata = [ @@ -136,8 +132,6 @@ def test_metadata_inherit(): assert test_obj.tags == {"a", "dir:a"} -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_conditional(): items = [("test", "a", 10), ("test", "a/b", 10), ("test", "c", 10)] @@ -147,8 +141,6 @@ def test_conditional(): assert test_obj.expected() == "FAIL" -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_metadata_lsan_stack_depth(): items = [("test", "a", 10), ("test", "a/b", 10)] @@ -172,8 +164,6 @@ def test_metadata_lsan_stack_depth(): assert test_obj.lsan_max_stack_depth == 42 -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_subtests(): test_obj = make_test_object(test_3, "a/3.html", 3, ("test", "a", 4), None, False) assert test_obj.expected("subtest1") == "PASS" @@ -184,40 +174,30 @@ def test_subtests(): assert test_obj.known_intermittent("subtest3") == [] -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_expected_fail(): test_obj = make_test_object(test_4, "a/4.html", 4, ("test", "a", 5), None, False) assert test_obj.expected() == "FAIL" assert test_obj.known_intermittent() == [] -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_no_expected(): test_obj = make_test_object(test_5, "a/5.html", 5, ("test", "a", 6), None, False) assert test_obj.expected() == "OK" assert test_obj.known_intermittent() == [] -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_known_intermittent(): test_obj = make_test_object(test_6, "a/6.html", 6, ("test", "a", 7), None, False) assert test_obj.expected() == "OK" assert test_obj.known_intermittent() == ["FAIL"] -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_expect_any_subtest_status(): test_obj = make_test_object(test_7, "a/7.html", 7, ("test", "a", 8), None, False) assert test_obj.expected() == "OK" assert test_obj.expect_any_subtest_status() is True -@pytest.mark.xfail(sys.version[0] == "3", - reason="bytes/text confusion in py3") def test_metadata_fuzzy(): manifest_data = { "items": {"reftest": {"a/fuzzy.html": [["a/fuzzy.html", @@ -234,7 +214,7 @@ def test_metadata_fuzzy(): test_path="a/fuzzy.html", url_base="/") - test = manifest.iterpath("a/fuzzy.html").next() + test = next(manifest.iterpath("a/fuzzy.html")) test_obj = wpttest.from_manifest(manifest, test, [], test_metadata.get_test(test.id)) assert test_obj.fuzzy == {('/a/fuzzy.html', '/a/fuzzy-ref.html', '=='): [[2, 3], [10, 15]]} diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py index 64dbf118060..f8a83525cbd 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py @@ -11,7 +11,7 @@ class BaseState(object): return rv logger.debug("No existing state found") - return object.__new__(cls, logger) + return super(BaseState, cls).__new__(cls) def __init__(self, logger): """Object containing state variables created when running Steps. diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py index 923bdaa5585..91f1161b01b 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py @@ -37,7 +37,7 @@ def require_arg(kwargs, name, value_func=None): def create_parser(product_choices=None): from mozlog import commandline - import products + from . import products if product_choices is None: config_data = config.load() diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py index 69cee744879..444d1d962d2 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py @@ -14,7 +14,7 @@ def setup(args, defaults, formatter_defaults=None): formatter_defaults=formatter_defaults) setup_stdlib_logger() - for name in args.keys(): + for name in list(args.keys()): if name.startswith("log_"): args.pop(name) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py index a81ad9d06a1..3b11e83012a 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py @@ -381,6 +381,10 @@ class ManifestItem(object): for item in iterkeys(self._flatten()): yield item + def iter_properties(self): + for item in self._data: + yield item, self._data[item] + def remove_value(self, key, value): if key not in self._data: return diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py index cac172a5940..75ce104c7ce 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py @@ -3,19 +3,20 @@ from __future__ import print_function, unicode_literals import json import os import sys +from six import iteritems, itervalues from wptserve import sslutils -import environment as env -import products -import testloader -import wptcommandline -import wptlogging -import wpttest +from . import environment as env +from . import products +from . import testloader +from . import wptcommandline +from . import wptlogging +from . import wpttest from mozlog import capture, handlers -from font import FontInstaller -from testrunner import ManagerGroup -from browsers.base import NullBrowser +from .font import FontInstaller +from .testrunner import ManagerGroup +from .browsers.base import NullBrowser here = os.path.split(__file__)[0] @@ -102,7 +103,7 @@ def list_disabled(test_paths, product, **kwargs): run_info, test_loader = get_loader(test_paths, product, run_info_extras=run_info_extras, **kwargs) - for test_type, tests in test_loader.disabled_tests.iteritems(): + for test_type, tests in iteritems(test_loader.disabled_tests): for test in tests: rv.append({"test": test.id, "reason": test.disabled()}) print(json.dumps(rv, indent=2)) @@ -127,7 +128,7 @@ def get_pause_after_test(test_loader, **kwargs): if kwargs["headless"]: return False tests = test_loader.tests - is_single_testharness = (sum(len(item) for item in tests.itervalues()) == 1 and + is_single_testharness = (sum(len(item) for item in itervalues(tests)) == 1 and len(tests.get("testharness", [])) == 1) if kwargs["repeat"] == 1 and kwargs["rerun"] == 1 and is_single_testharness: return True @@ -149,6 +150,7 @@ def run_tests(config, test_paths, product, **kwargs): if kwargs["install_fonts"]: env_extras.append(FontInstaller( + logger, font_dir=kwargs["font_dir"], ahem=os.path.join(test_paths["/"]["tests_path"], "fonts/Ahem.ttf") )) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py index 67b57583424..d650e98dfbf 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py @@ -2,6 +2,7 @@ import os import subprocess from six.moves.urllib.parse import urljoin from collections import defaultdict +from six import string_types from .wptmanifest.parser import atoms @@ -118,18 +119,6 @@ class RunInfo(dict): if extras is not None: self.update(extras) - # Until the test harness can understand default pref values, - # (https://bugzilla.mozilla.org/show_bug.cgi?id=1577912) this value - # should by synchronized with the default pref value indicated in - # StaticPrefList.yaml. - # - # Currently for automation, the pref (and `sw-e10s`) defaults to true in - # nightly builds and false otherwise but can be overridden with - # `--setpref`. If overridden, the value would be initialized in - # `run_info_extras` and be supplied in the `extras` parameter. - if "sw-e10s" not in self: - self["sw-e10s"] = self.get("nightly_build", False) - self["headless"] = extras.get("headless", False) self["webrender"] = enable_webrender @@ -337,7 +326,7 @@ class Test(object): try: expected = metadata.get("expected") - if isinstance(expected, (basestring)): + if isinstance(expected, string_types): return expected elif isinstance(expected, list): return expected[0] diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py index ca5118009cf..efc1a16a932 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py @@ -1,4 +1,7 @@ -import cgi +try: + import html +except ImportError: + import cgi as html import json import os import sys @@ -76,7 +79,7 @@ class DirectoryHandler(object): <ul> %(items)s </ul> -""" % {"path": cgi.escape(url_path), +""" % {"path": html.escape(url_path), "items": "\n".join(self.list_items(url_path, path))} # noqa: E122 def list_items(self, base_path, path): @@ -93,14 +96,14 @@ class DirectoryHandler(object): yield ("""<li class="dir"><a href="%(link)s">%(name)s</a></li>""" % {"link": link, "name": ".."}) for item in sorted(os.listdir(path)): - link = cgi.escape(quote(item)) + link = html.escape(quote(item)) if os.path.isdir(os.path.join(path, item)): link += "/" class_ = "dir" else: class_ = "file" yield ("""<li class="%(class)s"><a href="%(link)s">%(name)s</a></li>""" % - {"link": link, "name": cgi.escape(item), "class": class_}) + {"link": link, "name": html.escape(item), "class": class_}) def wrap_pipeline(path, request, response): diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py index ceb34cc3f4f..e5d6e1c96db 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py @@ -1,4 +1,7 @@ -from cgi import escape +try: + from html import escape +except ImportError: + from cgi import escape from collections import deque import base64 import gzip as gzip_module diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js index 7fbac5b24f1..2c53e3611e0 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js @@ -10,8 +10,8 @@ promise_test(async () => { builder .addFunction("swap", type_if_fi) .addBody([ - kExprGetLocal, 1, - kExprGetLocal, 0, + kExprLocalGet, 1, + kExprLocalGet, 0, kExprReturn, ]) .exportFunc(); @@ -31,8 +31,8 @@ promise_test(async () => { const swap = builder .addFunction("swap", type_if_fi) .addBody([ - kExprGetLocal, 1, - kExprGetLocal, 0, + kExprLocalGet, 1, + kExprLocalGet, 0, kExprReturn, ]); builder diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js b/tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js index 7ccf06c234a..c81672f208b 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js @@ -183,7 +183,7 @@ const instanceTestFactory = [ builder .addFunction("fn", kSig_i_v) .addBody([ - kExprGetGlobal, + kExprGlobalGet, index, kExprReturn, ]) diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js index 8e9732e5512..09355979d84 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js @@ -81,22 +81,10 @@ test(() => { const bytes1 = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121]; const bytes2 = [74, 83, 65, 80, 73]; - const binary = new Binary; - binary.emit_section(kUnknownSectionCode, section => { - section.emit_string("name"); - section.emit_bytes(bytes1); - }); - binary.emit_section(kUnknownSectionCode, section => { - section.emit_string("name"); - section.emit_bytes(bytes2); - }); - binary.emit_section(kUnknownSectionCode, section => { - section.emit_string("foo"); - section.emit_bytes(bytes1); - }); - const builder = new WasmModuleBuilder(); - builder.addExplicitSection(binary.trunc_buffer()); + builder.addCustomSection("name", bytes1); + builder.addCustomSection("name", bytes2); + builder.addCustomSection("foo", bytes1); const buffer = builder.toBuffer() const module = new WebAssembly.Module(buffer); @@ -119,14 +107,8 @@ test(() => { const bytes = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121]; const name = "yee\uD801\uDC37eey" - const binary = new Binary; - binary.emit_section(kUnknownSectionCode, section => { - section.emit_string(name); - section.emit_bytes(bytes); - }); - const builder = new WasmModuleBuilder(); - builder.addExplicitSection(binary.trunc_buffer()); + builder.addCustomSection(name, bytes); const buffer = builder.toBuffer(); const module = new WebAssembly.Module(buffer); @@ -140,14 +122,8 @@ test(() => { test(() => { const bytes = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121]; - const binary = new Binary; - binary.emit_section(kUnknownSectionCode, section => { - section.emit_string("na\uFFFDme"); - section.emit_bytes(bytes); - }); - const builder = new WasmModuleBuilder(); - builder.addExplicitSection(binary.trunc_buffer()); + builder.addCustomSection("na\uFFFDme", bytes); const buffer = builder.toBuffer(); const module = new WebAssembly.Module(buffer); diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js b/tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js index 09ff891f52e..82c6e04135f 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js @@ -66,6 +66,8 @@ let kStartSectionCode = 8; // Start function declaration let kElementSectionCode = 9; // Elements section let kCodeSectionCode = 10; // Function code let kDataSectionCode = 11; // Data segments +let kDataCountSectionCode = 12; // Data segment count (between Element & Code) +let kExceptionSectionCode = 13; // Exception section (between Global & Export) // Name section types let kModuleNameCode = 0; @@ -76,7 +78,13 @@ let kWasmFunctionTypeForm = 0x60; let kWasmAnyFunctionTypeForm = 0x70; let kHasMaximumFlag = 1; -let kResizableMaximumFlag = 1; +let kSharedHasMaximumFlag = 3; + +// Segment flags +let kActiveNoIndex = 0; +let kPassive = 1; +let kActiveWithIndex = 2; +let kPassiveWithElements = 5; // Function declaration flags let kDeclFunctionName = 0x01; @@ -91,14 +99,21 @@ let kWasmI64 = 0x7e; let kWasmF32 = 0x7d; let kWasmF64 = 0x7c; let kWasmS128 = 0x7b; +let kWasmAnyRef = 0x6f; +let kWasmAnyFunc = 0x70; +let kWasmExnRef = 0x68; let kExternalFunction = 0; let kExternalTable = 1; let kExternalMemory = 2; let kExternalGlobal = 3; +let kExternalException = 4; let kTableZero = 0; let kMemoryZero = 0; +let kSegmentZero = 0; + +let kExceptionAttribute = 0; // Useful signatures let kSig_i_i = makeSig([kWasmI32], [kWasmI32]); @@ -123,11 +138,30 @@ let kSig_v_l = makeSig([kWasmI64], []); let kSig_v_d = makeSig([kWasmF64], []); let kSig_v_dd = makeSig([kWasmF64, kWasmF64], []); let kSig_v_ddi = makeSig([kWasmF64, kWasmF64, kWasmI32], []); +let kSig_ii_v = makeSig([], [kWasmI32, kWasmI32]); +let kSig_iii_v = makeSig([], [kWasmI32, kWasmI32, kWasmI32]); +let kSig_ii_i = makeSig([kWasmI32], [kWasmI32, kWasmI32]); +let kSig_iii_i = makeSig([kWasmI32], [kWasmI32, kWasmI32, kWasmI32]); +let kSig_ii_ii = makeSig([kWasmI32, kWasmI32], [kWasmI32, kWasmI32]); +let kSig_iii_ii = makeSig([kWasmI32, kWasmI32], [kWasmI32, kWasmI32, kWasmI32]); let kSig_v_f = makeSig([kWasmF32], []); let kSig_f_f = makeSig([kWasmF32], [kWasmF32]); let kSig_f_d = makeSig([kWasmF64], [kWasmF32]); let kSig_d_d = makeSig([kWasmF64], [kWasmF64]); +let kSig_r_r = makeSig([kWasmAnyRef], [kWasmAnyRef]); +let kSig_a_a = makeSig([kWasmAnyFunc], [kWasmAnyFunc]); +let kSig_e_e = makeSig([kWasmExnRef], [kWasmExnRef]); +let kSig_i_r = makeSig([kWasmAnyRef], [kWasmI32]); +let kSig_v_r = makeSig([kWasmAnyRef], []); +let kSig_v_a = makeSig([kWasmAnyFunc], []); +let kSig_v_e = makeSig([kWasmExnRef], []); +let kSig_v_rr = makeSig([kWasmAnyRef, kWasmAnyRef], []); +let kSig_v_aa = makeSig([kWasmAnyFunc, kWasmAnyFunc], []); +let kSig_r_v = makeSig([], [kWasmAnyRef]); +let kSig_a_v = makeSig([], [kWasmAnyFunc]); +let kSig_a_i = makeSig([kWasmI32], [kWasmAnyFunc]); +let kSig_e_v = makeSig([], [kWasmExnRef]); function makeSig(params, results) { return {params: params, results: results}; @@ -163,6 +197,8 @@ let kExprElse = 0x05; let kExprTry = 0x06; let kExprCatch = 0x07; let kExprThrow = 0x08; +let kExprRethrow = 0x09; +let kExprBrOnExn = 0x0a; let kExprEnd = 0x0b; let kExprBr = 0x0c; let kExprBrIf = 0x0d; @@ -170,13 +206,17 @@ let kExprBrTable = 0x0e; let kExprReturn = 0x0f; let kExprCallFunction = 0x10; let kExprCallIndirect = 0x11; +let kExprReturnCall = 0x12; +let kExprReturnCallIndirect = 0x13; let kExprDrop = 0x1a; let kExprSelect = 0x1b; -let kExprGetLocal = 0x20; -let kExprSetLocal = 0x21; -let kExprTeeLocal = 0x22; -let kExprGetGlobal = 0x23; -let kExprSetGlobal = 0x24; +let kExprLocalGet = 0x20; +let kExprLocalSet = 0x21; +let kExprLocalTee = 0x22; +let kExprGlobalGet = 0x23; +let kExprGlobalSet = 0x24; +let kExprTableGet = 0x25; +let kExprTableSet = 0x26; let kExprI32LoadMem = 0x28; let kExprI64LoadMem = 0x29; let kExprF32LoadMem = 0x2a; @@ -329,6 +369,108 @@ let kExprI32ReinterpretF32 = 0xbc; let kExprI64ReinterpretF64 = 0xbd; let kExprF32ReinterpretI32 = 0xbe; let kExprF64ReinterpretI64 = 0xbf; +let kExprI32SExtendI8 = 0xc0; +let kExprI32SExtendI16 = 0xc1; +let kExprI64SExtendI8 = 0xc2; +let kExprI64SExtendI16 = 0xc3; +let kExprI64SExtendI32 = 0xc4; +let kExprRefNull = 0xd0; +let kExprRefIsNull = 0xd1; +let kExprRefFunc = 0xd2; + +// Prefix opcodes +let kNumericPrefix = 0xfc; +let kSimdPrefix = 0xfd; +let kAtomicPrefix = 0xfe; + +// Numeric opcodes. +let kExprMemoryInit = 0x08; +let kExprDataDrop = 0x09; +let kExprMemoryCopy = 0x0a; +let kExprMemoryFill = 0x0b; +let kExprTableInit = 0x0c; +let kExprElemDrop = 0x0d; +let kExprTableCopy = 0x0e; +let kExprTableGrow = 0x0f; +let kExprTableSize = 0x10; +let kExprTableFill = 0x11; + +// Atomic opcodes. +let kExprAtomicNotify = 0x00; +let kExprI32AtomicWait = 0x01; +let kExprI64AtomicWait = 0x02; +let kExprI32AtomicLoad = 0x10; +let kExprI32AtomicLoad8U = 0x12; +let kExprI32AtomicLoad16U = 0x13; +let kExprI32AtomicStore = 0x17; +let kExprI32AtomicStore8U = 0x19; +let kExprI32AtomicStore16U = 0x1a; +let kExprI32AtomicAdd = 0x1e; +let kExprI32AtomicAdd8U = 0x20; +let kExprI32AtomicAdd16U = 0x21; +let kExprI32AtomicSub = 0x25; +let kExprI32AtomicSub8U = 0x27; +let kExprI32AtomicSub16U = 0x28; +let kExprI32AtomicAnd = 0x2c; +let kExprI32AtomicAnd8U = 0x2e; +let kExprI32AtomicAnd16U = 0x2f; +let kExprI32AtomicOr = 0x33; +let kExprI32AtomicOr8U = 0x35; +let kExprI32AtomicOr16U = 0x36; +let kExprI32AtomicXor = 0x3a; +let kExprI32AtomicXor8U = 0x3c; +let kExprI32AtomicXor16U = 0x3d; +let kExprI32AtomicExchange = 0x41; +let kExprI32AtomicExchange8U = 0x43; +let kExprI32AtomicExchange16U = 0x44; +let kExprI32AtomicCompareExchange = 0x48; +let kExprI32AtomicCompareExchange8U = 0x4a; +let kExprI32AtomicCompareExchange16U = 0x4b; + +let kExprI64AtomicLoad = 0x11; +let kExprI64AtomicLoad8U = 0x14; +let kExprI64AtomicLoad16U = 0x15; +let kExprI64AtomicLoad32U = 0x16; +let kExprI64AtomicStore = 0x18; +let kExprI64AtomicStore8U = 0x1b; +let kExprI64AtomicStore16U = 0x1c; +let kExprI64AtomicStore32U = 0x1d; +let kExprI64AtomicAdd = 0x1f; +let kExprI64AtomicAdd8U = 0x22; +let kExprI64AtomicAdd16U = 0x23; +let kExprI64AtomicAdd32U = 0x24; +let kExprI64AtomicSub = 0x26; +let kExprI64AtomicSub8U = 0x29; +let kExprI64AtomicSub16U = 0x2a; +let kExprI64AtomicSub32U = 0x2b; +let kExprI64AtomicAnd = 0x2d; +let kExprI64AtomicAnd8U = 0x30; +let kExprI64AtomicAnd16U = 0x31; +let kExprI64AtomicAnd32U = 0x32; +let kExprI64AtomicOr = 0x34; +let kExprI64AtomicOr8U = 0x37; +let kExprI64AtomicOr16U = 0x38; +let kExprI64AtomicOr32U = 0x39; +let kExprI64AtomicXor = 0x3b; +let kExprI64AtomicXor8U = 0x3e; +let kExprI64AtomicXor16U = 0x3f; +let kExprI64AtomicXor32U = 0x40; +let kExprI64AtomicExchange = 0x42; +let kExprI64AtomicExchange8U = 0x45; +let kExprI64AtomicExchange16U = 0x46; +let kExprI64AtomicExchange32U = 0x47; +let kExprI64AtomicCompareExchange = 0x49 +let kExprI64AtomicCompareExchange8U = 0x4c; +let kExprI64AtomicCompareExchange16U = 0x4d; +let kExprI64AtomicCompareExchange32U = 0x4e; + +// Simd opcodes. +let kExprS128LoadMem = 0x00; +let kExprS128StoreMem = 0x01; +let kExprI32x4Splat = 0x0c; +let kExprI32x4Eq = 0x2c; +let kExprS1x4AllTrue = 0x75; +let kExprF32x4Min = 0x9e; class Binary { constructor() { @@ -346,7 +488,7 @@ class Binary { } trunc_buffer() { - return this.buffer = this.buffer.slice(0, this.length); + return new Uint8Array(this.buffer.buffer, 0, this.length); } reset() { @@ -372,7 +514,7 @@ class Binary { this.buffer[this.length++] = val >> 24; } - emit_leb(val, max_len) { + emit_leb_u(val, max_len) { this.ensure_space(max_len); for (let i = 0; i < max_len; ++i) { let v = val & 0xff; @@ -387,11 +529,11 @@ class Binary { } emit_u32v(val) { - this.emit_leb(val, kMaxVarInt32Size); + this.emit_leb_u(val, kMaxVarInt32Size); } emit_u64v(val) { - this.emit_leb(val, kMaxVarInt64Size); + this.emit_leb_u(val, kMaxVarInt64Size); } emit_bytes(data) { @@ -443,6 +585,16 @@ class WasmFunctionBuilder { this.name = name; this.type_index = type_index; this.body = []; + this.locals = []; + this.local_names = []; + } + + numLocalNames() { + let num_local_names = 0; + for (let loc_name of this.local_names) { + if (loc_name !== undefined) ++num_local_names; + } + return num_local_names; } exportAs(name) { @@ -456,9 +608,14 @@ class WasmFunctionBuilder { } addBody(body) { - const bodyCopy = body.slice(); - bodyCopy.push(kExprEnd); - return this.addBodyWithEnd(bodyCopy); + for (let b of body) { + if (typeof b !== 'number' || (b & (~0xFF)) !== 0 ) + throw new Error('invalid body (entries must be 8 bit numbers): ' + body); + } + this.body = body.slice(); + // Automatically add the end for the function block to the body. + this.body.push(kExprEnd); + return this; } addBodyWithEnd(body) { @@ -466,8 +623,23 @@ class WasmFunctionBuilder { return this; } - addLocals(locals) { - this.locals = locals; + getNumLocals() { + let total_locals = 0; + for (let l of this.locals) { + for (let type of ["i32", "i64", "f32", "f64", "s128"]) { + total_locals += l[type + "_count"] || 0; + } + } + return total_locals; + } + + addLocals(locals, names) { + const old_num_locals = this.getNumLocals(); + this.locals.push(locals); + if (names) { + const missing_names = old_num_locals - this.local_names.length; + this.local_names.push(...new Array(missing_names), ...names); + } return this; } @@ -491,21 +663,38 @@ class WasmGlobalBuilder { } } +class WasmTableBuilder { + constructor(module, type, initial_size, max_size) { + this.module = module; + this.type = type; + this.initial_size = initial_size; + this.has_max = max_size != undefined; + this.max_size = max_size; + } + + exportAs(name) { + this.module.exports.push({name: name, kind: kExternalTable, + index: this.index}); + return this; + } +} + class WasmModuleBuilder { constructor() { this.types = []; this.imports = []; this.exports = []; this.globals = []; + this.tables = []; + this.exceptions = []; this.functions = []; - this.table_length_min = 0; - this.table_length_max = undefined; this.element_segments = []; this.data_segments = []; - this.segments = []; this.explicit = []; this.num_imported_funcs = 0; this.num_imported_globals = 0; + this.num_imported_tables = 0; + this.num_imported_exceptions = 0; return this; } @@ -514,8 +703,8 @@ class WasmModuleBuilder { return this; } - addMemory(min, max, exp) { - this.memory = {min: min, max: max, exp: exp}; + addMemory(min, max, exp, shared) { + this.memory = {min: min, max: max, exp: exp, shared: shared}; return this; } @@ -524,6 +713,26 @@ class WasmModuleBuilder { return this; } + stringToBytes(name) { + var result = new Binary(); + result.emit_string(name); + return result.trunc_buffer() + } + + createCustomSection(name, bytes) { + name = this.stringToBytes(name); + var section = new Binary(); + section.emit_u8(kUnknownSectionCode); + section.emit_u32v(name.length + bytes.length); + section.emit_bytes(name); + section.emit_bytes(bytes); + return section.trunc_buffer(); + } + + addCustomSection(name, bytes) { + this.explicit.push(this.createCustomSection(name, bytes)); + } + addType(type) { this.types.push(type); var pl = type.params.length; // should have params @@ -538,6 +747,24 @@ class WasmModuleBuilder { return glob; } + addTable(type, initial_size, max_size = undefined) { + if (type != kWasmAnyRef && type != kWasmAnyFunc && type != kWasmExnRef) { + throw new Error( + 'Tables must be of type kWasmAnyRef, kWasmAnyFunc, or kWasmExnRef'); + } + let table = new WasmTableBuilder(this, type, initial_size, max_size); + table.index = this.tables.length + this.num_imported_tables; + this.tables.push(table); + return table; + } + + addException(type) { + let type_index = (typeof type) == "number" ? type : this.addType(type); + let except_index = this.exceptions.length + this.num_imported_exceptions; + this.exceptions.push(type_index); + return except_index; + } + addFunction(name, type) { let type_index = (typeof type) == "number" ? type : this.addType(type); let func = new WasmFunctionBuilder(this, name, type_index); @@ -547,6 +774,9 @@ class WasmModuleBuilder { } addImport(module, name, type) { + if (this.functions.length != 0) { + throw new Error('Imported functions must be declared before local ones'); + } let type_index = (typeof type) == "number" ? type : this.addType(type); this.imports.push({module: module, name: name, kind: kExternalFunction, type: type_index}); @@ -554,23 +784,40 @@ class WasmModuleBuilder { } addImportedGlobal(module, name, type, mutable = false) { + if (this.globals.length != 0) { + throw new Error('Imported globals must be declared before local ones'); + } let o = {module: module, name: name, kind: kExternalGlobal, type: type, mutable: mutable}; this.imports.push(o); return this.num_imported_globals++; } - addImportedMemory(module, name, initial = 0, maximum) { + addImportedMemory(module, name, initial = 0, maximum, shared) { let o = {module: module, name: name, kind: kExternalMemory, - initial: initial, maximum: maximum}; + initial: initial, maximum: maximum, shared: shared}; this.imports.push(o); return this; } - addImportedTable(module, name, initial, maximum) { + addImportedTable(module, name, initial, maximum, type) { + if (this.tables.length != 0) { + throw new Error('Imported tables must be declared before local ones'); + } let o = {module: module, name: name, kind: kExternalTable, initial: initial, - maximum: maximum}; + maximum: maximum, type: type || kWasmAnyFunctionTypeForm}; + this.imports.push(o); + return this.num_imported_tables++; + } + + addImportedException(module, name, type) { + if (this.exceptions.length != 0) { + throw new Error('Imported exceptions must be declared before local ones'); + } + let type_index = (typeof type) == "number" ? type : this.addType(type); + let o = {module: module, name: name, kind: kExternalException, type: type_index}; this.imports.push(o); + return this.num_imported_exceptions++; } addExport(name, index) { @@ -585,7 +832,12 @@ class WasmModuleBuilder { addDataSegment(addr, data, is_global = false) { this.data_segments.push( - {addr: addr, data: data, is_global: is_global}); + {addr: addr, data: data, is_global: is_global, is_active: true}); + return this.data_segments.length - 1; + } + + addPassiveDataSegment(data) { + this.data_segments.push({data: data, is_active: false}); return this.data_segments.length - 1; } @@ -593,18 +845,14 @@ class WasmModuleBuilder { this.exports.push({name: name, kind: kExternalMemory, index: 0}); } - addElementSegment(base, is_global, array, is_import = false) { - this.element_segments.push({base: base, is_global: is_global, - array: array}); - if (!is_global) { - var length = base + array.length; - if (length > this.table_length_min && !is_import) { - this.table_length_min = length; - } - if (length > this.table_length_max && !is_import) { - this.table_length_max = length; - } - } + addElementSegment(table, base, is_global, array) { + this.element_segments.push({table: table, base: base, is_global: is_global, + array: array, is_active: true}); + return this; + } + + addPassiveElementSegment(array, is_import = false) { + this.element_segments.push({array: array, is_active: false}); return this; } @@ -613,12 +861,30 @@ class WasmModuleBuilder { if (typeof n != 'number') throw new Error('invalid table (entries have to be numbers): ' + array); } - return this.addElementSegment(this.table_length_min, false, array); + if (this.tables.length == 0) { + this.addTable(kWasmAnyFunc, 0); + } + // Adjust the table to the correct size. + let table = this.tables[0]; + const base = table.initial_size; + const table_size = base + array.length; + table.initial_size = table_size; + if (table.has_max && table_size > table.max_size) { + table.max_size = table_size; + } + return this.addElementSegment(0, base, false, array); } setTableBounds(min, max = undefined) { - this.table_length_min = min; - this.table_length_max = max; + if (this.tables.length != 0) { + throw new Error("The table bounds of table '0' have already been set."); + } + this.addTable(kWasmAnyFunc, min, max); + return this; + } + + setName(name) { + this.name = name; return this; } @@ -664,15 +930,23 @@ class WasmModuleBuilder { section.emit_u8(imp.mutable); } else if (imp.kind == kExternalMemory) { var has_max = (typeof imp.maximum) != "undefined"; - section.emit_u8(has_max ? 1 : 0); // flags + var is_shared = (typeof imp.shared) != "undefined"; + if (is_shared) { + section.emit_u8(has_max ? 3 : 2); // flags + } else { + section.emit_u8(has_max ? 1 : 0); // flags + } section.emit_u32v(imp.initial); // initial if (has_max) section.emit_u32v(imp.maximum); // maximum } else if (imp.kind == kExternalTable) { - section.emit_u8(kWasmAnyFunctionTypeForm); + section.emit_u8(imp.type); var has_max = (typeof imp.maximum) != "undefined"; section.emit_u8(has_max ? 1 : 0); // flags section.emit_u32v(imp.initial); // initial if (has_max) section.emit_u32v(imp.maximum); // maximum + } else if (imp.kind == kExternalException) { + section.emit_u32v(kExceptionAttribute); + section.emit_u32v(imp.type); } else { throw new Error("unknown/unsupported import kind " + imp.kind); } @@ -681,31 +955,27 @@ class WasmModuleBuilder { } // Add functions declarations - let has_names = false; - let names = false; if (wasm.functions.length > 0) { if (debug) print("emitting function decls @ " + binary.length); binary.emit_section(kFunctionSectionCode, section => { section.emit_u32v(wasm.functions.length); for (let func of wasm.functions) { - has_names = has_names || (func.name != undefined && - func.name.length > 0); section.emit_u32v(func.type_index); } }); } // Add table section - if (wasm.table_length_min > 0) { - if (debug) print("emitting table @ " + binary.length); + if (wasm.tables.length > 0) { + if (debug) print ("emitting tables @ " + binary.length); binary.emit_section(kTableSectionCode, section => { - section.emit_u8(1); // one table entry - section.emit_u8(kWasmAnyFunctionTypeForm); - const max = wasm.table_length_max; - const has_max = max !== undefined; - section.emit_u8(has_max ? kHasMaximumFlag : 0); - section.emit_u32v(wasm.table_length_min); - if (has_max) section.emit_u32v(max); + section.emit_u32v(wasm.tables.length); + for (let table of wasm.tables) { + section.emit_u8(table.type); + section.emit_u8(table.has_max); + section.emit_u32v(table.initial_size); + if (table.has_max) section.emit_u32v(table.max_size); + } }); } @@ -715,7 +985,13 @@ class WasmModuleBuilder { binary.emit_section(kMemorySectionCode, section => { section.emit_u8(1); // one memory entry const has_max = wasm.memory.max !== undefined; - section.emit_u8(has_max ? 1 : 0); + const is_shared = wasm.memory.shared !== undefined; + // Emit flags (bit 0: reszeable max, bit 1: shared memory) + if (is_shared) { + section.emit_u8(has_max ? kSharedHasMaximumFlag : 2); + } else { + section.emit_u8(has_max ? kHasMaximumFlag : 0); + } section.emit_u32v(wasm.memory.min); if (has_max) section.emit_u32v(wasm.memory.max); }); @@ -738,7 +1014,7 @@ class WasmModuleBuilder { break; case kWasmI64: section.emit_u8(kExprI64Const); - section.emit_u8(global.init); + section.emit_u64v(global.init); break; case kWasmF32: section.emit_u8(kExprF32Const); @@ -750,10 +1026,22 @@ class WasmModuleBuilder { f64_view[0] = global.init; section.emit_bytes(f64_bytes_view); break; + case kWasmAnyFunc: + case kWasmAnyRef: + if (global.function_index !== undefined) { + section.emit_u8(kExprRefFunc); + section.emit_u32v(global.function_index); + } else { + section.emit_u8(kExprRefNull); + } + break; + case kWasmExnRef: + section.emit_u8(kExprRefNull); + break; } } else { // Emit a global-index initializer. - section.emit_u8(kExprGetGlobal); + section.emit_u8(kExprGlobalGet); section.emit_u32v(global.init_index); } section.emit_u8(kExprEnd); // end of init expression @@ -761,6 +1049,18 @@ class WasmModuleBuilder { }); } + // Add exceptions. + if (wasm.exceptions.length > 0) { + if (debug) print("emitting exceptions @ " + binary.length); + binary.emit_section(kExceptionSectionCode, section => { + section.emit_u32v(wasm.exceptions.length); + for (let type of wasm.exceptions) { + section.emit_u32v(kExceptionAttribute); + section.emit_u32v(type); + } + }); + } + // Add export table. var mem_export = (wasm.memory !== undefined && wasm.memory.exp); var exports_count = wasm.exports.length + (mem_export ? 1 : 0); @@ -797,22 +1097,55 @@ class WasmModuleBuilder { section.emit_u32v(inits.length); for (let init of inits) { - section.emit_u8(0); // table index / flags - if (init.is_global) { - section.emit_u8(kExprGetGlobal); + if (init.is_active) { + // Active segment. + if (init.table == 0) { + section.emit_u32v(kActiveNoIndex); + } else { + section.emit_u32v(kActiveWithIndex); + section.emit_u32v(init.table); + } + if (init.is_global) { + section.emit_u8(kExprGlobalGet); + } else { + section.emit_u8(kExprI32Const); + } + section.emit_u32v(init.base); + section.emit_u8(kExprEnd); + if (init.table != 0) { + section.emit_u8(kExternalFunction); + } + section.emit_u32v(init.array.length); + for (let index of init.array) { + section.emit_u32v(index); + } } else { - section.emit_u8(kExprI32Const); - } - section.emit_u32v(init.base); - section.emit_u8(kExprEnd); - section.emit_u32v(init.array.length); - for (let index of init.array) { - section.emit_u32v(index); + // Passive segment. + section.emit_u8(kPassiveWithElements); // flags + section.emit_u8(kWasmAnyFunc); + section.emit_u32v(init.array.length); + for (let index of init.array) { + if (index === null) { + section.emit_u8(kExprRefNull); + section.emit_u8(kExprEnd); + } else { + section.emit_u8(kExprRefFunc); + section.emit_u32v(index); + section.emit_u8(kExprEnd); + } + } } } }); } + // If there are any passive data segments, add the DataCount section. + if (wasm.data_segments.some(seg => !seg.is_active)) { + binary.emit_section(kDataCountSectionCode, section => { + section.emit_u32v(wasm.data_segments.length); + }); + } + // Add function bodies. if (wasm.functions.length > 0) { // emit function bodies @@ -824,9 +1157,7 @@ class WasmModuleBuilder { header.reset(); // Function body length will be patched later. let local_decls = []; - let l = func.locals; - if (l != undefined) { - let local_decls_count = 0; + for (let l of func.locals || []) { if (l.i32_count > 0) { local_decls.push({count: l.i32_count, type: kWasmI32}); } @@ -839,6 +1170,18 @@ class WasmModuleBuilder { if (l.f64_count > 0) { local_decls.push({count: l.f64_count, type: kWasmF64}); } + if (l.s128_count > 0) { + local_decls.push({count: l.s128_count, type: kWasmS128}); + } + if (l.anyref_count > 0) { + local_decls.push({count: l.anyref_count, type: kWasmAnyRef}); + } + if (l.anyfunc_count > 0) { + local_decls.push({count: l.anyfunc_count, type: kWasmAnyFunc}); + } + if (l.except_count > 0) { + local_decls.push({count: l.except_count, type: kWasmExnRef}); + } } header.emit_u32v(local_decls.length); @@ -860,17 +1203,21 @@ class WasmModuleBuilder { binary.emit_section(kDataSectionCode, section => { section.emit_u32v(wasm.data_segments.length); for (let seg of wasm.data_segments) { - section.emit_u8(0); // linear memory index 0 / flags - if (seg.is_global) { - // initializer is a global variable - section.emit_u8(kExprGetGlobal); - section.emit_u32v(seg.addr); + if (seg.is_active) { + section.emit_u8(0); // linear memory index 0 / flags + if (seg.is_global) { + // initializer is a global variable + section.emit_u8(kExprGlobalGet); + section.emit_u32v(seg.addr); + } else { + // initializer is a constant + section.emit_u8(kExprI32Const); + section.emit_u32v(seg.addr); + } + section.emit_u8(kExprEnd); } else { - // initializer is a constant - section.emit_u8(kExprI32Const); - section.emit_u32v(seg.addr); + section.emit_u8(kPassive); // flags } - section.emit_u8(kExprEnd); section.emit_u32v(seg.data.length); section.emit_bytes(seg.data); } @@ -883,21 +1230,50 @@ class WasmModuleBuilder { binary.emit_bytes(exp); } - // Add function names. - if (has_names) { - if (debug) print("emitting names @ " + binary.length); + // Add names. + let num_function_names = 0; + let num_functions_with_local_names = 0; + for (let func of wasm.functions) { + if (func.name !== undefined) ++num_function_names; + if (func.numLocalNames() > 0) ++num_functions_with_local_names; + } + if (num_function_names > 0 || num_functions_with_local_names > 0 || + wasm.name !== undefined) { + if (debug) print('emitting names @ ' + binary.length); binary.emit_section(kUnknownSectionCode, section => { - section.emit_string("name"); - var count = wasm.functions.length + wasm.num_imported_funcs; - section.emit_u32v(count); - for (var i = 0; i < wasm.num_imported_funcs; i++) { - section.emit_u8(0); // empty string - section.emit_u8(0); // local names count == 0 + section.emit_string('name'); + // Emit module name. + if (wasm.name !== undefined) { + section.emit_section(kModuleNameCode, name_section => { + name_section.emit_string(wasm.name); + }); } - for (let func of wasm.functions) { - var name = func.name == undefined ? "" : func.name; - section.emit_string(name); - section.emit_u8(0); // local names count == 0 + // Emit function names. + if (num_function_names > 0) { + section.emit_section(kFunctionNamesCode, name_section => { + name_section.emit_u32v(num_function_names); + for (let func of wasm.functions) { + if (func.name === undefined) continue; + name_section.emit_u32v(func.index); + name_section.emit_string(func.name); + } + }); + } + // Emit local names. + if (num_functions_with_local_names > 0) { + section.emit_section(kLocalNamesCode, name_section => { + name_section.emit_u32v(num_functions_with_local_names); + for (let func of wasm.functions) { + if (func.numLocalNames() == 0) continue; + name_section.emit_u32v(func.index); + name_section.emit_u32v(func.numLocalNames()); + for (let i = 0; i < func.local_names.length; ++i) { + if (func.local_names[i] === undefined) continue; + name_section.emit_u32v(i); + name_section.emit_string(func.local_names[i]); + } + } + }); } }); } @@ -925,13 +1301,24 @@ class WasmModuleBuilder { } } -function wasmI32Const(val) { - let bytes = [kExprI32Const]; - for (let i = 0; i < 4; ++i) { - bytes.push(0x80 | ((val >> (7 * i)) & 0x7f)); +function wasmSignedLeb(val, max_len = 5) { + let res = []; + for (let i = 0; i < max_len; ++i) { + let v = val & 0x7f; + // If {v} sign-extended from 7 to 32 bits is equal to val, we are done. + if (((v << 25) >> 25) == val) { + res.push(v); + return res; + } + res.push(v | 0x80); + val = val >> 7; } - bytes.push((val >> (7 * 4)) & 0x7f); - return bytes; + throw new Error( + 'Leb value <' + val + '> exceeds maximum length of ' + max_len); +} + +function wasmI32Const(val) { + return [kExprI32Const, ...wasmSignedLeb(val, 5)]; } function wasmF32Const(f) { diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html index c5179a72c9d..65f89b3e04c 100644 --- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html @@ -5,6 +5,7 @@ <title>reverse running animation</title> <link rel="match" href="reverse-running-animation-ref.html"> <script src="/common/reftest-wait.js"></script> +<script src="../../testcommon.js"></script> <style> #box, #overlay { /* Add a border to ensure that anti-aliasing does not leak blue pixels @@ -44,24 +45,25 @@ </p> </body> <script> - onload = function() { + onload = async function() { // Double rAF to ensure that we are not bogged down during initialization // and the compositor is ready. - requestAnimationFrame(() => { - requestAnimationFrame(() => { - const elem = document.getElementById('box'); - const anim = elem.animate([ - { transform: 'translateX(100px)' }, - { transform: 'translateX(100px)' }, - { transform: 'translateX(200px)' }, - { transform: 'translateX(200px)' } - ], { - duration: 1000 - }); - setTimeout(() => { + waitForAnimationFrames(2).then(() => { + const elem = document.getElementById('box'); + const anim = elem.animate([ + { transform: 'translateX(100px)' }, + { transform: 'translateX(100px)', offset: 0.49 }, + { transform: 'translateX(200px)', offset: 0.51 }, + { transform: 'translateX(200px)' } + ], { + duration: 10000, + }); + anim.ready.then(() => { + anim.currentTime = 5000; + requestAnimationFrame(() => { anim.reverse(); - }, 500); - takeScreenshotDelayed(900); + takeScreenshotDelayed(1000); + }); }); }); }; diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html index 0522c43b16a..a1f9e4f3ace 100644 --- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html @@ -97,8 +97,8 @@ promise_test(async t => { promise_test(async t => { const animation = createDiv(t).animate(null, 100 * MS_PER_SEC); - animation.currentTime = 50 * MS_PER_SEC; await animation.ready; + animation.currentTime = 50 * MS_PER_SEC; animation.playbackRate = 0; // Ensure that current time does not drift. assert_equals(animation.playState, 'running'); diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html index 1c842f5c7b6..4e53828c310 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html @@ -12,11 +12,21 @@ }, 'NDEFMessage constructor without init dict'); test(() => { - const message = new NDEFMessage(null); - assert_equals(message.records.length, 0, 'empty records'); + assert_throws(new TypeError, () => new NDEFMessage(null), + 'NDEFMessageInit#records is a required field.'); }, 'NDEFMessage constructor with null init dict'); test(() => { + assert_throws(new TypeError, () => new NDEFMessage({dummy_key: 'dummy_value'}), + 'NDEFMessageInit#records is a required field.'); + }, 'NDEFMessage constructor without NDEFMessageInit#records field'); + + test(() => { + assert_throws(new TypeError, () => new NDEFMessage({records: []}), + 'NDEFMessageInit#records should not be empty.'); + }, 'NDEFMessage constructor with NDEFMessageInit#records being empty'); + + test(() => { const message = new NDEFMessage( createMessage([createTextRecord(test_text_data)])); assert_equals(message.records.length, 1, 'one text record'); diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html index a9b1d751617..17b9fdb8569 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html @@ -207,4 +207,27 @@ nfc_test(async (t, mockNFC) => { }, "Test that NDEFReader.onreading should be fired on an unformatted NFC tag \ with empty records array for NDEFMessage."); +nfc_test(async (t, mockNFC) => { + const reader = new NDEFReader(); + const controller = new AbortController(); + const message = createMessage([createTextRecord(test_text_data), + createMimeRecordFromJson(test_json_data), + createMimeRecord(test_buffer_data), + createUnknownRecord(test_buffer_data), + createUrlRecord(test_url_data), + createUrlRecord(test_url_data, true), + createRecord('w3.org:xyz', test_buffer_data)], + test_message_origin); + const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]); + const promise = readerWatcher.wait_for("reading").then(event => { + assert_equals(event.serialNumber, fake_tag_serial_number); + assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message)); + controller.abort(); + }); + await reader.scan({signal : controller.signal}); + + mockNFC.setReadingMessage(message); + await promise; +}, "Test that reading message with multiple records should succeed."); + </script> diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html index cc56f8a18bd..5427b75ae2b 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html @@ -12,6 +12,12 @@ }, 'NDEFReadingEvent constructor without init dict'); test(() => { + assert_throws(new TypeError, () => new NDEFReadingEvent('type', + {serialNumber: '', message: null}), + 'NDEFMessageInit#records is a required field.'); + }, 'NDEFReadingEvent constructor failed to construct its NDEFMessage'); + + test(() => { const message = createMessage([createMimeRecordFromJson(test_buffer_data)]); const event = new NDEFReadingEvent('type', {serialNumber: null, message: message}); assert_equals(event.serialNumber, '', 'serialNumber'); @@ -24,11 +30,6 @@ }, 'NDEFReadingEvent constructor with serialNumber not present'); test(() => { - const event = new NDEFReadingEvent('type', {serialNumber: '', message: null}); - assert_equals(0, event.message.records.length, 'no records'); - }, 'NDEFReadingEvent constructor with null message'); - - test(() => { const message = createMessage([createMimeRecord(test_buffer_data)]); const event = new NDEFReadingEvent('type', {serialNumber: '', message: message}); assert_equals(event.type, 'type', 'type'); diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html index d46503ab172..2da7ca91078 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html @@ -13,10 +13,15 @@ test(() => { assert_throws(new TypeError, () => new NDEFRecord(null), - 'The record has neither type nor data.'); + 'NDEFRecordInit#recordType is a required field.'); }, 'NDEFRecord constructor with null init dict'); test(() => { + assert_throws(new TypeError, () => new NDEFRecord({id: test_record_id, data: test_text_data}), + 'NDEFRecordInit#recordType is a required field.'); + }, 'NDEFRecord constructor without NDEFRecordInit#recordType field'); + + test(() => { assert_throws(new TypeError, () => new NDEFRecord( createRecord('empty', test_text_data, test_record_id)), 'id does not apply for empty record type.'); @@ -260,15 +265,15 @@ test(() => { assert_throws(new TypeError, () => new NDEFRecord( - createRecord('foo.eXamPle.coM:bAr*-', "A string is not a BufferSource or NDEFMessage")), + createRecord('foo.eXamPle.com:bAr*-', "A string is not a BufferSource or NDEFMessage")), 'Only BufferSource and NDEFMessage are allowed to be the record data.'); let buffer = new ArrayBuffer(4); new Uint8Array(buffer).set([1, 2, 3, 4]); // Feed ArrayBuffer. { - const record = new NDEFRecord(createRecord('foo.eXamPle.coM:bAr*-', buffer, test_record_id)); - assert_equals(record.recordType, 'foo.example.com:bAr*-', 'recordType'); + const record = new NDEFRecord(createRecord('foo.eXamPle.com:bAr*-', buffer, test_record_id)); + assert_equals(record.recordType, 'foo.eXamPle.com:bAr*-', 'recordType'); assert_equals(record.mediaType, null, 'mediaType'); assert_equals(record.id, test_record_id, 'id'); assert_array_equals(new Uint8Array(record.data.buffer), [1, 2, 3, 4], @@ -280,8 +285,8 @@ { let buffer_view = new Uint8Array(buffer, 1); const record = new NDEFRecord(createRecord( - 'foo.eXamPle.coM:bAr*-', buffer_view, test_record_id)); - assert_equals(record.recordType, 'foo.example.com:bAr*-', 'recordType'); + 'foo.eXamPle.com:bAr*-', buffer_view, test_record_id)); + assert_equals(record.recordType, 'foo.eXamPle.com:bAr*-', 'recordType'); assert_equals(record.mediaType, null, 'mediaType'); assert_equals(record.id, test_record_id, 'id'); assert_array_equals(new Uint8Array(record.data.buffer), [2, 3, 4], @@ -305,13 +310,23 @@ }, 'NDEFRecord constructor with record type string being treated as case sensitive'); test(() => { + // Length of the external type is 255, OK. + const record = new NDEFRecord(createRecord( + [...Array(251)].map(_ => 'a').join('') + ':xyz', test_buffer_data)); + // Exceeding 255, Throws. assert_throws(new TypeError, () => new NDEFRecord(createRecord( - ':xyz', test_buffer_data)), 'The domain should not be empty.'); + [...Array(252)].map(_ => 'a').join('') + ':xyz', test_buffer_data)), + 'The external type should not be longer than 255.'); + assert_throws(new TypeError, () => new NDEFRecord(createRecord( - '[:xyz', test_buffer_data)), '"[" is not a valid FQDN.'); + 'xyz', test_buffer_data)), 'The external type must have a \':\'.'); + assert_throws(new TypeError, () => new NDEFRecord(createRecord( + ':xyz', test_buffer_data)), 'The domain should not be empty.'); assert_throws(new TypeError, () => new NDEFRecord(createRecord( 'example.com:', test_buffer_data)), 'The type should not be empty.'); assert_throws(new TypeError, () => new NDEFRecord(createRecord( + 'example.com:xyz[', test_buffer_data)), 'The type should not contain \'[\'.'); + assert_throws(new TypeError, () => new NDEFRecord(createRecord( 'example.com:xyz~', test_buffer_data)), 'The type should not contain \'~\'.'); assert_throws(new TypeError, () => new NDEFRecord(createRecord( 'example.com:xyz/', test_buffer_data)), 'The type should not contain \'/\'.'); diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html index a6050b8ff71..cb6b3941410 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html @@ -35,9 +35,6 @@ const invalid_type_messages = // "utf-16", "utf-16le" or "utf-16be". createMessage([createTextRecord(test_text_data, "chinese")]), - // NDEFRecord.lang length for 'text' record must be lower than 64. - createMessage([createTextRecord(test_text_data, undefined /* encoding */, [...Array(64)].map(_ => 'a'))]), - // https://w3c.github.io/web-nfc/#dfn-map-a-url-to-ndef // NDEFRecord must have data. createMessage([createUrlRecord()]), @@ -91,6 +88,10 @@ const invalid_syntax_messages = // Data for 'url' or 'absolute-url' record, must be a valid URL. createMessage([createUrlRecord('Invalid URL:// Data')]), createMessage([createUrlRecord('Invalid URL:// Data', true)]), + + // NDEFRecord.lang length for 'text' record must be lower than 64. + createMessage([createTextRecord(test_text_data, undefined /* encoding */, + [...Array(64)].map(_ => 'a'))]), ]; const invalid_signals = [ @@ -275,7 +276,7 @@ nfc_test(async () => { nfc_test(async (t, mockNFC) => { const writer = new NDEFWriter(); - let message = createMessage([createTextRecord(test_text_data), + const message = createMessage([createTextRecord(test_text_data), createMimeRecordFromJson(test_json_data), createMimeRecord(test_buffer_data), createUnknownRecord(test_buffer_data), @@ -307,9 +308,12 @@ nfc_test(async (t, mockNFC) => { assertNDEFMessagesEqual(buffer_view, mockNFC.pushedMessage()); }, "Test that NDEFWriter.push succeeds when message is ArrayBufferView."); -nfc_test(async () => { +nfc_test(async (t, mockNFC) => { const writer = new NDEFWriter(); await writer.push(createMessage([createRecord('empty')])); + const receivedMessage = mockNFC.pushedMessage(); + assert_equals(receivedMessage.data.length, 1); + assert_equals(receivedMessage.data[0].recordType, 'empty', 'recordType'); }, "NDEFWriter.push with 'empty' record should succeed."); nfc_test(async (t, mockNFC) => { @@ -387,20 +391,6 @@ nfc_test(async (t, mockNFC) => { nfc_test(async (t, mockNFC) => { const writer = new NDEFWriter(); - await writer.push({ records: [{ data: test_text_data}] }); - assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage()); -}, "Test that recordType should be set to 'text' if NDEFRecordInit.record's \ -recordType is undefined and NDEFRecordInit.record's data is DOMString."); - -nfc_test(async (t, mockNFC) => { - const writer = new NDEFWriter(); - await writer.push({ records: [{ data: test_buffer_data}] }); - assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage()); -}, "Test that recordType should be set to 'mime' if NDEFRecordInit.record's \ -recordType is undefined and NDEFRecordInit.record's data is not DOMString."); - -nfc_test(async (t, mockNFC) => { - const writer = new NDEFWriter(); await writer.push({ records: [{ recordType: "mime", data: test_buffer_data }] }); assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage()); }, "Test that mediaType should be set to 'application/octet-stream' if \ @@ -446,4 +436,11 @@ nfc_test(async (t, mockNFC) => { await promise_rejects(t, 'NotAllowedError', p); }, "NDEFWriter.push should fail when there are NDEF records on the NFC device \ and NDEFPushOptions.overwrite is false."); + +nfc_test(async (t, mockNFC) => { + const writer = new NDEFWriter(); + mockNFC.simulateDataTransferFails(); + await promise_rejects(t, 'NetworkError', writer.push(test_text_data)); +}, "NDEFWriter.push should fail with NetworkError when NFC data transfer fails."); + </script> diff --git a/tests/wpt/web-platform-tests/webrtc/RTCDataChannel-close.html b/tests/wpt/web-platform-tests/webrtc/RTCDataChannel-close.html new file mode 100644 index 00000000000..9f43dc93c5b --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/RTCDataChannel-close.html @@ -0,0 +1,75 @@ +<!doctype html> +<meta charset=utf-8> +<meta name="timeout" content="long"> +<title>RTCDataChannel.prototype.close</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="RTCPeerConnection-helper.js"></script> +<script> +'use strict'; + +promise_test(async t => { + let pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + let [channel1, channel2] = await createDataChannelPair(pc1); + let close_handler = new Promise(resolve => { + channel2.onclose = event => { + resolve(); + }; + }); + channel2.addEventListener('error', t.unreached_func()); + channel1.close(); + await close_handler; +}, 'Close datachannel causes onclose to be called'); + +promise_test(async t => { + // This is the same test as above, but using addEventListener + // rather than the "onclose" attribute. + let pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + let [channel1, channel2] = await createDataChannelPair(pc1); + let close_handler = new Promise(resolve => { + channel2.addEventListener('close', event => { + resolve(); + }); + }); + channel2.addEventListener('error', t.unreached_func()); + channel1.close(); + await close_handler; +}, 'Close datachannel causes close event to be called'); + +promise_test(async t => { + let pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + let [channel1, channel2] = await createDataChannelPair(pc1); + let events = []; + let error = null; + let close_handler = new Promise(resolve => { + channel2.addEventListener('close', event => { + events.push('close'); + resolve(); + }); + }); + let error_handler = new Promise((resolve, reject) => { + channel2.addEventListener('error', event => { + events.push('error'); + try { + assert_true(event instanceof RTCErrorEvent); + error = event.error; + } catch (e) { + // Prevent test from hanging when an assert in the error handler fails. + reject('Error event wrong: ' + e); + } + resolve(); + }); + }); + pc1.close(); + await error_handler; + await close_handler; + // Error should fire before close. + assert_array_equals(['error', 'close'], events); + assert_true(error instanceof RTCError); + assert_equals(error.name, 'OperationError'); +}, 'Close peerconnection causes close event and error to be called'); + +</script> diff --git a/tests/wpt/web-platform-tests/webrtc/RTCError.html b/tests/wpt/web-platform-tests/webrtc/RTCError.html index 4d0726093c1..9c7227521ed 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCError.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCError.html @@ -35,8 +35,8 @@ test(() => { test(() => { const error = new RTCError({errorDetail:'data-channel-failure'}, 'message'); - assert_equals(error.name, 'RTCError'); -}, 'RTCError.name is \'RTCError\''); + assert_equals(error.name, 'OperationError'); +}, 'RTCError.name is \'OperationError\''); test(() => { const error = new RTCError({errorDetail:'data-channel-failure'}, 'message'); diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-close.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-close.html new file mode 100644 index 00000000000..74f816bf3fc --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-close.html @@ -0,0 +1,18 @@ +<!doctype html> +<meta charset=utf-8> +<title>RTCPeerConnection.prototype.close</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +'use strict'; + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + pc.onsignalingstatechange = t.unreached_func(); + pc.close(); + assert_true(pc.signalingState === 'closed'); + await new Promise(r => t.step_timeout(r, 100)); + }, 'RTCPeerConnection.close() does not fire signalingstatechange event.'); +</script> diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html index 9ed5808727a..a054a1e8ccc 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html @@ -270,4 +270,22 @@ assert_array_equals(states, ['connecting', 'connected']); }, 'connectionState transitions to connected via connecting'); + + promise_test(async t => { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + const stream = await getNoiseStream({ audio: true }); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + + stream.getTracks().forEach(track => pc1.addTrack(track, stream)); + exchangeIceCandidates(pc1, pc2); + doSignalingHandshake(pc1, pc2); + await listenToIceConnected(pc2); + + pc2.onconnectionstatechange = t.unreached_func(); + pc2.close(); + assert_true(pc2.connectionState === 'closed'); + await new Promise(r => t.step_timeout(r, 100)); + }, 'Closing a PeerConnection should not fire connectionstatechange event'); </script> diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html index 67571895175..af84fe2498c 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html @@ -1205,14 +1205,27 @@ // Wait a little, just in case some stray events fire await new Promise(r => t.step_timeout(r, 100)); - assert_equals(1, countMuteAudio1.count, "Got 1 mute event for pc1's audio track"); - assert_equals(1, countMuteVideo1.count, "Got 1 mute event for pc1's video track"); - assert_equals(1, countMuteAudio2.count, "Got 1 mute event for pc2's audio track"); - assert_equals(1, countMuteVideo2.count, "Got 1 mute event for pc2's video track"); - assert_equals(2, countUnmuteAudio1.count, "Got 2 unmute events for pc1's audio track"); - assert_equals(2, countUnmuteVideo1.count, "Got 2 unmute events for pc1's video track"); - assert_equals(2, countUnmuteAudio2.count, "Got 2 unmute events for pc2's audio track"); - assert_equals(2, countUnmuteVideo2.count, "Got 2 unmute events for pc2's video track"); + // Receiving an RTCP bye should generate a mute event. How often this + // happens depends upon the browser and on timing. Rather than try to + // match an individual browser's current behaviour, this checks to see + // that we receive at least the minimum number of expected mute and + // unmute events. + assert_greater_than_equal(countMuteAudio1.count, 1, + "Expect 1 mute event for pc1's audio track"); + assert_greater_than_equal(countMuteVideo1.count, 1, + "Expect 1 mute event for pc1's video track"); + assert_greater_than_equal(countMuteAudio2.count, 1, + "Expect 1 mute event for pc2's audio track"); + assert_greater_than_equal(countMuteVideo2.count, 1, + "Expect 1 mute event for pc2's video track"); + assert_greater_than_equal(countUnmuteAudio1.count, 2, + "Expect 2 unmute events for pc1's audio track"); + assert_greater_than_equal(countUnmuteVideo1.count, 2, + "Expect 2 unmute events for pc1's video track"); + assert_greater_than_equal(countUnmuteAudio2.count, 2, + "Expect 2 unmute events for pc2's audio track"); + assert_greater_than_equal(countUnmuteVideo2.count, 2, + "Expect 2 unmute events for pc2's video track"); }; const checkStop = async t => { diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js index 863b9945724..38f1364ce03 100644 --- a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js +++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js @@ -5,7 +5,7 @@ // |p1|, |p2| - objects with x, y, z, w components that are floating point numbers // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging -let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") { +const assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") { if (p1 == null && p2 == null) { return; } @@ -33,7 +33,7 @@ let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefi // |p1|, |p2| - objects with x, y, z, w components that are floating point numbers // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging -let assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") { +const assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") { assert_not_equals(p1, null, prefix + "p1 must be non-null"); assert_not_equals(p2, null, prefix + "p2 must be non-null"); @@ -55,10 +55,25 @@ let assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPS } }; +// |t1|, |t2| - objects containing position and orientation. +// |epsilon| - float specifying precision +// |prefix| - string used as a prefix for logging +const assert_transform_approx_equals = function(t1, t2, epsilon = FLOAT_EPSILON, prefix = "") { + if (t1 == null && t2 == null) { + return; + } + + assert_not_equals(t1, null, prefix + "t1 must be non-null"); + assert_not_equals(t2, null, prefix + "t2 must be non-null"); + + assert_point_approx_equals(t1.position, t2.position, epsilon, prefix + "positions must be equal"); + assert_point_approx_equals(t1.orientation, t2.orientation, epsilon, prefix + "orientations must be equal"); +}; + // |m1|, |m2| - arrays of floating point numbers // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging -let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") { +const assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") { if (m1 == null && m2 == null) { return; } @@ -89,13 +104,12 @@ let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, pref m1[mismatched_element], m2[mismatched_element], epsilon, error_message); } -} - +}; // |m1|, |m2| - arrays of floating point numbers // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging -let assert_matrix_significantly_not_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") { +const assert_matrix_significantly_not_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") { if (m1 == null && m2 == null) { return; } @@ -133,13 +147,13 @@ let assert_matrix_significantly_not_equals = function(m1, m2, epsilon = FLOAT_EP assert_unreached(error_message); } -} +}; // |r1|, |r2| - XRRay objects // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging -let assert_ray_approx_equals = function(r1, r2, epsilon = FLOAT_EPSILON, prefix = "") { +const assert_ray_approx_equals = function(r1, r2, epsilon = FLOAT_EPSILON, prefix = "") { assert_point_approx_equals(r1.origin, r2.origin, epsilon, prefix + "origin:"); assert_point_approx_equals(r1.direction, r2.direction, epsilon, prefix + "direction:"); assert_matrix_approx_equals(r1.matrix, r2.matrix, epsilon, prefix + "matrix:"); -} +}; diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants_fake_world.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants_fake_world.js new file mode 100644 index 00000000000..0601f54fce9 --- /dev/null +++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants_fake_world.js @@ -0,0 +1,75 @@ +'use strict'; + +// This file introduces constants used to mock fake world for the purposes of hit test. + +// Generates FakeXRWorldInit dictionary with given dimensions. +// The generated fake world will have floor and front wall treated as planes, +// side walls treated as meshes, and ceiling treated as points. +// width - X axis, in meters +// height - Y axis, in meters +// length - Z axis, in meters +function createFakeWorld(width, height, length) { + // Vertices: + const BOTTOM_LEFT_FRONT = { x: -width/2, y: 0, z: -length/2, w: 1}; + const BOTTOM_RIGHT_FRONT = { x: width/2, y: 0, z: -length/2, w: 1}; + + const TOP_LEFT_FRONT = { x: -width/2, y: height, z: -length/2, w: 1}; + const TOP_RIGHT_FRONT = { x: width/2, y: height, z: -length/2, w: 1}; + + const BOTTOM_LEFT_BACK = { x: -width/2, y: 0, z: length/2, w: 1}; + const BOTTOM_RIGHT_BACK = { x: width/2, y: 0, z: length/2, w: 1}; + + const TOP_LEFT_BACK = { x: -width/2, y: height, z: length/2, w: 1}; + const TOP_RIGHT_BACK = { x: width/2, y: height, z: length/2, w: 1}; + + // Faces: + const FRONT_WALL_AND_FLOOR_FACES = [ + // Front wall: + [BOTTOM_LEFT_FRONT, BOTTOM_RIGHT_FRONT, TOP_RIGHT_FRONT], + [BOTTOM_LEFT_FRONT, TOP_RIGHT_FRONT, TOP_LEFT_FRONT], + // Floor: + [BOTTOM_LEFT_FRONT, BOTTOM_RIGHT_FRONT, BOTTOM_RIGHT_BACK], + [BOTTOM_LEFT_FRONT, BOTTOM_LEFT_BACK, BOTTOM_RIGHT_BACK], + ]; + + const CEILING_FACES = [ + // Ceiling: + [TOP_LEFT_FRONT, TOP_RIGHT_FRONT, TOP_RIGHT_BACK], + [TOP_LEFT_FRONT, TOP_LEFT_BACK, TOP_RIGHT_BACK], + ]; + + const SIDE_WALLS_FACES = [ + // Left: + [BOTTOM_LEFT_FRONT, TOP_LEFT_FRONT, TOP_LEFT_BACK], + [BOTTOM_LEFT_FRONT, BOTTOM_LEFT_BACK, TOP_LEFT_BACK], + // Right: + [BOTTOM_RIGHT_FRONT, TOP_RIGHT_FRONT, TOP_RIGHT_BACK], + [BOTTOM_RIGHT_FRONT, BOTTOM_RIGHT_BACK, TOP_RIGHT_BACK], + ]; + + // Regions: + const FRONT_WALL_AND_FLOOR_REGION = { + type: "plane", + faces: FRONT_WALL_AND_FLOOR_FACES, + }; + + const SIDE_WALLS_REGION = { + type: "mesh", + faces: SIDE_WALLS_FACES, + }; + + const CEILING_REGION = { + type: "point", + faces: CEILING_FACES, + }; + + return { + hitTestRegions : [ + FRONT_WALL_AND_FLOOR_REGION, + SIDE_WALLS_REGION, + CEILING_REGION, + ] + }; +} + +const VALID_FAKE_WORLD = createFakeWorld(5.0, 2.0, 5.0); diff --git a/tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html b/tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html index a314f6b55a2..3098fb64936 100644 --- a/tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html @@ -3,6 +3,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="resources/webxr_util.js"></script> <script src="resources/webxr_test_constants.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -12,18 +13,6 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; let testFunction = (session, fakeDeviceController, t) => new Promise((resolve, reject) => { - function assert_point_approx_equals(a, b) { - assert_approx_equals(a.x, b.x, FLOAT_EPSILON); - assert_approx_equals(a.y, b.y, FLOAT_EPSILON); - assert_approx_equals(a.z, b.z, FLOAT_EPSILON); - assert_approx_equals(a.w, b.w, FLOAT_EPSILON); - }; - - function assert_transform_approx_equals(a, b) { - assert_point_approx_equals(a.position, b.position); - assert_point_approx_equals(a.orientation, b.orientation); - }; - // An identity transform should be equal to it's inverse. let identity_transform = new XRRigidTransform(); t.step(() => { diff --git a/tests/wpt/web-platform-tests/xhr/resources/parse-headers.py b/tests/wpt/web-platform-tests/xhr/resources/parse-headers.py index fdc626539e8..c661f22c3e9 100644 --- a/tests/wpt/web-platform-tests/xhr/resources/parse-headers.py +++ b/tests/wpt/web-platform-tests/xhr/resources/parse-headers.py @@ -1,10 +1,6 @@ -import json - def main(request, response): - content = "" if "my-custom-header" in request.GET: val = request.GET.first("my-custom-header") response.headers.set("My-Custom-Header", val) - return content |