diff options
482 files changed, 13345 insertions, 2655 deletions
diff --git a/ports/libmlservo/src/lib.rs b/ports/libmlservo/src/lib.rs new file mode 100644 index 00000000000..f18136d2dea --- /dev/null +++ b/ports/libmlservo/src/lib.rs @@ -0,0 +1,571 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use egl::egl::EGLContext; +use egl::egl::EGLDisplay; +use egl::egl::EGLSurface; +use egl::egl::MakeCurrent; +use egl::egl::SwapBuffers; +use libc::{dup2, pipe, read}; +use log::info; +use log::warn; +use rust_webvr::api::MagicLeapVRService; +use servo::euclid::Scale; +use servo::keyboard_types::Key; +use servo::servo_url::ServoUrl; +use servo::webrender_api::units::{DeviceIntRect, DevicePixel, DevicePoint, LayoutPixel}; +use simpleservo::{self, deinit, gl_glue, MouseButton, ServoGlue, SERVO}; +use simpleservo::{ + Coordinates, EventLoopWaker, HostTrait, InitOptions, InputMethodType, PromptResult, + VRInitOptions, +}; +use smallvec::SmallVec; +use std::cell::Cell; +use std::ffi::CStr; +use std::ffi::CString; +use std::io::Write; +use std::os::raw::c_char; +use std::os::raw::c_int; +use std::os::raw::c_void; +use std::rc::Rc; +use std::thread; +use std::time::Duration; +use std::time::Instant; +use webxr::magicleap::MagicLeapDiscovery; + +#[repr(u32)] +pub enum MLLogLevel { + Fatal = 0, + Error = 1, + Warning = 2, + Info = 3, + Debug = 4, + Verbose = 5, +} + +#[repr(C)] +#[allow(non_camel_case_types)] +pub enum MLKeyType { + kNone, + kCharacter, + kBackspace, + kShift, + kSpeechToText, + kPageEmoji, + kPageLowerLetters, + kPageNumericSymbols, + kCancel, + kSubmit, + kPrevious, + kNext, + kClear, + kClose, + kEnter, + kCustom1, + kCustom2, + kCustom3, + kCustom4, + kCustom5, +} + +#[repr(transparent)] +#[derive(Clone, Copy)] +pub struct MLLogger(Option<extern "C" fn(MLLogLevel, *const c_char)>); + +#[repr(transparent)] +pub struct MLHistoryUpdate(Option<extern "C" fn(MLApp, bool, bool)>); + +#[repr(transparent)] +pub struct MLURLUpdate(Option<extern "C" fn(MLApp, *const c_char)>); + +#[repr(transparent)] +pub struct MLKeyboard(Option<extern "C" fn(MLApp, bool)>); + +#[repr(transparent)] +#[derive(Clone, Copy)] +pub struct MLApp(*mut c_void); + +const LOG_LEVEL: log::LevelFilter = log::LevelFilter::Info; + +fn call<F, T>(f: F) -> Result<T, &'static str> +where + F: FnOnce(&mut ServoGlue) -> Result<T, &'static str>, +{ + SERVO.with(|s| match s.borrow_mut().as_mut() { + Some(ref mut s) => (f)(s), + None => Err("Servo is not available in this thread"), + }) +} + +#[no_mangle] +pub unsafe extern "C" fn init_servo( + ctxt: EGLContext, + surf: EGLSurface, + disp: EGLDisplay, + landscape: bool, + app: MLApp, + logger: MLLogger, + history_update: MLHistoryUpdate, + url_update: MLURLUpdate, + keyboard: MLKeyboard, + url: *const c_char, + default_args: *const c_char, + width: u32, + height: u32, + hidpi: f32, +) -> *mut ServoInstance { + redirect_stdout_to_log(logger); + let _ = log::set_boxed_logger(Box::new(logger)); + log::set_max_level(LOG_LEVEL); + + let gl = gl_glue::egl::init().expect("EGL initialization failure"); + + let coordinates = Coordinates::new( + 0, + 0, + width as i32, + height as i32, + width as i32, + height as i32, + ); + + let mut url = CStr::from_ptr(url).to_str().unwrap_or("about:blank"); + + // If the URL has a space in it, then treat everything before the space as arguments + let args = if let Some(i) = url.rfind(' ') { + let (front, back) = url.split_at(i); + url = back; + front.split(' ').map(|s| s.to_owned()).collect() + } else if !default_args.is_null() { + CStr::from_ptr(default_args) + .to_str() + .unwrap_or("") + .split(' ') + .map(|s| s.to_owned()) + .collect() + } else { + Vec::new() + }; + + info!("got args: {:?}", args); + + let vr_init = if !landscape { + let name = String::from("Magic Leap VR Display"); + let (service, heartbeat) = MagicLeapVRService::new(name, ctxt, gl.gl_wrapper.clone()) + .expect("Failed to create VR service"); + let service = Box::new(service); + let heartbeat = Box::new(heartbeat); + VRInitOptions::VRService(service, heartbeat) + } else { + VRInitOptions::None + }; + + let xr_discovery: Option<Box<dyn webxr_api::Discovery>> = if !landscape { + let discovery = MagicLeapDiscovery::new(ctxt, gl.gl_wrapper.clone()); + Some(Box::new(discovery)) + } else { + None + }; + + let opts = InitOptions { + args, + density: hidpi, + xr_discovery, + coordinates, + gl_context_pointer: Some(ctxt), + native_display_pointer: Some(disp), + ..Default::default() + }; + let wakeup = Box::new(EventLoopWakerInstance); + let shut_down_complete = Rc::new(Cell::new(false)); + let callbacks = Box::new(HostCallbacks { + app, + ctxt, + surf, + disp, + landscape, + shut_down_complete: shut_down_complete.clone(), + history_update, + url_update, + keyboard, + }); + info!("Starting servo"); + simpleservo::init(opts, gl.gl_wrapper, wakeup, callbacks).expect("error initializing Servo"); + + let result = Box::new(ServoInstance { + scroll_state: ScrollState::TriggerUp, + scroll_scale: Scale::new(SCROLL_SCALE / hidpi), + shut_down_complete, + }); + Box::into_raw(result) +} + +#[no_mangle] +pub unsafe extern "C" fn heartbeat_servo(_servo: *mut ServoInstance) { + let _ = call(|s| s.perform_updates()); +} + +#[no_mangle] +pub unsafe extern "C" fn keyboard_servo( + _servo: *mut ServoInstance, + key_code: char, + key_type: MLKeyType, +) { + let key = match key_type { + MLKeyType::kCharacter => Key::Character([key_code].iter().collect()), + MLKeyType::kBackspace => Key::Backspace, + MLKeyType::kEnter => Key::Enter, + _ => return, + }; + // TODO: can the ML1 generate separate press and release events? + let key2 = key.clone(); + let _ = call(move |s| s.key_down(key2)); + let _ = call(move |s| s.key_up(key)); +} + +// Some magic numbers. + +// How far does the cursor have to move for it to count as a drag rather than a click? +// (In device pixels squared, to avoid taking a sqrt when calculating move distance.) +const DRAG_CUTOFF_SQUARED: f32 = 900.0; + +// How much should we scale scrolling by? +const SCROLL_SCALE: f32 = 3.0; + +#[no_mangle] +pub unsafe extern "C" fn move_servo(servo: *mut ServoInstance, x: f32, y: f32) { + // Servo's cursor was moved + if let Some(servo) = servo.as_mut() { + let point = DevicePoint::new(x, y); + match servo.scroll_state { + ScrollState::TriggerUp => { + servo.scroll_state = ScrollState::TriggerUp; + let _ = call(|s| s.mouse_move(x, y)); + }, + ScrollState::TriggerDown(start) + if (start - point).square_length() < DRAG_CUTOFF_SQUARED => + { + return; + }, + ScrollState::TriggerDown(start) => { + servo.scroll_state = ScrollState::TriggerDragging(start, point); + let _ = call(|s| s.mouse_move(x, y)); + let delta = (point - start) * servo.scroll_scale; + let start = start.to_i32(); + let _ = call(|s| s.scroll_start(delta.x, delta.y, start.x, start.y)); + }, + ScrollState::TriggerDragging(start, prev) => { + servo.scroll_state = ScrollState::TriggerDragging(start, point); + let _ = call(|s| s.mouse_move(x, y)); + let delta = (point - prev) * servo.scroll_scale; + let start = start.to_i32(); + let _ = call(|s| s.scroll(delta.x, delta.y, start.x, start.y)); + }, + } + } +} + +#[no_mangle] +pub unsafe extern "C" fn trigger_servo(servo: *mut ServoInstance, x: f32, y: f32, down: bool) { + // Servo was triggered + if let Some(servo) = servo.as_mut() { + let point = DevicePoint::new(x, y); + match servo.scroll_state { + ScrollState::TriggerUp if down => { + servo.scroll_state = ScrollState::TriggerDown(point); + let _ = call(|s| s.mouse_down(x, y, MouseButton::Left)); + }, + ScrollState::TriggerDown(start) if !down => { + servo.scroll_state = ScrollState::TriggerUp; + let _ = call(|s| s.mouse_up(start.x, start.y, MouseButton::Left)); + let _ = call(|s| s.click(start.x as f32, start.y as f32)); + let _ = call(|s| s.mouse_move(start.x, start.y)); + }, + ScrollState::TriggerDragging(start, prev) if !down => { + servo.scroll_state = ScrollState::TriggerUp; + let delta = (point - prev) * servo.scroll_scale; + let start = start.to_i32(); + let _ = call(|s| s.scroll_end(delta.x, delta.y, start.x, start.y)); + let _ = call(|s| s.mouse_up(x, y, MouseButton::Left)); + }, + _ => return, + } + } +} + +#[no_mangle] +pub unsafe extern "C" fn traverse_servo(_servo: *mut ServoInstance, delta: i32) { + // Traverse the session history + if delta == 0 { + let _ = call(|s| s.reload()); + } else if delta < 0 { + let _ = call(|s| s.go_back()); + } else { + let _ = call(|s| s.go_forward()); + } +} + +#[no_mangle] +pub unsafe extern "C" fn navigate_servo(_servo: *mut ServoInstance, text: *const c_char) { + let text = CStr::from_ptr(text) + .to_str() + .expect("Failed to convert text to UTF-8"); + let url = ServoUrl::parse(text).unwrap_or_else(|_| { + let mut search = ServoUrl::parse("https://duckduckgo.com") + .expect("Failed to parse search URL") + .into_url(); + search.query_pairs_mut().append_pair("q", text); + ServoUrl::from_url(search) + }); + let _ = call(|s| s.load_uri(url.as_str())); +} + +// Some magic numbers for shutdown +const SHUTDOWN_DURATION: Duration = Duration::from_secs(10); +const SHUTDOWN_POLL_INTERVAL: Duration = Duration::from_millis(100); + +#[no_mangle] +pub unsafe extern "C" fn discard_servo(servo: *mut ServoInstance) { + if let Some(servo) = servo.as_mut() { + let servo = Box::from_raw(servo); + let finish = Instant::now() + SHUTDOWN_DURATION; + let _ = call(|s| s.request_shutdown()); + while !servo.shut_down_complete.get() { + let _ = call(|s| s.perform_updates()); + if Instant::now() > finish { + warn!("Incomplete shutdown."); + } + thread::sleep(SHUTDOWN_POLL_INTERVAL); + } + deinit(); + } +} + +struct HostCallbacks { + ctxt: EGLContext, + surf: EGLSurface, + disp: EGLDisplay, + landscape: bool, + shut_down_complete: Rc<Cell<bool>>, + history_update: MLHistoryUpdate, + url_update: MLURLUpdate, + app: MLApp, + keyboard: MLKeyboard, +} + +impl HostTrait for HostCallbacks { + fn flush(&self) { + // Immersive and landscape apps have different requirements for who calls SwapBuffers. + if self.landscape { + SwapBuffers(self.disp, self.surf); + } + } + + fn make_current(&self) { + MakeCurrent(self.disp, self.surf, self.surf, self.ctxt); + } + + fn prompt_alert(&self, message: String, _trusted: bool) { + warn!("Prompt Alert: {}", message); + } + + fn prompt_ok_cancel(&self, message: String, _trusted: bool) -> PromptResult { + warn!("Prompt not implemented. Cancelled. {}", message); + PromptResult::Secondary + } + + fn prompt_yes_no(&self, message: String, _trusted: bool) -> PromptResult { + warn!("Prompt not implemented. Cancelled. {}", message); + PromptResult::Secondary + } + + fn prompt_input(&self, message: String, default: String, _trusted: bool) -> Option<String> { + warn!("Input prompt not implemented. {}", message); + Some(default) + } + + fn on_load_started(&self) {} + fn on_load_ended(&self) {} + fn on_title_changed(&self, _title: String) {} + fn on_allow_navigation(&self, _url: String) -> bool { + true + } + fn on_url_changed(&self, url: String) { + if let Ok(cstr) = CString::new(url.as_str()) { + if let Some(url_update) = self.url_update.0 { + url_update(self.app, cstr.as_ptr()); + } + } + } + + fn on_history_changed(&self, can_go_back: bool, can_go_forward: bool) { + if let Some(history_update) = self.history_update.0 { + history_update(self.app, can_go_back, can_go_forward); + } + } + + fn on_animating_changed(&self, _animating: bool) {} + + fn on_shutdown_complete(&self) { + self.shut_down_complete.set(true); + } + + fn on_ime_show( + &self, + _input_type: InputMethodType, + _text: Option<(String, i32)>, + _multiline: bool, + _bounds: DeviceIntRect, + ) { + if let Some(keyboard) = self.keyboard.0 { + keyboard(self.app, true) + } + } + + fn on_ime_hide(&self) { + if let Some(keyboard) = self.keyboard.0 { + keyboard(self.app, false) + } + } + + fn get_clipboard_contents(&self) -> Option<String> { + None + } + + fn set_clipboard_contents(&self, _contents: String) {} + + fn on_devtools_started(&self, port: Result<u16, ()>) { + match port { + Ok(p) => info!("Devtools Server running on port {}", p), + Err(()) => error!("Error running Devtools server"), + } + } +} + +pub struct ServoInstance { + scroll_state: ScrollState, + scroll_scale: Scale<f32, DevicePixel, LayoutPixel>, + shut_down_complete: Rc<Cell<bool>>, +} + +#[derive(Clone, Copy)] +enum ScrollState { + TriggerUp, + TriggerDown(DevicePoint), + TriggerDragging(DevicePoint, DevicePoint), +} + +struct EventLoopWakerInstance; + +impl EventLoopWaker for EventLoopWakerInstance { + fn clone_box(&self) -> Box<dyn EventLoopWaker> { + Box::new(EventLoopWakerInstance) + } + + fn wake(&self) {} +} + +impl log::Log for MLLogger { + fn enabled(&self, metadata: &log::Metadata) -> bool { + metadata.level() <= LOG_LEVEL + } + + fn log(&self, record: &log::Record) { + if let Some(log) = self.0 { + let lvl = match record.level() { + log::Level::Error => MLLogLevel::Error, + log::Level::Warn => MLLogLevel::Warning, + log::Level::Info => MLLogLevel::Info, + log::Level::Debug => MLLogLevel::Debug, + log::Level::Trace => MLLogLevel::Verbose, + }; + let mut msg = SmallVec::<[u8; 128]>::new(); + write!(msg, "{}\0", record.args()).unwrap(); + log(lvl, &msg[0] as *const _ as *const _); + } + } + + fn flush(&self) {} +} + +fn redirect_stdout_to_log(logger: MLLogger) { + let log = match logger.0 { + None => return, + Some(log) => log, + }; + + // The first step is to redirect stdout and stderr to the logs. + // We redirect stdout and stderr to a custom descriptor. + let mut pfd: [c_int; 2] = [0, 0]; + unsafe { + pipe(pfd.as_mut_ptr()); + dup2(pfd[1], 1); + dup2(pfd[1], 2); + } + + let descriptor = pfd[0]; + + // Then we spawn a thread whose only job is to read from the other side of the + // pipe and redirect to the logs. + let _detached = thread::spawn(move || { + const BUF_LENGTH: usize = 512; + let mut buf = vec![b'\0' as c_char; BUF_LENGTH]; + + // Always keep at least one null terminator + const BUF_AVAILABLE: usize = BUF_LENGTH - 1; + let buf = &mut buf[..BUF_AVAILABLE]; + + let mut cursor = 0_usize; + + loop { + let result = { + let read_into = &mut buf[cursor..]; + unsafe { + read( + descriptor, + read_into.as_mut_ptr() as *mut _, + read_into.len(), + ) + } + }; + + let end = if result == 0 { + return; + } else if result < 0 { + log( + MLLogLevel::Error, + b"error in log thread; closing\0".as_ptr() as *const _, + ); + return; + } else { + result as usize + cursor + }; + + // Only modify the portion of the buffer that contains real data. + let buf = &mut buf[0..end]; + + if let Some(last_newline_pos) = buf.iter().rposition(|&c| c == b'\n' as c_char) { + buf[last_newline_pos] = b'\0' as c_char; + log(MLLogLevel::Info, buf.as_ptr()); + if last_newline_pos < buf.len() - 1 { + let pos_after_newline = last_newline_pos + 1; + let len_not_logged_yet = buf[pos_after_newline..].len(); + for j in 0..len_not_logged_yet as usize { + buf[j] = buf[pos_after_newline + j]; + } + cursor = len_not_logged_yet; + } else { + cursor = 0; + } + } else if end == BUF_AVAILABLE { + // No newline found but the buffer is full, flush it anyway. + // `buf.as_ptr()` is null-terminated by BUF_LENGTH being 1 less than BUF_AVAILABLE. + log(MLLogLevel::Info, buf.as_ptr()); + cursor = 0; + } else { + cursor = end; + } + } + }); +} diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini new file mode 100644 index 00000000000..58e4780d677 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini @@ -0,0 +1,2 @@ +[color-mix-currentcolor-background-repaint-parent.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini new file mode 100644 index 00000000000..ae7e0461e5b --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini @@ -0,0 +1,2 @@ +[color-mix-currentcolor-background-repaint.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini new file mode 100644 index 00000000000..a6f5e206966 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini @@ -0,0 +1,2 @@ +[color-mix-currentcolor-outline-repaint-parent.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini new file mode 100644 index 00000000000..e7b7f5a85d4 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini @@ -0,0 +1,2 @@ +[color-mix-currentcolor-outline-repaint.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-color/parsing/gamut-mapping.html.ini b/tests/wpt/metadata-layout-2020/css/css-color/parsing/color-mix-out-of-gamut.html.ini index a83221e93e7..f1ebf996f5f 100644 --- a/tests/wpt/metadata/css/css-color/parsing/gamut-mapping.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-color/parsing/color-mix-out-of-gamut.html.ini @@ -1,4 +1,4 @@ -[gamut-mapping.html] +[color-mix-out-of-gamut.html] [Property color value 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL @@ -14,13 +14,13 @@ [Property color value 'color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] + [Property color value 'color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL [Property color value 'color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] + [Property color value 'color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL [Property color value 'color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] @@ -41,26 +41,14 @@ [Property color value 'color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] + [Property color value 'color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL [Property color value 'color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] + [Property color value 'color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL [Property color value 'color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - - [Property color value 'color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-padding-004.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-padding-004.html.ini new file mode 100644 index 00000000000..e025cd0107b --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-padding-004.html.ini @@ -0,0 +1,2 @@ +[percentage-padding-004.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/overlay/animation/overlay-interpolation.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/overlay/animation/overlay-interpolation.html.ini new file mode 100644 index 00000000000..0327458e15a --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-position/overlay/animation/overlay-interpolation.html.ini @@ -0,0 +1,264 @@ +[overlay-interpolation.html] + [CSS Transitions: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (0) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0.1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0.9) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (0) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (0) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (1) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (-1) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (-1) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (0) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (-1) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (0) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (0.5) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (0.5) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (0) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (0.5) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (0) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (0.5) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (1) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (1.5) should be [none\]] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini b/tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini index bf09731b3cd..68f7b709026 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini @@ -490,3 +490,15 @@ [ShadowRoot interface: attribute adoptedStyleSheets] expected: FAIL + + [CSSImportRule interface: attribute layerName] + expected: FAIL + + [CSSImportRule interface: attribute supportsText] + expected: FAIL + + [CSSImportRule interface: sheet.cssRules[0\] must inherit property "layerName" with the proper type] + expected: FAIL + + [CSSImportRule interface: sheet.cssRules[0\] must inherit property "supportsText" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini b/tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini index dd073891148..07f0769fafe 100644 --- a/tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini +++ b/tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini @@ -2,7 +2,13 @@ [readAsDataURL result for Blob with unspecified MIME type] expected: FAIL + [readAsDataURL result for empty Blob] + expected: FAIL + [filereader_readAsDataURL.any.html] [readAsDataURL result for Blob with unspecified MIME type] expected: FAIL + + [readAsDataURL result for empty Blob] + expected: FAIL diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 7df803243c2..b8872017d44 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -1884,6 +1884,13 @@ {} ] ], + "font-features-two-stylesheets-crash.html": [ + "0e6490974c27afe7aff29a22418107890eef45e2", + [ + null, + {} + ] + ], "infinite-size-crash.html": [ "d44cf4a37e26a772a4742a825a7422b795dfc9ee", [ @@ -5593,6 +5600,26 @@ ] } } + }, + "webappapis": { + "scripting": { + "reporterror-in-detached-window-crash.html": [ + "33662caa4d1d1f207daab615d4d1a2796d12d8a5", + [ + null, + {} + ] + ] + }, + "structured-clone": { + "structured-clone-detached-window-crash.html": [ + "75971023d2d79f17ec7f952fd6accf1473780d1f", + [ + null, + {} + ] + ] + } } }, "infrastructure": { @@ -8678,6 +8705,27 @@ {} ] ], + "aria-braillelabel-manual.html": [ + "a0668e8a5016777fb7bde8d2b986cada68fe23cd", + [ + null, + {} + ] + ], + "aria-brailleroledescription-manual.html": [ + "e509c88159bb86033094b8d4f1a5242ef23cd6be", + [ + null, + {} + ] + ], + "aria-brailleroledescription_is_empty-manual.html": [ + "6d24fe641e272011cd2508f3c98dc8651a1335e5", + [ + null, + {} + ] + ], "aria-busy_false-manual.html": [ "70a25082c69a82fcc5bbb09d83a6265e8b982fcf", [ @@ -9120,7 +9168,7 @@ ] ], "aria-keyshortcuts-manual.html": [ - "cbc474343d80e358dbc97a62e0f713d4f1e2af1c", + "5d071cb82df48c3a490342bda761f73c84c94293", [ null, {} @@ -9519,7 +9567,7 @@ ] ], "blockquote-manual.html": [ - "97ae290c4025345c87542c21514c5501a336c8c9", + "13d6859ec0716a45d6e26f6c10492bf346f42f5a", [ null, {} @@ -9554,7 +9602,7 @@ ] ], "caption-manual.html": [ - "00afda60ebf1d48549cd14be8c0db4ad81edb69e", + "68a1af8553db42bd72da7fdac9d0aa32b59713d8", [ null, {} @@ -9624,7 +9672,7 @@ ] ], "deletion-manual.html": [ - "4aed1d3e64b67715e2479fa432c28c3b95c1a476", + "4f6b0d7feb76d4fc21f6cf18c74b8adf849e6a9d", [ null, {} @@ -9834,7 +9882,7 @@ ] ], "insertion-manual.html": [ - "86210664ce7b95881d6bc85a2720235a715d43bc", + "7b5fd8098512174207ed5118d84392a42fc9d780", [ null, {} @@ -9896,6 +9944,13 @@ {} ] ], + "mark-manual.html": [ + "8373fa133da91bc635082589a6b8e3e974256abd", + [ + null, + {} + ] + ], "marquee-manual.html": [ "2c0e9a938561250443055871cc19fa399c6a1fc4", [ @@ -9938,15 +9993,8 @@ {} ] ], - "menuitem_not_owned_by_or_child_of_group-manual.html": [ - "abb582f52014560b756af3dd4530d49595f2e7a8", - [ - null, - {} - ] - ], - "menuitem_owned_by_or_child_of_group-manual.html": [ - "c2c3d7ce4b8d039389569532c188b97cf4faec04", + "menuitem-manual.html": [ + "49c3cacbe82d769482d5178100623cec81840828", [ null, {} @@ -9974,7 +10022,7 @@ ] ], "meter-manual.html": [ - "8010322a62c0721c08692ddd8234e8ca22f38c5d", + "74c8ba807379177dc05ba3f36d5f9bdee36d7bfc", [ null, {} @@ -10037,7 +10085,7 @@ ] ], "paragraph-manual.html": [ - "56a26c8c01a4736e1e2c78436a6d2105bbfb7fce", + "b79f61e0c6ecb7749a8e5fd4d99c086bb14b4469", [ null, {} @@ -10218,6 +10266,13 @@ {} ] ], + "suggestion-manual.html": [ + "f31bcab8defbb01a592ef78403a0645c72fabb03", + [ + null, + {} + ] + ], "superscript-manual.html": [ "5863f9b188ed893c9cddc9f5b80829674fd5f4f1", [ @@ -10289,7 +10344,7 @@ ] ], "time-manual.html": [ - "864cde1df18d5f2e12297545864f44c384b9294f", + "542015953b7760d386f6d2c25650305eb214963c", [ null, {} @@ -30237,7 +30292,7 @@ "css": { "printing": { "animation-timeline-none-with-progress-print.tentative.html": [ - "3939a1df48d7dfab5abc21a824d5d28af1163368", + "c37c1b95ef531a206a52bdfda1f76694d6ace066", [ null, [ @@ -30292,7 +30347,7 @@ ] ], "scroll-timeline-specified-scroller-print.html": [ - "05fab3e46ad22d01d26d5fe5ba90edb4dab798f3", + "dd4add49b0f0946cfbd5e4889c20ce21086af4d7", [ null, [ @@ -59517,6 +59572,19 @@ {} ] ], + "float-in-nested-multicol-001.html": [ + "8e1a257e389d0fdc6a4a69f63b81f32378a7b944", + [ + null, + [ + [ + "/css/reference/blank.html", + "!=" + ] + ], + {} + ] + ], "float-no-content-beside-001.html": [ "f073453ecaf5a884ed11606d05b1b5066f2e50e3", [ @@ -128295,7 +128363,7 @@ {} ] ], - "anchor-scroll-basics.tentative.html": [ + "anchor-scroll-001.html": [ "fa42e33d9266a41e803f427f4bec729a4636a858", [ null, @@ -137100,6 +137168,32 @@ {} ] ], + "color-mix-currentcolor-background-repaint-parent.html": [ + "44399c198862837fcf5f25e9af0cb83c8e62f9cf", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "color-mix-currentcolor-background-repaint.html": [ + "a8f742b6c53effac1e23491fc5a3843c90a82129", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "color-mix-currentcolor-border-repaint-parent.html": [ "5182dd8d0fbd968bff3931a0a32884d7aa4cf6f2", [ @@ -137126,6 +137220,32 @@ {} ] ], + "color-mix-currentcolor-outline-repaint-parent.html": [ + "0d434b1d351e9853426fe99d7f889649eaceda10", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "color-mix-currentcolor-outline-repaint.html": [ + "8892d818f9bbda92b02404347586d5c953d4793c", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css-border-radius-001.html": [ "8b0e2e9a36c67393f0497b174784c5245cee1d7c", [ @@ -153504,6 +153624,19 @@ {} ] ], + "at-supports-selector-file-selector-button.html": [ + "a51e503ef696fc0075234747a709ab8190fcf6d1", + [ + null, + [ + [ + "/css/css-conditional/at-supports-001-ref.html", + "==" + ] + ], + {} + ] + ], "css-supports-001.xht": [ "9221309d45fd637e613a1c11519a09fa105a4830", [ @@ -177033,6 +177166,19 @@ {} ] ], + "percentage-padding-004.html": [ + "ca96e546cc86e6a0c0db1a9884653cdecfab7409", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "percentage-size-subitems-001.html": [ "70f3953052a3a770c6cd15ee169607a00fc452b0", [ @@ -190424,6 +190570,19 @@ {} ] ], + "orthogonal-writing-mode-006.html": [ + "95d124322891aeb89d323fc5425725b32143ccf1", + [ + null, + [ + [ + "/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html", + "==" + ] + ], + {} + ] + ], "parent-repeat-auto-fit-001.html": [ "8ecbccbea64320054f940d9c2e2d31dd028daa14", [ @@ -190683,6 +190842,19 @@ ], {} ] + ], + "writing-directions-002.html": [ + "078d5808b04ad21ce4ed0814691d2842ccd8bc57", + [ + null, + [ + [ + "/css/css-grid/subgrid/writing-directions-002-ref.html", + "==" + ] + ], + {} + ] ] }, "table-grid-item-dynamic-001.html": [ @@ -308059,6 +308231,97 @@ {} ] ], + "2d.layer.render-opportunities.createImageBitmap.html": [ + "4ffcaa3e3c0defe2355eb9c2d8a6886a5c2e097a", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.drawImage.html": [ + "4eb0b6f721b974e013e18fabc9d283ce2b13d20c", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.getImageData.html": [ + "3cf514a03f4f626133733245ce297e2def1d3252", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.putImageData.html": [ + "8da3dafbb7c1d1c16eb357be595bf6c29f7b4a90", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.requestAnimationFrame.html": [ + "889ff5ba09cdf89ec31cc4fbb2d6fb2475a8c552", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.toBlob.html": [ + "908730424a8de315866b819f4f7b3a393a3c0abc", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.toDataURL.html": [ + "152f66a12b3d7d1d94c752a364f5ec9adaeb0269", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html", + "==" + ] + ], + {} + ] + ], "2d.layer.restore-style.html": [ "2537f409d6d99e0175667725ffedd5c384071864", [ @@ -308116,6 +308379,19 @@ ] } ] + ], + "2d.layer.unclosed.html": [ + "788889ee7ef1ca5fe1b33dd011dafa10e9d141df", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.unclosed-expected.html", + "==" + ] + ], + {} + ] ] }, "manual": { @@ -309103,7 +309379,7 @@ "offscreen": { "filters": { "2d.filter.canvasFilterObject.dropShadow.tentative.html": [ - "55f2d2c24b5e712180a7dd78f2cc21f2e7b2dddd", + "18af95c1eebf7b52265943e020416d39d020b555", [ null, [ @@ -309116,7 +309392,7 @@ ] ], "2d.filter.canvasFilterObject.dropShadow.tentative.w.html": [ - "633d202012c4ad6d9dcf61a9776cb375905163f0", + "b94424dd9962c16c76533205c59b6ac18eea2707", [ null, [ @@ -309131,7 +309407,7 @@ }, "layers": { "2d.layer.endlayer.alone.html": [ - "f088c89aa7cb1c678c16bc2f317385254f645007", + "6a0e5cce71719615966c649a1623ed98e27637b6", [ null, [ @@ -309144,7 +309420,7 @@ ] ], "2d.layer.endlayer.alone.w.html": [ - "96c8011550665865f7684aec66c887053ee98ee2", + "ddb2671aaabf37d51b6f4167e8bd16bd2fb88998", [ null, [ @@ -309157,7 +309433,7 @@ ] ], "2d.layer.endlayer.unmatched.html": [ - "a87c7364cfa1069df8269d79aa71a565d951369a", + "b204c49e5eb1d67dd4785b3cd2fc68afb2f90542", [ null, [ @@ -309170,7 +309446,7 @@ ] ], "2d.layer.endlayer.unmatched.w.html": [ - "9507809a528426755f2aa0a3a41c7235b4cfe127", + "2e1cb62c32a94ef4965b7cefdd5489055595acf7", [ null, [ @@ -309183,7 +309459,7 @@ ] ], "2d.layer.global-states.alpha.blending.html": [ - "bb7dd933372556976d06a0f4aac312ccf3874e94", + "71414b4b3790b97ad4947418c4ab9b1b04abcb57", [ null, [ @@ -309196,7 +309472,7 @@ ] ], "2d.layer.global-states.alpha.blending.shadow.html": [ - "70b32e43395d65654062d7471fe1cd7e77906964", + "551df36b15e450b2dee9a11b1933b7498aee7601", [ null, [ @@ -309209,7 +309485,7 @@ ] ], "2d.layer.global-states.alpha.blending.shadow.w.html": [ - "45932d4cd5d182e47a6d588485ed1bde32f266c7", + "6851a4a8468c83939879849ab99484f7603d0222", [ null, [ @@ -309222,7 +309498,7 @@ ] ], "2d.layer.global-states.alpha.blending.w.html": [ - "ff33fc450529c74a612c663b83d40e5a9df584ef", + "618480c813fdd19049284ead5e1ec8f636b1d4c6", [ null, [ @@ -309235,7 +309511,7 @@ ] ], "2d.layer.global-states.alpha.composite.html": [ - "21582189b1d800e96fed5317f92c23090092b0a7", + "94fed5752df2b618e2b34b4ca8a931b024bc1044", [ null, [ @@ -309248,7 +309524,7 @@ ] ], "2d.layer.global-states.alpha.composite.shadow.html": [ - "bb3d886b54fb0ea2f836a991ab88200101269880", + "841742ef1e7fcbd796952d1888d6654db7f543ab", [ null, [ @@ -309261,7 +309537,7 @@ ] ], "2d.layer.global-states.alpha.composite.shadow.w.html": [ - "592f92921b8b6fb97d833c0f2fad37efba7bf52e", + "ef44257c0ad3d57efbe222badd43cc3142115fb0", [ null, [ @@ -309274,7 +309550,7 @@ ] ], "2d.layer.global-states.alpha.composite.w.html": [ - "2359e92790fa03dc25a3fdb4b1a2a9ff74e8415a", + "d7d2b7a21e28596a4b031ee771dff98dc7ce063b", [ null, [ @@ -309287,7 +309563,7 @@ ] ], "2d.layer.global-states.alpha.html": [ - "67a8ae60249f12d79bb424abcec7258da5ce199b", + "63a264e6819fd67841f69bf240da0dcc7dd2a562", [ null, [ @@ -309300,7 +309576,7 @@ ] ], "2d.layer.global-states.alpha.shadow.html": [ - "a67f5872f78f204248ebd6dd5cea041f1a72d24a", + "daa788cd1505083bfcb5e9a2d7b38df84092758b", [ null, [ @@ -309313,7 +309589,7 @@ ] ], "2d.layer.global-states.alpha.shadow.w.html": [ - "35df72aabcd888df0e7b51e118aa931bd4db4a6f", + "f75db3d249068e56a1f44287dee5cbc592a40bba", [ null, [ @@ -309326,7 +309602,7 @@ ] ], "2d.layer.global-states.alpha.w.html": [ - "2db6b64738cb94c675146e298111e63763f1777e", + "694f31e208b3276a0c30c7dc4eb4750e48386f6a", [ null, [ @@ -309339,7 +309615,7 @@ ] ], "2d.layer.global-states.blending.html": [ - "6bcfd2854a607bbaddba85d8c07b4ebb01126dbf", + "6a36bb4ba101ce5e91f0279c95a728e94d808912", [ null, [ @@ -309352,7 +309628,7 @@ ] ], "2d.layer.global-states.blending.shadow.html": [ - "f1e9b7d23a31ae4b3b50cad0bc0d6a16b64f9640", + "9ad87aa0cd2bf7822fbcbda30b26db279bf33a06", [ null, [ @@ -309365,7 +309641,7 @@ ] ], "2d.layer.global-states.blending.shadow.w.html": [ - "1d22e94f6f9e7a9cbb025f9ba2ef246f90a24d85", + "dc52e9e9251329199814103d18923c659c59265f", [ null, [ @@ -309378,7 +309654,7 @@ ] ], "2d.layer.global-states.blending.w.html": [ - "227c72b80ac676eaa38277e78a8479d432bb8c2a", + "8964e97713cd9eea2cdef3904194b3f461fb4be7", [ null, [ @@ -309391,7 +309667,7 @@ ] ], "2d.layer.global-states.composite.html": [ - "9d4d1dce8a422ffc5125ece855e54ff9ee8aeb60", + "84fb4b3d95a199c82d6b556af8a13cce374877ef", [ null, [ @@ -309404,7 +309680,7 @@ ] ], "2d.layer.global-states.composite.shadow.html": [ - "9ad39065c6a32facdbcd0b2cbf1b4383e1447757", + "2e0883f5af81035a80d24ae4ed471ee7f5717051", [ null, [ @@ -309417,7 +309693,7 @@ ] ], "2d.layer.global-states.composite.shadow.w.html": [ - "b45c9d3aadc678748d6982ca904b8e40e3e720fc", + "66d44050581365e7a23943101a2cf55adaf85dfe", [ null, [ @@ -309430,7 +309706,7 @@ ] ], "2d.layer.global-states.composite.w.html": [ - "66493889b20c5c7412cae395e40761b1597ec6c8", + "b695871fcdcfc55469ae9f29983bff485edd76b8", [ null, [ @@ -309443,7 +309719,7 @@ ] ], "2d.layer.global-states.filter.alpha.blending.html": [ - "37d0e3dd1c5543e400cc3a087fcc7437330c4149", + "bf483ccc9259c0ea7edb9ee0ba365190e227da93", [ null, [ @@ -309456,7 +309732,7 @@ ] ], "2d.layer.global-states.filter.alpha.blending.shadow.html": [ - "93278cb5aa380fb59c953a2f3d4c9c4460e05e98", + "d914a70867fa8899c8cd2ec81d2130e10f84d98f", [ null, [ @@ -309469,7 +309745,7 @@ ] ], "2d.layer.global-states.filter.alpha.blending.shadow.w.html": [ - "783693f2c1430e558d23b332d2e6b260bd325134", + "a1acd0d083a4889f95c09e05dc660643ed9c0fd3", [ null, [ @@ -309482,7 +309758,7 @@ ] ], "2d.layer.global-states.filter.alpha.blending.w.html": [ - "53533e4ece628306624a49e871ef9c5b4667ceea", + "47503d5478bb9605f03776c03cf6f6ca057f36a9", [ null, [ @@ -309495,7 +309771,7 @@ ] ], "2d.layer.global-states.filter.alpha.composite.html": [ - "f0af85f8f51fa31982720f87ef4092d88870a29d", + "7d4f8ecda52d36836f8ed2ed0db5ab4889a05dc0", [ null, [ @@ -309508,7 +309784,7 @@ ] ], "2d.layer.global-states.filter.alpha.composite.shadow.html": [ - "46cd28b6c2b8b08875eb4621b283d2d994b26b5f", + "f75bd251ac4378b0dace8e77a2cd1932a3c0c485", [ null, [ @@ -309521,7 +309797,7 @@ ] ], "2d.layer.global-states.filter.alpha.composite.shadow.w.html": [ - "044b75927b399edc9601c3c52159f628fb688073", + "783a04cafbf837b4dc30e2eea562426e2fcd5de9", [ null, [ @@ -309534,7 +309810,7 @@ ] ], "2d.layer.global-states.filter.alpha.composite.w.html": [ - "be25ca66b169c6d873cfbfcac8ad28ba3ec36b22", + "ed8af9a0f1dff1efbf32076bc5d9e90effef3fdf", [ null, [ @@ -309547,7 +309823,7 @@ ] ], "2d.layer.global-states.filter.alpha.html": [ - "6567094376b6a31b375cfa08e6fe4e99991163fb", + "4f8954f978c2971a0b168adbd83092f63427a999", [ null, [ @@ -309560,7 +309836,7 @@ ] ], "2d.layer.global-states.filter.alpha.shadow.html": [ - "3059bf306cd76531ca094ca4fea104af64b54b96", + "0cfa86a0125fcf17661190dc7d1b7621a8008998", [ null, [ @@ -309573,7 +309849,7 @@ ] ], "2d.layer.global-states.filter.alpha.shadow.w.html": [ - "a481073ccfc59b244c0af2ad11b88f3de6e74b2b", + "015fe946338aa0ee4dd76a093a08eae22bb76e08", [ null, [ @@ -309586,7 +309862,7 @@ ] ], "2d.layer.global-states.filter.alpha.w.html": [ - "b5d81078899bcdd88adf63e62a9c52a87ba66262", + "4334fd6c1b067acaf3d2e9fbac52d35d54852f82", [ null, [ @@ -309599,7 +309875,7 @@ ] ], "2d.layer.global-states.filter.blending.html": [ - "a574e82932871d2ffb023962c4d32712cd766a65", + "7f3d1a2cb3c73488cdeda5752de4d53fe582acaf", [ null, [ @@ -309612,7 +309888,7 @@ ] ], "2d.layer.global-states.filter.blending.shadow.html": [ - "4bdf80337f8a93087c2530b6690dbd7b3e84d63e", + "9b9862e57ffa9022f80d9aa6e5ef38fef117e58d", [ null, [ @@ -309625,7 +309901,7 @@ ] ], "2d.layer.global-states.filter.blending.shadow.w.html": [ - "23cd4e834b04f23cca1dafee2659e24000a972ff", + "1d7e74b64eb53aee1139a399e47f685ee2dfe226", [ null, [ @@ -309638,7 +309914,7 @@ ] ], "2d.layer.global-states.filter.blending.w.html": [ - "bd7a51d89877bb871c8532870549e5e47b3d4794", + "f5ccee1d858b5931063c7f9fde4d2a0a713136fc", [ null, [ @@ -309651,7 +309927,7 @@ ] ], "2d.layer.global-states.filter.composite.html": [ - "663a953a29e2725f46b3a00acb711e150ae7d517", + "2e8272b2bfa963d25937e14c4892b0e764a7deed", [ null, [ @@ -309664,7 +309940,7 @@ ] ], "2d.layer.global-states.filter.composite.shadow.html": [ - "52ad8646f01c2f58cad4e68ad116987cdd765a47", + "077041a29400d15a867258a6c895309c2d592539", [ null, [ @@ -309677,7 +309953,7 @@ ] ], "2d.layer.global-states.filter.composite.shadow.w.html": [ - "bf7139edce6c23f2891d1fecb33ed4a9be622cdb", + "b162354da44529283e62056500ff0d0e9e008b12", [ null, [ @@ -309690,7 +309966,7 @@ ] ], "2d.layer.global-states.filter.composite.w.html": [ - "1f30d1e5644f373683def54c618abd3f19a33aef", + "b4158392660152977a246cb84593f253bbc15ecd", [ null, [ @@ -309703,7 +309979,7 @@ ] ], "2d.layer.global-states.filter.no-global-states.html": [ - "0619faa944ffea351f61b7cd4841b933895868a1", + "ccae63a26ab5682ad02897017d6e8dc3c1302b59", [ null, [ @@ -309716,7 +309992,7 @@ ] ], "2d.layer.global-states.filter.no-global-states.w.html": [ - "3a7168382006be4f6fbc4bd324b87532b578084f", + "6ce768ad2678c701e6c53503d6eac169287639fe", [ null, [ @@ -309729,7 +310005,7 @@ ] ], "2d.layer.global-states.filter.shadow.html": [ - "69120c105e5d17f1d5c6cbd1aa8a3d3a30948e0b", + "9a20e39fd5a22853717fbb91faab13e5eea12ca5", [ null, [ @@ -309742,7 +310018,7 @@ ] ], "2d.layer.global-states.filter.shadow.w.html": [ - "8a770b2911e58e78b66a528bd92c25edb963af05", + "26bdf7558762db5139631eee06dcaf4865b19b05", [ null, [ @@ -309755,7 +310031,7 @@ ] ], "2d.layer.global-states.no-global-states.html": [ - "022736c7b5b46c6eba7b22615cc166eaacf7accb", + "c8a98153816c1ae5f3064e75b7609b95264ce030", [ null, [ @@ -309768,7 +310044,7 @@ ] ], "2d.layer.global-states.no-global-states.w.html": [ - "80ed4e4503d02b12b4c4b6e657935cd451510868", + "db03a3fd0c3c9f820fe5889b27483a4d8f070727", [ null, [ @@ -309781,7 +310057,7 @@ ] ], "2d.layer.global-states.shadow.html": [ - "6402dc5760751d92a0642a1fd55285068fee7106", + "41a832c516e6bb7ff03dd7d802c6965c9ad41ca5", [ null, [ @@ -309794,7 +310070,7 @@ ] ], "2d.layer.global-states.shadow.w.html": [ - "e41e7aee4641bf6d32f5465c622daef21ffb5691", + "7b78f4b739ad8644a7082367bf67b673c951a1c1", [ null, [ @@ -309807,7 +310083,7 @@ ] ], "2d.layer.nested.html": [ - "0c168493c2143cd68e2a21fedbd64a2438e0a6a5", + "9e5b7d5826c17ee5a6c52bbd53a1cbc2b70081e3", [ null, [ @@ -309820,7 +310096,7 @@ ] ], "2d.layer.nested.w.html": [ - "3b81691e06ba27bc1f8f57e14af117ee72677523", + "99e73906096bd8f7f0fb81ddf5aea70853ad05e5", [ null, [ @@ -309832,8 +310108,164 @@ {} ] ], + "2d.layer.render-opportunities.convertToBlob.html": [ + "c1a139a3de8db540284dd7100f11232ccc9aed10", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.convertToBlob.w.html": [ + "404fef3ad6a597ed99a1a66be6e3ff5264644d02", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.createImageBitmap.html": [ + "876b027170edc6d2021dd233299b4256c73b9a92", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.createImageBitmap.w.html": [ + "9a89492e399222bc9252ec92c3336098dc07e070", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.drawImage.html": [ + "dd178206073801c5e0eafda4abc39f25ef4bac71", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.drawImage.w.html": [ + "80fbfbd272ed7ee29497f6a6989a94113c07f5ca", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.getImageData.html": [ + "b6f3c1b5626ffb0f7e75eaadea73651baf3b48de", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.getImageData.w.html": [ + "187eb0fce96bff4c105ce154c1b101a24b3095f1", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.putImageData.html": [ + "b4600156136c3aadb98db5e6a9de4beb54a95a69", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.putImageData.w.html": [ + "9ffac071c36b2e2f85280be0ba511c664e0a42e2", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.transferToImageBitmap.html": [ + "27830644b0553d125995a87055b65b752cfd5b41", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.transferToImageBitmap.w.html": [ + "06e016020db2ed99a47b1c8c336b168735a973ca", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], "2d.layer.restore-style.html": [ - "66f99835df4dbc04adc5ab3aedbf83d3116ee9e5", + "a3593cd2a82748df9db8bd74a67dbc29dcaefb31", [ null, [ @@ -309862,7 +310294,7 @@ ] ], "2d.layer.restore-style.w.html": [ - "a717a1d31222b4f5c7d5f481156a613259660a1f", + "a66fc2bc598344c7c9afc51dbdecbd13935b37a3", [ null, [ @@ -309891,7 +310323,7 @@ ] ], "2d.layer.several-complex.html": [ - "1d50bd4de6160a6fce2fd641236cb7e086cc0d4f", + "c4b50282805374bbee713ae7b9506eccc7d39cce", [ null, [ @@ -309920,7 +310352,7 @@ ] ], "2d.layer.several-complex.w.html": [ - "7982a8dbc4fbbee7e3492f7fe269ea3046c30b4b", + "114c5e06868141114c22f830a12fa31673eb5d0a", [ null, [ @@ -309947,6 +310379,32 @@ ] } ] + ], + "2d.layer.unclosed.html": [ + "689ee801cf27dcb8b61e9e89c5655a31708d689b", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.unclosed.w.html": [ + "0c7812e88c7bd34d18ebee8c8730547a4295fe30", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html", + "==" + ] + ], + {} + ] ] } } @@ -320900,6 +321358,19 @@ }, "scroll-animations": { "css": { + "animation-range-visual-test.html": [ + "f675f5108aec2ef2eb27793efca6e7e6a88f3324", + [ + null, + [ + [ + "/scroll-animations/css/animation-range-visual-test-ref.html", + "==" + ] + ], + {} + ] + ], "scroll-animation-initial-offset.html": [ "34ae52d47927ee73c9c41c6f608bcd988e8f0cd7", [ @@ -320992,7 +321463,7 @@ ] ], "scroll-timeline-update-reversed-animation.html": [ - "93ad6916ea7df38088093d5c82cb952ba8a65f4c", + "6bc18544f4ac7e61e98d5363520d3abaa1c48564", [ null, [ @@ -321005,7 +321476,7 @@ ] ], "view-timeline-range-update-reversed-animation.html": [ - "c7199161607162d106ba24a4815eb6f9cbbaf6e5", + "960a8e6ecfb90bf9c03178aab3fa8b3047c41dc3", [ null, [ @@ -321018,7 +321489,7 @@ ] ], "view-timeline-range-update.html": [ - "e8e761d86ba14e100b00758e52f5956cf4c8e340", + "5400d8314b087d479f0a6270c6c0b8c07af5a4a7", [ null, [ @@ -321031,7 +321502,7 @@ ] ], "view-timeline-subject-bounds-update.html": [ - "7001eceeaf8f4997d7fb3f8b297eaa3827c537e6", + "2961fedd4258bc60a3a0a9e404e56a4c5bd7dd39", [ null, [ @@ -323451,6 +323922,19 @@ {} ] ], + "pattern-opacity-01.svg": [ + "eb2d2d7e9a9a7776e5ffeeaf51ba992204a70fc4", + [ + null, + [ + [ + "/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg", + "==" + ] + ], + {} + ] + ], "pattern-viewbox-01.svg": [ "618b8fc29e69d2624d5556d6bbcdba600ce21a4a", [ @@ -328280,7 +328764,7 @@ }, "support": { ".azure-pipelines.yml": [ - "7851cd61e1f3e1ade11251758ac89831fbf80318", + "a21ebce6bc7abf9ab36066631637fc8ccbae23f7", [] ], ".gitattributes": [ @@ -331624,7 +332108,15 @@ [] ] }, + "accept-ch.wildcard.https.sub.html.sub.headers": [ + "66ad9243c7dc54e59052fa4fe64124cd63d0e84e", + [] + ], "critical-ch": { + "critical-ch.navigation-timing.restart.https.html.headers": [ + "b221a32886fffa1fd8dc5562fa211b8446db835b", + [] + ], "resources": { "echo-critical-hint.py": [ "a5c5160f7503ea3644b6d2deb9827994025c1af9", @@ -331773,6 +332265,14 @@ "f5beb4c3654c53ed136374519516505593b24a0b", [] ], + "accept-ch.wildcard.iframe.https.sub.html": [ + "250a9d9e2247db9c9d8bd65e11141ff2e4ff5087", + [] + ], + "accept-ch.wildcard.iframe.https.sub.html.sub.headers": [ + "c1c0fcd5c2ae6298f124de4ec74a05bd29d47ea8", + [] + ], "clienthintslist.py": [ "3d1f7caf4680fcdff15995aa08a31630f547e8f6", [] @@ -332023,6 +332523,10 @@ "6e555e3b197ce2f448f59d61e1488a0175490145", [] ], + "page.html": [ + "35bde8e5016bd3ff045ebe8cc3e0e39b08d90dc1", + [] + ], "user-activation.js": [ "ed294bb9cb27b552f23061118fcd260dc6b86a8f", [] @@ -332201,7 +332705,7 @@ [] ], "rendering-utils.js": [ - "8027cd5f8484702c35348eaf8b405684915cf283", + "46283bd5d078a14922e24160053017b6e8cb072c", [] ], "sab.js": [ @@ -350995,7 +351499,7 @@ [] ], "testharness-helper.sub.js": [ - "4adc52169612c91237460e9f6b04fc86171eba6d", + "7d2307ebbc974446d59fd7b023fe9f7ce088c193", [] ] } @@ -352969,6 +353473,10 @@ "72fa50e66ebf5b552e930f63ce06e93298f1fdcb", [] ], + "list-cookies-for-script.py": [ + "b325d1f7450faaf9a932b48f8699a49a7221f88f", + [] + ], "list.py": [ "4cb6639659abb611a5f3245f4e437f2544664b24", [] @@ -373031,6 +373539,22 @@ "10324966edb042c1c7298ce22dad76766c2a777b", [] ], + "color-mix-currentcolor-background-repaint-expected.xht": [ + "05a13794482a94f6c10bd9d4c98704e63ef60331", + [] + ], + "color-mix-currentcolor-background-repaint-parent-expected.xht": [ + "05a13794482a94f6c10bd9d4c98704e63ef60331", + [] + ], + "color-mix-currentcolor-outline-repaint-expected.xht": [ + "05a13794482a94f6c10bd9d4c98704e63ef60331", + [] + ], + "color-mix-currentcolor-outline-repaint-parent-expected.xht": [ + "05a13794482a94f6c10bd9d4c98704e63ef60331", + [] + ], "document-canvas-remove-body-ref.html": [ "8612aaafa99b6805690766d4ac5f910a695a7991", [] @@ -388788,6 +389312,10 @@ "f8fa0ab81b9fecee6d9efbb8f20e4af4cd1d89ad", [] ], + "orthogonal-writing-mode-006-ref.html": [ + "2bf12f083fe9f8da36076dcc27413c599b43a076", + [] + ], "parent-repeat-auto-fit-001-ref.html": [ "2217497cd2bf1813ecb585564788b81488079b85", [] @@ -388847,6 +389375,10 @@ "writing-directions-001-ref.html": [ "90612516889e8feb5b5b0ce6820b44d8531ab8be", [] + ], + "writing-directions-002-ref.html": [ + "cd1ee527ab1053bc5aa4b3e10466b09cfaa605e0", + [] ] }, "support": { @@ -413835,6 +414367,10 @@ "1b63235b7cdffe9ebb43bfac3a01d5220e1519fb", [] ], + "automatic-beacon-store.py": [ + "f783c8530c4386321c6da8e7be1ff4732074917d", + [] + ], "background-fetch-inner.https.html": [ "1bca25a957a3fe4069df838a5b7cbaa42e813f9b", [] @@ -414112,7 +414648,7 @@ [] ], "fledge-bidding-logic.js": [ - "c19cc1d0337472981283e3e729c93d8f4328f2b1", + "ab6685f1842db5b7e76a1c9f8443125c500e5c37", [] ], "fledge-bidding-logic.js.headers": [ @@ -414532,7 +415068,7 @@ [] ], "utils.js": [ - "2263fc1db18ecddd9674b5b7b6b65e8456670058", + "4638f37cbb1576e4b85e98616cf1c159a79e3d95", [] ], "web-bluetooth-inner.html": [ @@ -417475,6 +418011,12 @@ [] ] }, + "graphics-aria": { + "META.yml": [ + "692db91315ef759184fa1e4b7e259a9af40f3686", + [] + ] + }, "gyroscope": { "Gyroscope-disabled-by-feature-policy.https.html.headers": [ "3d91d5840be655ce477c46b3456b2fbe9cd3a3a2", @@ -420301,6 +420843,34 @@ "65525d4d6a23db56e5717147a60fa8e22d0519a2", [] ], + "2d.layer.render-opportunities.createImageBitmap-expected.html": [ + "8ce0c51e8e4f8dbea647b19b75b86c0e53415b25", + [] + ], + "2d.layer.render-opportunities.drawImage-expected.html": [ + "1ddc6d1b44964c2fe9708be8a7cc9262eea3273a", + [] + ], + "2d.layer.render-opportunities.getImageData-expected.html": [ + "ea0e78e0f28b02dffada148b1cb0872bfc6b7a26", + [] + ], + "2d.layer.render-opportunities.putImageData-expected.html": [ + "3d63bbe776672c9af514714ca96446179eb72eb2", + [] + ], + "2d.layer.render-opportunities.requestAnimationFrame-expected.html": [ + "138f3a7ccbb11c075119245fdbce9e9feba7265f", + [] + ], + "2d.layer.render-opportunities.toBlob-expected.html": [ + "fda8e8d7c6da225d60ef5de884ba4cbd2d5117c1", + [] + ], + "2d.layer.render-opportunities.toDataURL-expected.html": [ + "22a9770331d82a0965e6f06f4f98dfe8c681da09", + [] + ], "2d.layer.restore-style-expected.html": [ "1d0ac3558d1d4c15609c364a6e5678ed329fa272", [] @@ -420308,6 +420878,10 @@ "2d.layer.several-complex-expected.html": [ "84ad6244740e997d62cd0bdf4f017a7a6c15d713", [] + ], + "2d.layer.unclosed-expected.html": [ + "c41b253c95ba2b4f970b6ae59b58e444df14d866", + [] ] }, "manual": { @@ -421151,6 +421725,30 @@ "65525d4d6a23db56e5717147a60fa8e22d0519a2", [] ], + "2d.layer.render-opportunities.convertToBlob-expected.html": [ + "1e61775165527caed9da4cb1cde38f6a09438904", + [] + ], + "2d.layer.render-opportunities.createImageBitmap-expected.html": [ + "8ce0c51e8e4f8dbea647b19b75b86c0e53415b25", + [] + ], + "2d.layer.render-opportunities.drawImage-expected.html": [ + "1ddc6d1b44964c2fe9708be8a7cc9262eea3273a", + [] + ], + "2d.layer.render-opportunities.getImageData-expected.html": [ + "ea0e78e0f28b02dffada148b1cb0872bfc6b7a26", + [] + ], + "2d.layer.render-opportunities.putImageData-expected.html": [ + "3d63bbe776672c9af514714ca96446179eb72eb2", + [] + ], + "2d.layer.render-opportunities.transferToImageBitmap-expected.html": [ + "2833849da67f06693a228d9d3cec8c5ba56c8a8c", + [] + ], "2d.layer.restore-style-expected.html": [ "1d0ac3558d1d4c15609c364a6e5678ed329fa272", [] @@ -421158,6 +421756,10 @@ "2d.layer.several-complex-expected.html": [ "84ad6244740e997d62cd0bdf4f017a7a6c15d713", [] + ], + "2d.layer.unclosed-expected.html": [ + "c41b253c95ba2b4f970b6ae59b58e444df14d866", + [] ] }, "manual": { @@ -421267,7 +421869,7 @@ [] ], "gentestutilsunion.py": [ - "e923a0777ba2127a84bcc251363b9d02ebc4aee2", + "bf5fdeee506055248a5b94fcad4d036ee697f11a", [] ], "name2dir-canvas.yaml": [ @@ -421283,7 +421885,7 @@ [] ], "templates-new.yaml": [ - "0940471dd4d5f6244b9a08111a930367afb2f726", + "7d8ebfccf565a293138aecc3eaecc54d0176c573", [] ], "templates.yaml": [ @@ -421370,11 +421972,11 @@ [] ], "filters.yaml": [ - "292dfcc0ec7aa92afcba9eb8d6506517c229e634", + "dd84f913f9ba04480759b9f2010006e97902f13d", [] ], "layers.yaml": [ - "d398ef2b5a2a62aed4d675a2cb71b9d7a5e805e1", + "fe1902c61b7548a33e8b6d39c35c0c4ce270e85c", [] ], "line-styles.yaml": [ @@ -422045,7 +422647,7 @@ [] ], "iframe-test.js": [ - "a18688caf786bb54d19df621b984dad3f9c1d411", + "f788cbd1ebdb7a76dff082d0a59649bf756310b2", [] ], "popup-test.js": [ @@ -422131,12 +422733,16 @@ "d5c99062d2bb8f9660b68c172754867b598ed43f", [] ], + "reporting-bcg-reuse.https.html.sub.headers": [ + "33abadd83dd9187bfa5ecf811f9fef7058412780", + [] + ], "reporting-from-rp-ro.https.html.sub.headers": [ - "424ad3e8de0297a2e66dd53914f0e5faa8651bff", + "07ecad96f2493c7ddc70cc5f37d242c07f0cabb1", [] ], "reporting-from-rp.https.html.sub.headers": [ - "6339ea34c7045eabe7457cf0c170edd35ea2ba76", + "a61e2919c8acb6be886ef16e764f1ba5dcabe9bc", [] ], "reporting-to-rp-ro.https.html.headers": [ @@ -428615,10 +429221,16 @@ [] ], "attributes-common-to-form-controls": { - "dirname-ltr-iframe.html": [ - "b5ed7e3d9a717746d9653c7d5f867f3acbf3e47f", - [] - ] + "resources": { + "dirname-iframe.html": [ + "b5ed7e3d9a717746d9653c7d5f867f3acbf3e47f", + [] + ], + "dirname.js": [ + "f0e97bc30142bcf4ee0429283486091203b2c220", + [] + ] + } }, "constraints": { "support": { @@ -429359,12 +429971,16 @@ [] ], "resources": { + "popover-hover-hide-common.js": [ + "9f407ef157d8a4f86c2787ed27e73e07dfb3b129", + [] + ], "popover-styles.css": [ "df683c3c64f4de11c49c14b9dc53cc4165dff4a7", [] ], "popover-utils.js": [ - "aa69b7d41ae032330dc20a9e565e0b1ff9c53058", + "4dc4d8138d80c1ee23a1addef0749241ac4f25b8", [] ] } @@ -432511,6 +433127,22 @@ } }, "processing-model-2": { + "integration-with-the-javascript-agent-formalism": { + "atomics-wait-async.https.any.js.headers": [ + "5f8621ef83660c66f0d037ea28fafefb558140f1", + [] + ], + "resources": { + "notify-worker.js": [ + "2780e5bc34eec9e49d4311459cd7fc285fbe3f65", + [] + ], + "notify-worker.js.headers": [ + "6604450991a122e3e241e40b1b9e0516c525389d", + [] + ] + } + }, "integration-with-the-javascript-job-queue": { "resources": { "README.md": [ @@ -433239,7 +433871,7 @@ [] ], "README.md": [ - "82138a300b84382094b7d971794d6f4501a01358", + "7d0ec556aa45e60fdf03f21d24087d0dbd836005", [] ], "assumptions": { @@ -433558,7 +434190,7 @@ [] ], "file_upload.sub.html.ini": [ - "e2bfbf8fb8fb71003bd06a8356fec3a074395040", + "26ffac48154796962709d2e74451a5ca77c2c690", [] ], "generate_test_report.html.ini": [ @@ -433979,7 +434611,7 @@ [] ], "attribution-reporting-api.idl": [ - "76640f54c8d5bd22151509d4d9b8a018d9492a09", + "ed4497b56ff5b7cafe3ae43ae1fcba1638f4b29c", [] ], "audio-output.idl": [ @@ -434079,11 +434711,11 @@ [] ], "css-cascade-6.idl": [ - "37cdfb8293097e4297691f92ad291fc0433269f3", + "3bdf6ba3a6bf4dddada0edfd96c68e5c9e774630", [] ], "css-cascade.idl": [ - "9011dc7fd9e2a3f835e6d6ff565d9854db82e96f", + "0dd9969f6ebc0b5c98e4a251fa67275ece32307b", [] ], "css-color-5.idl": [ @@ -434187,7 +434819,7 @@ [] ], "cssom.idl": [ - "222b3dc09ec0eeecfd83d6f25c71c0f250481453", + "7f5bf17139874ee5fd6d7dfcd835a03e6396dd6b", [] ], "custom-state-pseudo-class.idl": [ @@ -434247,7 +434879,7 @@ [] ], "fenced-frame.idl": [ - "2869b95e6bb3c5968a3ced65cefd5b4509dbff9d", + "6b0734d1f7be28a29ab26b8ca6a17fe623fa249c", [] ], "fetch.idl": [ @@ -434271,7 +434903,7 @@ [] ], "fs.idl": [ - "e2474132abfb4c7ffe2e6ebcca7158d4eadbee75", + "e341ab387d9c4767c52ad661286ddbf75d7770bf", [] ], "fullscreen.idl": [ @@ -434323,7 +434955,7 @@ [] ], "html.idl": [ - "33d4de0db976e1ee3008fa743772202f9207b14a", + "99b33705b3991c1ffd3823e8d8d2e7aacebf56a9", [] ], "idle-detection.idl": [ @@ -434447,7 +435079,7 @@ [] ], "mediastream-recording.idl": [ - "99f30282333a933c6f59e0e34ac127742efea2f7", + "496bfcf2e27da7a7da6c653b8e7f27b702f7386f", [] ], "model-element.idl": [ @@ -434570,6 +435202,10 @@ "d8ee0bb3a46f856ac2ea18f5731b8270a36c0262", [] ], + "real-world-meshing.idl": [ + "38fe71f6c66a7f798d75c71ad5fe128cf7c13ed3", + [] + ], "referrer-policy.idl": [ "0ef9a1fdecc87241a536df9f725f3d7e2030d3e3", [] @@ -434595,7 +435231,7 @@ [] ], "resource-timing.idl": [ - "151e5d46d842742cf7f7a6328bedcc40e4cf7456", + "aa17003493eb2bd32dc1be241aa88323cb1889c5", [] ], "sanitizer-api.idl": [ @@ -434627,7 +435263,7 @@ [] ], "scroll-animations.idl": [ - "14215509c9fec9db69602ed1f91c0ee1ee7052d0", + "31b3746e9d4d629e468646e695726814682e615e", [] ], "scroll-to-text-fragment.idl": [ @@ -434635,7 +435271,7 @@ [] ], "secure-payment-confirmation.idl": [ - "9061b243477b4aaecc4ce756d5e0aae654342fe5", + "08ec8065c53081b50091ac780c9b330abb6dc1b5", [] ], "selection-api.idl": [ @@ -434658,6 +435294,10 @@ "4fc1f085ea2c24b73a9fa5f7d706d87fedf225a6", [] ], + "shared-storage.idl": [ + "eb5806f9a6db83daa76d3807af3683cb07b6ba39", + [] + ], "speech-api.idl": [ "74085481525c943296f023e94a6532e5bc9f5b15", [] @@ -434666,6 +435306,10 @@ "fff583e0982399d7ebdd001653d4bf338a14243a", [] ], + "storage-buckets.idl": [ + "f3d500a5711d393e72975d212f1654dd9c93f8e4", + [] + ], "storage-buckets.tentative.idl": [ "73d72ceab9805195704bbc63fca6ba658018784f", [] @@ -434699,7 +435343,7 @@ [] ], "trust-token-api.idl": [ - "ee339590827e0f678d9dc1dfe592d4ab33ba697c", + "f521acea1f5e5f5d593576f4af9534bf4371bd0b", [] ], "trusted-types.idl": [ @@ -434707,7 +435351,7 @@ [] ], "turtledove.idl": [ - "cd81a3d87ef8cb476ee303eafe58fb3b9d4fbca2", + "8add667b57509d3ec86ff214de6ee7380721fe18", [] ], "ua-client-hints.idl": [ @@ -434719,7 +435363,7 @@ [] ], "url.idl": [ - "6549e45f419cd89e9e5e5f28889da8ff18cf2d79", + "a5e4d1eb492e8248d74824bd53b3a2120e847fe5", [] ], "urlpattern.idl": [ @@ -434795,7 +435439,7 @@ [] ], "webauthn.idl": [ - "58a9e285232184b99caed6434b1a66f8a8ecee4a", + "c7f72eacfd079e1555c355c4648692787ab1a3c6", [] ], "webcodecs-aac-codec-registration.idl": [ @@ -434803,11 +435447,11 @@ [] ], "webcodecs-av1-codec-registration.idl": [ - "00e4493d3c0a957fefbaeeeb95efeaa26afd871c", + "ab20879728db6ba619600ac82478162ea87a7e6e", [] ], "webcodecs-avc-codec-registration.idl": [ - "d4074f647dab2b1af158a4f544ccd4737164b32c", + "2b952c2219422bfd657976b222a397313ac7551e", [] ], "webcodecs-flac-codec-registration.idl": [ @@ -434827,7 +435471,7 @@ [] ], "webcodecs.idl": [ - "77649029db69dd81b77f4178f9325537d50e4198", + "0b95dc8b75788e126d395ec9d69371b11f0d3a6c", [] ], "webcrypto-secure-curves.idl": [ @@ -434847,7 +435491,7 @@ [] ], "webgpu.idl": [ - "284327a578999a7a068952526ab457389e40729f", + "34f78a1d8cd52b59eff807de7ab383afda60d53d", [] ], "webhid.idl": [ @@ -434863,11 +435507,11 @@ [] ], "webnn.idl": [ - "2c2ab35e909712ad4ab89fe0f16358b4e92b353c", + "d2b973a624b46f86299ad65d05e515e3d3c4b773", [] ], "webrtc-encoded-transform.idl": [ - "e48f1080c41209bd83d90e002aa00d52f4c2425f", + "59710bf46c2e3b57f09aaacccb80eb2c48f33406", [] ], "webrtc-ice.idl": [ @@ -434883,7 +435527,7 @@ [] ], "webrtc-stats.idl": [ - "7e820a26df4844bcd094e16089a86ebca235a612", + "a5fb3294b7e64b56b0afec24ab25112ab3cac4cd", [] ], "webrtc-svc.idl": [ @@ -434947,7 +435591,7 @@ [] ], "webxrlayers.idl": [ - "e182f47b9c5bce5b6f3c8d47109358eb6c999856", + "c8b3a71c699cb641d1b037d2b2c41190fea11bd7", [] ], "window-controls-overlay.idl": [ @@ -435262,7 +435906,7 @@ ] }, "lint.ignore": [ - "7118adb16114c8ae8b9da512470fb94124f5b8cb", + "1672f3b52e7a09b0e98ff6bd14c1ca6a9a5ab160", [] ], "loading": { @@ -438289,7 +438933,7 @@ [] ], "navigation-id.helper.js": [ - "53099cadb254df0a4d087bc9dd75340b5ddb40fa", + "1b72fe9908d573c902e8457aad24615431b5e719", [] ], "not-restored-reasons": { @@ -438343,6 +438987,10 @@ "bd7fba2ccf4b6ab7e604273c25010e31e443e376", [] ], + "worker-navigation-id.js": [ + "3a2740d0675c84faa34781307ba6a323586ad90e", + [] + ], "worker-with-performance-observer.js": [ "a72fe81c47feace765613a0962f2a7e63f71fa25", [] @@ -442391,6 +443039,10 @@ [] ], "css": { + "animation-range-visual-test-ref.html": [ + "c246f7f1b0a541aa3eb3cbdd01efd57d3018d5b9", + [] + ], "animation-update-ref.html": [ "7e375a1df7f063ba6cdbbdad92beb73915b84d6e", [] @@ -442434,8 +443086,12 @@ [] ], "support": { + "animation-range.css": [ + "453d076b6f34533d8b9105a96d8d30c1e66aac51", + [] + ], "testcommon.js": [ - "66bc27bb104ebead9b7466c4ead9076f589ac5e0", + "91540774d08a1b68a65ff68298f5dbff1ef674a1", [] ] } @@ -444687,15 +445343,15 @@ [] ], "partitioned-cookies-3p-credentialless-frame.html": [ - "3fdf937ae1a7f6feff8db0b2905353721cfd503a", + "25ddf601457c484160490a267cd8053f84c01063", [] ], "partitioned-cookies-3p-frame.html": [ - "6a8ed6ca989f1eeb2c9d46d8aaf0e202f0995e31", + "00b3412c41fb566fcab380e83f3ca9bbcd4aa859", [] ], "partitioned-cookies-3p-sw.js": [ - "bc2a2831568f4cc438933b88b7cad6997beb041b", + "767dbf443275a427facf340d72cb63d6bdc10df2", [] ], "partitioned-cookies-3p-window.html": [ @@ -444703,7 +445359,7 @@ [] ], "partitioned-cookies-sw.js": [ - "bc2a2831568f4cc438933b88b7cad6997beb041b", + "767dbf443275a427facf340d72cb63d6bdc10df2", [] ], "partitioned-service-worker-iframe-claim.html": [ @@ -445910,7 +446566,7 @@ [] ], "soft-navigation-helper.js": [ - "e8e5846c93b3f50f59a4b0b77529cda7fb0259de", + "baf26be8b0bf7a06a3e85bc46769e62f796283a0", [] ] } @@ -447299,6 +447955,10 @@ "120941444a4898197d6b6001f9908a6cd48b62ba", [] ], + "pattern-opacity-01-ref.svg": [ + "1c9c68bd9d5becec895d4cacac93082bc2defcec", + [] + ], "pattern-viewbox-01-ref.svg": [ "c9f6931deadd57bad20ae1dbbd529d595b14adfb", [] @@ -447771,13 +448431,17 @@ [] ], "affected_tests.yml": [ - "ffb1fe1f6fb14add4f1f833203343f0aefd20c76", + "6d3d32acc82640e80ebd92618d539ae596cdb348", [] ], "checkout.yml": [ "618c571465963a478a308899328d5fa5851d491e", [] ], + "color_profile.yml": [ + "d90c6ca429d55c1e7beee3a25d713970e085688c", + [] + ], "com.apple.SafariTechnologyPreview.plist": [ "122080972c9f63410062ee8d33d0ed0286af8f11", [] @@ -447860,7 +448524,7 @@ [] ], "commands.json": [ - "59463144967d782537a48a19a4d8a3a39a637eb8", + "f26baddacadefc150ec36db11ef0f83dc20e6ca1", [] ], "epochs_update.sh": [ @@ -447875,6 +448539,10 @@ "44de9fe1ad078673e92385bd6e4bedba129c2485", [] ], + "macos_color_profile.py": [ + "f0919d77159795975ad2e0a68db37d96d82f7bb1", + [] + ], "make_hosts_file.py": [ "f3397281b71e85978a8bf737a1e52a0d622bc174", [] @@ -447891,8 +448559,12 @@ "a976e5d639866a58f46f2eb5ff3a619289b277ef", [] ], + "requirements_macos_color_profile.txt": [ + "c3448a98dfff36a8afdd3f4063e09aa875552be3", + [] + ], "requirements_tc.txt": [ - "91789c95e305fe737a34aa403ded9ca81aaa1652", + "9ab88012762a02398a80f8a5e4cb77c50f382450", [] ], "run_tc.py": [ @@ -448391,7 +449063,7 @@ ] }, "mypy.ini": [ - "def40c0bd0614c297bd1b1213f2182a2dba07a2a", + "5dc55c5b7470de4845f09bbc50b32a1d6686c1b1", [] ], "pytest.ini": [ @@ -448411,7 +449083,7 @@ [] ], "requirements_tests.txt": [ - "ca946a306e7b31d75be71cb9a5e52b8e44aaf346", + "ed41215bcc1bc16b3221dd80cfbe66e2521efe69", [] ], "runner": { @@ -456586,7 +457258,7 @@ [] ], "wpt.py": [ - "e423a8c67c5a2ea195515cf78504f590a83a7985", + "e1df4ef42dcfb8e923711cbbf781eb224057d7c4", [] ] }, @@ -456626,7 +457298,7 @@ ] }, "requirements.txt": [ - "fcaab2e6674ab475428baa900bd5c174412d5d28", + "28be0b3c6e10e5881bc6acfe700d17f514167979", [] ], "requirements_chromium.txt": [ @@ -456688,7 +457360,7 @@ [] ], "chrome.py": [ - "7092122d8c40e8327cfb91bcfecea5ca25776066", + "3bdbf6f962c3a8de49cd70212ffed22692bfb2e5", [] ], "chrome_android.py": [ @@ -456804,7 +457476,7 @@ [] ], "executorchrome.py": [ - "a3a733efbd256cce6715685b05dce952102c22c0", + "5df9de5f7e3c9b119af2a592c3214af9f30ef65e", [] ], "executorcontentshell.py": [ @@ -456828,7 +457500,7 @@ [] ], "executorwebdriver.py": [ - "ab7d1ab0d4c5200b39962c256f9e27ab9492ccc7", + "9a771f11c6ca9db2b1641af20cfdd9c9525477f5", [] ], "executorwktr.py": [ @@ -456987,7 +457659,7 @@ [] ], "testloader.py": [ - "c35e509776aae10ba83528058ef813068a2f0ef9", + "950273c38941ca95ae3ab068f7573983d4da76f6", [] ], "testrunner.py": [ @@ -457046,7 +457718,7 @@ [] ], "test_testloader.py": [ - "45b78496d1bdd741a65b77b8983451fdaa853abf", + "cef75e03be10535b7be60c324b04092b52ddaac9", [] ], "test_update.py": [ @@ -457093,7 +457765,7 @@ [] ], "wptcommandline.py": [ - "416e75b417f607b1cbb1e1d5bdc3ebd736af67bd", + "1c5895eec6ea8b19274a4fc6800d87efcb2c5c09", [] ], "wptlogging.py": [ @@ -461800,6 +462472,20 @@ "44f42eda493c27f5b4c83a3b53d427a2c51f7ce4", [] ] + }, + "url-parsing": { + "current": { + "current.html": [ + "82a48d409901b47cf3e2dfc22532b46de2dd60a1", + [] + ] + }, + "incumbent": { + "incumbent.html": [ + "2c5572b77493367aae1dc35c88b4713fdc47f352", + [] + ] + } } }, "security": { @@ -461979,6 +462665,10 @@ "4347d4aae3e1c6475b21a8f246fb768d91a43afc", [] ], + "echo_datagram_length.py": [ + "f0610b085fe30b4d5fda6473bf17fc498eb47650", + [] + ], "query.py": [ "75d458255ad7af10508dce9905bf2ddb259f3699", [] @@ -466739,7 +467429,7 @@ ] ], "filereader_readAsDataURL.any.js": [ - "d6812121295beedc38164a41cea20c848533369f", + "4f9dbf7a754a87694c737487a903467a4725cc7a", [ "FileAPI/reading-data-section/filereader_readAsDataURL.any.html", { @@ -487878,7 +488568,28 @@ ] ] }, + "accept-ch.wildcard.https.sub.html": [ + "36eccd6a5229ea39e6d94ad8d8e4bb9ae188f428", + [ + null, + {} + ] + ], "critical-ch": { + "critical-ch.navigation-timing.no-restart.https.html": [ + "a7c2ad705db844db61f6038ed0bba496a0598ce2", + [ + null, + {} + ] + ], + "critical-ch.navigation-timing.restart.https.html": [ + "d3a49a2e91ecf44b271e196fa6f5d766433bd161", + [ + null, + {} + ] + ], "iframe.https.window.js": [ "cbf128149e983fa1fb4e4ef085f5179c16b50016", [ @@ -488592,6 +489303,15 @@ } ] ], + "async-navigator-clipboard-write-multiple.tentative.https.sub.html": [ + "73cdd2f049e3ba1b0413476e49f0f98ef366c247", + [ + null, + { + "testdriver": true + } + ] + ], "async-promise-write-blobs-read-blobs.https.html": [ "12184c92e0777f5d10a63ad8e075e8422d5545a5", [ @@ -491528,7 +492248,7 @@ }, "embedded-enforcement": { "allow_csp_from-header.html": [ - "dd66bb77ac76f7fd9f8b626d41952298ff54d53f", + "b2abcbece0e3866b000096889465227c47ac7178", [ null, {} @@ -495389,6 +496109,13 @@ ] }, "nonce-hiding": { + "nonce-hiding-move-document.html": [ + "49de893ba03fbd25125fcf13eff8c352e4992d85", + [ + null, + {} + ] + ], "nonces.html": [ "7ee10a7b29e5a54918a75037ded0e5bd087f601a", [ @@ -501276,21 +502003,21 @@ ] ], "anchor-name-001.html": [ - "a7b4b01ff472b1488f2de50ddf7cadbda7ca34b9", + "4caf3ee2100327b03b73c5180ac4ecc8a3761173", [ null, {} ] ], "anchor-name-002.html": [ - "4c14e1d63c93ce59192b4fb54c13042f15480814", + "63b5d66a4e3ba66cdbac4bd550fbe385dcea102e", [ null, {} ] ], "anchor-name-003.html": [ - "91ff5bc9065ed3d9b9f321971ccf0cadb31a992b", + "9ab6b66d944cae1998f8d90add8cb3809575d0aa", [ null, {} @@ -501325,7 +502052,7 @@ ] ], "anchor-name-inline-001.html": [ - "70b753cda2d8aaabddbdc42d1e5cc6588279e88b", + "dba3472f5b1a2146a66eaf4c3d2429add3151321", [ null, {} @@ -501346,14 +502073,14 @@ ] ], "anchor-name-multicol-003.html": [ - "8b06b4c641caab53b6c4038c7100a78678360928", + "02fd1c164d65865940a1506ffe15c927d3324c05", [ null, {} ] ], "anchor-name-multicol-004.html": [ - "881578a4639e44abd04dfe7ead64345727e43cb2", + "fdd1772359ff609af103adce8fe5c673e360f8cf", [ null, {} @@ -501395,7 +502122,7 @@ ] ], "anchor-position-003.html": [ - "d5263fcddff526860684ecf68264e1ef7fe56f81", + "c149dd0e110e6486ed3aa9c453fd9f74efcee38e", [ null, {} @@ -501500,14 +502227,14 @@ ] ], "anchor-position-multicol-003.html": [ - "bf3e48ed207d12bb4c766009d33bb07041b2ca48", + "d23779ad9bf88ee4b49f9c9bdc97d3ce47d2a509", [ null, {} ] ], "anchor-position-multicol-004.html": [ - "2be88797541fd29a23b0d8b47448dcb5c5c81bb5", + "399494120ea0ea5da5534a0a14a9b99e598222d5", [ null, {} @@ -501542,7 +502269,7 @@ ] ], "anchor-position-multicol-fixed-001.html": [ - "6fca40dd7e90631d4272a0d27431e55cc6aca21f", + "b94680816e9aca235b7e499e1d902fbd95dd442e", [ null, {} @@ -501590,6 +502317,20 @@ {} ] ], + "anchor-scroll-002.html": [ + "88e8a754b5b1c81b75f3befabdf16216148b1317", + [ + null, + {} + ] + ], + "anchor-scroll-basics.html": [ + "6b2d96708bd44808f0cb7ce10a1b52e708e09eba", + [ + null, + {} + ] + ], "anchor-scroll-fallback-position-001.html": [ "a9a5d8c0ff4e84858c180eb440b514400ab97779", [ @@ -504729,7 +505470,7 @@ ] ], "color-computed-color-mix-function.html": [ - "8f05a99967c0902ad6e1c4d621b8d7af6ef85ef6", + "c1ca47491ffe165c76b8cf3187effd8ee10da126", [ null, {} @@ -504868,6 +505609,13 @@ {} ] ], + "color-mix-out-of-gamut.html": [ + "1803397f8a71dcfea8be93621fd47b33591f464e", + [ + null, + {} + ] + ], "color-valid-color-contrast-function.html": [ "bdb8f0f588805797c1589802043d761560f4cdb8", [ @@ -504938,13 +505686,6 @@ {} ] ], - "gamut-mapping.html": [ - "02133acced21478aa311f8e66f8cca52236deaf0", - [ - null, - {} - ] - ], "opacity-computed.html": [ "27d9316415f24bf8e398cc992508b0036935291c", [ @@ -505593,6 +506334,13 @@ {} ] ], + "display-contents-dynamic-style-queries.html": [ + "782cf566552423193669f9f0da034f802d265067", + [ + null, + {} + ] + ], "display-contents.html": [ "d96a46d06a85f024f0fce9d43e34dec6e271ea76", [ @@ -509002,6 +509750,13 @@ }, "css-fonts": { "animations": { + "font-size-adjust-composition.html": [ + "d98b0ffd10e5550ab7ccc7a96d02ebb93385ddcb", + [ + null, + {} + ] + ], "font-size-adjust-interpolation.html": [ "a138d7fee5a39bc925a7a4cc5224dcc3db5cc387", [ @@ -515155,7 +515910,7 @@ ] ], "clip-path-invalid.html": [ - "6b91f74ad484d4d0d70fa679db378d04e238125f", + "1dbdb5acab0cc86ed0f98d79c245b24c147a7053", [ null, {} @@ -515169,7 +515924,7 @@ ] ], "clip-path-valid.html": [ - "ec6ac5ae9bc349c8cb1dd473e9f9dc65f4002c97", + "895cdfacac6cc8ac56e67738aed53e55be7b2fcf", [ null, {} @@ -516521,6 +517276,15 @@ ] ], "overlay": { + "animation": { + "overlay-interpolation.html": [ + "a3034b88c131e12b2be6b268d46444d1a0645cff", + [ + null, + {} + ] + ] + }, "overlay-computed.html": [ "f1a0a315de6eeb08863d9fd4dbad2588b3492d89", [ @@ -533994,14 +534758,14 @@ ] ], "offset-path-parsing-invalid.html": [ - "949e45d828f102b8c3298a4d75ecc0a66c727a6b", + "28b45db8469f2b953df0381e9877bfc03f8b5b71", [ null, {} ] ], "offset-path-parsing-valid.html": [ - "95a9f8aabbc96eed703d86c512a5206036dd8dac", + "59a64b2116d603fa9ce79a614b8029033f2f1c42", [ null, {} @@ -544024,6 +544788,24 @@ } ] ], + "typing-space-in-editable-button.tentative.html": [ + "0f399378abf3de5f5bc90f82dddf138e447e8d70", + [ + null, + { + "testdriver": true + } + ] + ], + "typing-space-in-editable-summary.tentative.html": [ + "30a751d5239d378e70eaf9766c16fcb2e510bd36", + [ + null, + { + "testdriver": true + } + ] + ], "undo-insertparagraph-after-moving-split-nodes.html": [ "c61bcff9e9246abdabe8f5acc97b489db5708b94", [ @@ -559153,6 +559935,15 @@ {} ] ], + "automatic-beacon-click-handler.https.html": [ + "505eb6174f20de38ce6103f76e46dccc8caaa7a2", + [ + null, + { + "testdriver": true + } + ] + ], "background-fetch.https.html": [ "7036f2bb5f3bb5e42b5af1b5f970141c0884b5ef", [ @@ -560315,7 +561106,7 @@ ] ], "general.any.js": [ - "7bf98ba9b247924d1e0c813c8010112d63e965ca", + "3727bb42afe49ba8b52b8f8b5ac7856028c2828c", [ "fetch/api/abort/general.any.html", { @@ -566676,7 +567467,7 @@ ] }, "response-body-read-task-handling.html": [ - "c2c90eaa8bd951cf7d5168e7796dd1cb8dcf9cde", + "64b0755666168d7cac9808fe1593a01889a19bff", [ null, {} @@ -574699,8 +575490,8 @@ {} ] ], - "element-request-fullscreen-options.tentative.html": [ - "875431698f7a9212a40d444ddc10627defaf7b11", + "element-request-fullscreen-options.tentative.https.html": [ + "871c917dcc878d4ae1a177997483c1ac820c2dd0", [ null, { @@ -575370,6 +576161,17 @@ ] ] }, + "graphics-aria": { + "graphics-roles.html": [ + "159190ed833398d2410c5f4f2224f0b3a7dfd0a8", + [ + null, + { + "testdriver": true + } + ] + ] + }, "gyroscope": { "Gyroscope-disabled-by-feature-policy.https.html": [ "02cc44ec78b0c6ebeea657b8d0921943aa01028f", @@ -577632,8 +578434,8 @@ {} ] ], - "document-state.tentative.https.html": [ - "d0e629f63124579a2f4360403119dcd9fcb31190", + "document-state.https.html": [ + "609ce9b850369fae857c3e407cfbbaccaf381067", [ null, {} @@ -605139,7 +605941,7 @@ ] ], "access-reporting-post-message.https.html": [ - "4c8e96f57933f74d0ff3f76cafe498c20bef7353", + "5bc718e2a89a28a6867e83c0d85bc0cedefe39f6", [ null, {} @@ -605378,8 +606180,17 @@ } ] ], + "reporting-bcg-reuse.https.html": [ + "9bc171a269c5284de80cad871baafd58fb297da0", + [ + null, + { + "timeout": "long" + } + ] + ], "reporting-from-rp-ro.https.html": [ - "60322bffe7a1c7d8d536b35504e925b09ff0c6bd", + "b1da8cf77cefba3ab3ebaa5261dcc1c0b5583470", [ null, { @@ -605388,7 +606199,7 @@ ] ], "reporting-from-rp.https.html": [ - "5deb115d94ef2894e6551ca89f8d4966d2d438df", + "a8c11d7a4a89f6885e73422510c9046e9faab7a5", [ null, { @@ -605397,7 +606208,7 @@ ] ], "reporting-to-rp-ro.https.html": [ - "cf1385e766374d7fafae07eed9a857d8b9c381a3", + "eb80842863425fd60d04206354e60942c59232e1", [ null, { @@ -605406,7 +606217,7 @@ ] ], "reporting-to-rp.https.html": [ - "9ff374c1c787348115e5d10d624be64ea4040323", + "ad57afccf8fa4703434d39e070cce7744f65600d", [ null, { @@ -606143,7 +606954,7 @@ ] }, "name-content-attribute-and-property.html": [ - "3319c1875bf36c2cf6173ea606ecca0b74e0f1f1", + "082ed281fef888ddca0e6a743e9a8ba41c3816e7", [ null, {} @@ -606216,7 +607027,7 @@ ] ], "idlharness.https.html": [ - "4e9e25fd5df7221b4c99fd49c8fe0bb3753c549c", + "7d693d3c0a273ff2df256850baaeeb9203e54ba2", [ "html/dom/idlharness.https.html?exclude=(Document|Window|HTML.*)", { @@ -606237,7 +607048,7 @@ ] ], "idlharness.worker.js": [ - "16f6e85ce7c619e454d5657ca2978067785b0cff", + "88942ddfea13a10a14c4ceed360c9a7a9963e62e", [ "html/dom/idlharness.worker.html", {} @@ -606880,7 +607691,7 @@ "focus": { "sequential-focus-navigation-and-the-tabindex-attribute": { "focus-tabindex-event.html": [ - "8ff5843c866b62a040fce3133470fc48ffe7819e", + "55619661acc8721ec693fc89f78e5af5339c0b5a", [ null, { @@ -615644,21 +616455,28 @@ "forms": { "attributes-common-to-form-controls": { "dirname-ltr.html": [ - "9d1c9eb77e9fdef844689bb71b44c8c2271e6ba4", + "cbdbb72c674eec63e262957937f251fc557d9a6d", + [ + null, + {} + ] + ], + "dirname-only-if-applies.html": [ + "7d542111896e68e7df0b271b247126b99b3c1972", [ null, {} ] ], "dirname-rtl-auto.html": [ - "6368a26fafd74105428969660fec3d29bbcb4dce", + "072b85086857ba9d018895dfbc29a66a69b2dbc0", [ null, {} ] ], "dirname-rtl-inherited.html": [ - "1e6967d914a34de49033b1ea358b4093f11baf97", + "e7b07288d6b7ab0e0c2f4ce419dc6681760f8ab6", [ null, {} @@ -616002,6 +616820,13 @@ {} ] ], + "form-double-submit-requestsubmit.html": [ + "b4028784edd933e64fd8d4c1c86cda694fc3b312", + [ + null, + {} + ] + ], "form-double-submit-to-different-origin-frame.html": [ "00a46bfd4326fc2d35d50bfc4a2f68890a5594bb", [ @@ -616276,7 +617101,7 @@ ] ], "select-event.html": [ - "854b1f480460d61a77788cc7773c24a37b530cb2", + "d1b46a22d8621586be46ba6a535ab9467b1aed2d", [ null, { @@ -618194,6 +619019,13 @@ {} ] ], + "name-attribute.tentative.html": [ + "9aa5ce42e8e5ada6eeddfd4b8c2cff7359402157", + [ + null, + {} + ] + ], "toggleEvent.html": [ "8ad60de5d9b52ec5f22e6232d4ec8650fff5ec0c", [ @@ -618361,6 +619193,13 @@ {} ] ], + "dialog-focus-previous-outside.html": [ + "efd242c57694b8f8cc88c6974ef5236cca400200", + [ + null, + {} + ] + ], "dialog-focus-shadow-double-nested.html": [ "2cd63eb796b38f6a272aeb9eff13e5974705236b", [ @@ -618428,6 +619267,13 @@ } ] ], + "dialog-no-throw-requested-state.html": [ + "c86cbe84a62294b2d4ce949bd3e9d6af6623c8dc", + [ + null, + {} + ] + ], "dialog-open-2.html": [ "79120d07ebdca3625cce5925fc8ede3a528e9e53", [ @@ -618967,7 +619813,7 @@ ] ], "popover-attribute-basic.html": [ - "eab61407c8b38772059fb9dae2dfe33308138a1e", + "32d3deb3848c22ee48403e40c17038f1cc8e2f59", [ null, { @@ -619032,8 +619878,38 @@ } ] ], - "popover-hover-hide.tentative.html": [ - "ed647a7d7d8f9c2598cf2c69c21f84ec455f5994", + "popover-hover-hide-hide.tentative.html": [ + "57ca5723de562cc97b886e1410119596eefee313", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], + "popover-hover-hide-hover.tentative.html": [ + "d0036c0fe7b14b619a0c6562caf53713a478f6a7", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], + "popover-hover-hide-show.tentative.html": [ + "7b3fa2b30238df6e5f464b39bb246e7bef6ac241", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], + "popover-hover-hide-toggle.tentative.html": [ + "d6d4079e7e02be9cf6f6efde435fe4f1d0678d57", [ null, { @@ -619069,7 +619945,7 @@ ] ], "popover-light-dismiss.html": [ - "d7d1edd3a4b1fa655f971c69cf4d77b64926dc1b", + "4b888169e1becc6daca007a6d6e71df0004e8049", [ null, { @@ -619079,7 +619955,7 @@ ] ], "popover-move-documents.html": [ - "9feaa4b2bf8756aa1774cfa973327912d534ffac", + "11f52c2f2f0d14c74649cc7c52ac6e5ac68058b1", [ null, {} @@ -628116,6 +628992,31 @@ ] ], "integration-with-the-javascript-agent-formalism": { + "atomics-wait-async.https.any.js": [ + "3a3ea40d773f9b36314e714a17212f8ceed1f660", + [ + "html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker" + ] + ] + } + ], + [ + "html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker" + ] + ] + } + ] + ], "requires-failure.https.any.js": [ "fddf85dbede1a36d4f161b638f19c39f8300ac47", [ @@ -636976,7 +637877,7 @@ ] ], "MediaRecorder-error.html": [ - "97e781054f33b1eaabb6433ad41f703b0806cc36", + "39e8676d19f886254a7b5387ee98fc153a41a1b6", [ null, {} @@ -637037,6 +637938,13 @@ {} ] ], + "MediaRecorder-video-key-frame-distance.html": [ + "b986b3075ff6d9e71ff83033dadf96ca0d8037c0", + [ + null, + {} + ] + ], "idlharness.window.js": [ "99e884530c0f42ba8f42e6c51dcddb13cae45681", [ @@ -644426,7 +645334,7 @@ }, "performance-timeline": { "back-forward-cache-restoration.tentative.html": [ - "733642fd03225a0877b93e8dcc09ec24e097935a", + "c673e09cb461e094d5616b7a43154fe2cffb12bd", [ null, {} @@ -644595,7 +645503,7 @@ ] ], "navigation-id-element-timing.tentative.html": [ - "bc52f208b0726421f1d36cdc6b737030c0760c1d", + "7ff415530bc69d6feb4a8800892a3b2eb06a8e8a", [ null, { @@ -644604,7 +645512,7 @@ ] ], "navigation-id-initial-load.tentative.html": [ - "3228e12778b5d510dedcdd15977e2b021473f097", + "93ddcff062e726ea60a4f6041f6a6bfb23f6fc72", [ null, { @@ -644613,7 +645521,7 @@ ] ], "navigation-id-long-task-task-attribution.tentative.html": [ - "662e17508b26dc671bf4ed25618a3b9ed9b0cac1", + "e1da9100aeee55f0f2ecfda6afb4993079a3585a", [ null, { @@ -644622,7 +645530,7 @@ ] ], "navigation-id-mark-measure.tentative.html": [ - "42795f94a98cd07aee3c13dab7d33bbd2743848e", + "30613ebb980eb01e1e273513e5e5ce90fb2c6931", [ null, { @@ -644631,7 +645539,7 @@ ] ], "navigation-id-reset.tentative.html": [ - "7386331d26e918ebe06b15207f92f7c60a372409", + "f5a2428e5f568ab2bac64797fdc3a52fb0829386", [ null, { @@ -644640,7 +645548,7 @@ ] ], "navigation-id-resource-timing.tentative.html": [ - "1ec906ebbbba4a8118f746ac94c52aa399556f05", + "6d0614a6e23940cc003aa21a7ddf1b166b7a1ea7", [ null, { @@ -644648,6 +645556,13 @@ } ] ], + "navigation-id-worker-created-entries.html": [ + "96fc57be1d426c9c364fe20359dafebf60380fd8", + [ + null, + {} + ] + ], "not-clonable.html": [ "d651776e5f4b945328e9de2651b8a59f11b53426", [ @@ -646842,7 +647757,7 @@ ] ], "pointerevent_auxclick_is_a_pointerevent.html": [ - "b3b7481d6ab19cc81688ed6819d81aa16ead35f0", + "5ec1bab1649effa65bd8c6dd579a003ea815085c", [ "pointerevents/pointerevent_auxclick_is_a_pointerevent.html?mouse", { @@ -646923,7 +647838,7 @@ ] ], "pointerevent_click_is_a_pointerevent.html": [ - "9e4b023a25af7551e3737eb0d43df4a81b6c1510", + "2571c9c9034200e03bf2ad904cd859da9ccf6ddf", [ "pointerevents/pointerevent_click_is_a_pointerevent.html?mouse", { @@ -646972,7 +647887,7 @@ ] ], "pointerevent_contextmenu_is_a_pointerevent.html": [ - "fe3a69942ef6338561041d3fdf640dae76958d25", + "d951be542a367cd0e30a6b169bded298de365984", [ "pointerevents/pointerevent_contextmenu_is_a_pointerevent.html?mouse", { @@ -648423,8 +649338,22 @@ {} ] ], + "modulepreload-as.html": [ + "dd946e454a1fe1833dbe37164105f028795facba", + [ + null, + {} + ] + ], + "modulepreload-sri.html": [ + "ea32a6a302525240573deb75b6e3f16b96b5e1eb", + [ + null, + {} + ] + ], "modulepreload.html": [ - "0e4b6923e32e83ac3b8f3018537352aa120df6c5", + "4764b58261995cc617c4a8cca0daaf2ab78e66fb", [ null, {} @@ -664882,105 +665811,105 @@ "scroll-animations": { "css": { "animation-duration-auto.tentative.html": [ - "375489c26a4f49aa3f8bb1f3b4f24d19654ab549", + "cfb7cf2c1e4aad9ba103833199a4440e9381bc74", [ null, {} ] ], "animation-range-ignored.html": [ - "f08659635ea77263aded03ee66a4a4c8c4702862", + "dabb4ec5a60427b8137f02441feec0f7bf68658a", [ null, {} ] ], "animation-range-normal-matches-cover.html": [ - "44b08cab969dd2423fba21a95008e0b4384c2d67", + "a91e3d3e29a09c43a5e3fd61365ef803a1a47814", [ null, {} ] ], "animation-shorthand.html": [ - "7bd17b9919070006824fee9e77ec5b20e464315b", + "a17dd431264453f52f69fb8d3f55a1413f0680ba", [ null, {} ] ], "animation-timeline-computed.html": [ - "7759e799c62987817c2aa797fb0a8b802916abaa", + "1e621eee531c22e80d98fb3dc30517cf4153ce07", [ null, {} ] ], "animation-timeline-ignored.tentative.html": [ - "0ac7a9d63e819588ed375e151b17a364a458ff9f", + "8992cdc174fbcacc78476013536c31f30154a03c", [ null, {} ] ], "animation-timeline-in-keyframe.html": [ - "75483331390d9fb6571307c3158cc37adcd893ee", + "04b430c324231011cc883e359a1ffb12ca5741da", [ null, {} ] ], "animation-timeline-multiple.html": [ - "50a829c5b6bd50fad40414cb29de1e926ebbe905", + "e812c7d67ea3771c5c0355fa0eb57526d2209fb0", [ null, {} ] ], "animation-timeline-named-scroll-progress-timeline.tentative.html": [ - "ed2c32d31e97bfbe8e5836a382a3a5b116c5ce29", + "71df9ceda873e29146259d696c5ca9cc6d34fd06", [ null, {} ] ], "animation-timeline-none.html": [ - "a8e07a44d6de1337005bc64bf41f5acbaf026ad4", + "7092523c489603dbfd12452318cacec4aaf85421", [ null, {} ] ], "animation-timeline-parsing.html": [ - "4916f7726f910d56fad5c33dba7d1b6421fb6468", + "f0061c5705dd78484133968c414bfea9103ff6f1", [ null, {} ] ], "animation-timeline-scroll-functional-notation.tentative.html": [ - "09917b4ba56c80179f42b68648edd38f6cd2ec03", + "0bba4a03f402c18741a62046c785fa20b46227d8", [ null, {} ] ], "animation-timeline-view-functional-notation.tentative.html": [ - "745d76c72943b4316fd074d8537e41ea82b3d0e2", + "8a62199b524862b7feee1cfa577275c3490e03a2", [ null, {} ] ], "get-animations-inactive-timeline.html": [ - "10bf00fbbc06a18b47deab2eaad69ba516b9ff42", + "d3048913cef2229e27d54d19d3e014adfbb7b670", [ null, {} ] ], "merge-timeline-offset-keyframes.html": [ - "c6d384fce546d132e11b43d786c17fe46a9fcd04", + "e5d5037d622605176b70f1d7a2a9211f67514201", [ null, {} @@ -665001,7 +665930,7 @@ ] ], "progress-based-animation-timeline.html": [ - "eeb1e548e52a3df81df4c3f660c8d362fe1bea76", + "bbc60e3fbddf6f298ca3c3e3fcbff628d3a9baa5", [ null, {} @@ -665022,28 +665951,28 @@ ] ], "scroll-timeline-attachment.html": [ - "96033859e29ed624921361110fc2fdbaa546179c", + "c924302b224acfb351d55b8047f47f5915f4f33b", [ null, {} ] ], "scroll-timeline-axis-computed.html": [ - "b971aba6c0f8a5bd5a6e18ddbef1cc296263c305", + "c942fb40932433dd4daf7dbb68557488bebb14e8", [ null, {} ] ], "scroll-timeline-axis-parsing.html": [ - "25f48f0c70ab57359e291ac65f7c37436bd97425", + "a9a760a54a44c8a64cacfa25d155339f962b3c89", [ null, {} ] ], "scroll-timeline-axis-writing-mode.html": [ - "958ce4964e844bcf8d94699b4a8bbc5e29df8e2f", + "872dc1b2b93fe4236f76a78321be7edb10f32a14", [ null, {} @@ -665057,49 +665986,49 @@ ] ], "scroll-timeline-dynamic.tentative.html": [ - "0d951e7b139c1d219284398c386e81a2753a281a", + "57c666e2412cb0e7316a78da83980ce608b92bf8", [ null, {} ] ], "scroll-timeline-in-container-query.html": [ - "38b8ffdc15aed7875bc13d25e13bc5a501b298bb", + "742c35b258004930833ae6ea504082e7c615d6b1", [ null, {} ] ], "scroll-timeline-inactive.html": [ - "0953f1b389406dffb80fb9b599eef7f1fbe24c07", + "eedc8e3958ade809be1832619ab12684e2e12922", [ null, {} ] ], "scroll-timeline-multi-pass.tentative.html": [ - "651ba212ded9d0e64e8eb706f2af59c832d1fadc", + "7e0c1339b261bdaa9b59a2a9c76451fd1574fe86", [ null, {} ] ], "scroll-timeline-name-computed.html": [ - "bfffafc652319721a56aea35757124b03d716e3a", + "b803ee8212b25ea20f314b5e76fa795b2792d700", [ null, {} ] ], "scroll-timeline-name-parsing.html": [ - "0fb271250ad9ab12dd022579b016b4e4a1c50323", + "d38b9640af91b87b48838c95481ccf38afd2731d", [ null, {} ] ], "scroll-timeline-name-shadow.html": [ - "f5cd2ce47d707811287ab03cb4ea815c33cea599", + "f2bea29dd3c874718fa413f6d4294324921c5835", [ null, {} @@ -665113,7 +666042,7 @@ ] ], "scroll-timeline-nearest-with-absolute-positioned-element.html": [ - "7fe2d12be30cdcfadfa5f6f30cb324a31565f390", + "57a1a947126c86d8fdbdf7f6d1a7ced740ecf172", [ null, {} @@ -665141,21 +666070,14 @@ ] ], "scroll-timeline-sampling.html": [ - "51b60e73ce6a5c4542cc2fe67131533696807f5f", + "f77c5082200f6fbafa1201e5f315157409e82daf", [ null, {} ] ], "scroll-timeline-shorthand.tentative.html": [ - "68e1cc955f5239075cf283ceac3938c42143a9e4", - [ - null, - {} - ] - ], - "scroll-timeline-sibling-gcs.html": [ - "6062e795f43e3057f8fd580e9b949c91bee567fa", + "7a6d9cdf4ae0771700984ddedd41070e85f4caa4", [ null, {} @@ -665169,14 +666091,14 @@ ] ], "timeline-offset-in-keyframe-change-timeline.tentative.html": [ - "eeb13150aa1277490f913a5733ce1012c8d19725", + "311b2c8929a112940e80371ea3be8e85b6792991", [ null, {} ] ], "timeline-offset-keyframes-hidden-subject.html": [ - "93ef7ffa1eb18ed16cb6edfe0caf35bb70b8d624", + "10934347821b05331cf59bf27b103aecbf979556", [ null, {} @@ -665190,21 +666112,42 @@ ] ], "timeline-range-name-offset-in-keyframes.tentative.html": [ - "54467bc83b18146c4a0adcd2dffde44bfd352df9", + "cee90f3b1b0112206b9b2522400af0155ec365fd", + [ + null, + {} + ] + ], + "timeline-scope-computed.tentative.html": [ + "814933f726658493581a00157a660417ebf367c0", + [ + null, + {} + ] + ], + "timeline-scope-parsing.tentative.html": [ + "2885cb758ded6f4ad95f2f0603a977970b519ac7", + [ + null, + {} + ] + ], + "timeline-scope.html": [ + "985e694bfdc89077ba0075bb16cea1772e003c2f", [ null, {} ] ], "view-timeline-animation-range-update.tentative.html": [ - "6c2a792aeec0c0baf4998423a9e4750a1de2af4e", + "552461c9b6c24870972b96281ab42cdf63b06ca2", [ null, {} ] ], "view-timeline-animation.html": [ - "a367ef9dd879544e1fc0ad6f850661c86d2ea8e2", + "9f8ffd176e34e723b465218474be69d0e1ada27b", [ null, {} @@ -665225,35 +666168,35 @@ ] ], "view-timeline-attachment.html": [ - "ff98ed78258c47f58678f3f00f5fb04eb3678f82", + "a91ae13d64a2c98323adac1defbb1ab741bc0b0d", [ null, {} ] ], "view-timeline-axis-computed.html": [ - "f4649dab0404a49be5014e2df7475fd151c44342", + "30b2a1ae051bf3c20fc2b4eb6b008d696e21272a", [ null, {} ] ], "view-timeline-axis-parsing.html": [ - "ffcc36c32086d9720bd0b5b2d9f8542cee02769f", + "1ebe4410a9547b8255a6c6696afc60462aafc04e", [ null, {} ] ], "view-timeline-dynamic.html": [ - "207c8c4e22379e19cf2f557d89295e34178e0a5b", + "9e042b774b9e992fb707d7a27ad5e96940aa80bc", [ null, {} ] ], "view-timeline-inset-animation.html": [ - "a7e807c2e819dd0678178171816af5569b3aadff", + "9ba88fde507aceae168e1c0b31d38f90ebe6c7f3", [ null, {} @@ -665274,63 +666217,63 @@ ] ], "view-timeline-keyframe-boundary-interpolation.html": [ - "04eb648949057b6452d96b2f4ba55a1cb9f467e2", + "011f03cb5dbb9ccded90e743201b6ceaafb4a8df", [ null, {} ] ], "view-timeline-lookup.html": [ - "6cead9dc586697428c21d1f3fcca9c7b047f4a7d", + "ea9acd22ba70baa8e028790dfa0177640718e2b9", [ null, {} ] ], "view-timeline-name-computed.html": [ - "5657dc781784ad838a8d09712bc108d5d36f188e", + "3304723f43fa1880e5f1095739087e9612b1ac68", [ null, {} ] ], "view-timeline-name-parsing.html": [ - "3878d5c58347c83532292d2a565e2988e71ac6be", + "2b22cbe036e605633e1e72a160acd92172b3610d", [ null, {} ] ], "view-timeline-name-shadow.html": [ - "55240efcfb5a0528fe2f5faff7769770e51995c0", + "bb14618c00ad4350bf4716802da649e0567d9951", [ null, {} ] ], "view-timeline-range-animation.html": [ - "3d7593823dbc6864c054c518ff9e630d1dc8290d", + "1c657e40cebf0853a14151e9f46be0fa19c33839", [ null, {} ] ], "view-timeline-shorthand.tentative.html": [ - "f19b9e6ac21bd0a825f7e944ec9eea747897d09a", + "fd00acc73ab17ed7642d9c332d6e50aff4b63203", [ null, {} ] ], "view-timeline-used-values.html": [ - "6627eeb9988096f136a85408093e1b76fc4a06f2", + "1bd6f0468c3db67b2ec48d2727121f8a87ebd522", [ null, {} ] ], "view-timeline-with-delay-and-range.tentative.html": [ - "e8f537b188c1aff82c6a9e8015f56cd632379246", + "db260f15f07000045fa92068f7aaf1dfa39c4429", [ null, {} @@ -665360,7 +666303,7 @@ ] ], "constructor.html": [ - "8e211efa11a6ca8eb2ff606cbff683203e608702", + "88c6a453ec972fe492d54f316105621c0717a81b", [ null, {} @@ -665381,7 +666324,7 @@ ] ], "current-time-writing-modes.html": [ - "d18abcd48f5d4088089adda7ac9709f4db32b2ab", + "748cda2f894f28096204526797f0e3a259e333d0", [ null, {} @@ -665561,7 +666504,7 @@ ] ], "change-animation-range-updates-play-state.html": [ - "53330d32f1f4b8a14a72b652ae9c486d1368c5da", + "16b9c30141761fadaba5d9652114838a22d1f20c", [ null, {} @@ -665659,14 +666602,14 @@ ] ], "view-timeline-subject-size-changes.html": [ - "9ae4b1df775a7b16b4493dbd10aac849d4c63104", + "ee7ce906783c10c2b5e9b9734f14de906c122542", [ null, {} ] ], "zero-intrinsic-iteration-duration.tentative.html": [ - "e77cf4629cb0f4a9af5436c7b0e44de9bee5389f", + "4eec5d8f13ab75de299e1efa6eefd9eeaede0d8d", [ null, {} @@ -670228,7 +671171,7 @@ ] ], "partitioned-cookies.tentative.https.html": [ - "ab667013a2b7f5fa71a575e985a3c54b9ae4cc93", + "5f6371cb428335bc33f3ed2220473a1a48fad85c", [ null, { @@ -675027,10 +675970,43 @@ }, "storage": { "buckets": { - "buckets_storage_policy.tentative.https.any.js": [ - "a66fd81cd4394209d1c534322b2b150cac35adf6", + "bucket-quota-indexeddb.tentative.https.any.js": [ + "ba82edb72ec6fc1656be169a14c3a025e1ab6a23", + [ + "storage/buckets/bucket-quota-indexeddb.tentative.https.any.html", + { + "script_metadata": [ + [ + "title", + "Bucket quota enforcement for indexeddb" + ], + [ + "script", + "/storage/buckets/resources/util.js" + ] + ] + } + ], + [ + "storage/buckets/bucket-quota-indexeddb.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Bucket quota enforcement for indexeddb" + ], + [ + "script", + "/storage/buckets/resources/util.js" + ] + ] + } + ] + ], + "bucket-storage-policy.tentative.https.any.js": [ + "d6dce3675d0bca18a379518c6ecf2c7ec1310930", [ - "storage/buckets/buckets_storage_policy.tentative.https.any.html", + "storage/buckets/bucket-storage-policy.tentative.https.any.html", { "script_metadata": [ [ @@ -675049,7 +676025,7 @@ } ], [ - "storage/buckets/buckets_storage_policy.tentative.https.any.serviceworker.html", + "storage/buckets/bucket-storage-policy.tentative.https.any.serviceworker.html", { "script_metadata": [ [ @@ -675068,7 +676044,7 @@ } ], [ - "storage/buckets/buckets_storage_policy.tentative.https.any.sharedworker.html", + "storage/buckets/bucket-storage-policy.tentative.https.any.sharedworker.html", { "script_metadata": [ [ @@ -675087,7 +676063,7 @@ } ], [ - "storage/buckets/buckets_storage_policy.tentative.https.any.worker.html", + "storage/buckets/bucket-storage-policy.tentative.https.any.worker.html", { "script_metadata": [ [ @@ -678033,6 +679009,243 @@ {} ] ], + "owning-type-message-port.any.js": [ + "e9961ce042256acad6ac94cb558d57e7dd3464d5", + [ + "streams/readable-streams/owning-type-message-port.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type-message-port.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type-message-port.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type-message-port.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ] + ], + "owning-type-video-frame.any.js": [ + "ec01fda0b3c737326e8ca7cd78101ca062eab58b", + [ + "streams/readable-streams/owning-type-video-frame.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type-video-frame.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type-video-frame.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type-video-frame.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ] + ], + "owning-type.any.js": [ + "27a3dda894e4d6e2b71524f1f6ae87a71fbdfdcd", + [ + "streams/readable-streams/owning-type.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ], + [ + "streams/readable-streams/owning-type.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "../resources/test-utils.js" + ], + [ + "script", + "../resources/rs-utils.js" + ] + ] + } + ] + ], "patched-global.any.js": [ "a64a054a97f1f5f133ec961a02f75207b2cb4eee", [ @@ -678080,6 +679293,20 @@ } ] ], + "read-task-handling.window.js": [ + "2edc0ddddfe692c79474c8570d433ced8df90276", + [ + "streams/readable-streams/read-task-handling.window.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ] + ] + } + ] + ], "reentrant-strategies.any.js": [ "b4988bc2433fd56c6527f0546ab47fa14b4c9f54", [ @@ -678425,6 +679652,17 @@ {} ] ], + "transform-stream-members.any.js": [ + "fca060b0c05fa3b4015688c20c13a0423365c9f7", + [ + "streams/transferable/transform-stream-members.any.html", + {} + ], + [ + "streams/transferable/transform-stream-members.any.worker.html", + {} + ] + ], "transform-stream.html": [ "355d5d807433d75c02adff23e228d050b7772c0f", [ @@ -679996,7 +681234,7 @@ }, "subapps": { "add-error.tentative.https.html": [ - "2cbf50836df093ee12e0157d5db6dfa0cc59706e", + "defe4743c6ab290683af9b57f193508c5743c4e0", [ null, { @@ -680005,7 +681243,7 @@ ] ], "add-success.tentative.https.html": [ - "2453fdbdecd39cfadf142b5ecf34d35a9eaef5ca", + "a9a439b36ac9a9095be58eef3767136d402d9071", [ null, { @@ -680046,21 +681284,21 @@ ] ], "list-success.tentative.https.html": [ - "c1d281abc530f16f60c0af6548d36a35710fd4dd", + "ea4f96124a912f361abb1a9ca73bd08aa77776ad", [ null, {} ] ], "remove-error.tentative.https.html": [ - "917c3b4d022d446488ac14c45fff114e34a95c5d", + "a7271905dc7d19b4778d59e7f2c59274b4f7b813", [ null, {} ] ], "remove-success.tentative.https.html": [ - "6fd4305b4340a036ddba6084d9f6c5b929254f2e", + "ad60d6398dd848e935898810673d3aac3eba0333", [ null, {} @@ -688502,6 +689740,15 @@ ] ], "role": { + "abstract-roles.html": [ + "8a98ba74ead17698a48957c88e98601925f4e8e0", + [ + null, + { + "testdriver": true + } + ] + ], "basic.html": [ "5cb838647015de9ea295e60184b2300bbb718bfe", [ @@ -688511,6 +689758,33 @@ } ] ], + "fallback-roles.html": [ + "5242a02deec006b6dcfc152c7d5963c0bb85cdbe", + [ + null, + { + "testdriver": true + } + ] + ], + "form-roles.html": [ + "935899c583be85b4a8593567a94e87c826dc0d87", + [ + null, + { + "testdriver": true + } + ] + ], + "invalid-roles.html": [ + "e7d38dc8c950c53a9f15610a1f8eff64f177d8c4", + [ + null, + { + "testdriver": true + } + ] + ], "list-roles.html": [ "5d9787f04bfdcbdb236e38583b01401269419b9a", [ @@ -688529,8 +689803,17 @@ } ] ], + "role_none_conflict_resolution.html": [ + "efb247fc77cfe217a5856f0b2c031eaefedb5e98", + [ + null, + { + "testdriver": true + } + ] + ], "roles.html": [ - "71946cbffa50de3c09eaa6a449657476a9aae597", + "72c9cdd0cd35eb063491dd93801d6c2b5eb55fac", [ null, { @@ -697032,7 +698315,7 @@ ] ], "public-key-credential-to-json.https.window.js": [ - "339f16df838b156760711e40c0f0574452cbfb70", + "8de3b8c3cd09ac92fc2f1ade93e3ab7888cddc72", [ "webauthn/public-key-credential-to-json.https.window.html", { @@ -705294,6 +706577,13 @@ {} ] ], + "RTCRtpParameters-codec.html": [ + "5c81349b1528aaa17f8b17920c15e6664f9709e3", + [ + null, + {} + ] + ], "RTCRtpParameters-maxFramerate.html": [ "3e348f0d147bdb6cd0583d4f5596feb30f86cb52", [ @@ -715519,7 +716809,16 @@ null, {} ] - ] + ], + "url-parsing": { + "url-parsing.html": [ + "21ef6cd3a95487b99c732f0ff300722ebf3defe3", + [ + null, + {} + ] + ] + } }, "opening-handshake": { "001.html": [ @@ -717753,7 +719052,7 @@ ] ], "datagrams.https.any.js": [ - "dc7133bb867e203ee651d887b64e48782dc3c58b", + "d5b8e3bbda158707bb5273628ec1abea7206d1ac", [ "webtransport/datagrams.https.any.html", { @@ -749061,7 +750360,7 @@ }, "back": { "back.py": [ - "21e8498ccd57da9b101055f39fedab02ef2f2fcb", + "62434323e0ad5339a861d0752d29f7d1f95c81cc", [ null, {} @@ -749481,7 +750780,7 @@ ] ], "event_buffer.py": [ - "69c96c8c545a4192b1b85b3af4de3bd283c5ad40", + "99a95df104951a2760d5a6a2f13e887d277f25aa", [ null, {} @@ -749509,7 +750808,7 @@ ] ], "subscription.py": [ - "d23a4cf83e5ef701280dd92c148e40651482eb4a", + "4d604f6877e04ead8d666423cbb3d0c1fdf9ce4e", [ null, {} @@ -749602,7 +750901,7 @@ }, "call_function": { "arguments.py": [ - "ea85b2c6c94fffd24b6ca6794910e9fb1270a7fd", + "0cb571038b76242f6b2e33b787217eba36dd78fe", [ null, {} @@ -749923,7 +751222,7 @@ ] ], "invalid.py": [ - "1dd6cd0aadf79c00f5e1e1770a03d7c12bf319c0", + "005574b03ca265a73e5569c27d08f9f456347b5b", [ null, {} @@ -750091,7 +751390,7 @@ ] ], "navigate.py": [ - "bada57942b4807e4b151f80514bf8598ac359262", + "492718292a178e5bfe242d75acad4b6efc3cbf71", [ null, {} @@ -750439,7 +751738,7 @@ }, "forward": { "forward.py": [ - "61c66e201b9e9898cec78c86c37fbf894b48c457", + "f27be403f9e95bd2359d5ae6224f6ae2708ff7c8", [ null, {} @@ -750921,7 +752220,7 @@ ] ], "navigate.py": [ - "a367fc105e126aba603a2c426f2bfe823ccad950", + "d61377af275902c48083d3d84b35c3bba30bc34e", [ null, {} diff --git a/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini new file mode 100644 index 00000000000..58e4780d677 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini @@ -0,0 +1,2 @@ +[color-mix-currentcolor-background-repaint-parent.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini new file mode 100644 index 00000000000..ae7e0461e5b --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini @@ -0,0 +1,2 @@ +[color-mix-currentcolor-background-repaint.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini new file mode 100644 index 00000000000..a6f5e206966 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini @@ -0,0 +1,2 @@ +[color-mix-currentcolor-outline-repaint-parent.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini new file mode 100644 index 00000000000..e7b7f5a85d4 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini @@ -0,0 +1,2 @@ +[color-mix-currentcolor-outline-repaint.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-color/parsing/color-mix-out-of-gamut.html.ini b/tests/wpt/metadata/css/css-color/parsing/color-mix-out-of-gamut.html.ini new file mode 100644 index 00000000000..f1ebf996f5f --- /dev/null +++ b/tests/wpt/metadata/css/css-color/parsing/color-mix-out-of-gamut.html.ini @@ -0,0 +1,54 @@ +[color-mix-out-of-gamut.html] + [Property color value 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL + + [Property color value 'color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-conditional/at-supports-selector-file-selector-button.html.ini b/tests/wpt/metadata/css/css-conditional/at-supports-selector-file-selector-button.html.ini new file mode 100644 index 00000000000..92d21eff876 --- /dev/null +++ b/tests/wpt/metadata/css/css-conditional/at-supports-selector-file-selector-button.html.ini @@ -0,0 +1,2 @@ +[at-supports-selector-file-selector-button.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/percentage-padding-004.html.ini b/tests/wpt/metadata/css/css-flexbox/percentage-padding-004.html.ini new file mode 100644 index 00000000000..e025cd0107b --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/percentage-padding-004.html.ini @@ -0,0 +1,2 @@ +[percentage-padding-004.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-composition.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-composition.html.ini new file mode 100644 index 00000000000..b0985b5f3e5 --- /dev/null +++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-composition.html.ini @@ -0,0 +1,750 @@ +[font-size-adjust-composition.html] + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (-0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (0) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (0.5) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (1) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (1.5) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (-0.5) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (0) should be [0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (0.5) should be [1.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (1) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (1.5) should be [3.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (-0.5) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (0) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (0.5) should be [1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (1) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (1.5) should be [3.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (-0.5) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (0) should be [0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (0.5) should be [1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (1) should be [2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (1.5) should be [2.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (-0.5) should be [2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (0) should be [2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (1) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (1.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (-0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (0) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (0.5) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (1) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (1.5) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (-0.5) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (0) should be [0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (0.5) should be [1.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (1) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (1.5) should be [3.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (-0.5) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (0) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (0.5) should be [1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (1) should be [2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (1.5) should be [3.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (-0.5) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (0) should be [0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (0.5) should be [1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (1) should be [2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (1.5) should be [2.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (-0.5) should be [2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (0) should be [2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (1) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (1.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (-0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (0) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (0.5) should be [cap-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (1) should be [cap-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (1.5) should be [cap-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (-0.5) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (0) should be [cap-height 0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (0.5) should be [cap-height 1.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (1) should be [cap-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (1.5) should be [cap-height 3.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (-0.5) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (0) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (0.5) should be [cap-height 1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (1) should be [cap-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (1.5) should be [cap-height 3.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (-0.5) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (0) should be [cap-height 0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (0.5) should be [cap-height 1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (1) should be [cap-height 2\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (1.5) should be [cap-height 2.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (-0.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (0) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (1) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (1.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (-0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (0) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (0.5) should be [ch-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (1) should be [ch-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (1.5) should be [ch-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (-0.5) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (0) should be [ch-width 0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (0.5) should be [ch-width 1.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (1) should be [ch-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (1.5) should be [ch-width 3.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (-0.5) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (0) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (0.5) should be [ch-width 1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (1) should be [ch-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (1.5) should be [ch-width 3.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (-0.5) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (0) should be [ch-width 0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (0.5) should be [ch-width 1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (1) should be [ch-width 2\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (1.5) should be [ch-width 2.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (-0.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (0) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (1) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (1.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (-0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (0) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (0.5) should be [ic-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (1) should be [ic-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (1.5) should be [ic-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (-0.5) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (0) should be [ic-width 0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (0.5) should be [ic-width 1.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (1) should be [ic-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (1.5) should be [ic-width 3.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (-0.5) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (0) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (0.5) should be [ic-width 1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (1) should be [ic-width 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (1.5) should be [ic-width 3.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (-0.5) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (0) should be [ic-width 0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (0.5) should be [ic-width 1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (1) should be [ic-width 2\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (1.5) should be [ic-width 2.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (-0.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (0) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (1) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (1.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (-0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (0) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (0.5) should be [ic-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (1) should be [ic-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (1.5) should be [ic-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (-0.5) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (0) should be [ic-height 0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (0.5) should be [ic-height 1.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (1) should be [ic-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (1.5) should be [ic-height 3.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (-0.5) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (0) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (0.5) should be [ic-height 1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (1) should be [ic-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (1.5) should be [ic-height 3.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (-0.5) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (0) should be [ic-height 0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (0.5) should be [ic-height 1.25\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (1) should be [ic-height 2\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (1.5) should be [ic-height 2.75\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (-0.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (0) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (0.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (1) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (1.5) should be [none\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (-0.5) should be [0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (0) should be [0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (0.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (1) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (1.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (-0.5) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (0) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (0.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (1) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (1.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (-0.5) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (0) should be [0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (0.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (1) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (1.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (-0.5) should be [0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (0) should be [0.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (0.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (1) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (1.5) should be [cap-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (-0.5) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (0) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (0.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (1) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (1.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (-0.5) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (0) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (0.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (1) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (1.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (-0.5) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (0) should be [cap-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (0.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (1) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (1.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (-0.5) should be [cap-height 0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (0) should be [cap-height 0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (0.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (1) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (1.5) should be [ch-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (-0.5) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (0) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (0.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (1) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (1.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (-0.5) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (0) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (0.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (1) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (1.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (-0.5) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (0) should be [ch-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (0.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (1) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (1.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (-0.5) should be [ch-width 0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (0) should be [ch-width 0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (0.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (1) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (1.5) should be [ic-width 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (-0.5) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (0) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (0.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (1) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (1.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (-0.5) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (0) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (0.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (1) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (1.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (-0.5) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (0) should be [ic-width 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (0.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (1) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (1.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (-0.5) should be [ic-width 0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (0) should be [ic-width 0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (0.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (1) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (1.5) should be [ic-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (-0.5) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (0) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (0.5) should be [ex-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (1) should be [ex-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (1.5) should be [ex-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (-0.5) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (0) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (0.5) should be [ex-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (1) should be [ex-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (1.5) should be [ex-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (-0.5) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (0) should be [ic-height 0.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (0.5) should be [ex-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (1) should be [ex-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (1.5) should be [ex-height 2.5\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (-0.5) should be [ic-height 0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (0) should be [ic-height 0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (0.5) should be [ex-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (1) should be [ex-height 2.0\]] + expected: FAIL + + [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (1.5) should be [ex-height 2.0\]] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-position/overlay/animation/overlay-interpolation.html.ini b/tests/wpt/metadata/css/css-position/overlay/animation/overlay-interpolation.html.ini new file mode 100644 index 00000000000..0327458e15a --- /dev/null +++ b/tests/wpt/metadata/css/css-position/overlay/animation/overlay-interpolation.html.ini @@ -0,0 +1,264 @@ +[overlay-interpolation.html] + [CSS Transitions: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (0) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0.1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0.9) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (0) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (0) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (1) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (-1) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (-1) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (0) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (-1) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (0) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [CSS Animations: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]] + expected: FAIL + + [Web Animations: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (0.5) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Transitions: property <overlay> from [none\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (0.5) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (0) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (0.5) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (1) should be [none\]] + expected: FAIL + + [CSS Animations: property <overlay> from [none\] to [none\] at (1.5) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (-1) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (0) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (0.5) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (1) should be [none\]] + expected: FAIL + + [Web Animations: property <overlay> from [none\] to [none\] at (1.5) should be [none\]] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom/idlharness.html.ini b/tests/wpt/metadata/css/cssom/idlharness.html.ini index 1289e66d132..1398814cee8 100644 --- a/tests/wpt/metadata/css/cssom/idlharness.html.ini +++ b/tests/wpt/metadata/css/cssom/idlharness.html.ini @@ -535,3 +535,15 @@ [ShadowRoot interface: attribute adoptedStyleSheets] expected: FAIL + + [CSSImportRule interface: attribute layerName] + expected: FAIL + + [CSSImportRule interface: attribute supportsText] + expected: FAIL + + [CSSImportRule interface: sheet.cssRules[0\] must inherit property "layerName" with the proper type] + expected: FAIL + + [CSSImportRule interface: sheet.cssRules[0\] must inherit property "supportsText" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/response/response-body-read-task-handling.html.ini b/tests/wpt/metadata/fetch/api/response/response-body-read-task-handling.html.ini new file mode 100644 index 00000000000..30dbc35c06a --- /dev/null +++ b/tests/wpt/metadata/fetch/api/response/response-body-read-task-handling.html.ini @@ -0,0 +1,3 @@ +[response-body-read-task-handling.html] + [piping from a body stream to a JS-written WritableStream should occur in a microtask scope] + expected: FAIL diff --git a/tests/wpt/metadata/fetch/data-urls/navigate.window.js.ini b/tests/wpt/metadata/fetch/data-urls/navigate.window.js.ini deleted file mode 100644 index d3c0ec7eb61..00000000000 --- a/tests/wpt/metadata/fetch/data-urls/navigate.window.js.ini +++ /dev/null @@ -1,6 +0,0 @@ -[navigate.window.html] - [Nothing fancy] - expected: FAIL - - [base64] - expected: FAIL diff --git a/tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini b/tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini index 5b0348afa74..361838941f2 100644 --- a/tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini +++ b/tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini @@ -1,4 +1,5 @@ [iframe.tentative.https.window.html] + expected: TIMEOUT [private to local: failed preflight.] expected: FAIL @@ -33,4 +34,4 @@ expected: FAIL [public to local, grandparent navigates: success.] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini b/tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini index 09aa994d7e1..907ee959867 100644 --- a/tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini +++ b/tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini @@ -23,9 +23,6 @@ [treat-as-public to private: failure.] expected: FAIL - [local https to local https: success.] - expected: FAIL - [private https to local https: failure.] expected: FAIL diff --git a/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini b/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini index 9749a4fccd5..36a410bfecb 100644 --- a/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini +++ b/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini @@ -147,5 +147,5 @@ [list-style-image sec-fetch-site - HTTPS downgrade-upgrade] expected: FAIL - [border-image sec-fetch-dest - Not sent to non-trustworthy cross-site destination] + [border-image sec-fetch-site - HTTPS downgrade (header not sent)] expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.https.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.https.html.ini new file mode 100644 index 00000000000..2f7885994ac --- /dev/null +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.https.html.ini @@ -0,0 +1,6 @@ +[document-state.https.html] + [A navigation's initiator origin and referrer are stored in the document state and used in the document repopulation case] + expected: FAIL + + [A navigation's initiator origin and referrer are stored in the document state and used on location.reload()] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html.ini deleted file mode 100644 index 58bb2d39c3b..00000000000 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[document-state.tentative.https.html] - [A navigation's initiator origin and referrer are stored in the document state] - expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini index 6e9f7acf151..c8a3c8f9e68 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini @@ -1,6 +1,6 @@ [scroll-restoration-fragment-scrolling-cross-origin.html] type: testharness - expected: TIMEOUT + expected: ERROR [Manual scroll restoration should take precedent over scrolling to fragment in cross origin navigation] expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini index c5fc1407992..530635e744f 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini @@ -1,10 +1,6 @@ [iframe-src-aboutblank-navigate-immediately.html] - expected: TIMEOUT [Navigating to a different document with window.open] expected: FAIL [Navigating to a different document with link click] expected: FAIL - - [Navigating to a different document with form submission] - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini index 149bcb4ff8c..b8fd22e2b81 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini @@ -10,3 +10,6 @@ [load & pageshow events do not fire on contentWindow of <iframe> element created with src='about:blank'] expected: FAIL + + [load & pageshow events do not fire on contentWindow of <iframe> element created with src=''] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini index bcda478adb1..5a245d61359 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini @@ -1,10 +1,6 @@ [javascript-url-referrer.window.html] - expected: TIMEOUT [unsafe-url referrer policy used to create the starting page] expected: FAIL [origin referrer policy used to create the starting page] expected: FAIL - - [no-referrer referrer policy used to create the starting page] - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini index 78240a2f463..8ae58f9f1e2 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini @@ -16,3 +16,6 @@ [D83D DE0D set in href="" targeting a frame and clicked] expected: FAIL + + [DE0D 0041 set in href="" targeting a frame and clicked] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini index d77d78be5ae..2701c1818a5 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini @@ -1,3 +1,4 @@ [javascript-url-security-check-same-origin-domain.sub.html] + expected: TIMEOUT [javascript: URL security check for same-origin-domain but not same-origin] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini index 9eb22957864..27889a98fb5 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini @@ -1,7 +1,6 @@ [navigate-to-unparseable-url.html] - expected: TIMEOUT [location.href setter throws a SyntaxError DOMException for unparseable URLs] - expected: TIMEOUT + expected: FAIL [<a> tag navigate fails for unparseable URLs] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini new file mode 100644 index 00000000000..4ecd6d9f753 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini @@ -0,0 +1,3 @@ +[navigation-unload-cross-origin.sub.window.html] + [Cross-origin navigation started from unload handler must be ignored] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini index 0e40ffc0656..9f7f24f662e 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini @@ -1,4 +1,3 @@ [nav-cancelation-2.sub.html] - expected: TIMEOUT [grandparent cancels a pending navigation in a cross-origin grandchild] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse-during-unload.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse-during-unload.html.ini new file mode 100644 index 00000000000..f5b7b25324f --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse-during-unload.html.ini @@ -0,0 +1,4 @@ +[traverse-during-unload.html] + expected: TIMEOUT + [Traversing the history during unload] + expected: TIMEOUT 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_2.html.ini new file mode 100644 index 00000000000..5d17a8e9419 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini @@ -0,0 +1,3 @@ +[traverse_the_history_2.html] + [Multiple history traversals, last would be aborted] + expected: FAIL diff --git a/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html.ini b/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html.ini new file mode 100644 index 00000000000..e8075a662b2 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.requestAnimationFrame.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html.ini b/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html.ini new file mode 100644 index 00000000000..7278d75d305 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.toBlob.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini b/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini index 5cdcce07c65..2a54f2f8814 100644 --- a/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini +++ b/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini @@ -1,2 +1,2 @@ [canvas.2d.disconnected.html] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html.ini new file mode 100644 index 00000000000..ae2e171e5b1 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.convertToBlob.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html.ini new file mode 100644 index 00000000000..9c825a33c04 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.convertToBlob.w.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html.ini new file mode 100644 index 00000000000..21eb320f9cc --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.createImageBitmap.html] + expected: FAIL diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html.ini new file mode 100644 index 00000000000..3bf42dfd1d9 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.createImageBitmap.w.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html.ini new file mode 100644 index 00000000000..9e6d59e328a --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.drawImage.html] + expected: FAIL diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html.ini new file mode 100644 index 00000000000..ae30aba4a29 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.drawImage.w.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html.ini new file mode 100644 index 00000000000..5f3d19041e4 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.getImageData.html] + expected: FAIL diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html.ini new file mode 100644 index 00000000000..3b219b04a18 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.getImageData.w.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html.ini new file mode 100644 index 00000000000..fe0c3e0eb4a --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.putImageData.html] + expected: FAIL diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html.ini new file mode 100644 index 00000000000..39248753058 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.putImageData.w.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html.ini new file mode 100644 index 00000000000..93d97a15ac9 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.render-opportunities.transferToImageBitmap.w.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.html.ini new file mode 100644 index 00000000000..378b96580e8 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.html.ini @@ -0,0 +1,2 @@ +[2d.layer.unclosed.html] + expected: FAIL diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.w.html.ini new file mode 100644 index 00000000000..7e1b1ae3d76 --- /dev/null +++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.w.html.ini @@ -0,0 +1,2 @@ +[2d.layer.unclosed.w.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini index 50e9a6ac04a..108d8331261 100644 --- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini +++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini @@ -1640,6 +1640,36 @@ [SVGElement interface: attribute onbeforetoggle] expected: FAIL + [VisibilityStateEntry interface: existence and properties of interface object] + expected: FAIL + + [VisibilityStateEntry interface object length] + expected: FAIL + + [VisibilityStateEntry interface object name] + expected: FAIL + + [VisibilityStateEntry interface: existence and properties of interface prototype object] + expected: FAIL + + [VisibilityStateEntry interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [VisibilityStateEntry interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [VisibilityStateEntry interface: attribute name] + expected: FAIL + + [VisibilityStateEntry interface: attribute entryType] + expected: FAIL + + [VisibilityStateEntry interface: attribute startTime] + expected: FAIL + + [VisibilityStateEntry interface: attribute duration] + expected: FAIL + [idlharness.https.html?include=(Document|Window)] [Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type] diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini index 9b27c5c1957..add66c12f92 100644 --- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini +++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini @@ -1,7 +1,6 @@ [update-the-rendering.html] - expected: TIMEOUT ["Flush autofocus candidates" should be happen after the first animation frame callbacks, and before a resize event in the next iteration of window event loop.] expected: TIMEOUT ["Flush autofocus candidates" should be happen before a scroll event and animation frame callbacks] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini index 2d3fbf0f308..25d9964f057 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini @@ -1,5 +1,4 @@ [iframe_sandbox_popups_escaping-1.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/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini index 76e34322dca..6bec7a732b8 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini @@ -1,5 +1,4 @@ [iframe_sandbox_popups_nonescaping-2.html] type: testharness - expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html.ini new file mode 100644 index 00000000000..d3ac84dbc2b --- /dev/null +++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html.ini @@ -0,0 +1,12 @@ +[form-double-submit-requestsubmit.html] + [test runTest2 with submitterType: input, callRequestSubmit: true, callSubmit: true, preventDefault: false, passSubmitter: true] + expected: FAIL + + [test runTest2 with submitterType: input, callRequestSubmit: false, callSubmit: true, preventDefault: false, passSubmitter: true] + expected: FAIL + + [test runTest2 with submitterType: button, callRequestSubmit: true, callSubmit: true, preventDefault: false, passSubmitter: true] + expected: FAIL + + [test runTest2 with submitterType: button, callRequestSubmit: false, callSubmit: true, preventDefault: false, passSubmitter: true] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini new file mode 100644 index 00000000000..202f48ceee9 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini @@ -0,0 +1,9 @@ +[name-attribute.tentative.html] + [basic handling of mutually exclusive details] + expected: FAIL + + [more complex handling of mutually exclusive details] + expected: FAIL + + [mutually exclusive details across multiple names and multiple tree scopes] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini new file mode 100644 index 00000000000..7e889fccc46 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini @@ -0,0 +1,2 @@ +[dialog-focus-previous-outside.html] + expected: ERROR diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html.ini new file mode 100644 index 00000000000..d1af0a488be --- /dev/null +++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html.ini @@ -0,0 +1,3 @@ +[dialog-no-throw-requested-state.html] + [dialog-no-throw-requested-state] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini index 2d44172f4dc..cc18f512574 100644 --- a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini +++ b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini @@ -1,6 +1,5 @@ [htmlanchorelement_noopener.html] type: testharness - expected: TIMEOUT [Check that targeting of rel=noopener with a given name ignores an existing window with that name] expected: NOTRUN @@ -8,10 +7,10 @@ expected: FAIL [Check that rel=noopener with target=_top does a normal load] - expected: NOTRUN + expected: FAIL [Check that rel=noopener with target=_parent does a normal load] - expected: NOTRUN + expected: FAIL [Check that rel=noopener with target=_self does a normal load] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini deleted file mode 100644 index fc0233f5241..00000000000 --- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[module-delayed.html] - [async document.write in a module] - expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js.ini deleted file mode 100644 index 39ffbb01044..00000000000 --- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js.ini +++ /dev/null @@ -1,4 +0,0 @@ -[reload.window.html] - expected: TIMEOUT - [Reloading a document.open()'d page should reload the URL of the entry realm's responsible document] - expected: TIMEOUT diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini index 8845054116d..e55f8f2ce3c 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini @@ -3,3 +3,6 @@ expected: TIMEOUT [The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document] expected: TIMEOUT + + [The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document] + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.ini new file mode 100644 index 00000000000..b2dab02839a --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.ini @@ -0,0 +1,14 @@ +[atomics-wait-async.https.any.html] + [Atomics.waitAsync timeout in a Window] + expected: FAIL + + [Atomics.waitAsync notification in a Window] + expected: FAIL + + +[atomics-wait-async.https.any.worker.html] + [Atomics.waitAsync timeout in a DedicatedWorkerGlobalScope] + expected: FAIL + + [Atomics.waitAsync notification in a DedicatedWorkerGlobalScope] + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini index 4a48dd15a9d..1d71471b73c 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini @@ -1,6 +1,7 @@ [promise-rejection-events.html] + expected: TIMEOUT [delayed handling: delaying handling rejected promise created from createImageBitmap will cause both events to fire] - expected: FAIL + expected: TIMEOUT [unhandledrejection: from createImageBitmap which is UA triggered] expected: FAIL diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini index 0b5d4e5f650..64c04b8a877 100644 --- a/tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini +++ b/tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini @@ -1,3 +1,4 @@ [navigation-id-element-timing.tentative.html] + expected: TIMEOUT [Element Timing navigation id test] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini index 31761973a45..6a863a16256 100644 --- a/tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini +++ b/tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini @@ -2,3 +2,6 @@ expected: TIMEOUT [Navigation Id should be 1 at initial navigations.] expected: TIMEOUT + + [Navigation Ids should exist and are all the same as the initial navigation.] + expected: TIMEOUT diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini index d8eca554263..19ca16785b5 100644 --- a/tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini +++ b/tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini @@ -1,3 +1,4 @@ [navigation-id-long-task-task-attribution.tentative.html] + expected: TIMEOUT [Long Task/Task Attribution navigation id test] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini index 851caea6c13..74e2fb18b9f 100644 --- a/tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini +++ b/tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini @@ -1,3 +1,4 @@ [navigation-id-mark-measure.tentative.html] + expected: TIMEOUT [Mark/Measure navigation id test] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini index 393df22f1ba..92aef2f66fa 100644 --- a/tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini +++ b/tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini @@ -1,3 +1,7 @@ [navigation-id-reset.tentative.html] + expected: TIMEOUT [Navigation Id should be reset to 1 after reload.] expected: FAIL + + [Navigation Id should be re-generated after reload.] + expected: TIMEOUT diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini index b72950d068f..f2408ea2c08 100644 --- a/tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini +++ b/tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini @@ -1,3 +1,4 @@ [navigation-id-resource-timing.tentative.html] + expected: TIMEOUT [Resource Timing navigation id test] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-worker-created-entries.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-worker-created-entries.html.ini new file mode 100644 index 00000000000..8c5b66ff774 --- /dev/null +++ b/tests/wpt/metadata/performance-timeline/navigation-id-worker-created-entries.html.ini @@ -0,0 +1,3 @@ +[navigation-id-worker-created-entries.html] + [Navigation id of performance entries created by workers should be empty] + expected: FAIL diff --git a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini index a96df921c04..cb1495ca247 100644 --- a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini +++ b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini @@ -26,6 +26,12 @@ [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type] expected: FAIL + [PerformanceResourceTiming interface: attribute firstInterimResponseStart] + expected: FAIL + + [PerformanceResourceTiming interface: resource must inherit property "firstInterimResponseStart" with the proper type] + expected: FAIL + [idlharness.any.worker.html] [PerformanceResourceTiming interface: resource must inherit property "workerStart" with the proper type] @@ -54,3 +60,9 @@ [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type] expected: FAIL + + [PerformanceResourceTiming interface: attribute firstInterimResponseStart] + expected: FAIL + + [PerformanceResourceTiming interface: resource must inherit property "firstInterimResponseStart" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini b/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini index 9df96f72c08..23c4be4506a 100644 --- a/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini +++ b/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini @@ -1,10 +1,25 @@ [nested-context-navigations-iframe.html] expected: TIMEOUT [Test that iframe refreshes are not observable by the parent] - expected: TIMEOUT + expected: NOTRUN [Test that crossorigin iframe refreshes are not observable by the parent] expected: NOTRUN [Test that cross-site iframe refreshes are not observable by the parent] expected: NOTRUN + + [Test that crossorigin iframe navigations are not observable by the parent, even after history navigations by the parent] + expected: TIMEOUT + + [Test that cross-site iframe navigations are not observable by the parent, even after history navigations by the parent] + expected: NOTRUN + + [Test that iframe navigations are not observable by the parent] + expected: NOTRUN + + [Test that crossorigin iframe navigations are not observable by the parent] + expected: NOTRUN + + [Test that cross-site iframe navigations are not observable by the parent] + expected: NOTRUN diff --git a/tests/wpt/metadata/streams/readable-streams/owning-type-message-port.any.js.ini b/tests/wpt/metadata/streams/readable-streams/owning-type-message-port.any.js.ini new file mode 100644 index 00000000000..ce878bde61a --- /dev/null +++ b/tests/wpt/metadata/streams/readable-streams/owning-type-message-port.any.js.ini @@ -0,0 +1,21 @@ +[owning-type-message-port.any.sharedworker.html] + expected: ERROR + +[owning-type-message-port.any.worker.html] + [Transferred MessageChannel works as expected] + expected: FAIL + + [Second branch of owning ReadableStream tee should end up into errors with transfer only values] + expected: FAIL + + +[owning-type-message-port.any.html] + [Transferred MessageChannel works as expected] + expected: FAIL + + [Second branch of owning ReadableStream tee should end up into errors with transfer only values] + expected: FAIL + + +[owning-type-message-port.any.serviceworker.html] + expected: ERROR diff --git a/tests/wpt/metadata/streams/readable-streams/owning-type-video-frame.any.js.ini b/tests/wpt/metadata/streams/readable-streams/owning-type-video-frame.any.js.ini new file mode 100644 index 00000000000..283faebc9c8 --- /dev/null +++ b/tests/wpt/metadata/streams/readable-streams/owning-type-video-frame.any.js.ini @@ -0,0 +1,38 @@ +[owning-type-video-frame.any.serviceworker.html] + expected: ERROR + +[owning-type-video-frame.any.sharedworker.html] + expected: ERROR + +[owning-type-video-frame.any.worker.html] + [ReadableStream of type owning should close serialized chunks] + expected: FAIL + + [ReadableStream of type owning should transfer JS chunks with transferred values] + expected: FAIL + + [ReadableStream of type owning should error when trying to enqueue not serializable values] + expected: FAIL + + [ReadableStream of type owning should clone serializable objects when teeing] + expected: FAIL + + [ReadableStream of type owning should clone JS Objects with serializables when teeing] + expected: FAIL + + +[owning-type-video-frame.any.html] + [ReadableStream of type owning should close serialized chunks] + expected: FAIL + + [ReadableStream of type owning should transfer JS chunks with transferred values] + expected: FAIL + + [ReadableStream of type owning should error when trying to enqueue not serializable values] + expected: FAIL + + [ReadableStream of type owning should clone serializable objects when teeing] + expected: FAIL + + [ReadableStream of type owning should clone JS Objects with serializables when teeing] + expected: FAIL diff --git a/tests/wpt/metadata/streams/readable-streams/owning-type.any.js.ini b/tests/wpt/metadata/streams/readable-streams/owning-type.any.js.ini new file mode 100644 index 00000000000..4d1c7f59d60 --- /dev/null +++ b/tests/wpt/metadata/streams/readable-streams/owning-type.any.js.ini @@ -0,0 +1,39 @@ +[owning-type.any.html] + [ReadableStream can be constructed with owning type] + expected: FAIL + + [ReadableStream of type owning should call start with a ReadableStreamDefaultController] + expected: FAIL + + [ReadableStream should be able to call enqueue with an empty transfer list] + expected: FAIL + + [ReadableStream should check transfer parameter] + expected: FAIL + + [ReadableStream of type owning should transfer enqueued chunks] + expected: FAIL + + +[owning-type.any.sharedworker.html] + expected: ERROR + +[owning-type.any.worker.html] + [ReadableStream can be constructed with owning type] + expected: FAIL + + [ReadableStream of type owning should call start with a ReadableStreamDefaultController] + expected: FAIL + + [ReadableStream should be able to call enqueue with an empty transfer list] + expected: FAIL + + [ReadableStream should check transfer parameter] + expected: FAIL + + [ReadableStream of type owning should transfer enqueued chunks] + expected: FAIL + + +[owning-type.any.serviceworker.html] + expected: ERROR diff --git a/tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini b/tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini index 04c2032c723..39d039a0132 100644 --- a/tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini +++ b/tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini @@ -1,5 +1,5 @@ [cross-partition.https.tentative.html] - expected: TIMEOUT + expected: CRASH [BroadcastChannel messages aren't received from a cross-partition iframe] expected: FAIL diff --git a/tests/wpt/metadata/webmessaging/without-ports/017.html.ini b/tests/wpt/metadata/webmessaging/without-ports/017.html.ini new file mode 100644 index 00000000000..c7946fc91b4 --- /dev/null +++ b/tests/wpt/metadata/webmessaging/without-ports/017.html.ini @@ -0,0 +1,4 @@ +[017.html] + expected: TIMEOUT + [origin of the script that invoked the method, about:blank] + expected: TIMEOUT diff --git a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini b/tests/wpt/metadata/webmessaging/without-ports/018.html.ini deleted file mode 100644 index b7b36c1d3a4..00000000000 --- a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[018.html] - expected: TIMEOUT - [origin of the script that invoked the method, javascript:] - expected: TIMEOUT diff --git a/tests/wpt/metadata/websockets/multi-globals/url-parsing/url-parsing.html.ini b/tests/wpt/metadata/websockets/multi-globals/url-parsing/url-parsing.html.ini new file mode 100644 index 00000000000..b1c9a018c77 --- /dev/null +++ b/tests/wpt/metadata/websockets/multi-globals/url-parsing/url-parsing.html.ini @@ -0,0 +1,3 @@ +[url-parsing.html] + [Multiple globals for base URL in WebSocket constructor] + expected: FAIL diff --git a/tests/wpt/mozilla/meta/css/stylesheet_media_queries.html.ini b/tests/wpt/mozilla/meta/css/stylesheet_media_queries.html.ini deleted file mode 100644 index 77ca6b0688d..00000000000 --- a/tests/wpt/mozilla/meta/css/stylesheet_media_queries.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[stylesheet_media_queries.html] - [Media queries within stylesheets] - expected: FAIL diff --git a/tests/wpt/web-platform-tests/.azure-pipelines.yml b/tests/wpt/web-platform-tests/.azure-pipelines.yml index 7851cd61e1f..a21ebce6bc7 100644 --- a/tests/wpt/web-platform-tests/.azure-pipelines.yml +++ b/tests/wpt/web-platform-tests/.azure-pipelines.yml @@ -34,7 +34,7 @@ jobs: displayName: 'affected tests: Safari Technology Preview' condition: eq(variables['Build.Reason'], 'PullRequest') pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -51,7 +51,7 @@ jobs: displayName: 'affected tests without changes: Safari Technology Preview' condition: eq(variables['Build.Reason'], 'PullRequest') pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -93,7 +93,7 @@ jobs: dependsOn: decision condition: dependencies.decision.outputs['test_jobs.wptrunner_infrastructure'] pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -104,6 +104,7 @@ jobs: packages: virtualenv - template: tools/ci/azure/install_fonts.yml - template: tools/ci/azure/install_certs.yml + - template: tools/ci/azure/color_profile.yml - template: tools/ci/azure/install_chrome.yml - template: tools/ci/azure/install_firefox.yml - template: tools/ci/azure/install_safari.yml @@ -138,7 +139,7 @@ jobs: dependsOn: decision condition: dependencies.decision.outputs['test_jobs.tools_unittest'] pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -154,7 +155,7 @@ jobs: dependsOn: decision condition: dependencies.decision.outputs['test_jobs.tools_unittest'] pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -170,7 +171,7 @@ jobs: dependsOn: decision condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest'] pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -186,7 +187,7 @@ jobs: dependsOn: decision condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest'] pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -202,7 +203,7 @@ jobs: dependsOn: decision condition: dependencies.decision.outputs['test_jobs.wpt_integration'] pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: # full checkout required - task: UsePythonVersion@0 @@ -222,7 +223,7 @@ jobs: dependsOn: decision condition: dependencies.decision.outputs['test_jobs.wpt_integration'] pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: # full checkout required - task: UsePythonVersion@0 @@ -477,7 +478,7 @@ jobs: parallel: 8 # chosen to make runtime ~2h timeoutInMinutes: 180 pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -487,6 +488,7 @@ jobs: parameters: packages: virtualenv - template: tools/ci/azure/install_certs.yml + - template: tools/ci/azure/color_profile.yml - template: tools/ci/azure/install_safari.yml parameters: channel: stable @@ -518,7 +520,7 @@ jobs: parallel: 8 # chosen to make runtime ~2h timeoutInMinutes: 180 pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -528,6 +530,7 @@ jobs: parameters: packages: virtualenv - template: tools/ci/azure/install_certs.yml + - template: tools/ci/azure/color_profile.yml - template: tools/ci/azure/install_safari.yml - template: tools/ci/azure/update_hosts.yml - template: tools/ci/azure/update_manifest.yml @@ -556,7 +559,7 @@ jobs: parallel: 8 # chosen to make runtime ~2h timeoutInMinutes: 180 pool: - vmImage: 'macOS-12' + vmImage: 'macOS-13' steps: - task: UsePythonVersion@0 inputs: @@ -566,6 +569,7 @@ jobs: parameters: packages: virtualenv - template: tools/ci/azure/install_certs.yml + - template: tools/ci/azure/color_profile.yml - template: tools/ci/azure/update_hosts.yml - template: tools/ci/azure/update_manifest.yml - script: | diff --git a/tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js b/tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js index d6812121295..4f9dbf7a754 100644 --- a/tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js +++ b/tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js @@ -39,4 +39,16 @@ async_test(function(testCase) { testCase.done(); }); reader.readAsDataURL(blob); -}, 'readAsDataURL result for Blob with unspecified MIME type');
\ No newline at end of file +}, 'readAsDataURL result for Blob with unspecified MIME type'); + +async_test(function(testCase) { + var blob = new Blob([]); + var reader = new FileReader(); + + reader.onload = this.step_func(function() { + assert_equals(reader.result, + "data:application/octet-stream;base64,"); + testCase.done(); + }); + reader.readAsDataURL(blob); +}, 'readAsDataURL result for empty Blob');
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html b/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html new file mode 100644 index 00000000000..36eccd6a522 --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +// Here's the set-up for this test: +// Step 1 (top-frame) Embeds a cross-origin iframe. +// Step 2 (sub-frame) Make a cross-origin POST request. +// Step 3 (sub-frame) Checks if platform version header is present and alerts top frame. +// Step 4 (top-frame) Asserts header was present and returns. +async_test(t => { + // Step 4 + window.addEventListener("message", t.step_func(e => { + assert_equals(e.data, "HadPlatformVersion"); + t.done(); + })); + + // Step 1 + let iframe = document.createElement("iframe"); + iframe.src = "https://{{domains[www1]}}:{{ports[https][0]}}/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html"; + document.body.appendChild(iframe); +}, "Accept-CH with wildcard policy and iframe subresource"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html.sub.headers b/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html.sub.headers new file mode 100644 index 00000000000..66ad9243c7d --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html.sub.headers @@ -0,0 +1,2 @@ +Accept-CH: sec-ch-ua-platform-version +Permissions-Policy: ch-ua-platform-version=("https://*.{{domains[]}}:{{ports[https][0]}}")
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html new file mode 100644 index 00000000000..a7c2ad705db --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +promise_test(async t => { + var navigationTiming = window.performance.getEntriesByType('navigation')[0]; + assert_not_equals(navigationTiming, undefined); + assert_equals(navigationTiming.criticalCHRestart, 0, "This should be 0 as there was no restart."); +}, "Critical-CH no-restart navigation timing test"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html new file mode 100644 index 00000000000..d3a49a2e91e --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +promise_test(async t => { + var navigationTiming = window.performance.getEntriesByType('navigation')[0]; + assert_not_equals(navigationTiming, undefined); + assert_less_than(navigationTiming.startTime, navigationTiming.criticalCHRestart, "Restarts happen after the beginning of the navigation"); + assert_less_than(navigationTiming.criticalCHRestart, navigationTiming.fetchStart, "Restarts happen before fetch"); +}, "Critical-CH restart navigation timing test"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers new file mode 100644 index 00000000000..b221a32886f --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers @@ -0,0 +1,2 @@ +Accept-CH: sec-ch-device-memory +Critical-CH: sec-ch-device-memory diff --git a/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html b/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html new file mode 100644 index 00000000000..250a9d9e224 --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html @@ -0,0 +1,16 @@ +<!doctype html> +<meta charset="utf-8"> +<script> +// Step 2 (client-hints/accept-ch.wildcard.https.sub.html) +const xhr = new XMLHttpRequest(); +xhr.open('POST', "https://{{domains[www2]}}:{{ports[https][0]}}/client-hints/resources/echo-ua-client-hints-received.py"); +xhr.onload = function() { + // Step 3 (client-hints/accept-ch.wildcard.https.sub.html) + if (xhr.getResponseHeader("sec-ch-ua-platform-received") != null) { + window.top.postMessage("HadPlatformVersion", "*"); + } else { + window.top.postMessage("MissingPlatformVersion", "*"); + } +}; +xhr.send(); +</script> diff --git a/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html.sub.headers b/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html.sub.headers new file mode 100644 index 00000000000..c1c0fcd5c2a --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html.sub.headers @@ -0,0 +1 @@ +Permissions-Policy: ch-ua-platform-version=("https://*.{{domains[]}}:{{ports[https][0]}}")
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-write-multiple.tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-write-multiple.tentative.https.sub.html new file mode 100644 index 00000000000..73cdd2f049e --- /dev/null +++ b/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-write-multiple.tentative.https.sub.html @@ -0,0 +1,106 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Async Clipboard write should cancel the prior pending request</title> +<link rel="help" href="https://github.com/w3c/clipboard-apis/issues/161"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/user-activation.js"></script> + +<iframe width="50" height="50" id="same" src="resources/page.html"></iframe><br> +<iframe width="50" height="50" id="cross" src="https://{{hosts[alt][]}}:{{ports[https][1]}}/clipboard-apis/resources/page.html"></iframe><br> +<input value="Test"> +<script> +"use strict"; + +// Permissions are required in order to invoke navigator.clipboard functions in +// an automated test. +async function getPermissions() { + await test_driver.set_permission({name: "clipboard-read"}, "granted"); + await test_driver.set_permission({name: "clipboard-write"}, "granted"); + await waitForUserActivation(); +} + +function waitForMessage(msg) { + return new Promise((resolve) => { + window.addEventListener("message", function handler(e) { + if (e.data == msg) { + window.removeEventListener("message", handler); + resolve(); + } + }); + }); +} + +function generateRandomString() { + return "random number: " + Math.random(); +} + +function testCancelPendingWrite(funcToMakeNewRequest, msg) { + promise_test(async t => { + await getPermissions(); + + // Create a pending write request which should be rejected after a new + // request is made. + let resolvePendingPromise; + let promise = navigator.clipboard.write([ + new ClipboardItem({ + "text/plain": new Promise((resolve) => { resolvePendingPromise = resolve; }), + }), + ]).catch(e => { return e; }); + + // Make a new request that should cancel the prior pending request. + let str = generateRandomString(); + await funcToMakeNewRequest(str); + + // Pending request should be rejected with NotAllowedError. + let error = await promise; + assert_not_equals(error, undefined); + assert_equals(error.name, "NotAllowedError"); + + // Resolve pending promise. + resolvePendingPromise(generateRandomString()); + // Check clipboard data. + assert_equals(await navigator.clipboard.readText(), str); + }, msg); +} + +testCancelPendingWrite(async (str) => { + // A new write request should cancel the prior pending request. + await navigator.clipboard.write([ + new ClipboardItem({ + "text/plain": str, + }), + ]).catch(() => { + assert_true(false, "should not fail"); + }); +}, "clipboard.write() should cancel the prior pending one (same document)"); + +testCancelPendingWrite(async (str) => { + // A new write should cancel the prior pending request. + const iframe = document.getElementById("same"); + iframe.contentWindow.postMessage(["write", str], "*"); + await waitForMessage("done"); +}, "clipboard.write() should cancel the prior pending one (same-origin iframe)"); + +testCancelPendingWrite(async (str) => { + // A new write should cancel the prior pending request. + const iframe = document.getElementById("cross"); + iframe.contentWindow.postMessage(["write", str], "*"); + await waitForMessage("done"); +}, "clipboard.write() should cancel the prior pending one (cross-origin iframe)"); + +testCancelPendingWrite(async (str) => { + const input = document.querySelector("input"); + input.value = str; + input.focus(); + input.select(); + + // A new copy action should cancel the prior pending request. + const modifier_key = navigator.platform.includes("Mac") ? "\uE03D" : "\uE009"; + await new test_driver.Actions().keyDown(modifier_key).keyDown("c").send(); +}, "copy action should cancel the prior pending clipboard.write() request"); + +</script> diff --git a/tests/wpt/web-platform-tests/clipboard-apis/resources/page.html b/tests/wpt/web-platform-tests/clipboard-apis/resources/page.html new file mode 100644 index 00000000000..35bde8e5016 --- /dev/null +++ b/tests/wpt/web-platform-tests/clipboard-apis/resources/page.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-action.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="user-activation.js"></script> + +<div style="width: 10px; height: 10px"></div> +<script> +window.addEventListener("message", async (e) => { + if (e.data && e.data[0] == "write") { + test_driver.set_test_context(window.parent); + await test_driver.set_permission({name: 'clipboard-read'}, 'granted'); + await test_driver.set_permission({name: 'clipboard-write'}, 'granted'); + await waitForUserActivation(); + await navigator.clipboard.write([ + new ClipboardItem({ + "text/plain": e.data[1], + }), + ]).catch(() => { + assert_true(false, `should not fail`); + }); + window.parent.postMessage("done", "*"); + } +}); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/common/rendering-utils.js b/tests/wpt/web-platform-tests/common/rendering-utils.js index 8027cd5f848..46283bd5d07 100644 --- a/tests/wpt/web-platform-tests/common/rendering-utils.js +++ b/tests/wpt/web-platform-tests/common/rendering-utils.js @@ -7,14 +7,12 @@ */ function waitForAtLeastOneFrame() { return new Promise(resolve => { - // Different web engines work slightly different on this area but 1) waiting - // for two requestAnimationFrames() to happen one after another and 2) - // adding a step_timeout(0) to guarantee events have finished should be + // Different web engines work slightly different on this area but waiting + // for two requestAnimationFrames() to happen, one after another, should be // sufficient to ensure at least one frame has been generated anywhere. - // See https://bugzilla.mozilla.org/show_bug.cgi?id=1785615 window.requestAnimationFrame(() => { window.requestAnimationFrame(() => { - setTimeout(resolve, 0); + resolve(); }); }); }); diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html index dd66bb77ac7..b2abcbece0e 100644 --- a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html @@ -85,8 +85,10 @@ tests.forEach(test => { async_test(t => { - var url = generateUrlWithAllowCSPFrom(test.origin, test.allow_csp_from); - assert_iframe_with_csp(t, url, test.csp, test.expected, test.name, test.blockedURI); + const url = generateUrlWithAllowCSPFrom( + test.origin, test.allow_csp_from); + assert_iframe_with_csp(t, url, test.csp, test.expected, test.name, + test.blockedURI, /*checkImageLoaded=*/true); }, test.name); }); </script> diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js index 4adc5216961..7d2307ebbc9 100644 --- a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js +++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js @@ -102,14 +102,16 @@ function assert_required_csp(t, url, csp, expected) { document.body.appendChild(i); } -function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI) { - var i = document.createElement('iframe'); +function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI, + checkImageLoaded) { + const i = document.createElement('iframe'); url.searchParams.append("id", urlId); i.src = url.toString(); if (csp != null) i.csp = csp; var loaded = {}; + var onLoadReceived = {}; window.addEventListener("message", function (e) { if (e.source != i.contentWindow) return; @@ -146,24 +148,22 @@ function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI) { } else { // Assert iframe loads. Wait for the load event, the postMessage from the // script and the img load event. - let postMessage_received = false; - let img_loaded = false; + let img_loaded = !checkImageLoaded; window.addEventListener('message', t.step_func(e => { if (e.source != i.contentWindow) return; - if (e.data.loaded) { - assert_true(loaded[urlId]); - postMessage_received = true; - } else if (e.data === "img.loaded") + if (e.data === "img loaded") img_loaded = true; - if (i.onloadReceived && postMessage_received && img_loaded) + if (loaded[urlId] && onLoadReceived[urlId] && img_loaded) { t.done(); + } })); i.onload = t.step_func(function () { - if (loaded[urlId]) + onLoadReceived[urlId] = true; + if (loaded[urlId] && onLoadReceived[urlId] && img_loaded) { t.done(); - i.onloadReceived = true; + } }); } document.body.appendChild(i); diff --git a/tests/wpt/web-platform-tests/content-security-policy/nonce-hiding/nonce-hiding-move-document.html b/tests/wpt/web-platform-tests/content-security-policy/nonce-hiding/nonce-hiding-move-document.html new file mode 100644 index 00000000000..49de893ba03 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-security-policy/nonce-hiding/nonce-hiding-move-document.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<meta http-equiv="Content-Security-Policy" content="style-src 'self' 'nonce-allowme';"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1831328"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<title>Nonce isn't lost on document move</title> +<style type="text/css" nonce="allowme"> + p { + color: red; + } +</style> +<p>What color is this?</p> +<script> +test(function() { + const doc = document.implementation.createDocument("http://www.w3.org/1999/xhtml","html"); + const style = document.createElement("style"); + style.setAttribute("nonce", "allowme"); + style.textContent = "p { color: lime }"; + + doc.documentElement.appendChild(style); + document.body.appendChild(style); + assert_equals(style.nonce, "allowme", "Nonce should not have been lost"); + assert_equals(getComputedStyle(document.querySelector("p")).color, "rgb(0, 255, 0)", "Style should apply"); +}) +</script> diff --git a/tests/wpt/web-platform-tests/cookies/resources/list-cookies-for-script.py b/tests/wpt/web-platform-tests/cookies/resources/list-cookies-for-script.py new file mode 100644 index 00000000000..b325d1f7450 --- /dev/null +++ b/tests/wpt/web-platform-tests/cookies/resources/list-cookies-for-script.py @@ -0,0 +1,12 @@ +import json +from cookies.resources import helpers + +from wptserve.utils import isomorphic_decode + +def main(request, response): + headers = helpers.setNoCacheAndCORSHeaders(request, response) + headers[0] = (b"Content-Type", b"text/javascript") + cookies = helpers.readCookies(request) + decoded_cookies = {isomorphic_decode(key): isomorphic_decode(val) for key, val in cookies.items()} + return headers, 'self._cookies = [{}];\n'.format( + ', '.join(['"{}"'.format(name) for name in decoded_cookies.keys()])) diff --git a/tests/wpt/web-platform-tests/core-aam/aria-braillelabel-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-braillelabel-manual.html new file mode 100644 index 00000000000..a0668e8a501 --- /dev/null +++ b/tests/wpt/web-platform-tests/core-aam/aria-braillelabel-manual.html @@ -0,0 +1,71 @@ +<!doctype html> +<html> + <head> + <title>aria-braillelabel</title> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> + <link rel="stylesheet" href="/wai-aria/scripts/manual.css"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/wai-aria/scripts/ATTAcomm.js"></script> + <script> + setup({explicit_timeout: true, explicit_done: true }); + + var theTest = new ATTAcomm( + { + "steps" : [ + { + "element" : "test", + "test" : { + "ATK" : [ + [ + "property", + "objectAttributes", + "contains", + "braillelabel:foobar" + ] + ], + "AXAPI" : [ + [ + "property", + "AXBrailleLabel", + "is", + "foobar" + ] + ], + "IAccessible2" : [ + [ + "property", + "objectAttributes", + "contains", + "braillelabel:foobar" + ] + ], + "UIA" : [ + [ + "property", + "AriaProperties.braillelabel", + "is", + "foobar" + ] + ] + }, + "title" : "step 1", + "type" : "test" + } + ], + "title" : "aria-braillelabel" +} + + ) ; + </script> + </head> + <body> + <p>This test examines the ARIA properties for aria-braillelabel.</p> + <button id="test" aria-braillelabel="foobar"> + </div> + + <div id="manualMode"></div> + <div id="log"></div> + <div id="ATTAmessages"></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription-manual.html new file mode 100644 index 00000000000..e509c88159b --- /dev/null +++ b/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription-manual.html @@ -0,0 +1,71 @@ +<!doctype html> +<html> + <head> + <title>aria-brailleroledescription</title> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> + <link rel="stylesheet" href="/wai-aria/scripts/manual.css"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/wai-aria/scripts/ATTAcomm.js"></script> + <script> + setup({explicit_timeout: true, explicit_done: true }); + + var theTest = new ATTAcomm( + { + "steps" : [ + { + "element" : "test", + "test" : { + "ATK" : [ + [ + "property", + "objectAttributes", + "contains", + "brailleroledescription:foobar" + ] + ], + "AXAPI" : [ + [ + "property", + "AXBrailleRoleDescription", + "is", + "foobar" + ] + ], + "IAccessible2" : [ + [ + "property", + "objectAttributes", + "contains", + "brailleroledescription:foobar" + ] + ], + "UIA" : [ + [ + "property", + "AriaProperties.brailleroledescription", + "is", + "foobar" + ] + ] + }, + "title" : "step 1", + "type" : "test" + } + ], + "title" : "aria-brailleroledescription" +} + + ) ; + </script> + </head> + <body> + <p>This test examines the ARIA properties for aria-brailleroledescription.</p> + <button id="test" aria-brailleroledescription="foobar"> + </div> + + <div id="manualMode"></div> + <div id="log"></div> + <div id="ATTAmessages"></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription_is_empty-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription_is_empty-manual.html new file mode 100644 index 00000000000..6d24fe641e2 --- /dev/null +++ b/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription_is_empty-manual.html @@ -0,0 +1,71 @@ +<!doctype html> +<html> + <head> + <title>aria-brailleroledescription is empty</title> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> + <link rel="stylesheet" href="/wai-aria/scripts/manual.css"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/wai-aria/scripts/ATTAcomm.js"></script> + <script> + setup({explicit_timeout: true, explicit_done: true }); + + var theTest = new ATTAcomm( + { + "steps" : [ + { + "element" : "test", + "test" : { + "ATK" : [ + [ + "property", + "objectAttributes", + "doesNotContain", + "brailleroledescription" + ] + ], + "AXAPI" : [ + [ + "property", + "objectAttributes", + "doesNotContain", + "AXBrailleRoleDescription" + ] + ], + "IAccessible2" : [ + [ + "property", + "objectAttributes", + "doesNotContain", + "brailleroledescription" + ] + ], + "UIA" : [ + [ + "property", + "AriaProperties", + "doesNotContain", + "brailleroledescription" + ] + ] + }, + "title" : "step 1", + "type" : "test" + } + ], + "title" : "aria-brailleroledescription=''" +} + + ) ; + </script> + </head> + <body> + <p>This test examines the ARIA properties for aria-brailleroledescription is empty.</p> + <button id="test" aria-brailleroledescription=""> + </div> + + <div id="manualMode"></div> + <div id="log"></div> + <div id="ATTAmessages"></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html index cbc474343d8..5d071cb82df 100644 --- a/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html @@ -24,6 +24,14 @@ "keyshortcuts:Shift+Space" ] ], + "AXAPI" : [ + [ + "property", + "AXKeyShortcutsValue", + "is", + "Shift+Space" + ] + ], "IAccessible2" : [ [ "property", diff --git a/tests/wpt/web-platform-tests/core-aam/blockquote-manual.html b/tests/wpt/web-platform-tests/core-aam/blockquote-manual.html index 97ae290c402..13d6859ec07 100644 --- a/tests/wpt/web-platform-tests/core-aam/blockquote-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/blockquote-manual.html @@ -43,7 +43,7 @@ "property", "role", "is", - "IA2_ROLE_SECTION" + "IA2_ROLE_BLOCK_QUOTE" ] ], "MSAA" : [ diff --git a/tests/wpt/web-platform-tests/core-aam/caption-manual.html b/tests/wpt/web-platform-tests/core-aam/caption-manual.html index 00afda60ebf..68a1af8553d 100644 --- a/tests/wpt/web-platform-tests/core-aam/caption-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/caption-manual.html @@ -51,7 +51,7 @@ "property", "role", "is", - "ROLE_SYSTEM_TEXT" + "ROLE_SYSTEM_GROUPING" ] ], "UIA" : [ diff --git a/tests/wpt/web-platform-tests/core-aam/deletion-manual.html b/tests/wpt/web-platform-tests/core-aam/deletion-manual.html index 4aed1d3e64b..4f6b0d7feb7 100644 --- a/tests/wpt/web-platform-tests/core-aam/deletion-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/deletion-manual.html @@ -42,6 +42,12 @@ "AXSubrole", "is", "AXDeleteStyleGroup" + ], + [ + "result", + "AXAttributedStringForTextMarkerRange" + "contains", + "AXIsSuggestedDeletion" ] ], "IAccessible2" : [ @@ -63,7 +69,7 @@ "property", "LocalizedControlType", "is", - "del" + "deletion" ] ] }, diff --git a/tests/wpt/web-platform-tests/core-aam/insertion-manual.html b/tests/wpt/web-platform-tests/core-aam/insertion-manual.html index 86210664ce7..7b5fd809851 100644 --- a/tests/wpt/web-platform-tests/core-aam/insertion-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/insertion-manual.html @@ -42,6 +42,12 @@ "AXSubrole", "is", "AXInsertStyleGroup" + ], + [ + "result", + "AXAttributedStringForTextMarkerRange" + "contains", + "AXIsSuggestedInsertion" ] ], "IAccessible2" : [ @@ -63,7 +69,7 @@ "property", "LocalizedControlType", "is", - "ins" + "insertion" ] ] }, @@ -78,7 +84,9 @@ </script> </head> <body> - <p>This test examines the ARIA properties for insertion.</p> + <p> + This test examines the ARIA properties for insertion. + </p> <div role="insertion" id="test">content</div> <div id="manualMode"></div> <div id="log"></div> diff --git a/tests/wpt/web-platform-tests/core-aam/mark-manual.html b/tests/wpt/web-platform-tests/core-aam/mark-manual.html new file mode 100644 index 00000000000..8373fa133da --- /dev/null +++ b/tests/wpt/web-platform-tests/core-aam/mark-manual.html @@ -0,0 +1,93 @@ +<!doctype html> +<html> + <head> + <title>mark</title> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> + <link rel="stylesheet" href="/wai-aria/scripts/manual.css"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/wai-aria/scripts/ATTAcomm.js"></script> + <script> + setup({explicit_timeout: true, explicit_done: true }); + + var theTest = new ATTAcomm( + { + "steps" : [ + { + "element" : "test", + "test" : { + "ATK" : [ + [ + "property", + "role", + "is", + "ROLE_MARK" + ], + [ + "property", + "objectAttributes", + "contains", + "xml-roles:mark" + ] + ], + "AXAPI" : [ + [ + "property", + "AXRole", + "is", + "AXGroup" + ], + [ + "property", + "AXRoleDescription", + "is", + "highlight" + ], + [ + "result", + "AXAttributedStringForTextMarkerRange" + "contains", + "AXHighlight" + ] + ], + "IAccessible2" : [ + [ + "property", + "role", + "is", + "IA2_ROLE_MARK" + ], + [ + "property", + "objectAttributes", + "contains", + "xml-roles:mark" + ] + ], + "UIA" : [ + [ + "property", + "ControlType", + "is", + "Group" + ] + ] + }, + "title" : "step 1", + "type" : "test" + } + ], + "title" : "mark" +} + + ) ; + </script> + </head> + <body> + <p>This test examines the ARIA properties for mark.</p> + <div role="mark" id="test">content</div> + <div id="manualMode"></div> + <div id="log"></div> + <div id="ATTAmessages"></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html b/tests/wpt/web-platform-tests/core-aam/menuitem-manual.html index abb582f5201..49c3cacbe82 100644 --- a/tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/menuitem-manual.html @@ -1,7 +1,7 @@ <!doctype html> <html> <head> - <title>menuitem not owned by or child of group</title> + <title>menuitem</title> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <link rel="stylesheet" href="/wai-aria/scripts/manual.css"> <script src="/resources/testharness.js"></script> @@ -59,14 +59,14 @@ "type" : "test" } ], - "title" : "menuitem not owned by or child of group" + "title" : "menuitem" } ) ; </script> </head> <body> - <p>This test examines the ARIA properties for menuitem not owned by or child of group.</p> + <p>This test examines the ARIA properties for menuitem.</p> <div role='menu'> <div role='menuitem' id='test'>content</div> </div> diff --git a/tests/wpt/web-platform-tests/core-aam/meter-manual.html b/tests/wpt/web-platform-tests/core-aam/meter-manual.html index 8010322a62c..74c8ba80737 100644 --- a/tests/wpt/web-platform-tests/core-aam/meter-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/meter-manual.html @@ -41,7 +41,7 @@ "property", "AXSubrole", "is", - "<nil>" + "AXMeter" ] ], "IAccessible2" : [ diff --git a/tests/wpt/web-platform-tests/core-aam/paragraph-manual.html b/tests/wpt/web-platform-tests/core-aam/paragraph-manual.html index 56a26c8c01a..b79f61e0c6e 100644 --- a/tests/wpt/web-platform-tests/core-aam/paragraph-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/paragraph-manual.html @@ -51,7 +51,7 @@ "property", "role", "is", - "ROLE_SYSTEM_TEXT" + "ROLE_SYSTEM_GROUPING" ] ], "UIA" : [ diff --git a/tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html b/tests/wpt/web-platform-tests/core-aam/suggestion-manual.html index c2c3d7ce4b8..f31bcab8def 100644 --- a/tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/suggestion-manual.html @@ -1,7 +1,7 @@ <!doctype html> <html> <head> - <title>menuitem owned by or child of group</title> + <title>suggestion</title> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <link rel="stylesheet" href="/wai-aria/scripts/manual.css"> <script src="/resources/testharness.js"></script> @@ -21,7 +21,13 @@ "property", "role", "is", - "ROLE_MENU_ITEM" + "ROLE_SUGGESTION" + ], + [ + "property", + "objectAttributes", + "contains", + "xml-roles:suggestion" ] ], "AXAPI" : [ @@ -29,21 +35,21 @@ "property", "AXRole", "is", - "AXMenuButton" + "AXGroup" ], [ - "property", - "AXSubrole", - "is", - "<nil>" + "result", + "AXAttributedStringForTextMarkerRange" + "contains", + "AXIsSuggestion" ] ], - "MSAA" : [ + "IAccessible2" : [ [ "property", "role", "is", - "ROLE_SYSTEM_MENUITEM" + "IA2_ROLE_SUGGESTION" ] ], "UIA" : [ @@ -51,7 +57,13 @@ "property", "ControlType", "is", - "MenuItem" + "Group" + ], + [ + "property", + "LocalizedControlType", + "is", + "suggestion" ] ] }, @@ -59,21 +71,15 @@ "type" : "test" } ], - "title" : "menuitem owned by or child of group" + "title" : "suggestion" } ) ; </script> </head> <body> - <p>This test examines the ARIA properties for menuitem owned by or child of group.</p> - <div role='menu'> - <div role='group'> - <div role='menuitem' id='test'>content 1</div> - </div> - <div role='menuitem'>content 2</div> - </div> - + <p>This test examines the ARIA properties for suggestion.</p> + <div role="suggestion" id="test">content</div> <div id="manualMode"></div> <div id="log"></div> <div id="ATTAmessages"></div> diff --git a/tests/wpt/web-platform-tests/core-aam/time-manual.html b/tests/wpt/web-platform-tests/core-aam/time-manual.html index 864cde1df18..542015953b7 100644 --- a/tests/wpt/web-platform-tests/core-aam/time-manual.html +++ b/tests/wpt/web-platform-tests/core-aam/time-manual.html @@ -57,7 +57,7 @@ "property", "role", "is", - "ROLE_SYSTEM_STATICTEXT" + "ROLE_SYSTEM_GROUPING" ] ], "UIA" : [ diff --git a/tests/wpt/web-platform-tests/css/CSS2/floats/float-in-nested-multicol-001.html b/tests/wpt/web-platform-tests/css/CSS2/floats/float-in-nested-multicol-001.html new file mode 100644 index 00000000000..8e1a257e389 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/floats/float-in-nested-multicol-001.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1833238"> +<!-- Browsers do not agree on the rendering, so we just verify the rendering is *not* blank. --> +<link rel="mismatch" href="../../reference/blank.html"> + +<style> +article { + width: 300px; + column-count: 2; +} +main { + column-count: 2; +} +</style> + +<article> + <main> + <div> </div> + <footer style="float: left"> + <div style="margin-top: 1em">ABC</div> <!-- This text should appear. --> + </footer> + </main> +</article> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html index a7b4b01ff47..4caf3ee2100 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html @@ -24,16 +24,16 @@ </style> <body onload="checkLayoutForAnchorPos('.target')"> <!-- - All targets should find the 10px anchor, because it's the first + All targets should find the 30px anchor, because it's the last one in the pre-order DFS from the `relpos`. --> <div class="relpos"> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=30></div> <div class="anchor1" style="width: 10px"> <div class="anchor1" style="width: 20px"></div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=30></div> </div> <div class="anchor1" style="width: 30px"></div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=30></div> </div> </body> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html index 4c14e1d63c9..63b5d66a4e3 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html @@ -29,20 +29,26 @@ <div class="relpos"> <div> <div class="relpos"> + <!-- This target should not find the anchor, because the last containing + block has `position: absolute` and is after in tree order. --> + <div class="target" data-expected-width=0></div> <div class="abspos"> <div class="relpos"> - <div class="anchor1" style="position: absolute"></div> <!-- This target should not find the anchor, because the anchor is - positioned. --> + absolutely positioned after it. --> <div class="target" data-expected-width=0></div> + <div class="anchor1" style="position: absolute"></div> + <!-- This target should find the anchor, because the anchor is + absolutely positioned before it. --> + <div class="target" data-expected-width=10></div> </div> <!-- This target should find the anchor, because the last containing block has `position: relative`. --> <div class="target" data-expected-width=10></div> </div> - <!-- This target should not find the anchor, because the last containing - block has `position: absolute`. --> - <div class="target" data-expected-width=0></div> + <!-- This target should find the anchor, because the last containing + block has `position: absolute` and is before in tree order. --> + <div class="target" data-expected-width=10></div> </div> </div> <!-- This target should find the anchor, because the last containing block diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html index 91ff5bc9065..9ab6b66d944 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html @@ -29,109 +29,123 @@ <body onload="checkLayoutForAnchorPos('.target')"> <!-- In-flow and out-of-flow boxes in a containing block. --> <div class="relpos"> + <div class="target" data-expected-width=30></div> <div> + <div class="target" data-expected-width=30></div> <div class="relpos"> + <div class="target" data-expected-width=0></div> <div class="abspos"> + <div class="target" data-expected-width=30></div> <div class="relpos"> - <div class="anchor1" style="position: absolute; width: 10px"></div> + <div class="target" data-expected-width=40></div> <div class="anchor1" style="width: 20px"></div> - <div class="anchor1" style="position: absolute; width: 30px"></div> + <div class="anchor1" style="position: absolute; width: 10px"></div> <div class="anchor1" style="width: 40px"></div> - <div class="target" data-expected-width=20></div> + <div class="anchor1" style="position: absolute; width: 30px"></div> + <div class="target" data-expected-width=30></div> </div> - <div class="target" data-expected-width=10></div> </div> - <div class="target" data-expected-width=0></div> + <div class="target" data-expected-width=30></div> </div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=30></div> </div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=30></div> </div> <!-- In-flow boxes in ancestors, after the propagated ones. --> <div class="relpos"> <div> <div class="relpos"> + <div class="target" data-expected-width=0></div> <div class="abspos"> <div class="relpos"> - <div class="anchor1" style="position: absolute; width: 10px"></div> - <div class="anchor1" style="width: 20px"></div> <div class="target" data-expected-width=20></div> + <div class="anchor1" style="width: 20px"></div> + <div class="anchor1" style="position: absolute; width: 10px"></div> + <div class="target" data-expected-width=10></div> </div> <div class="anchor1" style="width: 50px"></div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=50></div> </div> - <div class="target" data-expected-width=0></div> + <div class="target" data-expected-width=50></div> </div> <div class="anchor1" style="width: 60px"></div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=70></div> </div> <div class="anchor1" style="width: 70px"></div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=70></div> </div> <!-- Out-of-flow boxes in ancestors, after the propagated ones. --> <div class="relpos"> <div> <div class="relpos"> + <div class="target" data-expected-width=0></div> <div class="abspos"> <div class="relpos"> - <div class="anchor1" style="position: absolute; width: 10px"></div> - <div class="anchor1" style="width: 20px"></div> <div class="target" data-expected-width=20></div> + <div class="anchor1" style="width: 20px"></div> + <div class="anchor1" style="position: absolute; width: 10px"></div> + <div class="target" data-expected-width=10></div> </div> <div class="anchor1" style="position: absolute; width: 110px"></div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=110></div> </div> - <div class="target" data-expected-width=0></div> + <div class="target" data-expected-width=110></div> </div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=110></div> </div> <div class="anchor1" style="position: absolute; width: 100px"></div> - <div class="target" data-expected-width=10></div> + <div class="target" data-expected-width=100></div> </div> <!-- In-flow boxes in ancestors, before the propagated ones. --> <div class="relpos"> - <div class="anchor1" style="width: 100px"></div> <div> <div class="relpos"> - <div class="anchor1" style="width: 110px"></div> <div class="abspos"> - <div class="anchor1" style="width: 120px"></div> <div class="relpos"> + <div class="target" data-expected-width=20></div> <div class="anchor1" style="position: absolute; width: 10px"></div> <div class="anchor1" style="width: 20px"></div> <div class="target" data-expected-width=20></div> </div> + <div class="anchor1" style="width: 120px"></div> <div class="target" data-expected-width=120></div> </div> + <div class="anchor1" style="width: 110px"></div> <div class="target" data-expected-width=110></div> </div> <div class="target" data-expected-width=100></div> </div> + <div class="anchor1" style="width: 100px"></div> <div class="target" data-expected-width=100></div> </div> <!-- Out-of-flow boxes in ancestors, before the propagated ones. --> <div class="relpos"> + <div class="target" data-expected-width=10></div> <div class="anchor1" style="position: absolute; width: 100px"></div> <div> + <div class="target" data-expected-width=10></div> <div class="relpos"> + <div class="target" data-expected-width=0></div> <div class="anchor1" style="position: absolute; width: 110px"></div> <div class="abspos"> + <div class="target" data-expected-width=10></div> <div class="anchor1" style="position: absolute; width: 120px"></div> <div class="relpos"> - <div class="anchor1" style="position: absolute; width: 10px"></div> - <div class="anchor1" style="width: 20px"></div> <div class="target" data-expected-width=20></div> + <div class="anchor1" style="width: 20px"></div> + <div class="anchor1" style="position: absolute; width: 10px"></div> + <div class="target" data-expected-width=10></div> </div> <div class="target" data-expected-width=10></div> </div> - <div class="target" data-expected-width=0></div> + <div class="target" data-expected-width=10></div> </div> - <div class="target" data-expected-width=110></div> + <div class="target" data-expected-width=10></div> </div> - <div class="target" data-expected-width=110></div> + <div class="target" data-expected-width=10></div> </div> </body> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html index 70b753cda2d..dba3472f5b1 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html @@ -42,10 +42,12 @@ <div class="container relpos xcolumns"> <div style="height: 150px"></div> <div class="relpos"> + <span class="target" data-expected-width=20></span> <span class="relpos"> + <span class="target" data-expected-width=20></span> <span class="relpos"> - <span class="anchor abspos">123</span> <span class="anchor">12</span> + <span class="anchor abspos">123</span> <span class="target" data-expected-width=20></span> </span> <span class="target" data-expected-width=30></span> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html index 8b06b4c641c..02fd1c164d6 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html @@ -43,16 +43,17 @@ } </style> <body onload="checkLayoutForAnchorPos('.target')"> + <!-- All targets should find the abspos anchor --> <div class="spacer"></div> <div class="relpos"> <div class="columns relpos"> <div class="relpos"> <div class="relpos"> <div class="spacer"></div> - <div class="anchor abspos" style="top: 120px; height: 100px"></div> <div class="anchor" style="height: 60px"></div> + <div class="anchor abspos" style="top: 120px; height: 100px"></div> <div class="target" - data-expected-width=40 data-expected-height=50></div> + data-expected-width=70 data-expected-height=50></div> </div> <div class="target" data-expected-width=70 data-expected-height=50></div> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html index 881578a4639..fdd1772359f 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html @@ -43,13 +43,14 @@ } </style> <body onload="checkLayoutForAnchorPos('.target')"> + <!-- All targets should find the static positioned anchor --> <div class="spacer"></div> <div class="relpos"> <div class="columns relpos"> <div class="relpos"> <div class="spacer"></div> - <div class="anchor" style="height: 60px"></div> <div class="anchor abspos" style="top: 120px; height: 100px"></div> + <div class="anchor" style="height: 60px"></div> <div class="target" data-expected-width=40 data-expected-height=50></div> </div> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html index d5263fcddff..c149dd0e110 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html @@ -30,23 +30,23 @@ } </style> <!-- - To determine the target anchor element, find the first element el in tree - order. + To determine the target anchor element, find the last acceptable anchor + element el in tree order. https://drafts.csswg.org/css-anchor-1/#determining --> <body onload="checkLayoutForAnchorPos('.target')"> <div class="cb"> <div class="anchor1 size5x7"></div> <div class="anchor1 size9x11"></div> - <div class="target" style="left: anchor(--a1 right)" data-offset-x=5></div> + <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div> </div> <div class="cb"> <div class="anchor1 size5x7"> <div class="anchor1 size9x11"></div> - <div class="target" style="left: anchor(--a1 right)" data-offset-x=5></div> + <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div> </div> - <div class="target" style="left: anchor(--a1 right)" data-offset-x=5></div> + <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div> </div> <div class="cb"> @@ -54,6 +54,6 @@ <div class="anchor1 size9x11"></div> <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div> </div> - <div class="target" style="left: anchor(--a1 right)" data-offset-x=5></div> + <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div> </div> </body> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html index bf3e48ed207..d23779ad9bf 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html @@ -40,7 +40,7 @@ <div class="relpos"> <div class="spacer" style="height: 30px"></div> <div class="anchor1"></div> - <div class="target" data-expected-height=0></div> + <div class="target" data-expected-height=50></div> </div> <div class="target" data-expected-height=50></div> </div> @@ -56,7 +56,7 @@ <div class="relpos"> <div class="spacer" style="height: 10px"></div> <div class="anchor1"></div> - <div class="target" data-expected-height=0></div> + <div class="target" data-expected-height=50></div> </div> <div class="target" data-expected-height=50></div> </div> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html index 2be88797541..399494120ea 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html @@ -54,7 +54,7 @@ } </style> <body onload="checkLayoutForAnchorPos('.target')"> - <p>The green box should be a union of blue boxes, + <p>The green box should be a union of two blue boxes in the right, and the purple box should be at the right-bottom of the green box. </p> <div class="spacer" style="height: 10px"></div> @@ -76,9 +76,9 @@ </div> <div class="target target1" - data-offset-x=18 data-offset-y=25 - data-expected-width=150 data-expected-height=100></div> + data-offset-x=34 data-offset-y=225 + data-expected-width=130 data-expected-height=100></div> <div class="target target1-rb" - data-offset-x=158 data-offset-y=115></div> + data-offset-x=154 data-offset-y=315></div> </div> </body> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html index 6fca40dd7e9..b94680816e9 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html @@ -35,7 +35,9 @@ } .fixedpos { position: fixed; - margin-left: 20px; + margin-left: 0; + left: 20px; + top: 20px; width: 20px; height: 30px; } @@ -50,6 +52,7 @@ } </style> <body onload="checkLayoutForAnchorPos('.target')"> + <!-- All targets should find the fixed positioned anchor --> <div class="transform"> <div class="spacer" style="height: 10px"></div> <div class="columns"> @@ -57,11 +60,11 @@ <div class="spacer" style="height: 20px"></div> <div class="transform"> <div class="spacer" style="height: 20px"></div> - <div class="anchor fixedpos"></div> <div class="anchor"></div> + <div class="anchor fixedpos"></div> <div class="target" data-offset-x="10" data-offset-y="20" - data-expected-width=40 data-expected-height=10></div> + data-expected-width=130 data-expected-height=50></div> </div> <div class="target" data-offset-x="20" data-offset-y="0" diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.tentative.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-001.html index fa42e33d926..fa42e33d926 100644 --- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.tentative.html +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-001.html diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-002.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-002.html new file mode 100644 index 00000000000..88e8a754b5b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-002.html @@ -0,0 +1,99 @@ +<!DOCTYPE html> +<title>Tests anchor-scroll resolving name conflicts</title> +<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#scroll"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/test-common.js"></script> + +<style> +body { + margin: 0; +} + +.scroller { + width: 100px; + height: 100px; + overflow-y: scroll; +} + +.nonpos-cb { + transform: scale(1); +} + +.abspos-cb { + position: absolute; +} + +.anchor { + background: orange; + anchor-name: --a1; + position: absolute; + width: 50px; + height: 50px; + top: 50px; +} + +.spacer { + height: 200px; +} + +.target { + background: lime; + position: absolute; + width: 50px; + height: 50px; + top: anchor(--a1 top); + left: anchor(--a1 right); + anchor-scroll: --a1; +} +</style> + +<div class="abspos-cb" style="width: 300px; height: 400px"> + <div class="scroller nonpos-cb" id="scroller1"> + <div class="anchor" id="anchor1"></div> + <div class="spacer"></div> + </div> + <div class="target" id="target1"></div> + + <div class="scroller abspos-cb" style="top: 125px" id="scroller2"> + <div class="anchor" id="anchor2"></div> + <div class="spacer"></div> + </div> + <div class="target" id="target2"></div> + + <div class="scroller abspos-cb" style="top: 250px" id="scroller3"> + <div class="anchor" id="anchor3"></div> + <div class="spacer"></div> + </div> + <div class="target" id="target3"></div> +</div> + +<script> +promise_test(async () => { + scroller1.scrollTop = 10; + await waitUntilNextAnimationFrame(); + await waitUntilNextAnimationFrame(); + + assert_equals(target1.getBoundingClientRect().top, anchor1.getBoundingClientRect().top); + assert_equals(target1.getBoundingClientRect().top, 40); +}, 'target1 should scroll with anchor1'); + +promise_test(async () => { + scroller2.scrollTop = 20; + await waitUntilNextAnimationFrame(); + await waitUntilNextAnimationFrame(); + + assert_equals(target2.getBoundingClientRect().top, anchor2.getBoundingClientRect().top); + assert_equals(target2.getBoundingClientRect().top, 155); +}, 'target2 should scroll with anchor2'); + +promise_test(async () => { + scroller3.scrollTop = 30; + await waitUntilNextAnimationFrame(); + await waitUntilNextAnimationFrame(); + + assert_equals(target3.getBoundingClientRect().top, anchor3.getBoundingClientRect().top); + assert_equals(target3.getBoundingClientRect().top, 270); +}, 'target3 should scroll with anchor3'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.html new file mode 100644 index 00000000000..6b2d96708bd --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<title>Tests basics of the 'anchor-scroll' property</title> +<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#propdef-anchor-scroll"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<script src="/css/support/inheritance-testcommon.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<div id="container"> + <div id="target"></div> +</div> + +<script> +// anchor-scroll: none | default | <anchor-element> +test_valid_value('anchor-scroll', 'none'); +test_valid_value('anchor-scroll', 'default'); +test_valid_value('anchor-scroll', 'implicit'); +test_valid_value('anchor-scroll', '--foo'); +test_invalid_value('anchor-scroll', 'foo-bar'); +test_invalid_value('anchor-scroll', '--foo --bar') +test_invalid_value('anchor-scroll', '--foo, --bar') +test_invalid_value('anchor-scroll', '100px'); +test_invalid_value('anchor-scroll', '100%'); + +// Computed value: as specified +test_computed_value('anchor-scroll', 'none'); +test_computed_value('anchor-scroll', 'default'); +test_computed_value('anchor-scroll', 'implicit'); +test_computed_value('anchor-scroll', '--foo'); + +// Initial: default +// Inherited: no +assert_not_inherited('anchor-scroll', 'default', '--foo'); + +// Animation type: discrete +test_no_interpolation({ + property: 'anchor-scroll', + from: '--foo', + to: 'none', +}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht new file mode 100644 index 00000000000..05a13794482 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht @@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> + <style type="text/css"><![CDATA[ + div + { + background-color: green; + height: 100px; + width: 100px; + } + ]]></style> + </head> + <body> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht new file mode 100644 index 00000000000..05a13794482 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht @@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> + <style type="text/css"><![CDATA[ + div + { + background-color: green; + height: 100px; + width: 100px; + } + ]]></style> + </head> + <body> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html new file mode 100644 index 00000000000..44399c19886 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>currentColor in color-mix() used in background-color repaints properly when parent color changes</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + #container { + color: red; + } + + #container.green { + color: green; + } + + #target { + background-color: color-mix(in hsl, transparent 0%, currentColor 100%); + width: 100px; + height: 100px; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id="container"> + <div id="target"></div> +</div> + +<script> + addEventListener("load", () => { + setTimeout(() => { + requestAnimationFrame(() => { + container.classList.add("green"); + document.documentElement.classList.remove("reftest-wait"); + }); + }, 0); + }); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint.html b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint.html new file mode 100644 index 00000000000..a8f742b6c53 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>currentColor in color-mix() used in background-color repaints properly when color changes</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + #target { + color: red; + background-color: color-mix(in hsl, transparent 0%, currentColor 100%); + width: 100px; + height: 100px; + } + + #target.green { + color: green; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id="target"></div> + +<script> + addEventListener("load", () => { + setTimeout(() => { + requestAnimationFrame(() => { + target.classList.add("green"); + document.documentElement.classList.remove("reftest-wait"); + }); + }, 0); + }); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht new file mode 100644 index 00000000000..05a13794482 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht @@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> + <style type="text/css"><![CDATA[ + div + { + background-color: green; + height: 100px; + width: 100px; + } + ]]></style> + </head> + <body> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht new file mode 100644 index 00000000000..05a13794482 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht @@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> + <style type="text/css"><![CDATA[ + div + { + background-color: green; + height: 100px; + width: 100px; + } + ]]></style> + </head> + <body> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html new file mode 100644 index 00000000000..0d434b1d351 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>currentColor in color-mix() used in outline repaints properly when parent color changes</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + #container { + color: red; + } + + #container.green { + color: green; + } + + #target { + outline: 50px solid color-mix(in hsl, transparent 0%, currentColor 100%); + outline-offset: -50px; + width: 100px; + height: 100px; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id="container"> + <div id="target"></div> +</div> + +<script> + addEventListener("load", () => { + setTimeout(() => { + requestAnimationFrame(() => { + container.classList.add("green"); + document.documentElement.classList.remove("reftest-wait"); + }); + }, 0); + }); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html new file mode 100644 index 00000000000..8892d818f9b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>currentColor in color-mix() used in outline repaints properly when color changes</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + #target { + color: red; + outline: 50px solid color-mix(in hsl, transparent 0%, currentColor 100%); + outline-offset: -50px; + width: 100px; + height: 100px; + } + + #target.green { + color: green; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id="target"></div> + +<script> + addEventListener("load", () => { + setTimeout(() => { + requestAnimationFrame(() => { + target.classList.add("green"); + document.documentElement.classList.remove("reftest-wait"); + }); + }, 0); + }); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html b/tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html index 8f05a99967c..c1ca47491ff 100644 --- a/tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html +++ b/tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html @@ -26,146 +26,148 @@ return computedValue; } - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `rgb(84, 92, 61)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))`, `rgb(112, 106, 67)`); - test_computed_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `rgb(112, 106, 67)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))`, `rgb(61, 73, 54)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)`, `rgb(61, 73, 54)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)`, `rgb(112, 106, 67)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)`, `rgb(112, 106, 67)`); // Scale down > 100% sum. - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)`, `rgba(112, 106, 67, 0.5)`); // Scale up < 100% sum, causes alpha multiplication. - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))`, `rgb(133, 102, 71)`); - - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `rgba(95, 105, 65, 0.6)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))`, `rgba(108, 103, 66, 0.85)`); - test_computed_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `rgba(121, 114, 69, 0.7)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))`, `rgba(68, 84, 59, 0.5)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)`, `rgba(68, 84, 59, 0.5)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)`, `rgba(121, 114, 69, 0.7)`); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)`, `rgba(121, 114, 69, 0.7)`); // Scale down > 100% sum. - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)`, `rgba(121, 114, 69, 0.35)`); // Scale up < 100% sum, causes alpha multiplication. - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))`, `rgba(133, 102, 71, 0.8)`); - - test_computed_value(`color`, `color-mix(in hsl, transparent, hsl(30deg 30% 40%))`, canonicalize(`hsl(30deg 30% 40% / 0.5)`)); - test_computed_value(`color`, `color-mix(in hsl, transparent 10%, hsl(30deg 30% 40%))`, canonicalize(`hsl(30deg 30% 40% / 0.9)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0), hsl(30deg 30% 40%))`, canonicalize(`hsl(75deg 30% 40% / 0.5)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0) 10%, hsl(30deg 30% 40%))`, canonicalize(`hsl(39deg 30% 40% / 0.9)`)); - - test_computed_value(`color`, `color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`)); - - test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`)); - - test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(230deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(230deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(190deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(190deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(170deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(170deg 50% 50%)`)); - - test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(230deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(190deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(170deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`)); - - test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(230deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(190deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`)); - test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(170deg 50% 50%)`)); - - test_computed_value(`color`, `color-mix(in hsl, hsl(none none none), hsl(none none none))`, canonicalize(`hsl(none none none)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))`, canonicalize(`hsl(30deg 40% 80%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))`, canonicalize(`hsl(120deg 20% 40%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))`, canonicalize(`hsl(75deg 30% 60%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))`, canonicalize(`hsl(75deg 20% 40%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))`, canonicalize(`hsl(30deg 20% 60%)`)); - - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))`, canonicalize(`hsl(60deg 40% 40%)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))`, canonicalize(`hsl(60deg 40% 40% / 0.5)`)); - test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))`, canonicalize(`hsl(60deg 40% 40% / none)`)); - - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `rgb(147, 179, 52)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))`, `rgb(166, 153, 64)`); - test_computed_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `rgb(166, 153, 64)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))`, `rgb(96, 191, 39)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)`, `rgb(96, 191, 39)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)`, `rgb(166, 153, 64)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)`, `rgb(166, 153, 64)`); // Scale down > 100% sum. - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)`, `rgba(166, 153, 64, 0.5)`); // Scale up < 100% sum, causes alpha multiplication. - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))`, `rgb(153, 115, 77)`); - - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `rgba(143, 170, 60, 0.6)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))`, `rgba(160, 149, 70, 0.7)`); - test_computed_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `rgba(160, 149, 70, 0.7)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))`, `rgba(95, 193, 37, 0.95)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)`, `rgba(98, 184, 46, 0.5)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)`, `rgba(160, 149, 70, 0.7)`); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)`, `rgba(160, 149, 70, 0.7)`); // Scale down > 100% sum. - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)`, `rgba(160, 149, 70, 0.35)`); // Scale up < 100% sum, causes alpha multiplication. - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))`, `rgba(153, 115, 77, 0.8)`); - - test_computed_value(`color`, `color-mix(in hwb, transparent, hwb(30deg 30% 40%))`, canonicalize(`hwb(30deg 30% 40% / 0.5)`)); - test_computed_value(`color`, `color-mix(in hwb, transparent 10%, hwb(30deg 30% 40%))`, canonicalize(`hwb(30deg 30% 40% / 0.9)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0), hwb(30deg 30% 40%))`, canonicalize(`hwb(75deg 30% 40% / 0.5)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0) 10%, hwb(30deg 30% 40%))`, canonicalize(`hwb(39deg 30% 40% / 0.9)`)); - - test_computed_value(`color`, `color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`)); - - test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`)); - - test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(230deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(230deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(190deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(190deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(170deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(170deg 30% 40%)`)); - - test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(230deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(190deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(170deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`)); - - test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(230deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(190deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(170deg 30% 40%)`)); - - test_computed_value(`color`, `color-mix(in hwb, hwb(none none none), hwb(none none none))`, canonicalize(`hwb(none none none)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))`, canonicalize(`hwb(30deg 30% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))`, canonicalize(`hwb(120deg 10% 20%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))`, canonicalize(`hwb(75deg 20% 40%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))`, canonicalize(`hwb(75deg 20% 20%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))`, canonicalize(`hwb(30deg 10% 30%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))`, canonicalize(`hwb(75deg 20% 30%)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))`, canonicalize(`hwb(75deg 20% 30% / 0.5)`)); - test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))`, canonicalize(`hwb(75deg 20% 30% / none)`)); + // hsl() + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color(srgb 0.33 0.36 0.24)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))`, `color(srgb 0.4375 0.415625 0.2625)`); + test_computed_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color(srgb 0.4375 0.415625 0.2625)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))`, `color(srgb 0.240625 0.2875 0.2125)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)`, `color(srgb 0.240625 0.2875 0.2125)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)`, `color(srgb 0.4375 0.415625 0.2625)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)`, `color(srgb 0.4375 0.415625 0.2625)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)`, `color(srgb 0.4375 0.415625 0.2625 / 0.5)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))`, `color(srgb 0.52 0.4 0.28)`); + + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color(srgb 0.372222 0.411111 0.255556 / 0.6)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))`, `color(srgb 0.42346 0.402889 0.258893 / 0.85)`); + test_computed_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color(srgb 0.472245 0.447041 0.270612 / 0.7)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))`, `color(srgb 0.2674 0.3304 0.2296 / 0.5)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)`, `color(srgb 0.2674 0.3304 0.2296 / 0.5)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)`, `color(srgb 0.472245 0.447041 0.270612 / 0.7)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)`, `color(srgb 0.472245 0.447041 0.270612 / 0.7)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)`, `color(srgb 0.472245 0.447041 0.270612 / 0.35)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))`, `color(srgb 0.52 0.4 0.28 / 0.8)`); + + test_computed_value(`color`, `color-mix(in hsl, transparent, hsl(30deg 30% 40%))`, `color(srgb 0.52 0.4 0.28 / 0.5)`); + test_computed_value(`color`, `color-mix(in hsl, transparent 10%, hsl(30deg 30% 40%))`, `color(srgb 0.52 0.4 0.28 / 0.9)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0), hsl(30deg 30% 40%))`, `color(srgb 0.46 0.52 0.28 / 0.5)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0) 10%, hsl(30deg 30% 40%))`, `color(srgb 0.52 0.436 0.28 / 0.9)`); + + test_computed_value(`color`, `color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); + + test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`); + test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`); + test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`); + test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`); + test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); + test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); + + test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`); + test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`); + test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.25 0.666667 0.75)`); + test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.25 0.666667 0.75)`); + test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`); + test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`); + + test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`); + test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`); + test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.25 0.666667 0.75)`); + test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`); + test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`); + test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); + + test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`); + test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`); + test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`); + test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.25 0.666667 0.75)`); + test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`); + test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`); + + test_computed_value(`color`, `color-mix(in hsl, hsl(none none none), hsl(none none none))`, `color(srgb none none none)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))`, `color(srgb 0.88 0.8 0.72)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))`, `color(srgb 0.32 0.48 0.32)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))`, `color(srgb 0.66 0.72 0.48)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))`, `color(srgb 0.44 0.48 0.32)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))`, `color(srgb 0.68 0.6 0.52)`); + + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))`, `color(srgb 0.56 0.56 0.24)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))`, `color(srgb 0.56 0.56 0.24 / 0.5)`); + test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))`, `color(srgb 0.56 0.56 0.24 / none)`); + + // hwb() + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color(srgb 0.575 0.7 0.2)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))`, `color(srgb 0.65 0.6 0.25)`); + test_computed_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color(srgb 0.65 0.6 0.25)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))`, `color(srgb 0.375 0.75 0.15)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)`, `color(srgb 0.375 0.75 0.15)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)`, `color(srgb 0.65 0.6 0.25)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)`, `color(srgb 0.65 0.6 0.25)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)`, `color(srgb 0.65 0.6 0.25 / 0.5)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3)`); + + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color(srgb 0.558333 0.666667 0.233333 / 0.6)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))`, `color(srgb 0.628571 0.583929 0.271429 / 0.7)`); + test_computed_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color(srgb 0.628571 0.583929 0.271429 / 0.7)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))`, `color(srgb 0.373026 0.757895 0.142105 / 0.95)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)`, `color(srgb 0.3825 0.72 0.18 / 0.5)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)`, `color(srgb 0.628571 0.583929 0.271429 / 0.7)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)`, `color(srgb 0.628571 0.583929 0.271429 / 0.7)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)`, `color(srgb 0.628571 0.583929 0.271429 / 0.35)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))`, `color(srgb 0.6 0.45 0.3 / 0.8)`); + + test_computed_value(`color`, `color-mix(in hwb, transparent, hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3 / 0.5)`); + test_computed_value(`color`, `color-mix(in hwb, transparent 10%, hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3 / 0.9)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0), hwb(30deg 30% 40%))`, `color(srgb 0.525 0.6 0.3 / 0.5)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0) 10%, hwb(30deg 30% 40%))`, `color(srgb 0.6 0.495 0.3 / 0.9)`); + + test_computed_value(`color`, `color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); + + test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`); + test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`); + test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`); + test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`); + test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); + test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); + + test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`); + test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`); + test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`); + test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`); + test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`); + test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`); + + test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`); + test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`); + test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`); + test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`); + test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`); + test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); + + test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`); + test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`); + test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`); + test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`); + test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`); + test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`); + + test_computed_value(`color`, `color-mix(in hwb, hwb(none none none), hwb(none none none))`, `color(srgb none none none)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))`, `color(srgb 0.1 0.8 0.1)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))`, `color(srgb 0.5 0.6 0.2)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))`, `color(srgb 0.65 0.8 0.2)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))`, `color(srgb 0.7 0.4 0.1)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))`, `color(srgb 0.575 0.7 0.2)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))`, `color(srgb 0.575 0.7 0.2 / 0.5)`); + test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))`, `color(srgb 0.575 0.7 0.2 / none)`); // lch() test_computed_value(`color`, `color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))`, `lch(30 40 50)`); diff --git a/tests/wpt/web-platform-tests/css/css-color/parsing/color-mix-out-of-gamut.html b/tests/wpt/web-platform-tests/css/css-color/parsing/color-mix-out-of-gamut.html new file mode 100644 index 00000000000..1803397f8a7 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-color/parsing/color-mix-out-of-gamut.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Color Level 4: Computation of colors using color-mix() function syntax that result in out-of-gamut sRGB colors</title> +<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> +<link rel="author" title="Aaron Krajeski" href="mailto:aaronhk@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#color-mix"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#resolving-mix"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#serial-color-mix"> +<meta name="assert" content="gamut mapping works for computed value of color-mix()"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +</head> +<body> +<div id="target"></div> +<script> + test_computed_value(`color`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color(srgb -0.511814 1.01832 -0.310726)`); + test_computed_value(`color`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59343 0.58802 1.40564)`); + test_computed_value(`color`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.351376 -0.213938 0.299501)`); + test_computed_value(`color`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59328 0.588284 1.40527)`); + test_computed_value(`color`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.351307 -0.213865 0.299236)`); + test_computed_value(`color`, `color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59295 0.360371 1.38571)`); + test_computed_value(`color`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.0763893 -0.0456266 0.0932598)`); + test_computed_value(`color`, `color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59328 0.358734 1.38664)`); + test_computed_value(`color`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.076536 -0.045825 0.0937443)`); + + test_computed_value(`color`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color(srgb -0.511814 1.01832 -0.310726)`); + test_computed_value(`color`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59343 0.58802 1.40564)`); + test_computed_value(`color`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.351376 -0.213938 0.299501)`); + test_computed_value(`color`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59328 0.588284 1.40527)`); + test_computed_value(`color`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.351307 -0.213865 0.299236)`); + test_computed_value(`color`, `color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59295 0.360371 1.38571)`); + test_computed_value(`color`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.0763893 -0.0456266 0.0932598)`); + test_computed_value(`color`, `color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59328 0.358736 1.38664)`); + test_computed_value(`color`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.0765361 -0.045825 0.0937443)`); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-color/parsing/gamut-mapping.html b/tests/wpt/web-platform-tests/css/css-color/parsing/gamut-mapping.html deleted file mode 100644 index 02133acced2..00000000000 --- a/tests/wpt/web-platform-tests/css/css-color/parsing/gamut-mapping.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta charset="utf-8"> -<title>CSS Color Level 5: Computation of colors using color-mix() function syntax that need to be gamut-mapped into the sRGB color space</title> -<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color-5/#color-mix"> -<link rel="help" href="https://drafts.csswg.org/css-color-5/#resolving-mix"> -<link rel="help" href="https://drafts.csswg.org/css-color-5/#serial-color-mix"> -<meta name="assert" content="gamut mapping works for computed value of color-mix()"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/css/support/computed-testcommon.js"></script> -</head> -<body> -<div id="target"></div> -<script> - test_computed_value(`color`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 249, 66)`); // Naive clip based mapping would give rgb(0, 255, 0). - test_computed_value(`color`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 150, 255). - test_computed_value(`color`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `rgb(42, 0, 34)`); // Naive clip based mapping would give rgb(90, 0, 76). NOTE: 0% lightness in Lab/LCH does not automatically correspond with sRGB black, - test_computed_value(`color`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 150, 255). - test_computed_value(`color`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `rgb(42, 0, 34)`); // Naive clip based mapping would give rgb(90, 0, 76). NOTE: 0% lightness in Lab/LCH does not automatically correspond with sRGB black, - test_computed_value(`color`, `color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 92, 255). - test_computed_value(`color`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 0, 0)`); // Naive clip based mapping would give rgb(19, 0, 24). - test_computed_value(`color`, `color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 91, 255). - test_computed_value(`color`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 0, 0)`); // Naive clip based mapping would give rgb(20, 0, 24). - - test_computed_value(`color`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 249, 66)`); // Naive clip based mapping would give rgb(0, 255, 0). - test_computed_value(`color`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 150, 255). - test_computed_value(`color`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `rgb(42, 0, 34)`); // Naive clip based mapping would give rgb(90, 0, 76). NOTE: 0% lightness in Lab/LCH does not automatically correspond with sRGB black, - test_computed_value(`color`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 150, 255). - test_computed_value(`color`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `rgb(42, 0, 34)`); // Naive clip based mapping would give rgb(90, 0, 76). NOTE: 0% lightness in Lab/LCH does not automatically correspond with sRGB black, - test_computed_value(`color`, `color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 92, 255). - test_computed_value(`color`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 0, 0)`); // Naive clip based mapping would give rgb(19, 0, 24). - test_computed_value(`color`, `color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 91, 255). - test_computed_value(`color`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 0, 0)`); // Naive clip based mapping would give rgb(20, 0, 24). -</script> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/css/css-conditional/at-supports-selector-file-selector-button.html b/tests/wpt/web-platform-tests/css/css-conditional/at-supports-selector-file-selector-button.html new file mode 100644 index 00000000000..a51e503ef69 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-conditional/at-supports-selector-file-selector-button.html @@ -0,0 +1,24 @@ +<!doctype html> +<html> + <head> + <title>CSS Test (Conditional Rules): In @supports, ::file-selector-button can be parsed successfully</title> + <link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> + <link rel="help" href="https://drafts.csswg.org/css-conditional-3/#at-supports"> + <link rel="help" href="https://drafts.csswg.org/css-pseudo/#file-selector-button-pseudo"> + <link rel="match" href="at-supports-001-ref.html"> + <style> + div { + background: red; + height: 100px; + width: 100px; + } + @supports selector(input::file-selector-button) { + div { background-color:green; } + } + </style> + </head> + <body> + <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p> + <div></div> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-contain/container-queries/display-contents-dynamic-style-queries.html b/tests/wpt/web-platform-tests/css/css-contain/container-queries/display-contents-dynamic-style-queries.html new file mode 100644 index 00000000000..782cf566552 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/container-queries/display-contents-dynamic-style-queries.html @@ -0,0 +1,35 @@ +<!doctype html> +<title>CSS Container Queries Test: Invalidate style queries and display:contents</title> +<link rel="help" href="https://drafts.csswg.org/css-contain-3/#style-container"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/cq-testcommon.js"></script> +<style> + #container.contents { + --foo: bar; + display: contents; + } + #target { + color: red; + } + @container style(--foo: bar) { + #target { + color: green; + } + } +</style> +<div id="container"> + <div id="target">This should be green</div> +</div> +<script> + setup(() => assert_implements_container_queries()); + + test(() => { + assert_equals(getComputedStyle(target).color, "rgb(255, 0, 0)"); + }, "Initially the color is red"); + + test(() => { + container.className = "contents"; + assert_equals(getComputedStyle(target).color, "rgb(0, 128, 0)"); + }, "After display and --foo changes, style() query causes the color to be green"); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/percentage-padding-004.html b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-padding-004.html new file mode 100644 index 00000000000..ca96e546cc8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-padding-004.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://crbug.com/1445257"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" + content="vertical-rl block's auto height should encompass its column wrap flexbox child and descendants, and the percentage padding should resolve based on that." /> + +<style> + #reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>. +</p> + +<div id=reference-overlapped-red></div> + +<div id="container" style="writing-mode:vertical-rl; width:101px;"> + <div style="display:flex; flex-flow:column wrap; padding-right:5%;"> + <div style="writing-mode:horizontal-tb; padding-right:10%;"> + <div + style="width:100px; height:100px; background:green; position:relative; left:15px;"> + </div> + </div> + </div> +</div> +<script> + document.body.offsetTop; + container.style.width = "100px"; +</script> diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-composition.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-composition.html new file mode 100644 index 00000000000..d98b0ffd10e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-composition.html @@ -0,0 +1,665 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>font-size-adjust composition</title> +<link rel="author" title="ChangSeok Oh" href="mailto:changseok@webkit.org"> +<link rel="help" href="https://www.w3.org/TR/css-fonts-5/#font-size-adjust-prop"> +<meta name="assert" content="font-size-adjust supports animation with two value font metrics"> + +<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: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "none", + addTo: "2.0", +}, [ + {at: -0.5, expect: "none"}, + {at: 0, expect: "none"}, + {at: 0.5, expect: "2.5"}, + {at: 1, expect: "2.5"}, + {at: 1.5, expect: "2.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "0.0", + addTo: "2.0", +}, [ + {at: -0.5, expect: "0.0"}, + {at: 0, expect: "0.5"}, + {at: 0.5, expect: "1.5"}, + {at: 1, expect: "2.5"}, + {at: 1.5, expect: "3.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "0.0", + addTo: "2.0", +}, [ + {at: -0.5, expect: "0.0"}, + {at: 0, expect: "0.0"}, + {at: 0.5, expect: "1.25"}, + {at: 1, expect: "2.5"}, + {at: 1.5, expect: "3.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "0.0", + replaceTo: "2.0", +}, [ + {at: -0.5, expect: "0.0"}, + {at: 0, expect: "0.5"}, + {at: 0.5, expect: "1.25"}, + {at: 1, expect: "2.0"}, + {at: 1.5, expect: "2.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "2.0", + addTo: "none", +}, [ + {at: -0.5, expect: "2.0"}, + {at: 0, expect: "2.0"}, + {at: 0.5, expect: "none"}, + {at: 1, expect: "none"}, + {at: 1.5, expect: "none"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ex-height 0.5", + replaceFrom: "none", + addTo: "ex-height 2.0", +}, [ + {at: -0.5, expect: "none"}, + {at: 0, expect: "none"}, + {at: 0.5, expect: "2.5"}, + {at: 1, expect: "2.5"}, + {at: 1.5, expect: "2.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ex-height 0.5", + addFrom: "ex-height 0", + addTo: "ex-height 2.0", +}, [ + {at: -0.5, expect: "0.0"}, + {at: 0, expect: "0.5"}, + {at: 0.5, expect: "1.5"}, + {at: 1, expect: "2.5"}, + {at: 1.5, expect: "3.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ex-height 0.5", + replaceFrom: "ex-height 0", + addTo: "ex-height 2.0", +}, [ + {at: -0.5, expect: "0.0"}, + {at: 0, expect: "0.0"}, + {at: 0.5, expect: "1.25"}, + {at: 1, expect: "2.5"}, + {at: 1.5, expect: "3.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ex-height 0.5", + addFrom: "ex-height 0", + replaceTo: "ex-height 2.0", +}, [ + {at: -0.5, expect: "0.0"}, + {at: 0, expect: "0.5"}, + {at: 0.5, expect: "1.25"}, + {at: 1, expect: "2.0"}, + {at: 1.5, expect: "2.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ex-height 0.5", + replaceFrom: "ex-height 2.0", + addTo: "none", +}, [ + {at: -0.5, expect: "2.0"}, + {at: 0, expect: "2.0"}, + {at: 0.5, expect: "none"}, + {at: 1, expect: "none"}, + {at: 1.5, expect: "none"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "cap-height 0.5", + replaceFrom: "none", + addTo: "cap-height 2.0", +}, [ + {at: -0.5, expect: "none"}, + {at: 0, expect: "none"}, + {at: 0.5, expect: "cap-height 2.5"}, + {at: 1, expect: "cap-height 2.5"}, + {at: 1.5, expect: "cap-height 2.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "cap-height 0.5", + addFrom: "cap-height 0", + addTo: "cap-height 2.0", +}, [ + {at: -0.5, expect: "cap-height 0.0"}, + {at: 0, expect: "cap-height 0.5"}, + {at: 0.5, expect: "cap-height 1.5"}, + {at: 1, expect: "cap-height 2.5"}, + {at: 1.5, expect: "cap-height 3.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "cap-height 0.5", + replaceFrom: "cap-height 0", + addTo: "cap-height 2.0", +}, [ + {at: -0.5, expect: "cap-height 0.0"}, + {at: 0, expect: "cap-height 0.0"}, + {at: 0.5, expect: "cap-height 1.25"}, + {at: 1, expect: "cap-height 2.5"}, + {at: 1.5, expect: "cap-height 3.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "cap-height 0.5", + addFrom: "cap-height 0.0", + replaceTo: "cap-height 2.0", +}, [ + {at: -0.5, expect: "cap-height 0.0"}, + {at: 0, expect: "cap-height 0.5"}, + {at: 0.5, expect: "cap-height 1.25"}, + {at: 1, expect: "cap-height 2"}, + {at: 1.5, expect: "cap-height 2.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "cap-height 0.5", + replaceFrom: "cap-height 2.0", + addTo: "none", +}, [ + {at: -0.5, expect: "cap-height 2.0"}, + {at: 0, expect: "cap-height 2.0"}, + {at: 0.5, expect: "none"}, + {at: 1, expect: "none"}, + {at: 1.5, expect: "none"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ch-width 0.5", + replaceFrom: "none", + addTo: "ch-width 2.0", +}, [ + {at: -0.5, expect: "none"}, + {at: 0, expect: "none"}, + {at: 0.5, expect: "ch-width 2.5"}, + {at: 1, expect: "ch-width 2.5"}, + {at: 1.5, expect: "ch-width 2.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ch-width 0.5", + addFrom: "ch-width 0", + addTo: "ch-width 2.0", +}, [ + {at: -0.5, expect: "ch-width 0.0"}, + {at: 0, expect: "ch-width 0.5"}, + {at: 0.5, expect: "ch-width 1.5"}, + {at: 1, expect: "ch-width 2.5"}, + {at: 1.5, expect: "ch-width 3.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ch-width 0.5", + replaceFrom: "ch-width 0", + addTo: "ch-width 2.0", +}, [ + {at: -0.5, expect: "ch-width 0.0"}, + {at: 0, expect: "ch-width 0.0"}, + {at: 0.5, expect: "ch-width 1.25"}, + {at: 1, expect: "ch-width 2.5"}, + {at: 1.5, expect: "ch-width 3.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ch-width 0.5", + addFrom: "ch-width 0", + replaceTo: "ch-width 2.0", +}, [ + {at: -0.5, expect: "ch-width 0.0"}, + {at: 0, expect: "ch-width 0.5"}, + {at: 0.5, expect: "ch-width 1.25"}, + {at: 1, expect: "ch-width 2"}, + {at: 1.5, expect: "ch-width 2.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ch-width 0.5", + replaceFrom: "ch-width 2.0", + addTo: "none", +}, [ + {at: -0.5, expect: "ch-width 2.0"}, + {at: 0, expect: "ch-width 2.0"}, + {at: 0.5, expect: "none"}, + {at: 1, expect: "none"}, + {at: 1.5, expect: "none"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-width 0.5", + replaceFrom: "none", + addTo: "ic-width 2.0", +}, [ + {at: -0.5, expect: "none"}, + {at: 0, expect: "none"}, + {at: 0.5, expect: "ic-width 2.5"}, + {at: 1, expect: "ic-width 2.5"}, + {at: 1.5, expect: "ic-width 2.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-width 0.5", + addFrom: "ic-width 0", + addTo: "ic-width 2.0", +}, [ + {at: -0.5, expect: "ic-width 0.0"}, + {at: 0, expect: "ic-width 0.5"}, + {at: 0.5, expect: "ic-width 1.5"}, + {at: 1, expect: "ic-width 2.5"}, + {at: 1.5, expect: "ic-width 3.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-width 0.5", + replaceFrom: "ic-width 0", + addTo: "ic-width 2.0", +}, [ + {at: -0.5, expect: "ic-width 0.0"}, + {at: 0, expect: "ic-width 0.0"}, + {at: 0.5, expect: "ic-width 1.25"}, + {at: 1, expect: "ic-width 2.5"}, + {at: 1.5, expect: "ic-width 3.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-width 0.5", + addFrom: "ic-width 0", + replaceTo: "ic-width 2.0", +}, [ + {at: -0.5, expect: "ic-width 0.0"}, + {at: 0, expect: "ic-width 0.5"}, + {at: 0.5, expect: "ic-width 1.25"}, + {at: 1, expect: "ic-width 2"}, + {at: 1.5, expect: "ic-width 2.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-width 0.5", + replaceFrom: "ic-width 2.0", + addTo: "none", +}, [ + {at: -0.5, expect: "ic-width 2.0"}, + {at: 0, expect: "ic-width 2.0"}, + {at: 0.5, expect: "none"}, + {at: 1, expect: "none"}, + {at: 1.5, expect: "none"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-height 0.5", + replaceFrom: "none", + addTo: "ic-height 2.0", +}, [ + {at: -0.5, expect: "none"}, + {at: 0, expect: "none"}, + {at: 0.5, expect: "ic-height 2.5"}, + {at: 1, expect: "ic-height 2.5"}, + {at: 1.5, expect: "ic-height 2.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-height 0.5", + addFrom: "ic-height 0", + addTo: "ic-height 2.0", +}, [ + {at: -0.5, expect: "ic-height 0.0"}, + {at: 0, expect: "ic-height 0.5"}, + {at: 0.5, expect: "ic-height 1.5"}, + {at: 1, expect: "ic-height 2.5"}, + {at: 1.5, expect: "ic-height 3.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-height 0.5", + replaceFrom: "ic-height 0", + addTo: "ic-height 2.0", +}, [ + {at: -0.5, expect: "ic-height 0.0"}, + {at: 0, expect: "ic-height 0.0"}, + {at: 0.5, expect: "ic-height 1.25"}, + {at: 1, expect: "ic-height 2.5"}, + {at: 1.5, expect: "ic-height 3.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-height 0.5", + addFrom: "ic-height 0", + replaceTo: "ic-height 2.0", +}, [ + {at: -0.5, expect: "ic-height 0.0"}, + {at: 0, expect: "ic-height 0.5"}, + {at: 0.5, expect: "ic-height 1.25"}, + {at: 1, expect: "ic-height 2"}, + {at: 1.5, expect: "ic-height 2.75"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "ic-height 0.5", + replaceFrom: "ic-height 2.0", + addTo: "none", +}, [ + {at: -0.5, expect: "ic-height 2.0"}, + {at: 0, expect: "ic-height 2.0"}, + {at: 0.5, expect: "none"}, + {at: 1, expect: "none"}, + {at: 1.5, expect: "none"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "ex-height 0.0", + addTo: "cap-height 2.0", +}, [ + {at: -0.5, expect: "0.5"}, + {at: 0, expect: "0.5"}, + {at: 0.5, expect: "cap-height 2.0"}, + {at: 1, expect: "cap-height 2.0"}, + {at: 1.5, expect: "cap-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "ex-height 0.0", + replaceTo: "cap-height 2.0", +}, [ + {at: -0.5, expect: "0.0"}, + {at: 0, expect: "0.0"}, + {at: 0.5, expect: "cap-height 2.0"}, + {at: 1, expect: "cap-height 2.0"}, + {at: 1.5, expect: "cap-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "ex-height 0", + addTo: "cap-height 2.0", +}, [ + {at: -0.5, expect: "0.0"}, + {at: 0, expect: "0.0"}, + {at: 0.5, expect: "cap-height 2.0"}, + {at: 1, expect: "cap-height 2.0"}, + {at: 1.5, expect: "cap-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "ex-height 0", + replaceTo: "cap-height 2.0", +}, [ + {at: -0.5, expect: "0.5"}, + {at: 0, expect: "0.5"}, + {at: 0.5, expect: "cap-height 2.0"}, + {at: 1, expect: "cap-height 2.0"}, + {at: 1.5, expect: "cap-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "cap-height 0.0", + addTo: "ch-width 2.0", +}, [ + {at: -0.5, expect: "cap-height 0.0"}, + {at: 0, expect: "cap-height 0.0"}, + {at: 0.5, expect: "ch-width 2.0"}, + {at: 1, expect: "ch-width 2.0"}, + {at: 1.5, expect: "ch-width 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "cap-height 0.0", + replaceTo: "ch-width 2.0", +}, [ + {at: -0.5, expect: "cap-height 0.0"}, + {at: 0, expect: "cap-height 0.0"}, + {at: 0.5, expect: "ch-width 2.0"}, + {at: 1, expect: "ch-width 2.0"}, + {at: 1.5, expect: "ch-width 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "cap-height 0", + addTo: "ch-width 2.0", +}, [ + {at: -0.5, expect: "cap-height 0.0"}, + {at: 0, expect: "cap-height 0.0"}, + {at: 0.5, expect: "ch-width 2.0"}, + {at: 1, expect: "ch-width 2.0"}, + {at: 1.5, expect: "ch-width 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "cap-height 0", + replaceTo: "ch-width 2.0", +}, [ + {at: -0.5, expect: "cap-height 0"}, + {at: 0, expect: "cap-height 0"}, + {at: 0.5, expect: "ch-width 2.0"}, + {at: 1, expect: "ch-width 2.0"}, + {at: 1.5, expect: "ch-width 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "ch-width 0.0", + addTo: "ic-width 2.0", +}, [ + {at: -0.5, expect: "ch-width 0.0"}, + {at: 0, expect: "ch-width 0.0"}, + {at: 0.5, expect: "ic-width 2.0"}, + {at: 1, expect: "ic-width 2.0"}, + {at: 1.5, expect: "ic-width 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "ch-width 0.0", + replaceTo: "ic-width 2.0", +}, [ + {at: -0.5, expect: "ch-width 0.0"}, + {at: 0, expect: "ch-width 0.0"}, + {at: 0.5, expect: "ic-width 2.0"}, + {at: 1, expect: "ic-width 2.0"}, + {at: 1.5, expect: "ic-width 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "ch-width 0", + addTo: "ic-width 2.0", +}, [ + {at: -0.5, expect: "ch-width 0.0"}, + {at: 0, expect: "ch-width 0.0"}, + {at: 0.5, expect: "ic-width 2.0"}, + {at: 1, expect: "ic-width 2.0"}, + {at: 1.5, expect: "ic-width 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "ch-width 0", + replaceTo: "ic-width 2.0", +}, [ + {at: -0.5, expect: "ch-width 0"}, + {at: 0, expect: "ch-width 0"}, + {at: 0.5, expect: "ic-width 2.0"}, + {at: 1, expect: "ic-width 2.0"}, + {at: 1.5, expect: "ic-width 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "ic-width 0.0", + addTo: "ic-height 2.0", +}, [ + {at: -0.5, expect: "ic-width 0.0"}, + {at: 0, expect: "ic-width 0.0"}, + {at: 0.5, expect: "ic-height 2.0"}, + {at: 1, expect: "ic-height 2.0"}, + {at: 1.5, expect: "ic-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "ic-width 0.0", + replaceTo: "ic-height 2.0", +}, [ + {at: -0.5, expect: "ic-width 0.0"}, + {at: 0, expect: "ic-width 0.0"}, + {at: 0.5, expect: "ic-height 2.0"}, + {at: 1, expect: "ic-height 2.0"}, + {at: 1.5, expect: "ic-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "ic-width 0", + addTo: "ic-height 2.0", +}, [ + {at: -0.5, expect: "ic-width 0.0"}, + {at: 0, expect: "ic-width 0.0"}, + {at: 0.5, expect: "ic-height 2.0"}, + {at: 1, expect: "ic-height 2.0"}, + {at: 1.5, expect: "ic-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "ic-width 0", + replaceTo: "ic-height 2.0", +}, [ + {at: -0.5, expect: "ic-width 0"}, + {at: 0, expect: "ic-width 0"}, + {at: 0.5, expect: "ic-height 2.0"}, + {at: 1, expect: "ic-height 2.0"}, + {at: 1.5, expect: "ic-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "ic-height 0.0", + addTo: "ex-height 2.0", +}, [ + {at: -0.5, expect: "ic-height 0.0"}, + {at: 0, expect: "ic-height 0.0"}, + {at: 0.5, expect: "ex-height 2.5"}, + {at: 1, expect: "ex-height 2.5"}, + {at: 1.5, expect: "ex-height 2.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "ic-height 0.0", + replaceTo: "ex-height 2.0", +}, [ + {at: -0.5, expect: "ic-height 0.0"}, + {at: 0, expect: "ic-height 0.0"}, + {at: 0.5, expect: "ex-height 2.0"}, + {at: 1, expect: "ex-height 2.0"}, + {at: 1.5, expect: "ex-height 2.0"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + replaceFrom: "ic-height 0", + addTo: "ex-height 2.0", +}, [ + {at: -0.5, expect: "ic-height 0.0"}, + {at: 0, expect: "ic-height 0.0"}, + {at: 0.5, expect: "ex-height 2.5"}, + {at: 1, expect: "ex-height 2.5"}, + {at: 1.5, expect: "ex-height 2.5"}, +]); + +test_composition({ + property: 'font-size-adjust', + underlying: "0.5", + addFrom: "ic-height 0", + replaceTo: "ex-height 2.0", +}, [ + {at: -0.5, expect: "ic-height 0"}, + {at: 0, expect: "ic-height 0"}, + {at: 0.5, expect: "ex-height 2.0"}, + {at: 1, expect: "ex-height 2.0"}, + {at: 1.5, expect: "ex-height 2.0"}, +]); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-features-two-stylesheets-crash.html b/tests/wpt/web-platform-tests/css/css-fonts/font-features-two-stylesheets-crash.html new file mode 100644 index 00000000000..0e6490974c2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/font-features-two-stylesheets-crash.html @@ -0,0 +1,10 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>CSS Test: @font-feature-values crashes with two stylesheets</title> +<link rel="author" href="mailto:sesse@chromium.org"> +<link rel="help" href="https://crbug.com/1444274"> +<meta http-equiv="Content-type" content="text/html; charset=utf-8"> +<style></style><iframe></iframe><style>@font-feature-values x {</style> +</head> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html new file mode 100644 index 00000000000..2bf12f083fe --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html @@ -0,0 +1,76 @@ +<!DOCTYPE HTML> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> +<meta charset="utf-8"> +<title>Reference: Subgridded item sizing with mixed writing modes</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> +body { + background: white; + color: black; + display: grid; + font: 20px/1 Ahem; + place-items: start; + padding: 0; + margin: 0; +} +.grid { + background: cyan; + display: grid; + padding: 5px; +} +.grid > .grid { + background: pink; +} +.h { writing-mode: horizontal-tb; } +.v { writing-mode: vertical-rl; } +</style> +</head> +<body> + <div class="grid h"> + <div class="grid h"> + <div class="h">1234</div> + </div> + </div> + <div class="grid h"> + <div class="grid h"> + <div class="v">1234</div> + </div> + </div> + <div class="grid h"> + <div class="grid v"> + <div class="h">1234</div> + </div> + </div> + <div class="grid h"> + <div class="grid v"> + <div class="v">1234</div> + </div> + </div> + <div class="grid v"> + <div class="grid h"> + <div class="h">1234</div> + </div> + </div> + <div class="grid v"> + <div class="grid h"> + <div class="v">1234</div> + </div> + </div> + <div class="grid v"> + <div class="grid v"> + <div class="h">1234</div> + </div> + </div> + <div class="grid v"> + <div class="grid v"> + <div class="v">1234</div> + </div> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006.html new file mode 100644 index 00000000000..95d12432289 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006.html @@ -0,0 +1,79 @@ +<!DOCTYPE HTML> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Test: Subgridded item sizing with mixed writing modes</title> +<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-2"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="match" href="orthogonal-writing-mode-006-ref.html"> +<style> +body { + background: white; + color: black; + display: grid; + font: 20px/1 Ahem; + place-items: start; + padding: 0; + margin: 0; +} +.grid { + background: cyan; + display: grid; + padding: 5px; +} +.grid > .grid { + background: pink; + grid-template: subgrid / subgrid; +} +.h { writing-mode: horizontal-tb; } +.v { writing-mode: vertical-rl; } +</style> +</head> +<body> + <div class="grid h"> + <div class="grid h"> + <div class="h">1234</div> + </div> + </div> + <div class="grid h"> + <div class="grid h"> + <div class="v">1234</div> + </div> + </div> + <div class="grid h"> + <div class="grid v"> + <div class="h">1234</div> + </div> + </div> + <div class="grid h"> + <div class="grid v"> + <div class="v">1234</div> + </div> + </div> + <div class="grid v"> + <div class="grid h"> + <div class="h">1234</div> + </div> + </div> + <div class="grid v"> + <div class="grid h"> + <div class="v">1234</div> + </div> + </div> + <div class="grid v"> + <div class="grid v"> + <div class="h">1234</div> + </div> + </div> + <div class="grid v"> + <div class="grid v"> + <div class="v">1234</div> + </div> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002-ref.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002-ref.html new file mode 100644 index 00000000000..cd1ee527ab1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002-ref.html @@ -0,0 +1,96 @@ +<!DOCTYPE HTML> +<html><head> + <meta charset="utf-8"> + <title>Reference: nested subgrids map margin/border/padding according to writing direction</title> + <link rel="author" title="Kurt Catti-Schmidt" href="mailto:kschmi@microsoft.com"> + <link rel="help" href="https://drafts.csswg.org/css-grid-2"> + <style> +html,body { + font:12px/1 monospace; +} + +.grid { + display: grid; + grid: 0.2em 1.4em / repeat(10, auto); + border: 1px solid; + padding: 0 0 0 0; +} + +div > div { + display: grid; + grid-column: 1 / span 3; + grid: auto / subgrid; + border: 1px solid; + background: grey; +} + +n { + grid-row: 1; + counter-increment: n; +} +n::before { content: counter(n, decimal); } + +x { + background: silver; +} + + </style> +</head> +<body> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div style="grid-template-columns: subgrid; padding: 0 0 0 10px;"> + <div style="grid-template-columns: subgrid; grid-column: 1 /span 3;"> + <x style="grid-column: 1; ">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div style="grid-template-columns: subgrid;"> + <div style="grid-template-columns: subgrid; grid-column: 1 /span 3; padding-left: 10px;"> + <x style="grid-column: 1; ">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div style="grid-template-columns: subgrid; border-right: 20px solid; border-left: 10px solid;"> + <div style="grid-template-columns: subgrid; grid-column-start:span 3;"> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div style="grid-template-columns: subgrid;"> + <div style="grid-template-columns: subgrid; grid-column-start:span 3; border-right: 20px solid; border-left: 10px solid;"> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div style="grid-template-columns: subgrid; margin: 0 20px 0 0;"> + <div style="grid-template-columns: subgrid; grid-column-start:span 3;"> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div style="grid-template-columns: subgrid;"> + <div style="grid-template-columns: subgrid; grid-column-start:span 3; margin: 0 20px 0 0;"> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002.html new file mode 100644 index 00000000000..078d5808b04 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002.html @@ -0,0 +1,100 @@ +<!DOCTYPE HTML> +<html><head> + <meta charset="utf-8"> + <title>CSS Grid Test: nested subgrids map margin/border/padding according to writing direction</title> + <link rel="author" title="Kurt Catti-Schmidt" href="mailto:kschmi@microsoft.com"> + <link rel="help" href="https://drafts.csswg.org/css-grid-2"> + <link rel="match" href="writing-directions-002-ref.html"> + <style> +html,body { + font:12px/1 monospace; +} + +.grid { + display: grid; + grid: 0.2em 1.4em / repeat(10, auto); + border: 1px solid; + padding: 0 0 0 0; +} + +div > div { + display: grid; + grid-column: 1 / span 3; + grid: auto / subgrid; + border: 1px solid; + background: grey; +} + +n { + grid-row: 1; + counter-increment: n; +} +n::before { content: counter(n, decimal); } + +x { + background: silver; +} + +.rtl { direction:rtl; } +.ltr { direction:ltr; } + + </style> +</head> +<body> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div class="rtl" style="grid-template-columns: subgrid; padding: 0 0 0 10px;"> + <div class="ltr" style="grid-template-columns: subgrid;"> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div class="rtl" style="grid-template-columns: subgrid; "> + <div class="ltr" style="grid-template-columns: subgrid; padding: 0 0 0 10px;"> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div class="rtl" style="grid-template-columns: subgrid; border-right: 20px solid; border-left: 10px solid;"> + <div class="ltr" style="grid-template-columns: subgrid; "> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div class="rtl" style="grid-template-columns: subgrid;"> + <div class="ltr" style="grid-template-columns: subgrid; border-right: 20px solid; border-left: 10px solid;"> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div class="rtl" style="grid-template-columns: subgrid; margin: 0 20px 0 0;"> + <div class="ltr" style="grid-template-columns: subgrid; "> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +<div class="grid"> + <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n> + <div class="rtl" style="grid-template-columns: subgrid;"> + <div class="ltr" style="grid-template-columns: subgrid; margin: 0 20px 0 0;"> + <x style="grid-column: 1;">x</x> + </div> + </div> +</div> + +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html index 6b91f74ad48..1dbdb5acab0 100644 --- a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html +++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html @@ -46,6 +46,8 @@ test_invalid_value("clip-path", "polygon(1%)"); test_invalid_value("clip-path", "unknown-box"); +test_invalid_value("clip-path", 'path(" ")'); +test_invalid_value("clip-path", 'path(evenodd, "")'); test_invalid_value("clip-path", 'path(abc, "m 20 0 h -100 z")'); test_invalid_value("clip-path", 'path(nonzero)'); test_invalid_value("clip-path", 'path("m 20 0 h -100", nonzero)'); diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html index ec6ac5ae9bc..895cdfacac6 100644 --- a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html +++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html @@ -49,10 +49,6 @@ test_valid_value("clip-path", 'path(evenodd, "M 20 20 h 60 v 60 h -60 Z M 30 30 test_valid_value("clip-path", 'path(nonzero, "M20,20h60 v60 h-60z M30,30 h40 v40 h-40z")', 'path("M 20 20 h 60 v 60 h -60 Z M 30 30 h 40 v 40 h -40 Z")'); -// See https://github.com/w3c/fxtf-drafts/issues/392. If empty path string, -// Blink serializes it as none, but Gecko serializes as path(""). -test_valid_value("clip-path", 'path(" ")', ["none", 'path("")']); -test_valid_value("clip-path", 'path(evenodd, "")', ["none", 'path(evenodd, "")']); // <geometry-box> test_valid_value("clip-path", "border-box"); diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/animation/overlay-interpolation.html b/tests/wpt/web-platform-tests/css/css-position/overlay/animation/overlay-interpolation.html new file mode 100644 index 00000000000..a3034b88c13 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/overlay/animation/overlay-interpolation.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://drafts.csswg.org/css-position-4/#overlay"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<body> +<script> +const alwaysAuto = [ + {at: -1, expect: 'auto'}, + {at: 0, expect: 'auto'}, + {at: 0.1, expect: 'auto'}, + {at: 0.9, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]; +const alwaysNone = [ + {at: -1, expect: 'none'}, + {at: 0, expect: 'none'}, + {at: 0.1, expect: 'none'}, + {at: 0.9, expect: 'none'}, + {at: 1, expect: 'none'}, + {at: 1.5, expect: 'none'}, +]; + +test_interpolation({ + property: 'overlay', + from: 'auto', + to: 'none', + // transition:all is not supposed to allow overlay to be transitioned. + 'CSS Transitions with transition: all': alwaysNone, +}, [ + {at: -1, expect: 'auto'}, + {at: 0, expect: 'auto'}, + {at: 0.1, expect: 'auto'}, + {at: 0.9, expect: 'auto'}, + {at: 1, expect: 'none'}, + {at: 1.5, expect: 'none'}, +]); + +test_interpolation({ + property: 'overlay', + from: 'none', + to: 'auto', + // transition:all is not supposed to allow overlay to be transitioned. + 'CSS Transitions with transition: all': alwaysAuto, +}, [ + {at: -1, expect: 'none'}, + {at: 0, expect: 'none'}, + {at: 0.1, expect: 'auto'}, + {at: 0.9, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); + +test_interpolation({ + property: 'overlay', + from: 'auto', + to: 'auto' +}, [ + {at: -1, expect: 'auto'}, + {at: 0, expect: 'auto'}, + {at: 0.5, expect: 'auto'}, + {at: 1, expect: 'auto'}, + {at: 1.5, expect: 'auto'}, +]); + +test_interpolation({ + property: 'overlay', + from: 'none', + to: 'none' +}, [ + {at: -1, expect: 'none'}, + {at: 0, expect: 'none'}, + {at: 0.5, expect: 'none'}, + {at: 1, expect: 'none'}, + {at: 1.5, expect: 'none'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html b/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html index 949e45d828f..28b45db8469 100644 --- a/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html +++ b/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html @@ -15,6 +15,8 @@ // arc path segments must have at least 7 arguments. // https://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands test_invalid_value("offset-path", 'path("M 20 30 A 60 70 80")'); +test_invalid_value("offset-path", 'path("")'); +test_invalid_value("offset-path", 'path(" ")'); test_invalid_value("offset-path", "ray(0 sides)"); test_invalid_value("offset-path", "ray(closest-side)"); diff --git a/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html b/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html index 95a9f8aabbc..59a64b2116d 100644 --- a/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html +++ b/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html @@ -41,10 +41,6 @@ test_valid_value("offset-path", ' path( "m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50" ) ', 'path("m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50")' ); -// See https://github.com/w3c/fxtf-drafts/issues/392. If empty path string, -// Blink serializes it as none, but Gecko serializes as path(""). -test_valid_value("offset-path", 'path("")', ['none', 'path("")']); -test_valid_value("offset-path", 'path(" ")', ['none', 'path("")']); test_valid_value("offset-path", 'url("http://www.example.com/index.html#polyline1")'); diff --git a/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-button.tentative.html b/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-button.tentative.html new file mode 100644 index 00000000000..0f399378abf --- /dev/null +++ b/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-button.tentative.html @@ -0,0 +1,77 @@ +<!doctype html> +<head> +<meta charset="utf-8"> +<title>Tests for pressing space in editable button element</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> +</head> +<body> +<button contenteditable>HelloWorld</button> +<div contenteditable><button>HelloWorld</button></div> +<button><div contenteditable>HelloWorld</div></button> +<script> +"use strict"; + +promise_test(async () => { + await new Promise(resolve => { + addEventListener("load", resolve, {once: true}); + }); + const button = document.querySelector("button[contenteditable]"); + getSelection().collapse(button.firstChild, "Hello".length); + let clickEvent = null; + button.addEventListener("click", event => clickEvent = event, {once: true}); + await new this.window.test_driver.Actions() + .keyDown("\uE00D") + .keyUp("\uE00D") + .send(); + assert_equals(button.textContent, "HelloWorld", "The button label shouldn't be changed"); + assert_not_equals(clickEvent, null, "Click event should be fired on the <button>"); +}, "Type space key in <button contenteditable> should be handled by the <button>"); + +promise_test(async () => { + document.querySelector("div[contenteditable]").focus(); + const button = document.querySelector("div[contenteditable] > button"); + getSelection().collapse(button.firstChild, "Hello".length); + let clickEvent = null; + button.addEventListener("click", event => clickEvent = event, {once: true}); + await new this.window.test_driver.Actions() + .keyDown("\uE00D") + .keyUp("\uE00D") + .send(); + assert_equals(button.textContent, "Hello World", "A space should be inserted into the button label"); + assert_equals(clickEvent, null, "Click event should not be fired on the <button>"); +}, "Type space key in editable <button> shouldn't be handled by the <button> when it's not focused"); + +promise_test(async () => { + const button = document.querySelector("div[contenteditable] > button"); + button.textContent = "HelloWorld"; + button.focus(); + let clickEvent = null; + button.addEventListener("click", event => clickEvent = event, {once: true}); + await new this.window.test_driver.Actions() + .keyDown("\uE00D") + .keyUp("\uE00D") + .send(); + assert_equals(button.textContent, "HelloWorld", "The button label shouldn't be changed"); + assert_not_equals(clickEvent, null, "Click event should be fired on the <button>"); +}, "Type space key in editable <button> should be handled by the <button> when it's focused"); + +promise_test(async () => { + const div = document.querySelector("button > div[contenteditable]"); + div.focus(); + getSelection().collapse(div.firstChild, "Hello".length); + let clickEvent = null; + div.parentElement.addEventListener("click", event => clickEvent = event, {once: true}); + await new this.window.test_driver.Actions() + .keyDown("\uE00D") + .keyUp("\uE00D") + .send(); + assert_equals(div.textContent, "Hello World", "A space should be inserted into the button label"); + assert_equals(clickEvent, null, "Click event should not be fired on the <button>"); +}, "Type space key in editable element in <button> shouldn't be handled by the <button>"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-summary.tentative.html b/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-summary.tentative.html new file mode 100644 index 00000000000..30a751d5239 --- /dev/null +++ b/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-summary.tentative.html @@ -0,0 +1,90 @@ +<!doctype html> +<head> +<meta charset="utf-8"> +<title>Tests for pressing space in editable summary element</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> +</head> +<body> +<details contenteditable><summary>HelloWorld</summary>Details</details> +<details><summary contenteditable>HelloWorld</summary>Details</details> +<details><summary><div contenteditable>HelloWorld</div></summary>Details</details> +<script> +"use strict"; + +promise_test(async () => { + const details = document.querySelector("details[contenteditable]"); + const summary = details.querySelector("summary"); + getSelection().collapse(summary.firstChild, "Hello".length); + summary.focus(); + await new this.window.test_driver.Actions() + .keyDown("\uE00D") + .keyUp("\uE00D") + .send(); + assert_equals( + details.innerHTML, + "<summary>HelloWorld</summary>Details", + "A space shouldn't be inserted into the focused <summary>" + ); + assert_true(details.open, "<details> shouldn't keep collapsed"); +}, "Type space key in editable <summary> should be handled by the <summary> when it's focused"); + +promise_test(async () => { + const details = document.querySelector("details[contenteditable]"); + details.innerHTML = "<summary>HelloWorld</summary>Details"; + details.open = false; + const summary = details.querySelector("summary"); + getSelection().collapse(summary.firstChild, "Hello".length); + details.focus(); + await new this.window.test_driver.Actions() + .keyDown("\uE00D") + .keyUp("\uE00D") + .send(); + assert_equals( + details.innerHTML, + "<summary>Hello World</summary>Details", + "A space should be inserted into the <summary>" + ); + assert_false(details.open, "<details> should keep collapsed"); +}, "Type space key in editable <summary> shouldn't be handled by the <summary> when it's not focused"); + +promise_test(async () => { + const details = document.querySelector("details > summary[contenteditable]").parentNode; + const summary = details.querySelector("summary"); + getSelection().collapse(summary.firstChild, "Hello".length); + summary.focus(); + await new this.window.test_driver.Actions() + .keyDown("\uE00D") + .keyUp("\uE00D") + .send(); + assert_equals( + details.innerHTML, + '<summary contenteditable="">HelloWorld</summary>Details', + "The content of <details> shouldn't be changed" + ); + assert_true(details.open, "<details> shouldn't keep collapsed"); +}, "Type space key in <summary contenteditable> should be handled by the <summary>"); + +promise_test(async () => { + const details = document.querySelector("summary > div[contenteditable]").parentNode.parentNode; + const summary = details.querySelector("summary"); + const editable = summary.querySelector("div[contenteditable]"); + editable.focus(); + getSelection().collapse(editable.firstChild, "Hello".length); + await new this.window.test_driver.Actions() + .keyDown("\uE00D") + .keyUp("\uE00D") + .send(); + assert_equals( + details.innerHTML, + '<summary><div contenteditable="">Hello World</div></summary>Details', + "A space should be inserted" + ); + assert_false(details.open, "<details> should keep collapsed"); +}, "Type space key in editable element in <summary> shouldn't be handled by the <summary>"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/fenced-frame/automatic-beacon-click-handler.https.html b/tests/wpt/web-platform-tests/fenced-frame/automatic-beacon-click-handler.https.html new file mode 100644 index 00000000000..505eb6174f2 --- /dev/null +++ b/tests/wpt/web-platform-tests/fenced-frame/automatic-beacon-click-handler.https.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<title>Test window.fence.setReportEventDataForAutomaticBeacons</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<body> +<script> +promise_test(async(t) => { + const actions = new test_driver.Actions(); + const fencedframe = await attachFencedFrameContext( + {generator_api: 'fledge'}); + const new_url = new URL("resources/dummy.html", location.href); + const beacon_data = "This is the beacon data!"; + + await fencedframe.execute((new_url, beacon_data) => { + addEventListener("click", (event) => { + let beacon_event = { + eventType: "reserved.top_navigation", + eventData: beacon_data, + destination: ["buyer"], + } + window.fence.setReportEventDataForAutomaticBeacons(beacon_event); + window.open(new_url, "_blank"); + }); + }, [new_url, beacon_data]); + + await actions.pointerMove(0, 0, {origin: fencedframe.element}) + .pointerDown() + .pointerUp() + .send(); + + const received_beacon_data = await nextAutomaticBeacon(); + assert_equals(received_beacon_data, beacon_data); +}, 'Set and trigger an automatic beacon in a click handler'); + +promise_test(async(t) => { + const fencedframe = await attachFencedFrameContext( + {generator_api: 'fledge'}); + const new_url = new URL("resources/dummy.html", location.href); + const beacon_data = "This is the beacon data!"; + + await fencedframe.execute((new_url, beacon_data) => { + const actions = new test_driver.Actions(); + let a = document.createElement('a'); + a.textContent = "Click me!"; + a.href = new_url; + a.target = "_blank"; + + // When the anchor link is clicked, the click handler will set the data + // before the navigation happens. This test checks to make sure that the + // data makes it to the correct place by the time the navigation commits. + a.onclick = () => { + let beacon_event = { + eventType: "reserved.top_navigation", + eventData: beacon_data, + destination: ["buyer"], + } + window.fence.setReportEventDataForAutomaticBeacons(beacon_event); + }; + document.body.appendChild(a); + + // This will trigger the beacon data storing + navigation. + return actions.pointerMove(0, 0, {origin: a}) + .pointerDown() + .pointerUp() + .send(); + }, [new_url, beacon_data]); + + const received_beacon_data = await nextAutomaticBeacon(); + assert_equals(received_beacon_data, beacon_data); +}, 'Set and trigger an automatic beacon in an <a> click handler'); + +</script> +</body> diff --git a/tests/wpt/web-platform-tests/fenced-frame/resources/automatic-beacon-store.py b/tests/wpt/web-platform-tests/fenced-frame/resources/automatic-beacon-store.py new file mode 100644 index 00000000000..f783c8530c4 --- /dev/null +++ b/tests/wpt/web-platform-tests/fenced-frame/resources/automatic-beacon-store.py @@ -0,0 +1,25 @@ +"""Automatic beacon store server. + +- When a request body is not specified, serves a 200 response whose body + contains the stored value from the last automatic beacon. If the stored value + doesn't exist, serves a 200 response with an empty body. +- When a request body is specified, stores the data in the body and serves a 200 + response without body. +""" +# Use an arbitrary key since `request.server.stash.put` expects a valid UUID. +BEACON_KEY = "0c02dba4-f01e-11ed-a05b-0242ac120003" + +def main(request, response): + # Requests with a body imply they were sent as an automatic beacon for + # reserved.top_navigation. Note that this only stores the most recent beacon + # that was sent. + if request.body: + request.server.stash.put(BEACON_KEY, request.body) + return (200, [], b"") + + # Requests without a body imply they were sent as the request from + # nextAutomaticBeacon(). + data = request.server.stash.take(BEACON_KEY) + if not data and data != "": + return (200, [], b"<Not set>") + return (200, [], data) diff --git a/tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js b/tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js index c19cc1d0337..ab6685f1842 100644 --- a/tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js +++ b/tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js @@ -25,5 +25,10 @@ function generateBid(interestGroup, auctionSignals, perBuyerSignals, function reportWin( auctionSignals, perBuyerSignals, sellerSignals, browserSignals) { + registerAdBeacon({ + 'reserved.top_navigation': + browserSignals.interestGroupOwner + + '/fenced-frame/resources/automatic-beacon-store.py' + }); return; } diff --git a/tests/wpt/web-platform-tests/fenced-frame/resources/utils.js b/tests/wpt/web-platform-tests/fenced-frame/resources/utils.js index 2263fc1db18..4638f37cbb1 100644 --- a/tests/wpt/web-platform-tests/fenced-frame/resources/utils.js +++ b/tests/wpt/web-platform-tests/fenced-frame/resources/utils.js @@ -1,4 +1,5 @@ const STORE_URL = '/fenced-frame/resources/key-value-store.py'; +const BEACON_URL = '/fenced-frame/resources/automatic-beacon-store.py'; const REMOTE_EXECUTOR_URL = '/fenced-frame/resources/remote-context-executor.https.html'; const FLEDGE_BIDDING_URL = '/fenced-frame/resources/fledge-bidding-logic.js'; const FLEDGE_BIDDING_WITH_SIZE_URL = '/fenced-frame/resources/fledge-bidding-logic-with-size.js'; @@ -417,6 +418,37 @@ async function nextValueFromServer(key) { } } +// Reads the data from the latest automatic beacon sent to the server. +async function readAutomaticBeaconDataFromServer() { + const serverUrl = `${BEACON_URL}`; + const response = await fetch(serverUrl); + if (!response.ok) + throw new Error('An error happened in the server'); + const value = await response.text(); + + // The value is not stored in the server. + if (value === "<Not set>") + return { status: false }; + + return { status: true, value: value }; +} + +// Convenience wrapper around the above getter that will wait until a value is +// available on the server. +async function nextAutomaticBeacon() { + while (true) { + // Fetches the test result from the server. + const { status, value } = await readAutomaticBeaconDataFromServer(); + if (!status) { + // The test result has not been stored yet. Retry after a while. + await new Promise(resolve => setTimeout(resolve, 20)); + continue; + } + + return value; + } +} + // Writes `value` for `key` in the key-value store on the server. async function writeValueToServer(key, value, origin = '') { // Resolve the key if it is a Promise. diff --git a/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js b/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js index 7bf98ba9b24..3727bb42afe 100644 --- a/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js +++ b/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js @@ -566,7 +566,7 @@ test(() => { controller.abort(); - assert_array_equals(log, ['clone-aborted', 'original-aborted'], "Abort events fired in correct order"); + assert_array_equals(log, ['original-aborted', 'clone-aborted'], "Abort events fired in correct order"); assert_true(request.signal.aborted, 'Signal aborted'); assert_true(clonedRequest.signal.aborted, 'Signal aborted'); }, "Clone aborts with original controller"); diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html b/tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html index c2c90eaa8bd..64b07556661 100644 --- a/tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html +++ b/tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html @@ -35,9 +35,7 @@ promise_test(function() { // The fulfill handler above shouldn't have run yet. If it has run, // throw to reject this promise and fail the test. - if (executed) { - throw "shouldn't have run microtasks yet"; - } + assert_false(executed, "shouldn't have run microtasks yet"); // Otherwise act as if there's no "then" property so the promise // fulfills and the test passes. @@ -49,6 +47,40 @@ promise_test(function() { return response.body.getReader().read(); }); }, "reading from a body stream should occur in a microtask scope"); + +promise_test(function() { + return fetch("../resources/data.json").then(function(response) { + // Add a getter for "then" that will incidentally be invoked + // during promise resolution. + Object.prototype.__defineGetter__('then', () => { + // Clean up behind ourselves. + delete Object.prototype.then; + + // This promise should (like all promises) be resolved + // asynchronously. + var executed = false; + Promise.resolve().then(_ => { executed = true; }); + + // This shouldn't run microtasks! They should only run + // after the fetch is resolved. + performMicrotaskCheckpoint(); + + // The fulfill handler above shouldn't have run yet. If it has run, + // throw to reject this promise and fail the test. + assert_false(executed, "shouldn't have run microtasks yet"); + + // Otherwise act as if there's no "then" property so the promise + // fulfills and the test passes. + return undefined; + }); + + // Create a read request, incidentally resolving a promise with an + // object value, thereby invoking the getter installed above. + return response.body.pipeTo(new WritableStream({ + write(chunk) {} + })) + }); +}, "piping from a body stream to a JS-written WritableStream should occur in a microtask scope"); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.https.html index 875431698f7..871c917dcc8 100644 --- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.html +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.https.html @@ -1,10 +1,10 @@ <!DOCTYPE html> <title>Element#requestFullscreen({ screen }) tentative support</title> -<link rel="help" href="https://w3c.github.io/window-placement/" /> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> +<link rel="help" href="https://w3c.github.io/window-management/" /> <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="../trusted-click.js"></script> <body></body> <script> @@ -24,6 +24,6 @@ await trusted_click(document.body); await document.body.requestFullscreen(options); - assert_equals(screenGetterInvoked, true); + assert_true(screenGetterInvoked); }, "fullscreenOptions.screen getter is invoked on requestFullscreen"); </script> diff --git a/tests/wpt/web-platform-tests/graphics-aria/META.yml b/tests/wpt/web-platform-tests/graphics-aria/META.yml new file mode 100644 index 00000000000..692db91315e --- /dev/null +++ b/tests/wpt/web-platform-tests/graphics-aria/META.yml @@ -0,0 +1,4 @@ +spec: https://w3c.github.io/graphics-aria/ +suggested_reviewers: + - cookiecrook + - spectranaut diff --git a/tests/wpt/web-platform-tests/graphics-aria/graphics-roles.html b/tests/wpt/web-platform-tests/graphics-aria/graphics-roles.html new file mode 100644 index 00000000000..159190ed833 --- /dev/null +++ b/tests/wpt/web-platform-tests/graphics-aria/graphics-roles.html @@ -0,0 +1,22 @@ +<!doctype html> +<html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/wai-aria/scripts/aria-utils.js"></script> +</head> +<body> + +<div role="graphics-document" data-expectedrole="graphics-document" class="ex">x</div> +<div role="graphics-object" data-expectedrole="graphics-object" class="ex">x</div> +<div role="graphics-symbol" data-expectedrole="graphics-symbol" class="ex">x</div> + +<script> +AriaUtils.verifyRolesBySelector(".ex"); +</script> + +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html index d0e629f6312..609ce9b8503 100644 --- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html +++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html @@ -86,6 +86,50 @@ promise_test(async t => { 'Same-origin forward history navigation to a document whose original ' + 'initiator was cross-site ends up with document.referrer that is the ' + 'original cross-site initiator'); -}, "A navigation's initiator origin and referrer are stored in the document state"); +}, "A navigation's initiator origin and referrer are stored in the document " + + "state and used in the document repopulation case"); + +// This test is similar to the above, but instead of testing for the true +// history entry -> document state -> document repopulation case, we stay on [B] +// (the document who was navigated to from [A]) and run `location.reload()` to +// confirm that the initiator information from the [A] -> [B] navigation is used +// when reloading [B], not [B]'s own same-origin information. +promise_test(async t => { + const rcHelper = new RemoteContextHelper(); + const A = await rcHelper.addWindow(); + + const originA = new URL(await A.executeScript(() => location.href)).origin; + + // Create B on a new origin. + const B = await A.navigateToNew({ + origin: 'HTTPS_NOTSAMESITE_ORIGIN', + }); + + const originB = new URL(await B.executeScript(() => location.href)).origin; + assert_not_equals(originA, originB, 'Contexts A and B are cross-origin'); + + // Reload B. + await B.navigate(() => { + location.reload(); + }, []); + + const secFetchSite = await B.executeScript(() => window.requestHeaders['sec-fetch-site']); + const referrer = await B.executeScript(() => window.requestHeaders['referer']); + const documentReferrer = await B.executeScript(() => document.referrer); + + assert_equals(secFetchSite, 'cross-site', + 'Same-origin forward history navigation to a document whose original ' + + 'initiator was cross-site, ends up with Sec-Fetch-Dest: cross-site ' + + 'header'); + assert_equals(referrer, originA + '/', + 'Same-origin forward history navigation to a document whose original ' + + 'initiator was cross-site ends up with the Referer header that is the ' + + 'original cross-site initiator'); + assert_equals(documentReferrer, originA + '/', + 'Same-origin forward history navigation to a document whose original ' + + 'initiator was cross-site ends up with document.referrer that is the ' + + 'original cross-site initiator'); +}, "A navigation's initiator origin and referrer are stored in the document " + + "state and used on location.reload()"); </script> </body> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html new file mode 100644 index 00000000000..8ce0c51e8e4 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title> +<h1>2d.layer.render-opportunities.createImageBitmap</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap.html new file mode 100644 index 00000000000..4ffcaa3e3c0 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.createImageBitmap-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title> +<h1>2d.layer.render-opportunities.createImageBitmap</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + createImageBitmap(canvas); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html new file mode 100644 index 00000000000..1ddc6d1b449 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.drawImage</title> +<h1>2d.layer.render-opportunities.drawImage</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage.html new file mode 100644 index 00000000000..4eb0b6f721b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.drawImage-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.drawImage</title> +<h1>2d.layer.render-opportunities.drawImage</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + const canvas2 = new OffscreenCanvas(200, 200); + const ctx2 = canvas2.getContext('2d'); + ctx2.drawImage(canvas, 0, 0); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html new file mode 100644 index 00000000000..ea0e78e0f28 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.getImageData</title> +<h1>2d.layer.render-opportunities.getImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData.html new file mode 100644 index 00000000000..3cf514a03f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.getImageData-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.getImageData</title> +<h1>2d.layer.render-opportunities.getImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + ctx.getImageData(0, 0, 200, 200); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html new file mode 100644 index 00000000000..3d63bbe7766 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.putImageData</title> +<h1>2d.layer.render-opportunities.putImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData.html new file mode 100644 index 00000000000..8da3dafbb7c --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.putImageData-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.putImageData</title> +<h1>2d.layer.render-opportunities.putImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + const canvas2 = new OffscreenCanvas(200, 200); + const ctx2 = canvas2.getContext('2d'); + ctx.putImageData(ctx2.getImageData(0, 0, 1, 1), 0, 0); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html new file mode 100644 index 00000000000..138f3a7ccbb --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<title>Canvas test: 2d.layer.render-opportunities.requestAnimationFrame</title> +<h1>2d.layer.render-opportunities.requestAnimationFrame</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script type="module"> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + document.documentElement.classList.remove("reftest-wait"); +</script> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html new file mode 100644 index 00000000000..889ff5ba09c --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.requestAnimationFrame-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.requestAnimationFrame</title> +<h1>2d.layer.render-opportunities.requestAnimationFrame</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script type="module"> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + await new Promise(resolve => requestAnimationFrame(resolve)); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + document.documentElement.classList.remove("reftest-wait"); +</script> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html new file mode 100644 index 00000000000..fda8e8d7c6d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<title>Canvas test: 2d.layer.render-opportunities.toBlob</title> +<h1>2d.layer.render-opportunities.toBlob</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script type="module"> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + document.documentElement.classList.remove("reftest-wait"); +</script> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html new file mode 100644 index 00000000000..908730424a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.toBlob-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.toBlob</title> +<h1>2d.layer.render-opportunities.toBlob</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script type="module"> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + await new Promise(resolve => canvas.toBlob(resolve)); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + document.documentElement.classList.remove("reftest-wait"); +</script> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html new file mode 100644 index 00000000000..22a9770331d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.toDataURL</title> +<h1>2d.layer.render-opportunities.toDataURL</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL.html new file mode 100644 index 00000000000..152f66a12b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.toDataURL-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.toDataURL</title> +<h1>2d.layer.render-opportunities.toDataURL</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + canvas.toDataURL(); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed-expected.html new file mode 100644 index 00000000000..c41b253c95b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed-expected.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.unclosed</title> +<h1>2d.layer.unclosed</h1> +<p class="desc">Check that layers are rendered even if not closed.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed.html new file mode 100644 index 00000000000..788889ee7ef --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.unclosed-expected.html"> +<title>Canvas test: 2d.layer.unclosed</title> +<h1>2d.layer.unclosed</h1> +<p class="desc">Check that layers are rendered even if not closed.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html index 55f2d2c24b5..18af95c1eeb 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(520, 420); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(520, 420); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'teal'; ctx.fillRect(0, 0, 520, 50); @@ -105,6 +105,6 @@ floodColor: 'purple', floodOpacity: ['0.4']}); ctx.fillRect(210, 310, 80, 80); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html index 633d202012c..b94424dd996 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(520, 420); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(520, 420); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'teal'; ctx.fillRect(0, 0, 520, 50); @@ -107,7 +107,7 @@ floodColor: 'purple', floodOpacity: ['0.4']}); ctx.fillRect(210, 310, 80, 80); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html index f088c89aa7c..6a0e5cce717 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; ctx.fillRect(60, 60, 75, 50); @@ -22,6 +22,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html index 96c80115506..ddb2671aaab 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; ctx.fillRect(60, 60, 75, 50); @@ -24,7 +24,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html index a87c7364cfa..b204c49e5eb 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; ctx.fillRect(60, 60, 75, 50); @@ -26,6 +26,6 @@ ctx.fillRect(70, 70, 75, 50); ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html index 9507809a528..2e1cb62c32a 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; ctx.fillRect(60, 60, 75, 50); @@ -28,7 +28,7 @@ ctx.fillRect(70, 70, 75, 50); ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html index bb7dd933372..71414b4b379 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -33,6 +33,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html index 70b32e43395..551df36b15e 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -36,6 +36,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html index 45932d4cd5d..6851a4a8468 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -38,7 +38,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html index ff33fc45052..618480c813f 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,7 +35,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html index 21582189b1d..94fed5752df 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -33,6 +33,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html index bb3d886b54f..841742ef1e7 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -36,6 +36,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html index 592f92921b8..ef44257c0ad 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -38,7 +38,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html index 2359e92790f..d7d2b7a21e2 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,7 +35,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html index 67a8ae60249..63a264e6819 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -32,6 +32,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html index a67f5872f78..daa788cd150 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,6 +35,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html index 35df72aabcd..f75db3d2490 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -37,7 +37,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html index 2db6b64738c..694f31e208b 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -34,7 +34,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html index 6bcfd2854a6..6a36bb4ba10 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -32,6 +32,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html index f1e9b7d23a3..9ad87aa0cd2 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,6 +35,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html index 1d22e94f6f9..dc52e9e9251 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -37,7 +37,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html index 227c72b80ac..8964e97713c 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -34,7 +34,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html index 9d4d1dce8a4..84fb4b3d95a 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -32,6 +32,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html index 9ad39065c6a..2e0883f5af8 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,6 +35,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html index b45c9d3aadc..66d44050581 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -37,7 +37,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html index 66493889b20..b695871fcdc 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -34,7 +34,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html index 37d0e3dd1c5..bf483ccc925 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -36,6 +36,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html index 93278cb5aa3..d914a70867f 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -39,6 +39,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html index 783693f2c14..a1acd0d083a 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -41,7 +41,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html index 53533e4ece6..47503d5478b 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -38,7 +38,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html index f0af85f8f51..7d4f8ecda52 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -36,6 +36,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html index 46cd28b6c2b..f75bd251ac4 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -39,6 +39,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html index 044b75927b3..783a04cafbf 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -41,7 +41,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html index be25ca66b16..ed8af9a0f1d 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -38,7 +38,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html index 6567094376b..4f8954f978c 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,6 +35,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html index 3059bf306cd..0cfa86a0125 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -38,6 +38,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html index a481073ccfc..015fe946338 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -40,7 +40,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html index b5d81078899..4334fd6c1b0 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -37,7 +37,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html index a574e829328..7f3d1a2cb3c 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,6 +35,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html index 4bdf80337f8..9b9862e57ff 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -38,6 +38,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html index 23cd4e834b0..1d7e74b64eb 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -40,7 +40,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html index bd7a51d8987..f5ccee1d858 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -37,7 +37,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html index 663a953a29e..2e8272b2bfa 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,6 +35,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html index 52ad8646f01..077041a2940 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -38,6 +38,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html index bf7139edce6..b162354da44 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -40,7 +40,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html index 1f30d1e5644..b4158392660 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -37,7 +37,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html index 0619faa944f..ccae63a26ab 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -35,6 +35,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html index 3a716838200..6ce768ad267 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -37,7 +37,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html index 69120c105e5..9a20e39fd5a 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -37,6 +37,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html index 8a770b2911e..26bdf755876 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -39,7 +39,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html index 022736c7b5b..c8a98153816 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -32,6 +32,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html index 80ed4e4503d..db03a3fd0c3 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -34,7 +34,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html index 6402dc57607..41a832c516e 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -34,6 +34,6 @@ ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html index e41e7aee464..7b78f4b739a 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; @@ -36,7 +36,7 @@ ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html index 0c168493c21..9e5b7d5826c 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html @@ -8,8 +8,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); var circle = new Path2D(); circle.arc(90, 90, 40, 0, 2 * Math.PI); @@ -34,6 +34,6 @@ ctx.endLayer(); ctx.endLayer(); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html index 3b81691e06b..99e73906096 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html @@ -10,8 +10,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); var circle = new Path2D(); circle.arc(90, 90, 40, 0, 2 * Math.PI); @@ -36,7 +36,7 @@ ctx.endLayer(); ctx.endLayer(); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html new file mode 100644 index 00000000000..1e617751655 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<title>Canvas test: 2d.layer.render-opportunities.convertToBlob</title> +<h1>2d.layer.render-opportunities.convertToBlob</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script type="module"> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + document.documentElement.classList.remove("reftest-wait"); +</script> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html new file mode 100644 index 00000000000..c1a139a3de8 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.convertToBlob-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.convertToBlob</title> +<h1>2d.layer.render-opportunities.convertToBlob</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script type="module"> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + await canvas.convertToBlob(); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); + document.documentElement.classList.remove("reftest-wait"); +</script> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html new file mode 100644 index 00000000000..404fef3ad6a --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.convertToBlob-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.convertToBlob</title> +<h1>2d.layer.render-opportunities.convertToBlob</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = async function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + await canvas.convertToBlob(); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html new file mode 100644 index 00000000000..8ce0c51e8e4 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title> +<h1>2d.layer.render-opportunities.createImageBitmap</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html new file mode 100644 index 00000000000..876b027170e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.createImageBitmap-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title> +<h1>2d.layer.render-opportunities.createImageBitmap</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + createImageBitmap(canvas); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html new file mode 100644 index 00000000000..9a89492e399 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.createImageBitmap-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title> +<h1>2d.layer.render-opportunities.createImageBitmap</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + createImageBitmap(canvas); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html new file mode 100644 index 00000000000..1ddc6d1b449 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.drawImage</title> +<h1>2d.layer.render-opportunities.drawImage</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html new file mode 100644 index 00000000000..dd178206073 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.drawImage-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.drawImage</title> +<h1>2d.layer.render-opportunities.drawImage</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + const canvas2 = new OffscreenCanvas(200, 200); + const ctx2 = canvas2.getContext('2d'); + ctx2.drawImage(canvas, 0, 0); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html new file mode 100644 index 00000000000..80fbfbd272e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.drawImage-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.drawImage</title> +<h1>2d.layer.render-opportunities.drawImage</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + const canvas2 = new OffscreenCanvas(200, 200); + const ctx2 = canvas2.getContext('2d'); + ctx2.drawImage(canvas, 0, 0); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html new file mode 100644 index 00000000000..ea0e78e0f28 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.getImageData</title> +<h1>2d.layer.render-opportunities.getImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html new file mode 100644 index 00000000000..b6f3c1b5626 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.getImageData-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.getImageData</title> +<h1>2d.layer.render-opportunities.getImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + ctx.getImageData(0, 0, 200, 200); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html new file mode 100644 index 00000000000..187eb0fce96 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.getImageData-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.getImageData</title> +<h1>2d.layer.render-opportunities.getImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + ctx.getImageData(0, 0, 200, 200); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html new file mode 100644 index 00000000000..3d63bbe7766 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.putImageData</title> +<h1>2d.layer.render-opportunities.putImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html new file mode 100644 index 00000000000..b4600156136 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.putImageData-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.putImageData</title> +<h1>2d.layer.render-opportunities.putImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + const canvas2 = new OffscreenCanvas(200, 200); + const ctx2 = canvas2.getContext('2d'); + ctx.putImageData(ctx2.getImageData(0, 0, 1, 1), 0, 0); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html new file mode 100644 index 00000000000..9ffac071c36 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.putImageData-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.putImageData</title> +<h1>2d.layer.render-opportunities.putImageData</h1> +<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + const canvas2 = new OffscreenCanvas(200, 200); + const ctx2 = canvas2.getContext('2d'); + ctx.putImageData(ctx2.getImageData(0, 0, 1, 1), 0, 0); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html new file mode 100644 index 00000000000..2833849da67 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.render-opportunities.transferToImageBitmap</title> +<h1>2d.layer.render-opportunities.transferToImageBitmap</h1> +<p class="desc">Checks that transferToImageBitmap flushes and rebuilds the state stack.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.html new file mode 100644 index 00000000000..27830644b05 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.render-opportunities.transferToImageBitmap-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.transferToImageBitmap</title> +<h1>2d.layer.render-opportunities.transferToImageBitmap</h1> +<p class="desc">Checks that transferToImageBitmap flushes and rebuilds the state stack.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack. + // `transferToImageBitmap` clears the frame but preserves render states. + canvas.transferToImageBitmap(); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html new file mode 100644 index 00000000000..06e016020db --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.render-opportunities.transferToImageBitmap-expected.html"> +<title>Canvas test: 2d.layer.render-opportunities.transferToImageBitmap</title> +<h1>2d.layer.render-opportunities.transferToImageBitmap</h1> +<p class="desc">Checks that transferToImageBitmap flushes and rebuilds the state stack.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack. + // `transferToImageBitmap` clears the frame but preserves render states. + canvas.transferToImageBitmap(); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html index 66f99835df4..a3593cd2a82 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html @@ -9,8 +9,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(200, 200); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0,0,255,1)'; ctx.fillRect(50, 50, 75, 50); @@ -23,6 +23,6 @@ ctx.fillRect(70, 70, 75, 50); - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html index a717a1d3122..a66fc2bc598 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html @@ -11,8 +11,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(200, 200); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0,0,255,1)'; ctx.fillRect(50, 50, 75, 50); @@ -25,7 +25,7 @@ ctx.fillRect(70, 70, 75, 50); - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html index 1d50bd4de61..c4b50282805 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html @@ -9,8 +9,8 @@ <p class="fallback">FAIL (fallback content)</p> </canvas> <script> - const offscreen_canvas = new OffscreenCanvas(500, 500); - const ctx = offscreen_canvas.getContext('2d'); + const canvas = new OffscreenCanvas(500, 500); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; ctx.fillRect(50, 50, 95, 70); @@ -32,6 +32,6 @@ ctx.endLayer(); } - const canvas = document.getElementById("canvas"); - canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html index 7982a8dbc4f..114c5e06868 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html @@ -11,8 +11,8 @@ </canvas> <script id='myWorker' type='text/worker'> self.onmessage = function(e) { - const oc = new OffscreenCanvas(500, 500); - const ctx = oc.getContext('2d'); + const canvas = new OffscreenCanvas(500, 500); + const ctx = canvas.getContext('2d'); ctx.fillStyle = 'rgba(0, 0, 255, 1)'; ctx.fillRect(50, 50, 95, 70); @@ -34,7 +34,7 @@ ctx.endLayer(); } - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html new file mode 100644 index 00000000000..c41b253c95b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.unclosed</title> +<h1>2d.layer.unclosed</h1> +<p class="desc">Check that layers are rendered even if not closed.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.html new file mode 100644 index 00000000000..689ee801cf2 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.unclosed-expected.html"> +<title>Canvas test: 2d.layer.unclosed</title> +<h1>2d.layer.unclosed</h1> +<p class="desc">Check that layers are rendered even if not closed.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.w.html new file mode 100644 index 00000000000..0c7812e88c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.w.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.unclosed-expected.html"> +<title>Canvas test: 2d.layer.unclosed</title> +<h1>2d.layer.unclosed</h1> +<p class="desc">Check that layers are rendered even if not closed.</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py b/tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py index e923a0777ba..bf5fdeee506 100644 --- a/tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py +++ b/tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py @@ -170,9 +170,18 @@ def _get_test_sub_dir(name: str, name_to_sub_dir: Mapping[str, str]) -> str: 'Test "%s" has no defined target directory mapping' % name) +def _remove_extra_newlines(text: str) -> str: + """Remove newlines if a backslash is found at end of line.""" + # Lines ending with '\' gets their newline character removed. + text = re.sub(r'\\\n', '', text, flags=re.MULTILINE | re.DOTALL) + + # Lines ending with '\-' gets their newline and any leading white spaces on + # the following line removed. + text = re.sub(r'\\-\n\s*', '', text, flags=re.MULTILINE | re.DOTALL) + return text + def _expand_test_code(code: str) -> str: - # Remove newlines if a backslash is found at end of line. - code = re.sub(r'\\\n\s*', '', code, flags=re.MULTILINE | re.DOTALL) + code = _remove_extra_newlines(code) # Unroll expressions with a cross-product-style parameter expansion. code = re.sub(r'@unroll ([^;]*;)', lambda m: _unroll(m.group(1)), code) @@ -287,29 +296,18 @@ def _write_reference_test(is_js_ref: bool, templates: Mapping[str, str], def _write_testharness_test(templates: Mapping[str, str], template_params: MutableMapping[str, str], - test_type: str, canvas_path: Optional[str], offscreen_path: Optional[str]): # Create test cases for canvas and offscreencanvas. code = template_params['code'] template_params['code'] = textwrap.indent(code, ' ') if canvas_path: - template_name = 'element' - if test_type: - template_name += '-' + test_type - pathlib.Path(f'{canvas_path}.html').write_text( - templates[template_name] % template_params, 'utf-8') + templates['element'] % template_params, 'utf-8') if offscreen_path: - offscreen_template_name = 'offscreen' - worker_template_name = 'worker' - if test_type: - offscreen_template_name += '-' + test_type - worker_template_name += '-' + test_type - - offscreen_template = templates[offscreen_template_name] - worker_template = templates[worker_template_name] + offscreen_template = templates['offscreen'] + worker_template = templates['worker'] if ('then(t_pass, t_fail);' in code): offscreen_template = offscreen_template.replace('t.done();\n', '') @@ -321,6 +319,54 @@ def _write_testharness_test(templates: Mapping[str, str], worker_template % template_params, 'utf-8') +def _expand_template(template: str, template_params: Mapping[str, str]) -> str: + # Remove whole line comments. + template = re.sub(r'^ *#.*?\n', '', template, flags=re.MULTILINE) + # Remove trailing line comments. + template = re.sub(r' *#.*?$', '', template, flags=re.MULTILINE) + + # Unwrap lines ending with a backslash. + template = _remove_extra_newlines(template) + + content_without_nested_if = r'((?:(?!{%\s*(?:if|else|endif)[^%]*%}).)*?)' + + # Resolve {% if <cond> %}<content>{% else %}<alternate content>{% endif %} + if_else_regex = re.compile( + r'{%\s*if\s*([^\s%]+)\s*%}' + # {% if <cond> %} + content_without_nested_if + # content + r'{%\s*else\s*%}' + # {% else %} + content_without_nested_if + # alternate + r'{%\s*endif\s*%}', # {% endif %} + flags=re.MULTILINE | re.DOTALL) + while match := if_else_regex.search(template): + condition, content, alternate = match.groups() + substitution = content if template_params[condition] else alternate + template = ( + template[:match.start(0)] + substitution + template[match.end(0):]) + + # Resolve {% if <cond> %}<content>{% endif %} + if_regex = re.compile( + r'{%\s*if\s*([^\s%]+)\s*%}' + # {% if <cond> %} + content_without_nested_if + # content + r'{%\s*endif\s*%}', # {% endif %} + flags=re.MULTILINE | re.DOTALL) + while match := if_regex.search(template): + condition, content = match.groups() + substitution = content if template_params[condition] else '' + template = ( + template[:match.start(0)] + substitution + template[match.end(0):]) + + return template + + +def _expand_templates(templates: Mapping[str, str], + params: Mapping[str, str]) -> Mapping[str, str]: + return { + name: _expand_template(template, params) + for name, template in templates.items() + } + + def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str], sub_dir: str, html_canvas_cfg: TestConfig, offscreen_canvas_cfg: TestConfig) -> None: @@ -373,10 +419,10 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str], notes = '<p class="notes">%s' % test['notes'] if 'notes' in test else '' - links = f'\n<link rel="match" href="{name}-expected.html">' - fuzzy = ('\n<meta name=fuzzy content="%s">' % + links = f'<link rel="match" href="{name}-expected.html">\n' + fuzzy = ('<meta name=fuzzy content="%s">\n' % test['fuzzy'] if 'fuzzy' in test else '') - timeout = ('\n<meta name="timeout" content="%s">' % + timeout = ('<meta name="timeout" content="%s">\n' % test['timeout'] if 'timeout' in test else '') timeout_js = ('// META: timeout=%s\n' % test['timeout'] if 'timeout' in test else '') @@ -420,6 +466,16 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str], else: context_args = "'2d'" + is_promise_test = False + if 'test_type' in test: + if test['test_type'] == 'promise': + is_promise_test = True + else: + raise InvalidTestDefinitionError( + f'Test {name}\' test_type is invalid, it only accepts ' + '"promise" now for creating promise test type in the template ' + 'file.') + template_params = { 'name': name, 'desc': desc, @@ -439,7 +495,8 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str], 'code': code_canvas, 'fallback': fallback, 'attributes': attributes, - 'context_args': context_args + 'context_args': context_args, + 'promise_test': is_promise_test } canvas_path = os.path.join(html_canvas_cfg.out_dir, sub_dir, name) @@ -455,18 +512,7 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str], f'Test {name} is invalid, "reference" and "html_reference" can\'t ' 'both be specified at the same time.') - test_type = '' - if 'test_type' in test: - test_type = test['test_type'] - if test_type != 'promise': - raise InvalidTestDefinitionError( - f'Test {name}\' test_type is invalid, it only accepts ' - '"promise" now for creating promise test type in the template ' - 'file.') - if js_reference is not None or html_reference is not None: - raise InvalidTestDefinitionError( - f'Test {name}: promise test type cannot be used together with ' - 'html_reference or js_reference.') + templates = _expand_templates(templates, template_params) ref_code = js_reference or html_reference if ref_code is not None: @@ -476,7 +522,7 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str], offscreen_path if offscreen_canvas_cfg.enabled else None) else: _write_testharness_test( - templates, template_params, test_type, + templates, template_params, canvas_path if html_canvas_cfg.enabled else None, offscreen_path if offscreen_canvas_cfg.enabled else None) diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml index 0940471dd4d..7d8ebfccf56 100644 --- a/tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml +++ b/tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml @@ -1,7 +1,8 @@ offscreen: | <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - <title>OffscreenCanvas test: %(name)s</title>%(timeout)s + <title>OffscreenCanvas test: %(name)s</title> + %(timeout)s\ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> @@ -10,48 +11,40 @@ offscreen: | <p class="desc">%(desc)s</p> %(notes)s - <script> + <script>\ + + ## Promise vs. async test header: + {% if promise_test %}\ + promise_test(async t => { + {% else %}\ var t = async_test("%(escaped_desc)s"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; }); t.step(function() { + {% endif %}\ + ## Test body: var canvas = new OffscreenCanvas(%(width)s, %(height)s); var ctx = canvas.getContext(%(context_args)s); - %(code)s - t.done(); - - }); - </script> - -offscreen-promise: | - <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - <title>OffscreenCanvas test: %(name)s</title>%(timeout)s - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/html/canvas/resources/canvas-tests.js"></script> - - <h1>%(name)s</h1> - <p class="desc">%(desc)s</p> + %(code)s\ - %(notes)s - <script> - promise_test(async t => { - - var canvas = new OffscreenCanvas(%(width)s, %(height)s); - var ctx = canvas.getContext(%(context_args)s); - - %(code)s + ## Promise vs. async test footer: + {% if promise_test %}\ }, "%(desc)s"); + {% else %}\ + t.done(); + + }); + {% endif %}\ </script> worker: | - %(timeout_js)s// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. + %(timeout_js)s\ + // DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. // OffscreenCanvas test in a worker:%(name)s // Description:%(desc)s // Note:%(notes)s @@ -59,39 +52,31 @@ worker: | importScripts("/resources/testharness.js"); importScripts("/html/canvas/resources/canvas-tests.js"); + ## Promise vs. async test header: + {% if promise_test %}\ + promise_test(async t => { + {% else %}\ var t = async_test("%(escaped_desc)s"); var t_pass = t.done.bind(t); var t_fail = t.step_func(function(reason) { throw reason; }); t.step(function() { + {% endif %}\ + ## Test body: var canvas = new OffscreenCanvas(%(width)s, %(height)s); var ctx = canvas.getContext(%(context_args)s); %(code)s - t.done(); - }); - done(); - + t.done();\ -worker-promise: | - %(timeout_js)s// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. - // OffscreenCanvas test in a worker:%(name)s - // Description:%(desc)s - // Note:%(notes)s - - importScripts("/resources/testharness.js"); - importScripts("/html/canvas/resources/canvas-tests.js"); - - promise_test(async t => { - - var canvas = new OffscreenCanvas(%(width)s, %(height)s); - var ctx = canvas.getContext(%(context_args)s); - - %(code)s - t.done(); + ## Promise vs. async test footer: + {% if promise_test %}\ }, "%(desc)s"); + {% else %}\ + }); + {% endif %}\ done(); element: | @@ -102,81 +87,84 @@ element: | <script src="/resources/testharnessreport.js"></script> <script src="/html/canvas/resources/canvas-tests.js"></script> <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> - %(fonts)s<body class="show_output"> + %(fonts)s\ + <body class="show_output"> <h1>%(name)s</h1> <p class="desc">%(desc)s</p> %(notes)s - %(fonthack)s<p class="output">Actual output:</p> - <canvas id="c" class="output" width="%(width)s" height="%(height)s"%(canvas)s>%(fallback)s</canvas> + %(fonthack)s\ + <p class="output">Actual output:</p> + <canvas id="c" class="output" width="%(width)s" height="%(height)s"%(canvas)s>\- + %(fallback)s\ + </canvas> %(expected)s - <ul id="d"></ul> - <script> - var t = async_test("%(escaped_desc)s"); - _addTest(function(canvas, ctx) { - - %(code)s - - }%(attributes)s); - </script> - %(images)s - -element-promise: | - <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - <title>Canvas test: %(name)s</title> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/html/canvas/resources/canvas-tests.js"></script> - <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> - %(fonts)s<body class="show_output"> + <ul id="d"></ul>\ - <h1>%(name)s</h1> - <p class="desc">%(desc)s</p> + <script>\ - %(notes)s - %(fonthack)s<p class="output">Actual output:</p> - <canvas id="c" class="output" width="%(width)s" height="%(height)s"%(canvas)s>%(fallback)s</canvas> - %(expected)s - <ul id="d"></ul> - <script> + ## Promise vs. async test header: + {% if promise_test %}\ promise_test(async t => { var canvas = document.getElementById('c'); var ctx = canvas.getContext('2d'%(attributes)s); + {% else %}\ + var t = async_test("%(escaped_desc)s"); + _addTest(function(canvas, ctx) { + {% endif %}\ + ## Test body: %(code)s + ## Promise vs. async test footer: + {% if promise_test %}\ }, "%(desc)s"); + {% else %}\ + }%(attributes)s); + {% endif %}\ + \ </script> %(images)s offscreen_ref_test: |- <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->%(links)s%(fuzzy)s%(timeout)s + <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> + {% if promise_test %}\ + <html class="reftest-wait"> + {% endif %}\ + %(links)s\ + %(fuzzy)s\ + %(timeout)s\ <title>Canvas test: %(name)s</title> <h1>%(name)s</h1> <p class="desc">%(desc)s</p> %(fonts)s%(fonthack)s%(notes)s<canvas id="canvas" width="%(width)s" height="%(height)s"%(canvas)s> %(fallback)s </canvas> - <script> - const offscreen_canvas = new OffscreenCanvas(%(width)s, %(height)s); - const ctx = offscreen_canvas.getContext(%(context_args)s); + <script{% if promise_test %} type="module"{% endif %}> + const canvas = new OffscreenCanvas(%(width)s, %(height)s); + const ctx = canvas.getContext(%(context_args)s); %(code)s - const canvas = document.getElementById("canvas"); - canvas.getContext(%(context_args)s).drawImage(offscreen_canvas, 0, 0); + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext(%(context_args)s).drawImage(canvas, 0, 0); + {% if promise_test %}\ + document.documentElement.classList.remove("reftest-wait"); + {% endif %}\ </script> - %(images)s - + %(images)s\ + {% if promise_test %}</html>{% endif %} worker_ref_test: | <!DOCTYPE html> <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - <html class="reftest-wait">%(links)s%(fuzzy)s%(timeout)s + <html class="reftest-wait"> + %(links)s\ + %(fuzzy)s\ + %(timeout)s\ <title>Canvas test: %(name)s</title> <h1>%(name)s</h1> <p class="desc">%(desc)s</p> @@ -184,13 +172,13 @@ worker_ref_test: | %(fallback)s </canvas> <script id='myWorker' type='text/worker'> - self.onmessage = function(e) { - const oc = new OffscreenCanvas(%(width)s, %(height)s); - const ctx = oc.getContext('2d'); + self.onmessage = {% if promise_test %}async {% endif %}function(e) { + const canvas = new OffscreenCanvas(%(width)s, %(height)s); + const ctx = canvas.getContext('2d'); %(code)s - const bitmap = oc.transferToImageBitmap(); + const bitmap = canvas.transferToImageBitmap(); self.postMessage(bitmap, bitmap); }; </script> @@ -204,30 +192,43 @@ worker_ref_test: | }); worker.postMessage(null); </script> - %(images)s</html> - + %(images)s\ + </html> element_ref_test: |- <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->%(links)s%(fuzzy)s%(timeout)s + <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> + {% if promise_test %}\ + <html class="reftest-wait"> + {% endif %}\ + %(links)s\ + %(fuzzy)s\ + %(timeout)s\ <title>Canvas test: %(name)s</title> <h1>%(name)s</h1> <p class="desc">%(desc)s</p> %(fonts)s%(fonthack)s%(notes)s<canvas id="canvas" width="%(width)s" height="%(height)s"%(canvas)s> %(fallback)s </canvas> - <script> + <script{% if promise_test %} type="module"{% endif %}> const canvas = document.getElementById("canvas"); const ctx = canvas.getContext(%(context_args)s); %(code)s + {% if promise_test %}\ + document.documentElement.classList.remove("reftest-wait"); + {% endif %}\ </script> - %(images)s + %(images)s\ + {% if promise_test %}</html>{% endif %} html_ref_test: |- <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->%(links)s%(fuzzy)s%(timeout)s + <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> + %(links)s\ + %(fuzzy)s\ + %(timeout)s\ <title>Canvas test: %(name)s</title> <h1>%(name)s</h1> <p class="desc">%(desc)s</p> diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml index 292dfcc0ec7..dd84f913f9b 100644 --- a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml +++ b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml @@ -500,34 +500,34 @@ - name: 2d.filter.canvasFilterObject.dropShadow.exceptions.tentative desc: Test exceptions on CanvasFilter() dropShadow object code: | - @unroll @assert new CanvasFilter({\ - filter: 'dropShadow', \ - <dx | dy | floodOpacity>: \ + @unroll @assert new CanvasFilter({\- + filter: 'dropShadow', \- + <dx | dy | floodOpacity>: \- <10 | -1 | 0.5 | null | true | false | [] | [20] | '30'>}); - @unroll @assert new CanvasFilter({\ - filter: 'dropShadow', \ - <stdDeviation>: \ - <10 | -1 | 0.5 | null | true | false | [] | [20] | '30' | \ - [10, -1] | [0.5, null] | [true, false] | [[], [20]] | \ + @unroll @assert new CanvasFilter({\- + filter: 'dropShadow', \- + <stdDeviation>: \- + <10 | -1 | 0.5 | null | true | false | [] | [20] | '30' | \- + [10, -1] | [0.5, null] | [true, false] | [[], [20]] | \- ['30', ['40']]>}); - @unroll @assert new CanvasFilter({\ - filter: 'dropShadow', \ - <floodColor>: \ + @unroll @assert new CanvasFilter({\- + filter: 'dropShadow', \- + <floodColor>: \- <'red' | 'canvas' | 'rgba(4, -3, 0.5, 1)' | '#aabbccdd' | '#abcd'>}); - @unroll @assert throws TypeError new CanvasFilter({\ - filter: 'dropShadow', \ - <dx | dy | floodOpacity>: \ + @unroll @assert throws TypeError new CanvasFilter({\- + filter: 'dropShadow', \- + <dx | dy | floodOpacity>: \- <NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2]>}); - @unroll @assert throws TypeError new CanvasFilter({\ - filter: 'dropShadow', \ - <stdDeviation>: \ - <NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2, 3] | \ - [1, NaN] | [1, Infinity] | [1, -Infinity] | [1, undefined] | \ + @unroll @assert throws TypeError new CanvasFilter({\- + filter: 'dropShadow', \- + <stdDeviation>: \- + <NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2, 3] | \- + [1, NaN] | [1, Infinity] | [1, -Infinity] | [1, undefined] | \- [1, 'test'] | [1, {}] | [1, [2, 3]]>}); - @unroll @assert throws TypeError new CanvasFilter({\ - filter: 'dropShadow', \ - <floodColor>: \ + @unroll @assert throws TypeError new CanvasFilter({\- + filter: 'dropShadow', \- + <floodColor>: \- <'test' | 'rgba(NaN, 3, 2, 1)' | 10 | undefined | null | NaN>}); - name: 2d.filter.canvasFilterObject.turbulence.inputTypes.tentative diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml index d398ef2b5a2..fe1902c61b7 100644 --- a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml +++ b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml @@ -247,6 +247,146 @@ ctx.fillRect(70, 70, 75, 50); +- name: 2d.layer.unclosed + desc: Check that layers are rendered even if not closed. + size: 200, 200 + code: | + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + reference: | + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + +- name: 2d.layer.render-opportunities + desc: Check that layers state stack is flushed and rebuilt on frame renders. + size: 200, 200 + code: | + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack: + %(flush_canvas)s + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + reference: | + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'purple'; + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + ctx.endLayer(); + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + variants: + convertToBlob: + test_type: "promise" + canvasType: ['OffscreenCanvas'] + flush_canvas: |- + await canvas.convertToBlob(); + createImageBitmap: + flush_canvas: createImageBitmap(canvas); + drawImage: + flush_canvas: |- + const canvas2 = new OffscreenCanvas(200, 200); + const ctx2 = canvas2.getContext('2d'); + ctx2.drawImage(canvas, 0, 0); + getImageData: + flush_canvas: ctx.getImageData(0, 0, 200, 200); + requestAnimationFrame: + canvasType: ['HTMLCanvas'] + test_type: "promise" + flush_canvas: |- + await new Promise(resolve => requestAnimationFrame(resolve)); + putImageData: + flush_canvas: |- + const canvas2 = new OffscreenCanvas(200, 200); + const ctx2 = canvas2.getContext('2d'); + ctx.putImageData(ctx2.getImageData(0, 0, 1, 1), 0, 0); + toBlob: + test_type: "promise" + canvasType: ['HTMLCanvas'] + flush_canvas: |- + await new Promise(resolve => canvas.toBlob(resolve)); + toDataURL: + canvasType: ['HTMLCanvas'] + flush_canvas: canvas.toDataURL(); + + +- name: 2d.layer.render-opportunities.transferToImageBitmap + desc: Checks that transferToImageBitmap flushes and rebuilds the state stack. + size: 200, 200 + canvasType: ['OffscreenCanvas'] + code: | + ctx.fillStyle = 'purple'; + ctx.fillRect(60, 60, 75, 50); + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillRect(40, 40, 75, 50); + ctx.fillStyle = 'grey'; + ctx.fillRect(50, 50, 75, 50); + + // Force a flush and restoration of the state stack. + // `transferToImageBitmap` clears the frame but preserves render states. + canvas.transferToImageBitmap(); + + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + reference: | + ctx.fillStyle = 'purple'; + ctx.globalAlpha = 0.5; + + ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2}); + ctx.fillStyle = 'grey'; + ctx.fillRect(70, 70, 75, 50); + ctx.fillStyle = 'orange'; + ctx.fillRect(80, 80, 75, 50); + ctx.endLayer(); + + ctx.fillRect(80, 40, 75, 50); + + - name: 2d.layer.several-complex desc: >- Test to ensure beginlayer works for filter, alpha and shadow, even with diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js index a18688caf78..f788cbd1ebd 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js @@ -166,8 +166,8 @@ function iframe_test(description, iframe_origin, popup_origin, headers, await evaluate(popup_token, 'opener != null'), "true", 'Popup has an opener?'); assert_equals( - await evaluate(popup_token, `name === '${popup_token}'`), "true", - 'Popup has a name?'); + await evaluate(popup_token, `name === ''`), "true", + 'Popup name is cleared?'); // When the popup was created using window.open, we've kept a handle // and we can do extra verifications. @@ -194,8 +194,8 @@ function iframe_test(description, iframe_origin, popup_origin, headers, assert_equals(await evaluate(popup_token, 'opener != null'), "false", 'Popup has an opener?'); assert_equals( - await evaluate(popup_token, `name === '${popup_token}'`), "false", - 'Popup has a name?'); + await evaluate(popup_token, `name === ''`), "true", + 'Popup name is cleared?'); // When the popup was created using window.open, we've kept a handle // and we can do extra verifications. @@ -213,8 +213,8 @@ function iframe_test(description, iframe_origin, popup_origin, headers, assert_equals(await evaluate(popup_token, 'opener != null'), "false", 'Popup has an opener?'); assert_equals( - await evaluate(popup_token, `name === '${popup_token}'`), "false", - 'Popup has a name?'); + await evaluate(popup_token, `name === ''`), "true", + 'Popup name is cleared?'); // When the popup was created using window.open, we've kept a handle // and we can do extra verifications. diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html index 4c8e96f5793..5bc718e2a89 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html @@ -10,15 +10,8 @@ <script> testAccessProperty( - "postMessage single arg", - w => w.postMessage(""), - expectReport = false, - use_restrict_properties = true -); - -testAccessProperty( - "postMessage double arg", - w => w.postMessage("", ""), + "postMessage", + w => w.postMessage("message", "*"), expectReport = false, use_restrict_properties = true ); diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html new file mode 100644 index 00000000000..9bc171a269c --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html @@ -0,0 +1,62 @@ +<!doctype html> +<title> + Verify that we consider browsing context group reuse for COOP reporting. +</title> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script> +<script src="/html/cross-origin-opener-policy/resources/common.js"></script> +<script + src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=f1e361ab5854f2dcfe0224b19bc53199&report_only_id=b6fe666b74547291d52d72790adde05c"></script> +<script> + +const same_origin = get_host_info().HTTPS_ORIGIN; +const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN; + +promise_test(async test => { + // To receive reports use the same hard-coded value as the one passed in the + // headers and to "reporting-common.js". + const report_token = "b6fe666b74547291d52d72790adde05c"; + const reportTo = reportToHeaders(report_token); + + // 1. Open a popup without any COOP. It should be in a + // different virtual browsing context group. + const opener_token = token(); // For this window. + const initial_openee_token = token(); + const initial_openee_url = cross_origin + executor_path + + `&uuid=${initial_openee_token}`; + let openee = window.open(initial_openee_url); + + // 2. Navigate the openee to a COOP-RO: restrict-properties page. If the + // policy was enforced, it would live in the same browsing context group as + // this page. The virtual browsing context group should similarly be equal. + // Note: We omit the reporting endpoint header, because it is not possible to + // easily escape it. Since it is not necessary in this test, we skip it. + const final_openee_token = token(); + const final_openee_url = same_origin + executor_path + + reportTo.coopReportOnlyRestrictPropertiesHeader + + `&uuid=${final_openee_token}`; + + send(initial_openee_token, `location.href = '${final_openee_url}';`); + test.add_cleanup(() => send(final_openee_token, "window.close()")); + + // Wait for the final openee to load. + send(final_openee_token, + `send("${opener_token}", "Ready"); + `); + assert_equals(await receive(opener_token), "Ready"); + + // 3. Try to access the openee from the opener. No report should be sent. + tryAccess(openee); + + let report = + await receiveReport(report_token, "access-from-coop-page-to-openee") + assert_equals(report, "timeout"); + +}, "access-reporting-browsing-context-group-reuse"); + +</script> diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers new file mode 100644 index 00000000000..33abadd83dd --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers @@ -0,0 +1,2 @@ +Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint" +Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=f1e361ab5854f2dcfe0224b19bc53199", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=b6fe666b74547291d52d72790adde05c" diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html index 60322bffe7a..b1da8cf77ce 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html @@ -8,7 +8,7 @@ <script src="/common/dispatcher/dispatcher.js"></script> <script src="/html/cross-origin-opener-policy/resources/common.js"></script> <script - src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=4f545c5dbcce012cd30af173b08dcdfb&report_only_id=c265b07fbb3bffa2cd2a5179d686ced2"></script> + src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=fb054dadb3a9ec17b5cd5c0152d2a7dd&report_only_id=c265b07fbb3bffa2cd2a5179d686ced2"></script> <script> diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers index 424ad3e8de0..07ecad96f24 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers @@ -1,2 +1,2 @@ Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint" -Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=4f545c5dbcce012cd30af173b08dcdfb", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c265b07fbb3bffa2cd2a5179d686ced2" +Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fb054dadb3a9ec17b5cd5c0152d2a7dd", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c265b07fbb3bffa2cd2a5179d686ced2" diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html index 5deb115d94e..a8c11d7a4a8 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html @@ -8,7 +8,7 @@ <script src="/common/dispatcher/dispatcher.js"></script> <script src="/html/cross-origin-opener-policy/resources/common.js"></script> <script - src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=c265b07fbb3bffa2cd2a5179d686ced2&report_only_id=b4ea2bc3c537541b4fd408dc8f2b5c39"></script> + src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=ed5a8be35e4e21c2ba960e6574e0a32c&report_only_id=fa22ddc676642edae42c75defb82ba2e"></script> <script> diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers index 6339ea34c70..a61e2919c8a 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers @@ -1,2 +1,2 @@ Cross-Origin-Opener-Policy: restrict-properties; report-to="coop-report-endpoint" -Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=d9fe7e0e1a72f4ff2c4ea6d9dd44b5f1", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=b4ea2bc3c537541b4fd408dc8f2b5c39" +Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=ed5a8be35e4e21c2ba960e6574e0a32c", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fa22ddc676642edae42c75defb82ba2e" diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html index cf1385e7663..eb808428634 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html @@ -55,7 +55,7 @@ let tests = [ "body": { "disposition": "reporting", "effectivePolicy": "restrict-properties", - "previousResponseURL": `${location.href}`, + "previousResponseURL": "", "referrer": `${location.origin}/`, "type": "navigation-to-response" }, diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html index 9ff374c1c78..ad57afccf8f 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html +++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html @@ -55,7 +55,7 @@ let tests = [ "body": { "disposition": "enforce", "effectivePolicy": "restrict-properties", - "previousResponseURL": `${location.href}`, + "previousResponseURL": "", "referrer": `${location.origin}/`, "type": "navigation-to-response" }, diff --git a/tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html b/tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html index 3319c1875bf..082ed281fef 100644 --- a/tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html +++ b/tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html @@ -26,7 +26,20 @@ "iframe", "img", "input", "map", "meta", "object", "output", "param", "select", "slot", "textarea", ]; + + // Optionally add "details" to reflectingTagNames since Chromium is + // prototyping the proposal at + // https://open-ui.org/components/accordion.explainer that adds this + // reflection to "details" as well. + // TODO(https://crbug.com/1444057): This runtime check should eventually be + // removed, and depending on the outcome of the proposal details should + // possibly be added to reflectingTagNames unconditionally. + if ("name" in HTMLDetailsElement.prototype) { + reflectingTagNames.push("details"); + } + const old_and_new_elements = [...HTML5_ELEMENTS, ...HTML5_DEPRECATED_ELEMENTS]; + const nonReflectingTagNames = old_and_new_elements.filter(x => !reflectingTagNames.includes(x)); reflectingTagNames.forEach(function(tagName) { diff --git a/tests/wpt/web-platform-tests/html/dom/idlharness.https.html b/tests/wpt/web-platform-tests/html/dom/idlharness.https.html index 4e9e25fd5df..7d693d3c0a2 100644 --- a/tests/wpt/web-platform-tests/html/dom/idlharness.https.html +++ b/tests/wpt/web-platform-tests/html/dom/idlharness.https.html @@ -38,7 +38,7 @@ const waitForLoad = new Promise(resolve => { addEventListener('load', resolve); idl_test( ['html'], - ['wai-aria', 'SVG', 'cssom', 'touch-events', 'uievents', 'dom', 'xhr', 'FileAPI', 'mediacapture-streams'], + ['wai-aria', 'SVG', 'cssom', 'touch-events', 'uievents', 'dom', 'xhr', 'FileAPI', 'mediacapture-streams', 'performance-timeline'], async idlArray => { self.documentWithHandlers = new Document(); const handler = function(e) {}; diff --git a/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js b/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js index 16f6e85ce7c..88942ddfea1 100644 --- a/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js +++ b/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js @@ -5,7 +5,7 @@ importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js"); idl_test( ["html"], - ["wai-aria", "dom", "cssom", "touch-events", "uievents"], + ["wai-aria", "dom", "cssom", "touch-events", "uievents", "performance-timeline"], idlArray => { idlArray.add_untested_idls('typedef Window WindowProxy;'); idlArray.add_objects({ diff --git a/tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html b/tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html index 8ff5843c866..55619661acc 100644 --- a/tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html +++ b/tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html @@ -20,25 +20,19 @@ setup({explicit_done: true}); setup({explicit_timeout: true}); promise_test(async t => { - let button = document.querySelector("button"); - let focused = false; - - on_event(button, "focus", () => { - focused = !focused; - }); - - on_event(button, "click", () => { - test(() => { - assert_true(focused, "Focus on the button by Tab key"); - }, "Check if click event will be fired when press the 'enter' key while the element is focused"); - done(); - }); - - const altKey = '\uE004'; - const enterKey = '\uE007'; - await test_driver.send_keys(button, altKey); - await test_driver.send_keys(button, enterKey); - + const button = document.querySelector("button"); + on_event(button, "click", () => { + test(() => { + assert_true(document.activeElement == button, "Focus on the button by Tab key"); + }, "Check if click event will be fired when press the 'enter' key while the element is focused"); + done(); + }); + + window.focus(); + document.activeElement?.blur(); + getSelection().collapse(document.querySelector("p"), 0); + const enterKey = '\uE007'; + await test_driver.send_keys(button, enterKey); }); </script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html index 9d1c9eb77e9..cbdbb72c674 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html @@ -5,32 +5,19 @@ <link rel=help href="https://html.spec.whatwg.org/multipage/#submitting-element-directionality:-the-dirname-attribute"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="resources/dirname.js"></script> <div id="log"></div> -<form action="dirname-ltr-iframe.html" method=get target="iframe"> +<form action="resources/dirname-iframe.html" method=get target="iframe"> <p><label>Comment: <input type=text name="comment" dirname="comment.dir" required></label></p> <p><button type=submit>Post Comment</button></p> </form> <iframe name="iframe"></iframe> <script> - function getParameterByName(name) { - name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); - var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), - results = regex.exec(document.querySelector("iframe").contentWindow.location.search); - return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); - } - var t = async_test("submit element directionality"); document.querySelector("input").value = "foobar"; document.querySelector("button").click(); - var iframe = document.querySelector("iframe"); - iframe.onload = t.step_func(function() { - // The initial about:blank load event can be fired before the form navigation occurs. - // See https://github.com/whatwg/html/issues/490 for more information. - if(iframe.contentWindow.location.href == "about:blank") { return; } - - assert_equals(getParameterByName("comment.dir"), "ltr"); - - t.done(); + onIframeLoadedDone(t, function(params) { + assert_equals(params.get("comment.dir"), "ltr"); }); </script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-only-if-applies.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-only-if-applies.html new file mode 100644 index 00000000000..7d542111896 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-only-if-applies.html @@ -0,0 +1,75 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset=utf-8> + <title>Submitting element directionality: the dirname attribute</title> + <link rel="author" title="Vincent Hilla" href="mailto:vhilla@mozilla.com"> + <link rel=help href="https://html.spec.whatwg.org/multipage/#submitting-element-directionality:-the-dirname-attribute"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="resources/dirname.js"></script> + </head> + <body> + <div id="log"></div> + <form action="resources/dirname-iframe.html" method=get target="iframe"> + <textarea name="textarea" dirname="textarea.dir"></textarea> + <p><button id="btn-submit" type=submit>Submit</button></p> + </form> + <iframe name="iframe"></iframe> + + <script> + const types_applies = ["text", "search"]; + const types_not = [ + "hidden", "tel", "url", "email", "password", "date", "month", "week", "time", + "datetime-local", "number", "range", "color", "checkbox", "radio", "file", "submit", + "image", "reset", "button" + ]; + const types = [...types_applies, ...types_not]; + let form = document.querySelector("form"); + for (const type of types) { + let p = document.createElement("p"); + let lbl = document.createElement("label"); + let txt = document.createTextNode(type + ": "); + let inp = document.createElement("input"); + inp.type = type; + inp.name = type; + inp.dirName = type + ".dir"; + inp.id = "testelement." + type + lbl.appendChild(txt); + lbl.appendChild(inp); + p.appendChild(lbl); + form.appendChild(p); + } + // Avoid continue in https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#constructing-form-data-set:attr-fe-dirname + document.getElementById("testelement.checkbox").checked = true; + document.getElementById("testelement.radio").checked = true; + + function assertInputSubmission(data) { + for (const type of types_applies) { + assert_equals(data.get(type + ".dir"), "ltr", "Submit ltr for input type=" + type); + } + for (const type of types_not) { + assert_false(data.has(type + ".dir"), "Do not submit dir for input type=" + type); + } + } + + const data = new FormData(form); + test(function() { + assertInputSubmission(data); + }, "Submit input element directionality to FormData, if dirname applies."); + test(function() { + assert_equals(data.get("textarea.dir"), "ltr", "Submit ltr for textarea"); + }, "Submit textarea element directionality to FormData."); + + document.getElementById("btn-submit").click(); + const t_inp = async_test("Submit input element directionality, if dirname applies."); + onIframeLoadedDone(t_inp, function(params) { + assertInputSubmission(params); + }); + const t_ta = async_test("Submit textarea element directionality."); + onIframeLoadedDone(t_ta, function(params) { + assert_equals(params.get("textarea.dir"), "ltr", "Submit ltr for textarea"); + }); + </script> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html index 6368a26fafd..072b8508685 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html @@ -5,33 +5,20 @@ <link rel=help href="https://html.spec.whatwg.org/multipage/#submitting-element-directionality:-the-dirname-attribute"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="resources/dirname.js"></script> <div id="log"></div> -<form action="dirname-ltr-iframe.html" method=get target="iframe"> +<form action="resources/dirname-iframe.html" method=get target="iframe"> <p><label>Comment: <input type=text name="comment" dir="auto" dirname="comment.dir" required/></label></p> <p><button type=submit>Post Comment</button></p> </form> <iframe name="iframe"></iframe> <script> - function getParameterByName(name) { - name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); - var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), - results = regex.exec(document.querySelector("iframe").contentWindow.location.search); - return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); - } - var t = async_test("submit element directionality"); var rtlValue = "مرحبا"; document.querySelector("input").value = rtlValue; document.querySelector("button").click(); - var iframe = document.querySelector("iframe"); - iframe.onload = t.step_func(function() { - // The initial about:blank load event can be fired before the form navigation occurs. - // See https://github.com/whatwg/html/issues/490 for more information. - if(iframe.contentWindow.location.href == "about:blank") { return; } - - assert_equals(getParameterByName("comment.dir"), "rtl"); - - t.done(); + onIframeLoadedDone(t, function(params) { + assert_equals(params.get("comment.dir"), "rtl"); }); </script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html index 1e6967d914a..e7b07288d6b 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html @@ -5,34 +5,21 @@ <link rel=help href="https://html.spec.whatwg.org/multipage/#submitting-element-directionality:-the-dirname-attribute"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="resources/dirname.js"></script> <div id="log"></div> <div dir="rtl"> - <form action="dirname-ltr-iframe.html" method=get target="iframe"> + <form action="resources/dirname-iframe.html" method=get target="iframe"> <p><label>Comment: <input type=text name="comment" dirname="comment.dir" required/></label></p> <p><button type=submit>Post Comment</button></p> </form> </div> <iframe name="iframe"></iframe> <script> - function getParameterByName(name) { - name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); - var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), - results = regex.exec(document.querySelector("iframe").contentWindow.location.search); - return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); - } - var t = async_test("submit element directionality"); document.querySelector("input").value = "foobar"; document.querySelector("button").click(); - var iframe = document.querySelector("iframe"); - iframe.onload = t.step_func(function() { - // The initial about:blank load event can be fired before the form navigation occurs. - // See https://github.com/whatwg/html/issues/490 for more information. - if(iframe.contentWindow.location.href == "about:blank") { return; } - - assert_equals(getParameterByName("comment.dir"), "rtl"); - - t.done(); + onIframeLoadedDone(t, function(params) { + assert_equals(params.get("comment.dir"), "rtl"); }); </script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr-iframe.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname-iframe.html index b5ed7e3d9a7..b5ed7e3d9a7 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr-iframe.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname-iframe.html diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname.js b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname.js new file mode 100644 index 00000000000..f0e97bc3014 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname.js @@ -0,0 +1,12 @@ +function onIframeLoadedDone(t, cb, selector="iframe") { + const iframe = document.querySelector(selector); + iframe.addEventListener("load", function() { + // The initial about:blank load event can be fired before the form navigation occurs. + // See https://github.com/whatwg/html/issues/490 for more information. + if(iframe.contentWindow.location.href == "about:blank") { return; } + + const params = new URLSearchParams(iframe.contentWindow.location.search); + t.step(() => cb(params)) + t.done(); + }); +} diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html new file mode 100644 index 00000000000..b4028784edd --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html @@ -0,0 +1,142 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#form-submission-algorithm"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/targetted-form.js"></script> + +<!-- The onclick requestSubmit() should get superseded by the default + action submit, which isn't preventDefaulted by onclick here. + This is per the Form Submission Algorithm [1], which + says that new planned navigations replace old planned navigations. + [1] https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#planned-navigation + --> + +<body> + <script> + function runTest({ submitterType, preventDefaultSubmitButton, preventDefaultRequestSubmit, passSubmitter, testName }) { + if (preventDefaultRequestSubmit && preventDefaultSubmitButton) { + // In this case, no submit action will take place. + return; + } + + promise_test(async () => { + const form = populateForm(`<input name=n1 value=v1><${submitterType} type=submit name=n2 value=v2>${submitterType == 'button' ? '</button>' : ''}`); + const input = form.elements[0]; + const submitter = form.elements[1]; + submitter.addEventListener('click', e => { + form.addEventListener('submit', e => { + submitter.value = 'v3'; + if (preventDefaultRequestSubmit) { + e.preventDefault(); + } + }, { once: true }); + + form.requestSubmit(passSubmitter ? submitter : null); + input.value = 'v2'; + + form.addEventListener('submit', e => { + submitter.value = 'v4'; + if (preventDefaultSubmitButton) { + e.preventDefault(); + } + }, { once: true }); + }); + + let formDataInEvent; + form.addEventListener('formdata', e => { + formDataInEvent = e.formData; + }); + + submitter.click(); + assert_equals(formDataInEvent.get('n1'), preventDefaultSubmitButton ? 'v1' : 'v2'); + if (preventDefaultSubmitButton && !passSubmitter) { + assert_false(formDataInEvent.has('n2')); + } else { + assert_equals(formDataInEvent.get('n2'), + preventDefaultSubmitButton && passSubmitter ? 'v3' : 'v4') + } + + let iframe = form.previousSibling; + await loadPromise(iframe); + assert_equals(getParamValue(iframe, 'n1'), preventDefaultSubmitButton ? 'v1' : 'v2'); + if (preventDefaultSubmitButton && !passSubmitter) { + assert_equals(getParamValue(iframe, 'n2'), null); + } else { + assert_equals(getParamValue(iframe, 'n2'), + preventDefaultSubmitButton && passSubmitter ? 'v3' : 'v4'); + } + }, testName); + } + + function runTest2({ submitterType, callRequestSubmit, callSubmit, preventDefault, passSubmitter, testName }) { + if (!callSubmit && preventDefault) { + // Without callSubmit, preventDefault will cause the form to not get + // submitted. + return; + } + + promise_test(async () => { + const form = populateForm(`<input name=n1 value=v1><${submitterType} type=submit name=n2 value=v3>${submitterType == 'button' ? '</button>' : ''}`); + const input = form.elements[0]; + const submitter = form.elements[1]; + + form.addEventListener('submit', e => { + if (callRequestSubmit) { + form.requestSubmit(passSubmitter ? submitter : null); + input.value = 'v2'; + } + if (callSubmit) { + form.submit(); + } + if (preventDefault) { + e.preventDefault(); + } + }); + + form.requestSubmit(passSubmitter ? submitter : null); + let iframe = form.previousSibling; + await loadPromise(iframe); + + assert_equals(getParamValue(iframe, 'n1'), callRequestSubmit ? 'v2' : 'v1'); + if (callSubmit || !passSubmitter) { + assert_equals(getParamValue(iframe, 'n2'), null); + } else { + assert_equals(getParamValue(iframe, 'n2'), 'v3') + } + }, testName); + } + + function callWithArgs(test, argsLeft, args) { + if (argsLeft.length == 0) { + args.testName = 'test ' + test.name + ' with ' + Object.entries(args).map(([key, value]) => `${key}: ${value}`).join(', '); + test(args); + return; + } + + let [name, values] = argsLeft[0]; + for (let value of values) { + callWithArgs(test, argsLeft.slice(1), { ...args, [name]: value }) + } + } + + let args = { + submitterType: ['input', 'button'], + preventDefaultRequestSubmit: [true, false], + preventDefaultSubmitButton: [true, false], + passSubmitter: [true, false], + }; + callWithArgs(runTest, Object.entries(args), {}); + + args = { + submitterType: ['input', 'button'], + callRequestSubmit: [true, false], + callSubmit: [true, false], + preventDefault: [true, false], + passSubmitter: [true, false], + }; + callWithArgs(runTest2, Object.entries(args), {}); + </script> +</body> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html index 854b1f48046..d1b46a22d86 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html @@ -6,7 +6,6 @@ <link rel=help href="https://html.spec.whatwg.org/multipage/#textFieldSelection"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/common/rendering-utils.js"></script> <div id="log"></div> <textarea>foobar</textarea> @@ -60,10 +59,25 @@ const actions = [ } ]; +function waitForEvents() { + // Engines differ in when these events are sent (see: + // https://bugzilla.mozilla.org/show_bug.cgi?id=1785615) so wait for both a + // frame to be rendered, and a timeout. + return new Promise(resolve => { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setTimeout(() => { + resolve(); + }); + }); + }); + }); +} + function initialize(el) { el.setRangeText("foobar", 0, el.value.length, "start"); // Make sure to flush async dispatches - return waitForAtLeastOneFrame(); + return waitForEvents(); } els.forEach((el) => { @@ -93,7 +107,7 @@ els.forEach((el) => { action.action(el); - await waitForAtLeastOneFrame(); + await waitForEvents(); el.onselect = null; }, `${elLabel}: ${action.label} a second time (must not fire select)`); @@ -104,7 +118,7 @@ els.forEach((el) => { action.action(element); - await waitForAtLeastOneFrame(); + await waitForEvents(); assert_true(fired, "event didn't fire"); }, `${elLabel}: ${action.label} disconnected node`); @@ -119,7 +133,7 @@ els.forEach((el) => { action.action(element); assert_false(fired, "the select event must not fire synchronously"); - await waitForAtLeastOneFrame(); + await waitForEvents(); assert_true(fired, "event didn't fire"); }, `${elLabel}: ${action.label} event queue`); @@ -132,7 +146,7 @@ els.forEach((el) => { action.action(element); action.action(element); - await waitForAtLeastOneFrame(); + await waitForEvents(); assert_equals(selectCount, 1, "the select event must not fire twice"); }, `${elLabel}: ${action.label} twice in disconnected node (must fire select only once)`); }); diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html new file mode 100644 index 00000000000..9aa5ce42e8e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html @@ -0,0 +1,197 @@ +<!DOCTYPE HTML> +<meta charset=UTF-8> +<title>Test for the name attribute creating exclusive accordions from details elements</title> +<link rel="author" title="L. David Baron" href="https://dbaron.org/"> +<link rel="author" title="Google" href="http://www.google.com/"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-details-element"> +<link rel="help" href="https://open-ui.org/components/accordion.explainer"> +<link rel="help" href="https://github.com/openui/open-ui/issues/725"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1444057"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="container"> +</div> + +<script> + +function assert_element_states(elements, expectations, description) { + assert_array_equals(elements.map(e => Number(e.open)), expectations, description); +} + +let container = document.getElementById("container"); + +promise_test(async t => { + container.innerHTML = ` + <details name="a"> + <summary>1</summary> + This is the first item. + </details> + + <details name="a"> + <summary>2</summary> + This is the second item. + </details> + `; + let first = container.firstElementChild; + let second = first.nextElementSibling; + assert_false(first.open); + assert_false(second.open); + first.open = true; + assert_true(first.open); + assert_false(second.open); + second.open = true; + assert_false(first.open); + assert_true(second.open); + second.open = true; + assert_false(first.open); + assert_true(second.open); + second.open = false; + assert_false(first.open); + assert_false(second.open); +}, "basic handling of mutually exclusive details"); + +promise_test(async t => { + container.innerHTML = ` + <details name="a" open> + <summary>1</summary> + This is the first item. + </details> + + <details name="a"> + <summary>2</summary> + This is the second item. + </details> + + <details name="a" open> + <summary>3</summary> + This is the third item. + </details> + `; + let first = container.firstElementChild; + let second = first.nextElementSibling; + let third = second.nextElementSibling; + function assert_states(expected_first, expected_second, expected_third, description) { + assert_array_equals([first.open, second.open, third.open], [expected_first, expected_second, expected_third], description); + } + + assert_states(true, false, true, "initial states from open attribute"); + first.open = true; + assert_states(true, false, true, "non-mutation doesn't change state"); + second.open = true; + assert_states(false, true, false, "mutation closes multiple open elements"); + third.setAttribute("open", ""); + assert_states(false, false, true, "setAttribute closes other open element"); +}, "more complex handling of mutually exclusive details"); + +promise_test(async t => { + let details_elements_string = ` + <details name="a"></details> + <details name="a" open></details> + <details name="b"></details> + <details name="b"></details> + `; + container.innerHTML = ` + ${details_elements_string} + <div id="shadow_host"></div> + `; + let shadow_root = document.getElementById("shadow_host").attachShadow({ mode: "open" }); + shadow_root.innerHTML = details_elements_string; + let elements = Array.from(container.querySelectorAll("details")).concat(Array.from(shadow_root.querySelectorAll("details"))); + + assert_element_states(elements, [0, 1, 0, 0, 0, 1, 0, 0], "initial states from open attribute"); + elements[4].open = true; + assert_element_states(elements, [0, 1, 0, 0, 1, 0, 0, 0], "after mutation in shadow tree"); + for (let i = 0; i < 8; ++i) { + elements[i].open = true; + } + assert_element_states(elements, [0, 1, 0, 1, 0, 1, 0, 1], "after setting all elements open"); + elements[0].open = true; + assert_element_states(elements, [1, 0, 0, 1, 0, 1, 0, 1], "after final mutation"); +}, "mutually exclusive details across multiple names and multiple tree scopes"); + +// The next two tests test characteristics of the design that are only +// exposed via mutation events. If mutation events (for attribute +// addition/removal) are removed from the web, these tests could be +// removed, and some small simplifications could be made to the code +// implementing this feature. +function mutation_events_for_attribute_removal_supported() { + container.innerHTML = `<div id="event-removal-test"></div>`; + let element = container.firstChild; + let event_fired = false; + element.addEventListener("DOMSubtreeModified", event => event_fired = true); + element.removeAttribute("id"); + return event_fired; +} + +promise_test(async t => { + if (!mutation_events_for_attribute_removal_supported()) { + return; + } + container.innerHTML = ` + <details name="a" id="e0" open></details> + <details name="a" id="e1"></details> + <details name="a" id="e3" open></details> + `; + let e2 = document.createElement("details"); + e2.id = "e2"; + e2.name = "a"; + e2.open = true; + let elements = [ document.getElementById("e0"), + document.getElementById("e1"), + e2, + document.getElementById("e3") ]; + container.insertBefore(e2, elements[3]); + + let received_ids = []; + let listener = event => { + assert_equals(event.type, "DOMSubtreeModified"); + assert_equals(event.target.nodeType, Node.ELEMENT_NODE); + let element = event.target; + assert_equals(element.localName, "details"); + received_ids.push(element.id); + }; + for (let element of elements) { + element.addEventListener("DOMSubtreeModified", listener); + } + assert_array_equals(received_ids, []); + assert_element_states(elements, [1, 0, 1, 1], "states before mutation"); + elements[1].open = true; + assert_array_equals(received_ids, ["e0", "e3", "e2", "e1"], + "removal events received in node insertion order, followed by addition event"); + assert_element_states(elements, [0, 1, 0, 0], "states after mutation"); +}, "mutation event order matches order of insertion in set of named elements"); + +promise_test(async t => { + if (!mutation_events_for_attribute_removal_supported()) { + return; + } + container.innerHTML = ` + <details name="a" id="e0" open></details> + <details name="a" id="e1"></details> + <details name="a" id="e2" open></details> + `; + let elements = [ document.getElementById("e0"), + document.getElementById("e1"), + document.getElementById("e2") ]; + + let received_ids = []; + let listener = event => { + received_ids.push(event.target.id); + let i = 0; + for (let element of elements) { + element.setAttribute("name", `b${i++}`); + } + }; + for (let element of elements) { + element.addEventListener("DOMSubtreeModified", listener); + } + assert_array_equals(received_ids, []); + assert_element_states(elements, [1, 0, 1], "states before mutation"); + elements[1].open = true; + assert_array_equals(received_ids, ["e0", "e2", "e1"], + "removal events received in node insertion order, followed by addition event, despite changes to name during mutation event"); + assert_element_states(elements, [0, 1, 0], "states after mutation"); +}, "interaction of open attribute changes with mutation events"); + +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html new file mode 100644 index 00000000000..efd242c5769 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://github.com/whatwg/html/issues/8904"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/declarative-shadow-dom-polyfill.js"></script> + +<button id=b1>button 1</button> +<button id=b2>button 2</button> +<div id=host> + <template shadowrootmode=open> + <button>button in shadowroot outside dialog</button> + </template> +</div> +<dialog id=mydialog> + <button id=b3>button in dialog</button> + <div id=dialoghost> + <template shadowrootmode=open> + <button>button in shadowroot in dialog</button> + </template> + </div> +</dialog> + +<div id=host2> + <template shadowrootmode=open> + <dialog> + <slot></slot> + </dialog> + </template> + <button id=host2button>button</button> +</div> + +<script> +polyfill_declarative_shadow_dom(document); + +test(() => { + b1.focus(); + mydialog.show(); + b2.focus(); + mydialog.close(); + assert_equals(document.activeElement, b2); +}, 'Focus should not be restored if the currently focused element is not inside the dialog.'); + +test(() => { + const shadowbutton = host.shadowRoot.querySelector('button'); + b2.focus(); + mydialog.show(); + shadowbutton.focus(); + mydialog.close(); + assert_equals(document.activeElement, host, 'document.activeElement should point at the shadow host.'); + assert_equals(host.shadowRoot.activeElement, shadowbutton, 'The button in the shadowroot should remain focused.'); +}, 'Focus restore should not occur when the focused element is in a shadowroot outside of the dialog.'); + +test(() => { + const shadowbutton = dialoghost.shadowRoot.querySelector('button'); + b2.focus(); + mydialog.show(); + shadowbutton.focus(); + mydialog.close(); + assert_equals(document.activeElement, b2); +}, 'Focus restore should occur when the focused element is in a shadowroot inside the dialog.'); + +test(() => { + const dialog = host2.shadowRoot.querySelector('dialog'); + b2.focus(); + dialog.show(); + host2button.focus(); + dialog.close(); + assert_equals(document.activeElement, b2); +}, 'Focus restore should occur when the focused element is slotted into a dialog.'); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html new file mode 100644 index 00000000000..c86cbe84a62 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://github.com/whatwg/html/pull/9142"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<dialog>hello</dialog> + +<script> +test(() => { + const dialog = document.querySelector('dialog'); + + // calling close() on a dialog that is already closed should not throw. + dialog.close(); + + dialog.show(); + // calling show() on a dialog that is already showing non-modal should not throw. + dialog.show(); + assert_throws_dom('InvalidStateError', () => dialog.showModal(), + 'Calling showModal() on a dialog that is already showing non-modal should throw.'); + dialog.close(); + + dialog.showModal(); + assert_throws_dom('InvalidStateError', () => dialog.show(), + 'Calling show() on a dialog that is already showing modal should throw.'); + // calling showModal() on a dialog that is already showing modal should not throw. + dialog.showModal(); +}); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html index eab61407c8b..32d3deb3848 100644 --- a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html @@ -254,11 +254,21 @@ window.onload = () => { },{once: true}); assert_true(popover.matches(':popover-open')); assert_true(other_popover.matches(':popover-open')); - assert_throws_dom('InvalidStateError', () => popover.hidePopover()); + popover.hidePopover(); // Calling hidePopover on a hidden popover should not throw. assert_false(other_popover.matches(':popover-open'),'unrelated popover is hidden'); assert_false(popover.matches(':popover-open'),'popover is still hidden if its type changed during hide event'); - assert_throws_dom("InvalidStateError",() => other_popover.hidePopover(),'Nested popover should already be hidden'); - },`Changing the popover type in a "beforetoggle" event handler should throw an exception (during hidePopover())`); + other_popover.hidePopover(); // Calling hidePopover on a hidden popover should not throw. + },`Changing the popover type in a "beforetoggle" event handler during hidePopover() should not throw an exception`); + + test(t => { + const popover = document.createElement('div'); + assert_throws_dom('NotSupportedError', () => popover.hidePopover(), + 'Calling hidePopover on an element without a popover attribute should throw.'); + popover.setAttribute('popover', 'auto'); + popover.hidePopover(); // Calling hidePopover on a disconnected popover should not throw. + assert_throws_dom('InvalidStateError', () => popover.showPopover(), + 'Calling showPopover on a disconnected popover should throw.'); + },'Calling hidePopover on a disconnected popover should not throw.'); function interpretedType(typeString,method) { if (validTypes.includes(typeString)) diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hide.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hide.tentative.html new file mode 100644 index 00000000000..57ca5723de5 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hide.tentative.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>The popover-hide-delay CSS property</title> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel=help href="https://open-ui.org/components/popover.research.explainer"> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/popover-utils.js"></script> + +<body> +<script src="resources/popover-hover-hide-common.js"></script> +<script> + +// See popover-hover-hide-common.js for documentation. +runHoverHideTestsForInvokerAction('hide'); + +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hover.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hover.tentative.html new file mode 100644 index 00000000000..d0036c0fe7b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hover.tentative.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>The popover-hide-delay CSS property</title> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel=help href="https://open-ui.org/components/popover.research.explainer"> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/popover-utils.js"></script> + +<body> +<script src="resources/popover-hover-hide-common.js"></script> +<script> + +// See popover-hover-hide-common.js for documentation. +runHoverHideTestsForInvokerAction('hover'); + +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-show.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-show.tentative.html new file mode 100644 index 00000000000..7b3fa2b3023 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-show.tentative.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>The popover-hide-delay CSS property</title> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel=help href="https://open-ui.org/components/popover.research.explainer"> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/popover-utils.js"></script> + +<body> +<script src="resources/popover-hover-hide-common.js"></script> +<script> + +// See popover-hover-hide-common.js for documentation. +runHoverHideTestsForInvokerAction('show'); + +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-toggle.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-toggle.tentative.html new file mode 100644 index 00000000000..d6d4079e7e0 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-toggle.tentative.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>The popover-hide-delay CSS property</title> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel=help href="https://open-ui.org/components/popover.research.explainer"> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/popover-utils.js"></script> + +<body> +<script src="resources/popover-hover-hide-common.js"></script> +<script> + +// See popover-hover-hide-common.js for documentation. +runHoverHideTestsForInvokerAction('toggle'); + +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide.tentative.html deleted file mode 100644 index ed647a7d7d8..00000000000 --- a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide.tentative.html +++ /dev/null @@ -1,129 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8" /> -<title>The popover-hide-delay CSS property</title> -<link rel="author" href="mailto:masonf@chromium.org"> -<link rel=help href="https://open-ui.org/components/popover.research.explainer"> -<meta name="timeout" content="long"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-actions.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="resources/popover-utils.js"></script> - -<style> - [popover] { - top:100px; - popover-hide-delay: 100ms; - } - [popovertargetaction=hover] { - top:200px; - popover-show-delay: 100ms; - } - #unrelated {top: 300px;} - div { - /* Fixed position everything to ensure nothing overlaps */ - position: fixed; - } -</style> -<div id=unrelated>Unrelated element</div> - -<div popover id=example1>Popover</div> -<button popovertarget=example1 popovertargetaction=hover id=invoker1>Hover me</button> - -<script> -const hoverDelays = 100; // This needs to match the style block above. -const hoverWaitTime = 200; // How long to wait to cover the delay for sure. - -// NOTE about testing methodology: -// This test checks whether popovers are hidden *after* the appropriate de-hover -// delay. The delay used for testing is kept low, to avoid this test taking too -// long, but that means that sometimes on a slow bot/client, the delay can -// elapse before we are able to check the popover status. And that can make this -// test flaky. To avoid that, the msSinceMouseOver() function is used to check -// that not-too-much time has passed, and if it has, the test is simply skipped. - -const unrelated = document.getElementById('unrelated'); - -function getComputedStyleTimeMs(element,property) { - // Times are in seconds, so just strip off the 's'. - return Number(getComputedStyle(element)[property].slice(0,-1))*1000; -} - -promise_test(async (t) => { - await mouseOver(unrelated); - const popover = document.getElementById('example1'); - assert_false(popover.matches(':popover-open')); - popover.showPopover(); - assert_true(popover.matches(':popover-open')); - await waitForHoverTime(hoverWaitTime); - assert_false(popover.matches(':popover-open')); - assert_true(msSinceMouseOver() >= hoverWaitTime,'waitForHoverTime should wait the specified time'); - assert_true(hoverWaitTime > hoverDelays,'hoverDelays is the value from CSS, hoverWaitTime should be longer than that'); - assert_equals(getComputedStyleTimeMs(invoker1,'popoverShowDelay'),hoverDelays,'popover-show-delay is incorrect'); - assert_equals(getComputedStyleTimeMs(popover,'popoverHideDelay'),hoverDelays,'popover-hide-delay is incorrect'); -},`The popover-hide-delay causes a popover to be hidden after a delay`); - -promise_test(async (t) => { - await mouseOver(unrelated); - const popover = document.getElementById('example1'); - assert_false(popover.matches(':popover-open')); - popover.showPopover(); - await mouseOver(popover); - await waitForHoverTime(hoverWaitTime); - assert_true(popover.matches(':popover-open'),'hovering the popover should keep it showing'); - await mouseOver(unrelated); - let showing = popover.matches(':popover-open'); - if (msSinceMouseOver() >= hoverDelays) - return; // The WPT runner was too slow. - assert_true(showing,'hovering unrelated element shouldn\'t immediately hide the popover'); - await waitForHoverTime(hoverWaitTime); - assert_false(popover.matches(':popover-open'),'hovering unrelated element should hide popover after delay'); -},`hovering the popover keeps it from being hidden`); - -promise_test(async (t) => { - await mouseOver(unrelated); - const popover = document.getElementById('example1'); - const invoker = document.getElementById('invoker1'); - assert_false(popover.matches(':popover-open')); - await mouseOver(invoker); - await waitForHoverTime(hoverWaitTime); - assert_true(popover.matches(':popover-open')); - await waitForHoverTime(hoverWaitTime); - assert_true(popover.matches(':popover-open'),'While still hovering the invoker, popover should not be hidden'); - await mouseOver(popover); - await waitForHoverTime(hoverWaitTime); - await mouseOver(invoker); - await waitForHoverTime(hoverWaitTime); - assert_true(popover.matches(':popover-open'),'Moving hover between invoker and popover should keep popover from being hidden'); - await mouseOver(unrelated); - await waitForHoverTime(hoverWaitTime); - assert_false(popover.matches(':popover-open'),'Moving hover to unrelated should finally hide the popover'); -},`hovering a popovertargetaction=hover invoking element keeps the popover from being hidden`); -</script> - - -<div popover id=example2>Popover</div> -<button popovertarget=example2 popovertargetaction=toggle><span><span data-note=nested_element id=invoker2>Click me</span></span></button> - -<script> -promise_test(async (t) => { - await mouseOver(unrelated); - const popover = document.getElementById('example2'); - const invoker = document.getElementById('invoker2'); - assert_equals(getComputedStyleTimeMs(popover,'popoverHideDelay'),hoverDelays,'popover-hide-delay is incorrect'); - assert_false(popover.matches(':popover-open')); - await mouseOver(invoker); - popover.showPopover(); - await waitForHoverTime(hoverWaitTime); - assert_true(popover.matches(':popover-open'),'While hovering an invoker element, popover should not be hidden'); - await mouseOver(popover); - await waitForHoverTime(hoverWaitTime); - await mouseOver(invoker); - await waitForHoverTime(hoverWaitTime); - assert_true(popover.matches(':popover-open'),'Moving hover between invoker and popover should keep popover from being hidden'); - await mouseOver(unrelated); - await waitForHoverTime(hoverWaitTime); - assert_false(popover.matches(':popover-open'),'Moving hover to unrelated should finally hide the popover'); -},`hovering a popovertargetaction=toggle invoking element keeps the popover from being hidden`); -</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html index d7d1edd3a4b..4b888169e1b 100644 --- a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html @@ -532,7 +532,7 @@ promise_test(async () => { p14.hidePopover(); },{once:true}); assert_true(p13.matches(':popover-open') && p14.matches(':popover-open') && p15.matches(':popover-open'),'all three should be open'); - assert_throws_dom('InvalidStateError',() => p14.hidePopover(),'should throw because the event listener has already hidden the popover'); + p14.hidePopover(); assert_true(p13.matches(':popover-open'),'p13 should still be open'); assert_false(p14.matches(':popover-open')); assert_false(p15.matches(':popover-open')); @@ -579,10 +579,7 @@ promise_test(async () => { p20.showPopover(); }); p20.addEventListener('beforetoggle', logEvents); - // Because the `beforetoggle` handler shows a different popover, - // and that action closes the p19 popover, the call to hidePopover() - // will result in an exception. - assert_throws_dom('InvalidStateError',() => p19.hidePopover()); + p19.hidePopover(); assert_array_equals(events,['hide p19','show p20'],'There should not be a second hide event for 19'); assert_false(p19.matches(':popover-open')); assert_true(p20.matches(':popover-open')); diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html index 9feaa4b2bf8..11f52c2f2f0 100644 --- a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html @@ -4,10 +4,30 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script> +async function iframeLoaded(iframe) { + return new Promise(resolve => { + if (iframe.contentWindow.document.readyState == 'complete') { + resolve(); + } else { + iframe.onload = resolve; + } + }); +} +</script> + <iframe id=myframe srcdoc="<p>iframe</p>"></iframe> <div id=p1 popover=auto>p1</div> <script> -test(() => { +promise_test(async () => { + await iframeLoaded(myframe); + await new Promise(resolve => { + if (myframe.contentWindow.document.readyState == 'complete') { + resolve(); + } else { + + } + }); p1.addEventListener('beforetoggle', () => { myframe.contentWindow.document.body.appendChild(p1); }); @@ -18,7 +38,8 @@ test(() => { <iframe id=myframe2 srcdoc="<p>iframe</p>"></iframe> <div id=p2 popover=auto>p2</div> <script> -test(() => { +promise_test(async () => { + await iframeLoaded(myframe2); const p2 = document.getElementById('p2'); p2.showPopover(); p2.addEventListener('beforetoggle', () => { @@ -27,10 +48,7 @@ test(() => { assert_true(p2.matches(':popover-open'), 'The popover should be open after calling showPopover()'); - // Because the `beforetoggle` handler changes the document, - // and that action closes the popover, the call to hidePopover() - // will result in an exception. - assert_throws_dom('InvalidStateError',() => p2.hidePopover()); + p2.hidePopover(); assert_false(p2.matches(':popover-open'), 'The popover should be closed after moving it between documents.'); }, 'Moving popovers between documents while hiding should not throw an exception.'); @@ -43,7 +61,8 @@ test(() => { <div id=p5 popover=auto>p5</div> </div> <script> -test(() => { +promise_test(async () => { + await iframeLoaded(myframe3); p3.showPopover(); p4.showPopover(); p4.addEventListener('beforetoggle', event => { diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-hover-hide-common.js b/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-hover-hide-common.js new file mode 100644 index 00000000000..9f407ef157d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-hover-hide-common.js @@ -0,0 +1,139 @@ +// NOTE about testing methodology: +// This test checks whether popovers are hidden *after* the appropriate de-hover +// delay. The delay used for testing is kept low, to avoid this test taking too +// long, but that means that sometimes on a slow bot/client, the delay can +// elapse before we are able to check the popover status. And that can make this +// test flaky. To avoid that, the msSinceMouseOver() function is used to check +// that not-too-much time has passed, and if it has, the test is simply skipped. + +const hoverDelays = 100; // This needs to match the style block below. +const hoverWaitTime = 200; // How long to wait to cover the delay for sure. + +async function initialPopoverShow(invoker) { + const popover = invoker.popoverTargetElement; + assert_false(popover.matches(':popover-open')); + await mouseOver(invoker); // Always start with the mouse over the invoker + popover.showPopover(); + assert_true(popover.matches(':popover-open')); +} + +function runHoverHideTest(popoverType, invokerType, invokerAction) { + const descr = `popover=${popoverType}, invoker=${invokerType}, popovertargetaction=${invokerAction}`; + promise_test(async (t) => { + const {popover,invoker} = makeTestParts(t, popoverType, invokerType, invokerAction); + await initialPopoverShow(invoker); + await mouseOver(unrelated); + let showing = popover.matches(':popover-open'); + if (msSinceMouseOver() >= hoverDelays) + return; // The WPT runner was too slow. + assert_true(showing,'popover shouldn\'t immediately hide'); + await mouseHover(unrelated,hoverWaitTime); + assert_false(popover.matches(':popover-open'),'popover should hide after delay'); + },`The popover-hide-delay causes a popover to be hidden after a delay, ${descr}`); + + promise_test(async (t) => { + const {popover,invoker} = makeTestParts(t, popoverType, invokerType, invokerAction); + await initialPopoverShow(invoker); + await mouseHover(popover,hoverWaitTime); + assert_true(popover.matches(':popover-open'),'hovering the popover should keep it showing'); + await mouseOver(unrelated); + let showing = popover.matches(':popover-open'); + if (msSinceMouseOver() >= hoverDelays) + return; // The WPT runner was too slow. + assert_true(showing,'subsequently hovering unrelated element shouldn\'t immediately hide the popover'); + await mouseHover(unrelated,hoverWaitTime); + assert_false(popover.matches(':popover-open'),'hovering unrelated element should hide popover after delay'); + },`hovering the popover keeps it from being hidden, ${descr}`); + + promise_test(async (t) => { + const {popover,invoker,mouseOverInvoker} = makeTestParts(t, popoverType, invokerType, invokerAction); + await initialPopoverShow(invoker); + assert_true(popover.matches(':popover-open')); + await mouseHover(popover,hoverWaitTime); + await mouseHover(mouseOverInvoker,hoverWaitTime); + assert_true(popover.matches(':popover-open'),'Moving hover between invoker and popover should keep popover from being hidden'); + await mouseHover(unrelated,hoverWaitTime); + assert_false(popover.matches(':popover-open'),'Moving hover to unrelated should finally hide the popover'); + },`hovering an invoking element keeps the popover from being hidden, ${descr}`); +} + +function runHoverHideTestsForInvokerAction(invokerAction) { + promise_test(async (t) => { + const {popover,invoker} = makeTestParts(t, 'auto', 'button', 'show'); + assert_false(popover.matches(':popover-open')); + assert_true(invoker.matches('[popovertarget]'),'invoker needs to match [popovertarget]'); + assert_equals(invoker.popoverTargetElement,popover,'invoker should point to popover'); + await mouseHover(invoker,hoverWaitTime); + assert_true(msSinceMouseOver() >= hoverWaitTime,'waitForHoverTime should wait the specified time'); + assert_true(hoverWaitTime > hoverDelays,'hoverDelays is the value from CSS, hoverWaitTime should be longer than that'); + assert_equals(getComputedStyleTimeMs(invoker,'popoverShowDelay'),hoverDelays,'popover-show-delay is incorrect'); + assert_equals(getComputedStyleTimeMs(popover,'popoverHideDelay'),hoverDelays,'popover-hide-delay is incorrect'); + },'Test the harness'); + + // Run for all invoker and popover types. + ["button","input"].forEach(invokerType => { + ["auto","hint","manual"].forEach(popoverType => { + runHoverHideTest(popoverType, invokerType, invokerAction); + }); + }); +} + +// Setup stuff +const unrelated = document.createElement('div'); +unrelated.id = 'unrelated'; +unrelated.textContent = 'Unrelated element'; +const style = document.createElement('style'); +document.body.append(unrelated,style); +style.textContent = ` + div, button, input { + /* Fixed position everything to ensure nothing overlaps */ + position: fixed; + max-height: 100px; + } + #unrelated {top: 100px;} + [popovertarget] { + top:200px; + popover-show-delay: 100ms; + } + [popover] { + width: 200px; + height: 100px; + top:300px; + popover-hide-delay: 100ms; + } +`; + +function makeTestParts(t,popoverType,invokerType,invokerAction) { + const popover = document.createElement('div'); + popover.id = `popover-${popoverType}-${invokerType}-${invokerAction}`; + document.body.appendChild(popover); + popover.popover = popoverType; + assert_equals(popover.popover, popoverType, `Type ${popoverType} not supported`); + const invoker = document.createElement(invokerType); + document.body.appendChild(invoker); + invoker.popoverTargetElement = popover; + invoker.popoverTargetAction = invokerAction; + assert_equals(invoker.popoverTargetAction, invokerAction, `Invoker action ${invokerAction} not supported`); + let mouseOverInvoker; + switch (invokerType) { + case 'button': + invoker.innerHTML = '<span><span data-note=nested_element>Click me</span></span>'; + mouseOverInvoker = invoker.firstElementChild.firstElementChild; + assert_true(!!mouseOverInvoker); + break; + case 'input': + invoker.type = 'button'; + mouseOverInvoker = invoker; + break; + default: + assert_unreached('Invalid invokerType ' + invokerType); + break; + } + t.add_cleanup(() => {popover.remove(); invoker.remove();}); + return {popover, invoker, mouseOverInvoker}; +} + +function getComputedStyleTimeMs(element,property) { + // Times are in seconds, so just strip off the 's'. + return Number(getComputedStyle(element)[property].slice(0,-1))*1000; +} diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js b/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js index aa69b7d41ae..4dc4d8138d8 100644 --- a/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js +++ b/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js @@ -67,20 +67,35 @@ async function finishAnimations(popover) { popover.getAnimations({subtree: true}).forEach(animation => animation.finish()); await waitForRender(); } -let mouseOverStarted; +let mousemoveInfo; function mouseOver(element) { - mouseOverStarted = performance.now(); + mousemoveInfo?.controller?.abort(); + const controller = new AbortController(); + mousemoveInfo = {element, controller, moved: false, started: performance.now()}; return (new test_driver.Actions()) .pointerMove(0, 0, {origin: element}) - .send(); + .send() + .then(() => { + document.addEventListener("mousemove", (e) => {mousemoveInfo.moved = true;}, {signal: controller.signal}); + }) } function msSinceMouseOver() { - return performance.now() - mouseOverStarted; + return performance.now() - mousemoveInfo.started; +} +function assertMouseStillOver(element) { + assert_equals(mousemoveInfo.element, element, 'Broken test harness'); + assert_false(mousemoveInfo.moved,'Broken test harness'); } async function waitForHoverTime(hoverWaitTimeMs) { await new Promise(resolve => step_timeout(resolve,hoverWaitTimeMs)); await waitForRender(); }; +async function mouseHover(element,hoverWaitTimeMs) { + await mouseOver(element); + await waitForHoverTime(hoverWaitTimeMs); + assertMouseStillOver(element); +} + async function blessTopLayer(visibleElement) { // The normal "bless" function doesn't work well when there are top layer // elements blocking clicks. Additionally, since the normal test_driver.bless @@ -153,10 +168,10 @@ function assertIsFunctionalPopover(popover, checkVisibility) { assertPopoverVisibility(popover, /*isPopover*/true, /*expectedVisibility*/false, 'A popover should start out hidden'); popover.showPopover(); if (checkVisibility) assertPopoverVisibility(popover, /*isPopover*/true, /*expectedVisibility*/true, 'After showPopover(), a popover should be visible'); - assert_throws_dom("InvalidStateError",() => popover.showPopover(),'Calling showPopover on a showing popover should throw InvalidStateError'); + popover.showPopover(); // Calling showPopover on a showing popover should not throw. popover.hidePopover(); if (checkVisibility) assertPopoverVisibility(popover, /*isPopover*/true, /*expectedVisibility*/false, 'After hidePopover(), a popover should be hidden'); - assert_throws_dom("InvalidStateError",() => popover.hidePopover(),'Calling hidePopover on a hidden popover should throw InvalidStateError'); + popover.hidePopover(); // Calling hidePopover on a hidden popover should not throw. popover.togglePopover(); if (checkVisibility) assertPopoverVisibility(popover, /*isPopover*/true, /*expectedVisibility*/true, 'After togglePopover() on hidden popover, it should be visible'); popover.togglePopover(); @@ -172,7 +187,7 @@ function assertIsFunctionalPopover(popover, checkVisibility) { const parent = popover.parentElement; popover.remove(); assert_throws_dom("InvalidStateError",() => popover.showPopover(),'Calling showPopover on a disconnected popover should throw InvalidStateError'); - assert_throws_dom("InvalidStateError",() => popover.hidePopover(),'Calling hidePopover on a disconnected popover should throw InvalidStateError'); + popover.hidePopover(); // Calling hidePopover on a disconnected popover should not throw. assert_throws_dom("InvalidStateError",() => popover.togglePopover(),'Calling hidePopover on a disconnected popover should throw InvalidStateError'); parent.appendChild(popover); } diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js new file mode 100644 index 00000000000..3a3ea40d773 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js @@ -0,0 +1,25 @@ +// META: global=window,dedicatedworker + +promise_test(async () => { + const sab = new SharedArrayBuffer(64); + const ta = new Int32Array(sab); + + const waitAsyncObj = Atomics.waitAsync(ta, 0, 0, 10); + assert_equals(waitAsyncObj.async, true); + const v = await waitAsyncObj.value; + assert_equals(v, "timed-out"); +}, `Atomics.waitAsync timeout in a ${self.constructor.name}`); + +promise_test(async () => { + const sab = new SharedArrayBuffer(64); + const ta = new Int32Array(sab); + + const waitAsyncObj = Atomics.waitAsync(ta, 0, 0); + assert_equals(waitAsyncObj.async, true); + + const worker = new Worker("resources/notify-worker.js"); + worker.postMessage(sab); + + const v = await waitAsyncObj.value; + assert_equals(v, "ok"); +}, `Atomics.waitAsync notification in a ${self.constructor.name}`); diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.headers b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.headers new file mode 100644 index 00000000000..5f8621ef836 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.headers @@ -0,0 +1,2 @@ +Cross-Origin-Embedder-Policy: require-corp +Cross-Origin-Opener-Policy: same-origin diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js new file mode 100644 index 00000000000..2780e5bc34e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js @@ -0,0 +1,5 @@ +onmessage = (e) => { + const sab = e.data; + const ta = new Int32Array(sab); + Atomics.notify(ta, 0); +}; diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js.headers b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js.headers new file mode 100644 index 00000000000..6604450991a --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js.headers @@ -0,0 +1 @@ +Cross-Origin-Embedder-Policy: require-corp diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/reporterror-in-detached-window-crash.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/reporterror-in-detached-window-crash.html new file mode 100644 index 00000000000..33662caa4d1 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/reporterror-in-detached-window-crash.html @@ -0,0 +1,11 @@ +<!doctype html> +<title>window.reportError() doesn't crash when window is detached</title> +<link rel="help" href="https://crbug.com/1445375"> +<body> +<script> +let i = document.createElement("iframe"); +document.body.appendChild(i); +let i_win = i.contentWindow; +i.remove(); +i_win.reportError("an error"); +</script> diff --git a/tests/wpt/web-platform-tests/html/webappapis/structured-clone/structured-clone-detached-window-crash.html b/tests/wpt/web-platform-tests/html/webappapis/structured-clone/structured-clone-detached-window-crash.html new file mode 100644 index 00000000000..75971023d2d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/structured-clone/structured-clone-detached-window-crash.html @@ -0,0 +1,11 @@ +<!doctype html> +<title>window.structuredClone() doesn't crash when window is detached</title> +<link rel="help" href="https://crbug.com/1445375"> +<body> +<script> +let i = document.createElement("iframe"); +document.body.appendChild(i); +let i_win = i.contentWindow; +i.remove(); +i_win.structuredClone("some data"); +</script> diff --git a/tests/wpt/web-platform-tests/infrastructure/README.md b/tests/wpt/web-platform-tests/infrastructure/README.md index 82138a300b8..7d0ec556aa4 100644 --- a/tests/wpt/web-platform-tests/infrastructure/README.md +++ b/tests/wpt/web-platform-tests/infrastructure/README.md @@ -7,3 +7,8 @@ infrastructure is operating correctly: * The tests in server/ are designed to test the WPT server configuration * The tests in expected-fail/ should all fail. + +To update the expectations stored in metadata/, you want to use the `wpt` +tool with an invocation such as `./wpt update-expectations --metadata +infrastructure/metadata --manifest MANIFEST.json [wptreport.json]` with one +or more wptreport.json files. diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini index e2bfbf8fb8f..26ffac48154 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini @@ -1,4 +1,6 @@ [file_upload.sub.html] + expected: + if product == "safari": [OK, TIMEOUT] [File upload using testdriver] expected: - if product == "epiphany" or product == "webkit": FAIL + if (product == "epiphany") or (product == "webkit"): FAIL diff --git a/tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl b/tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl index 76640f54c8d..ed4497b56ff 100644 --- a/tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl @@ -4,9 +4,23 @@ // Source: Attribution Reporting (https://wicg.github.io/attribution-reporting-api/) interface mixin HTMLAttributionSrcElementUtils { - [CEReactions] attribute USVString attributionSrc; + [CEReactions, SecureContext] attribute USVString attributionSrc; }; HTMLAnchorElement includes HTMLAttributionSrcElementUtils; HTMLImageElement includes HTMLAttributionSrcElementUtils; HTMLScriptElement includes HTMLAttributionSrcElementUtils; + +dictionary AttributionReportingRequestOptions { + required boolean eventSourceEligible; + required boolean triggerEligible; +}; + +partial dictionary RequestInit { + AttributionReportingRequestOptions attributionReporting; +}; + +partial interface XMLHttpRequest { + [SecureContext] + undefined setAttributionReporting(AttributionReportingRequestOptions options); +}; diff --git a/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl b/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl index 37cdfb82930..3bdf6ba3a6b 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl @@ -5,6 +5,6 @@ [Exposed=Window] interface CSSScopeRule : CSSGroupingRule { - readonly attribute CSSOMString start; - readonly attribute CSSOMString end; + readonly attribute CSSOMString? start; + readonly attribute CSSOMString? end; }; diff --git a/tests/wpt/web-platform-tests/interfaces/css-cascade.idl b/tests/wpt/web-platform-tests/interfaces/css-cascade.idl index 9011dc7fd9e..0dd9969f6eb 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-cascade.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-cascade.idl @@ -3,10 +3,6 @@ // (https://github.com/w3c/webref) // Source: CSS Cascading and Inheritance Level 5 (https://drafts.csswg.org/css-cascade-5/) -partial interface CSSImportRule { - readonly attribute CSSOMString? layerName; -}; - [Exposed=Window] interface CSSLayerBlockRule : CSSGroupingRule { readonly attribute CSSOMString name; diff --git a/tests/wpt/web-platform-tests/interfaces/cssom.idl b/tests/wpt/web-platform-tests/interfaces/cssom.idl index 222b3dc09ec..7f5bf171398 100644 --- a/tests/wpt/web-platform-tests/interfaces/cssom.idl +++ b/tests/wpt/web-platform-tests/interfaces/cssom.idl @@ -106,7 +106,9 @@ interface CSSStyleRule : CSSRule { interface CSSImportRule : CSSRule { readonly attribute USVString href; [SameObject, PutForwards=mediaText] readonly attribute MediaList media; - [SameObject] readonly attribute CSSStyleSheet styleSheet; + [SameObject] readonly attribute CSSStyleSheet? styleSheet; + readonly attribute CSSOMString? layerName; + readonly attribute CSSOMString? supportsText; }; [Exposed=Window] diff --git a/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl b/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl index 2869b95e6bb..6b0734d1f7b 100644 --- a/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl +++ b/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl @@ -10,19 +10,23 @@ interface HTMLFencedFrameElement : HTMLElement { [CEReactions] attribute FencedFrameConfig? config; [CEReactions] attribute DOMString width; [CEReactions] attribute DOMString height; + [CEReactions] attribute DOMString allow; }; enum OpaqueProperty {"opaque"}; typedef (unsigned long or OpaqueProperty) FencedFrameConfigSize; -typedef (USVString or OpaqueProperty) FencedFrameConfigURL; +typedef USVString FencedFrameConfigURL; [Exposed=Window] interface FencedFrameConfig { - constructor(USVString url); readonly attribute FencedFrameConfigURL? url; - readonly attribute FencedFrameConfigSize? width; - readonly attribute FencedFrameConfigSize? height; + readonly attribute FencedFrameConfigSize? containerWidth; + readonly attribute FencedFrameConfigSize? containerHeight; + readonly attribute FencedFrameConfigSize? contentWidth; + readonly attribute FencedFrameConfigSize? contentHeight; + + undefined setSharedStorageContext(DOMString contextString); }; enum FenceReportingDestination { diff --git a/tests/wpt/web-platform-tests/interfaces/fs.idl b/tests/wpt/web-platform-tests/interfaces/fs.idl index e2474132abf..e341ab387d9 100644 --- a/tests/wpt/web-platform-tests/interfaces/fs.idl +++ b/tests/wpt/web-platform-tests/interfaces/fs.idl @@ -15,6 +15,7 @@ interface FileSystemHandle { Promise<boolean> isSameEntry(FileSystemHandle other); }; + dictionary FileSystemCreateWritableOptions { boolean keepExistingData = false; }; @@ -26,6 +27,7 @@ interface FileSystemFileHandle : FileSystemHandle { [Exposed=DedicatedWorker] Promise<FileSystemSyncAccessHandle> createSyncAccessHandle(); }; + dictionary FileSystemGetFileOptions { boolean create = false; }; @@ -49,6 +51,7 @@ interface FileSystemDirectoryHandle : FileSystemHandle { Promise<sequence<USVString>?> resolve(FileSystemHandle possibleDescendant); }; + enum WriteCommandType { "write", "seek", @@ -70,6 +73,7 @@ interface FileSystemWritableFileStream : WritableStream { Promise<undefined> seek(unsigned long long position); Promise<undefined> truncate(unsigned long long size); }; + dictionary FileSystemReadWriteOptions { [EnforceRange] unsigned long long at; }; diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl index 33d4de0db97..99b33705b39 100644 --- a/tests/wpt/web-platform-tests/interfaces/html.idl +++ b/tests/wpt/web-platform-tests/interfaces/html.idl @@ -1643,6 +1643,14 @@ dictionary ValidityStateFlags { boolean customError = false; }; +[Exposed=(Window)] +interface VisibilityStateEntry : PerformanceEntry { + readonly attribute DOMString name; // shadows inherited name + readonly attribute DOMString entryType; // shadows inherited entryType + readonly attribute DOMHighResTimeStamp startTime; // shadows inherited startTime + readonly attribute unsigned long duration; // shadows inherited duration +}; + [Exposed=Window] interface UserActivation { readonly attribute boolean hasBeenActive; diff --git a/tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl b/tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl index 99f30282333..496bfcf2e27 100644 --- a/tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl +++ b/tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl @@ -34,6 +34,8 @@ dictionary MediaRecorderOptions { unsigned long videoBitsPerSecond; unsigned long bitsPerSecond; BitrateMode audioBitrateMode = "variable"; + DOMHighResTimeStamp videoKeyFrameIntervalDuration; + unsigned long videoKeyFrameIntervalCount; }; enum BitrateMode { diff --git a/tests/wpt/web-platform-tests/interfaces/real-world-meshing.idl b/tests/wpt/web-platform-tests/interfaces/real-world-meshing.idl new file mode 100644 index 00000000000..38fe71f6c66 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/real-world-meshing.idl @@ -0,0 +1,21 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: WebXR Mesh Detection Module (https://immersive-web.github.io/real-world-meshing/) + +[Exposed=Window] interface XRMesh { + [SameObject] readonly attribute XRSpace meshSpace; + + readonly attribute FrozenArray<Float32Array> vertices; + readonly attribute Uint32Array indices; + readonly attribute DOMHighResTimeStamp lastChangedTime; + readonly attribute DOMString? semanticLabel; +}; + +[Exposed=Window] interface XRMeshSet { + readonly setlike<XRMesh>; +}; + +partial interface XRFrame { + readonly attribute XRMeshSet detectedMeshs; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/resource-timing.idl b/tests/wpt/web-platform-tests/interfaces/resource-timing.idl index 151e5d46d84..aa17003493e 100644 --- a/tests/wpt/web-platform-tests/interfaces/resource-timing.idl +++ b/tests/wpt/web-platform-tests/interfaces/resource-timing.idl @@ -18,6 +18,7 @@ interface PerformanceResourceTiming : PerformanceEntry { readonly attribute DOMHighResTimeStamp connectEnd; readonly attribute DOMHighResTimeStamp secureConnectionStart; readonly attribute DOMHighResTimeStamp requestStart; + readonly attribute DOMHighResTimeStamp firstInterimResponseStart; readonly attribute DOMHighResTimeStamp responseStart; readonly attribute DOMHighResTimeStamp responseEnd; readonly attribute unsigned long long transferSize; diff --git a/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl b/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl index 14215509c9f..31b3746e9d4 100644 --- a/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl +++ b/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl @@ -36,7 +36,11 @@ interface ViewTimeline : ScrollTimeline { readonly attribute CSSNumericValue endOffset; }; +dictionary AnimationTimeOptions { + DOMString? range; +}; + [Exposed=Window] partial interface AnimationTimeline { - CSSNumericValue? getCurrentTime(optional CSSOMString rangeName); + CSSNumericValue? getCurrentTime(optional AnimationTimeOptions options = {}); }; diff --git a/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl b/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl index 9061b243477..08ec8065c53 100644 --- a/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl +++ b/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl @@ -15,6 +15,7 @@ dictionary SecurePaymentConfirmationRequest { sequence<USVString> locale; boolean showOptOut; }; + partial dictionary AuthenticationExtensionsClientInputs { AuthenticationExtensionsPaymentInputs payment; }; @@ -30,9 +31,11 @@ dictionary AuthenticationExtensionsPaymentInputs { PaymentCurrencyAmount total; PaymentCredentialInstrument instrument; }; + dictionary CollectedClientPaymentData : CollectedClientData { required CollectedClientAdditionalPaymentData payment; }; + dictionary CollectedClientAdditionalPaymentData { required USVString rpId; required USVString topOrigin; @@ -41,6 +44,7 @@ dictionary CollectedClientAdditionalPaymentData { required PaymentCurrencyAmount total; required PaymentCredentialInstrument instrument; }; + dictionary PaymentCredentialInstrument { required USVString displayName; required USVString icon; diff --git a/tests/wpt/web-platform-tests/interfaces/shared-storage.idl b/tests/wpt/web-platform-tests/interfaces/shared-storage.idl new file mode 100644 index 00000000000..eb5806f9a6d --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/shared-storage.idl @@ -0,0 +1,80 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: Shared Storage API (https://wicg.github.io/shared-storage/) + +[Exposed=(Window)] +interface SharedStorageWorklet : Worklet { +}; + +[Exposed=SharedStorageWorklet, Global=SharedStorageWorklet] +interface SharedStorageWorkletGlobalScope : WorkletGlobalScope { + undefined register(DOMString name, + SharedStorageOperationConstructor operationCtor); +}; + +callback SharedStorageOperationConstructor = + SharedStorageOperation(optional SharedStorageRunOperationMethodOptions options); + +[Exposed=SharedStorageWorklet] +interface SharedStorageOperation { +}; + +dictionary SharedStorageRunOperationMethodOptions { + object data; + boolean resolveToConfig = false; + boolean keepAlive = false; +}; + +[Exposed=SharedStorageWorklet] +interface SharedStorageRunOperation : SharedStorageOperation { + Promise<undefined> run(object data); +}; + +[Exposed=SharedStorageWorklet] +interface SharedStorageSelectURLOperation : SharedStorageOperation { + Promise<long> run(object data, + FrozenArray<SharedStorageUrlWithMetadata> urls); +}; + +[Exposed=(Window,SharedStorageWorklet)] +interface SharedStorage { + Promise<any> set(DOMString key, + DOMString value, + optional SharedStorageSetMethodOptions options = {}); + Promise<any> append(DOMString key, + DOMString value); + Promise<any> delete(DOMString key); + Promise<any> clear(); +}; + +dictionary SharedStorageSetMethodOptions { + boolean ignoreIfPresent = false; +}; + +typedef (USVString or FencedFrameConfig) SharedStorageResponse; + +[Exposed=(Window)] +interface WindowSharedStorage : SharedStorage { + Promise<any> run(DOMString name, + optional SharedStorageRunOperationMethodOptions options = {}); + Promise<SharedStorageResponse> selectURL(DOMString name, + FrozenArray<SharedStorageUrlWithMetadata> urls, + optional SharedStorageRunOperationMethodOptions options = {}); + + readonly attribute SharedStorageWorklet worklet; +}; + +dictionary SharedStorageUrlWithMetadata { + required USVString url; + object reportingMetadata; +}; + +[Exposed=(SharedStorageWorklet)] +interface WorkletSharedStorage : SharedStorage { + Promise<DOMString> get(DOMString key); + Promise<unsigned long> length(); + Promise<double> remainingBudget(); + + async iterable<DOMString, DOMString>; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/storage-buckets.idl b/tests/wpt/web-platform-tests/interfaces/storage-buckets.idl new file mode 100644 index 00000000000..f3d500a5711 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/storage-buckets.idl @@ -0,0 +1,53 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: Storage Buckets API (https://wicg.github.io/storage-buckets/) + +[SecureContext] +interface mixin NavigatorStorageBuckets { + [SameObject] readonly attribute StorageBucketManager storageBuckets; +}; +Navigator includes NavigatorStorageBuckets; +WorkerNavigator includes NavigatorStorageBuckets; + +[Exposed=(Window,Worker), + SecureContext] +interface StorageBucketManager { + Promise<StorageBucket> open(DOMString name, optional StorageBucketOptions options = {}); + Promise<sequence<DOMString>> keys(); + Promise<undefined> delete(DOMString name); +}; + +enum StorageBucketDurability { + "strict", + "relaxed" +}; + +dictionary StorageBucketOptions { + boolean? persisted = null; + StorageBucketDurability? durability = null; + unsigned long long? quota = null; + DOMHighResTimeStamp? expires = null; +}; + +[Exposed=(Window,Worker), + SecureContext] +interface StorageBucket { + readonly attribute DOMString name; + + [Exposed=Window] Promise<boolean> persist(); + Promise<boolean> persisted(); + + Promise<StorageEstimate> estimate(); + + Promise<StorageBucketDurability> durability(); + + Promise<undefined> setExpires(DOMHighResTimeStamp expires); + Promise<DOMHighResTimeStamp?> expires(); + + [SameObject] readonly attribute IDBFactory indexedDB; + + [SameObject] readonly attribute CacheStorage caches; + + Promise<FileSystemDirectoryHandle> getDirectory(); +}; diff --git a/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl b/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl index ee339590827..f521acea1f5 100644 --- a/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl @@ -5,14 +5,11 @@ enum RefreshPolicy { "none", "refresh" }; -enum TokenType { "private-state-token" }; - enum TokenVersion { "1" }; enum OperationType { "token-request", "send-redemption-record", "token-redemption" }; dictionary PrivateToken { - required TokenType type; required TokenVersion version; required OperationType operation; RefreshPolicy refreshPolicy = "none"; @@ -24,6 +21,6 @@ partial dictionary RequestInit { }; partial interface Document { - Promise<boolean> hasPrivateTokens(USVString issuer, USVString type); - Promise<boolean> hasRedemptionRecord(USVString issuer, USVString type); + Promise<boolean> hasPrivateTokens(USVString issuer); + Promise<boolean> hasRedemptionRecord(USVString issuer); }; diff --git a/tests/wpt/web-platform-tests/interfaces/turtledove.idl b/tests/wpt/web-platform-tests/interfaces/turtledove.idl index cd81a3d87ef..8add667b575 100644 --- a/tests/wpt/web-platform-tests/interfaces/turtledove.idl +++ b/tests/wpt/web-platform-tests/interfaces/turtledove.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: FLEDGE (https://wicg.github.io/turtledove/) +// Source: Protected Audience (formerly FLEDGE) (https://wicg.github.io/turtledove/) [SecureContext] partial interface Navigator { @@ -25,7 +25,7 @@ dictionary AuctionAdInterestGroup { DOMString executionMode = "compatibility"; USVString biddingLogicURL; USVString biddingWasmHelperURL; - USVString dailyUpdateURL; + USVString updateURL; USVString trustedBiddingSignalsURL; sequence<USVString> trustedBiddingSignalsKeys; any userBiddingSignals; @@ -67,9 +67,15 @@ dictionary AuctionAdConfig { AbortSignal? signal; }; +[Exposed=InterestGroupScriptRunnerGlobalScope] +interface InterestGroupScriptRunnerGlobalScope { +}; + [Exposed=InterestGroupBiddingScriptRunnerGlobalScope, -Global=InterestGroupBiddingScriptRunnerGlobalScope] -interface InterestGroupBiddingScriptRunnerGlobalScope { + Global=(InterestGroupScriptRunnerGlobalScope, + InterestGroupBiddingScriptRunnerGlobalScope)] +interface InterestGroupBiddingScriptRunnerGlobalScope + : InterestGroupScriptRunnerGlobalScope { boolean setBid(); boolean setBid(GenerateBidOutput generateBidOutput); undefined setPriority(double priority); @@ -77,13 +83,17 @@ interface InterestGroupBiddingScriptRunnerGlobalScope { }; [Exposed=InterestGroupScoringScriptRunnerGlobalScope, -Global=InterestGroupScoringScriptRunnerGlobalScope] -interface InterestGroupScoringScriptRunnerGlobalScope { + Global=(InterestGroupScriptRunnerGlobalScope, + InterestGroupScoringScriptRunnerGlobalScope)] +interface InterestGroupScoringScriptRunnerGlobalScope + : InterestGroupScriptRunnerGlobalScope { }; [Exposed=InterestGroupReportingScriptRunnerGlobalScope, -Global=InterestGroupReportingScriptRunnerGlobalScope] -interface InterestGroupReportingScriptRunnerGlobalScope { + Global=(InterestGroupScriptRunnerGlobalScope, + InterestGroupReportingScriptRunnerGlobalScope)] +interface InterestGroupReportingScriptRunnerGlobalScope + : InterestGroupScriptRunnerGlobalScope { undefined sendReportTo(DOMString url); }; @@ -96,7 +106,7 @@ dictionary AdRender { dictionary GenerateBidOutput { required double bid; required (DOMString or AdRender) adRender; - DOMString ad; + any ad; sequence<(DOMString or AdRender)> adComponents; double adCost; double modelingSignals; diff --git a/tests/wpt/web-platform-tests/interfaces/url.idl b/tests/wpt/web-platform-tests/interfaces/url.idl index 6549e45f419..a5e4d1eb492 100644 --- a/tests/wpt/web-platform-tests/interfaces/url.idl +++ b/tests/wpt/web-platform-tests/interfaces/url.idl @@ -33,10 +33,10 @@ interface URLSearchParams { readonly attribute unsigned long size; undefined append(USVString name, USVString value); - undefined delete(USVString name); + undefined delete(USVString name, optional USVString value); USVString? get(USVString name); sequence<USVString> getAll(USVString name); - boolean has(USVString name); + boolean has(USVString name, optional USVString value); undefined set(USVString name, USVString value); undefined sort(); diff --git a/tests/wpt/web-platform-tests/interfaces/webauthn.idl b/tests/wpt/web-platform-tests/interfaces/webauthn.idl index 58a9e285232..c7f72eacfd0 100644 --- a/tests/wpt/web-platform-tests/interfaces/webauthn.idl +++ b/tests/wpt/web-platform-tests/interfaces/webauthn.idl @@ -12,6 +12,7 @@ interface PublicKeyCredential : Credential { static Promise<boolean> isConditionalMediationAvailable(); PublicKeyCredentialJSON toJSON(); }; + typedef DOMString Base64URLString; typedef (RegistrationResponseJSON or AuthenticationResponseJSON) PublicKeyCredentialJSON; @@ -48,15 +49,19 @@ dictionary AuthenticatorAssertionResponseJSON { dictionary AuthenticationExtensionsClientOutputsJSON { }; + partial dictionary CredentialCreationOptions { PublicKeyCredentialCreationOptions publicKey; }; + partial dictionary CredentialRequestOptions { PublicKeyCredentialRequestOptions publicKey; }; + partial interface PublicKeyCredential { static Promise<boolean> isUserVerifyingPlatformAuthenticatorAvailable(); }; + partial interface PublicKeyCredential { static PublicKeyCredentialCreationOptions parseCreationOptionsFromJSON(PublicKeyCredentialCreationOptionsJSON options); }; @@ -87,6 +92,7 @@ dictionary PublicKeyCredentialDescriptorJSON { dictionary AuthenticationExtensionsClientInputsJSON { }; + partial interface PublicKeyCredential { static PublicKeyCredentialRequestOptions parseRequestOptionsFromJSON(PublicKeyCredentialRequestOptionsJSON options); }; @@ -99,10 +105,12 @@ dictionary PublicKeyCredentialRequestOptionsJSON { DOMString userVerification = "preferred"; AuthenticationExtensionsClientInputsJSON extensions; }; + [SecureContext, Exposed=Window] interface AuthenticatorResponse { [SameObject] readonly attribute ArrayBuffer clientDataJSON; }; + [SecureContext, Exposed=Window] interface AuthenticatorAttestationResponse : AuthenticatorResponse { [SameObject] readonly attribute ArrayBuffer attestationObject; @@ -111,6 +119,7 @@ interface AuthenticatorAttestationResponse : AuthenticatorResponse { ArrayBuffer? getPublicKey(); COSEAlgorithmIdentifier getPublicKeyAlgorithm(); }; + [SecureContext, Exposed=Window] interface AuthenticatorAssertionResponse : AuthenticatorResponse { [SameObject] readonly attribute ArrayBuffer authenticatorData; @@ -118,10 +127,12 @@ interface AuthenticatorAssertionResponse : AuthenticatorResponse { [SameObject] readonly attribute ArrayBuffer? userHandle; [SameObject] readonly attribute ArrayBuffer? attestationObject; }; + dictionary PublicKeyCredentialParameters { required DOMString type; required COSEAlgorithmIdentifier alg; }; + dictionary PublicKeyCredentialCreationOptions { required PublicKeyCredentialRpEntity rp; required PublicKeyCredentialUserEntity user; @@ -136,37 +147,45 @@ dictionary PublicKeyCredentialCreationOptions { sequence<DOMString> attestationFormats = []; AuthenticationExtensionsClientInputs extensions; }; + dictionary PublicKeyCredentialEntity { required DOMString name; }; + dictionary PublicKeyCredentialRpEntity : PublicKeyCredentialEntity { DOMString id; }; + dictionary PublicKeyCredentialUserEntity : PublicKeyCredentialEntity { required BufferSource id; required DOMString displayName; }; + dictionary AuthenticatorSelectionCriteria { DOMString authenticatorAttachment; DOMString residentKey; boolean requireResidentKey = false; DOMString userVerification = "preferred"; }; + enum AuthenticatorAttachment { "platform", "cross-platform" }; + enum ResidentKeyRequirement { "discouraged", "preferred", "required" }; + enum AttestationConveyancePreference { "none", "indirect", "direct", "enterprise" }; + dictionary PublicKeyCredentialRequestOptions { required BufferSource challenge; unsigned long timeout; @@ -177,10 +196,13 @@ dictionary PublicKeyCredentialRequestOptions { sequence<DOMString> attestationFormats = []; AuthenticationExtensionsClientInputs extensions; }; + dictionary AuthenticationExtensionsClientInputs { }; + dictionary AuthenticationExtensionsClientOutputs { }; + dictionary CollectedClientData { required DOMString type; required DOMString challenge; @@ -195,42 +217,54 @@ dictionary TokenBinding { }; enum TokenBindingStatus { "present", "supported" }; + enum PublicKeyCredentialType { "public-key" }; + dictionary PublicKeyCredentialDescriptor { required DOMString type; required BufferSource id; sequence<DOMString> transports; }; + enum AuthenticatorTransport { "usb", "nfc", "ble", + "smart-card", "hybrid", "internal" }; + typedef long COSEAlgorithmIdentifier; + enum UserVerificationRequirement { "required", "preferred", "discouraged" }; + partial dictionary AuthenticationExtensionsClientInputs { USVString appid; }; + partial dictionary AuthenticationExtensionsClientOutputs { boolean appid; }; + partial dictionary AuthenticationExtensionsClientInputs { USVString appidExclude; }; + partial dictionary AuthenticationExtensionsClientOutputs { boolean appidExclude; }; + partial dictionary AuthenticationExtensionsClientInputs { boolean credProps; }; + dictionary CredentialPropertiesOutput { boolean rk; }; @@ -238,6 +272,7 @@ dictionary CredentialPropertiesOutput { partial dictionary AuthenticationExtensionsClientOutputs { CredentialPropertiesOutput credProps; }; + dictionary AuthenticationExtensionsPRFValues { required BufferSource first; BufferSource second; @@ -289,12 +324,14 @@ dictionary AuthenticationExtensionsLargeBlobOutputs { partial dictionary AuthenticationExtensionsClientInputs { boolean uvm; }; + typedef sequence<unsigned long> UvmEntry; typedef sequence<UvmEntry> UvmEntries; partial dictionary AuthenticationExtensionsClientOutputs { UvmEntries uvm; }; + dictionary AuthenticationExtensionsDevicePublicKeyInputs { DOMString attestation = "none"; sequence<DOMString> attestationFormats = []; diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl index 00e4493d3c0..ab20879728d 100644 --- a/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl +++ b/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl @@ -3,6 +3,14 @@ // (https://github.com/w3c/webref) // Source: AV1 WebCodecs Registration (https://w3c.github.io/webcodecs/av1_codec_registration.html) +partial dictionary VideoEncoderConfig { + AV1EncoderConfig av1; +}; + +dictionary AV1EncoderConfig { + boolean forceScreenContentTools = false; +}; + partial dictionary VideoEncoderEncodeOptions { VideoEncoderEncodeOptionsForAv1 av1; }; diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl index d4074f647da..2b952c22194 100644 --- a/tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl +++ b/tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl @@ -15,3 +15,11 @@ enum AvcBitstreamFormat { "annexb", "avc", }; + +partial dictionary VideoEncoderEncodeOptions { + VideoEncoderEncodeOptionsForAvc avc; +}; + +dictionary VideoEncoderEncodeOptionsForAvc { + unsigned short? quantizer; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs.idl index 77649029db6..0b95dc8b757 100644 --- a/tests/wpt/web-platform-tests/interfaces/webcodecs.idl +++ b/tests/wpt/web-platform-tests/interfaces/webcodecs.idl @@ -161,6 +161,7 @@ dictionary AudioEncoderConfig { [EnforceRange] unsigned long sampleRate; [EnforceRange] unsigned long numberOfChannels; [EnforceRange] unsigned long long bitrate; + BitrateMode bitrateMode; }; dictionary VideoEncoderConfig { diff --git a/tests/wpt/web-platform-tests/interfaces/webgpu.idl b/tests/wpt/web-platform-tests/interfaces/webgpu.idl index 284327a5789..34f78a1d8cd 100644 --- a/tests/wpt/web-platform-tests/interfaces/webgpu.idl +++ b/tests/wpt/web-platform-tests/interfaces/webgpu.idl @@ -18,6 +18,7 @@ interface GPUSupportedLimits { readonly attribute unsigned long maxTextureDimension3D; readonly attribute unsigned long maxTextureArrayLayers; readonly attribute unsigned long maxBindGroups; + readonly attribute unsigned long maxBindGroupsPlusVertexBuffers; readonly attribute unsigned long maxBindingsPerBindGroup; readonly attribute unsigned long maxDynamicUniformBuffersPerPipelineLayout; readonly attribute unsigned long maxDynamicStorageBuffersPerPipelineLayout; @@ -26,7 +27,6 @@ interface GPUSupportedLimits { readonly attribute unsigned long maxStorageBuffersPerShaderStage; readonly attribute unsigned long maxStorageTexturesPerShaderStage; readonly attribute unsigned long maxUniformBuffersPerShaderStage; - readonly attribute unsigned long maxFragmentCombinedOutputResources; readonly attribute unsigned long long maxUniformBufferBindingSize; readonly attribute unsigned long long maxStorageBufferBindingSize; readonly attribute unsigned long minUniformBufferOffsetAlignment; @@ -85,7 +85,7 @@ dictionary GPURequestAdapterOptions { enum GPUPowerPreference { "low-power", - "high-performance" + "high-performance", }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -98,7 +98,8 @@ interface GPUAdapter { Promise<GPUAdapterInfo> requestAdapterInfo(optional sequence<DOMString> unmaskHints = []); }; -dictionary GPUDeviceDescriptor : GPUObjectDescriptorBase { +dictionary GPUDeviceDescriptor + : GPUObjectDescriptorBase { sequence<GPUFeatureName> requiredFeatures = []; record<DOMString, GPUSize64> requiredLimits = {}; GPUQueueDescriptor defaultQueue = {}; @@ -115,7 +116,7 @@ enum GPUFeatureName { "shader-f16", "rg11b10ufloat-renderable", "bgra8unorm-storage", - "float32-filterable" + "float32-filterable", }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -167,10 +168,11 @@ GPUBuffer includes GPUObjectBase; enum GPUBufferMapState { "unmapped", "pending", - "mapped" + "mapped", }; -dictionary GPUBufferDescriptor : GPUObjectDescriptorBase { +dictionary GPUBufferDescriptor + : GPUObjectDescriptorBase { required GPUSize64 size; required GPUBufferUsageFlags usage; boolean mappedAtCreation = false; @@ -215,7 +217,8 @@ interface GPUTexture { }; GPUTexture includes GPUObjectBase; -dictionary GPUTextureDescriptor : GPUObjectDescriptorBase { +dictionary GPUTextureDescriptor + : GPUObjectDescriptorBase { required GPUExtent3D size; GPUIntegerCoordinate mipLevelCount = 1; GPUSize32 sampleCount = 1; @@ -228,7 +231,7 @@ dictionary GPUTextureDescriptor : GPUObjectDescriptorBase { enum GPUTextureDimension { "1d", "2d", - "3d" + "3d", }; typedef [EnforceRange] unsigned long GPUTextureUsageFlags; @@ -246,7 +249,8 @@ interface GPUTextureView { }; GPUTextureView includes GPUObjectBase; -dictionary GPUTextureViewDescriptor : GPUObjectDescriptorBase { +dictionary GPUTextureViewDescriptor + : GPUObjectDescriptorBase { GPUTextureFormat format; GPUTextureViewDimension dimension; GPUTextureAspect aspect = "all"; @@ -262,13 +266,13 @@ enum GPUTextureViewDimension { "2d-array", "cube", "cube-array", - "3d" + "3d", }; enum GPUTextureAspect { "all", "stencil-only", - "depth-only" + "depth-only", }; enum GPUTextureFormat { @@ -388,7 +392,7 @@ enum GPUTextureFormat { "astc-12x10-unorm", "astc-12x10-unorm-srgb", "astc-12x12-unorm", - "astc-12x12-unorm-srgb" + "astc-12x12-unorm-srgb", }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -396,8 +400,9 @@ interface GPUExternalTexture { }; GPUExternalTexture includes GPUObjectBase; -dictionary GPUExternalTextureDescriptor : GPUObjectDescriptorBase { - required HTMLVideoElement source; +dictionary GPUExternalTextureDescriptor + : GPUObjectDescriptorBase { + required (HTMLVideoElement or VideoFrame) source; PredefinedColorSpace colorSpace = "srgb"; }; @@ -406,7 +411,8 @@ interface GPUSampler { }; GPUSampler includes GPUObjectBase; -dictionary GPUSamplerDescriptor : GPUObjectDescriptorBase { +dictionary GPUSamplerDescriptor + : GPUObjectDescriptorBase { GPUAddressMode addressModeU = "clamp-to-edge"; GPUAddressMode addressModeV = "clamp-to-edge"; GPUAddressMode addressModeW = "clamp-to-edge"; @@ -422,17 +428,17 @@ dictionary GPUSamplerDescriptor : GPUObjectDescriptorBase { enum GPUAddressMode { "clamp-to-edge", "repeat", - "mirror-repeat" + "mirror-repeat", }; enum GPUFilterMode { "nearest", - "linear" + "linear", }; enum GPUMipmapFilterMode { "nearest", - "linear" + "linear", }; enum GPUCompareFunction { @@ -443,7 +449,7 @@ enum GPUCompareFunction { "greater", "not-equal", "greater-equal", - "always" + "always", }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -451,7 +457,8 @@ interface GPUBindGroupLayout { }; GPUBindGroupLayout includes GPUObjectBase; -dictionary GPUBindGroupLayoutDescriptor : GPUObjectDescriptorBase { +dictionary GPUBindGroupLayoutDescriptor + : GPUObjectDescriptorBase { required sequence<GPUBindGroupLayoutEntry> entries; }; @@ -477,7 +484,7 @@ namespace GPUShaderStage { enum GPUBufferBindingType { "uniform", "storage", - "read-only-storage" + "read-only-storage", }; dictionary GPUBufferBindingLayout { @@ -489,7 +496,7 @@ dictionary GPUBufferBindingLayout { enum GPUSamplerBindingType { "filtering", "non-filtering", - "comparison" + "comparison", }; dictionary GPUSamplerBindingLayout { @@ -501,7 +508,7 @@ enum GPUTextureSampleType { "unfilterable-float", "depth", "sint", - "uint" + "uint", }; dictionary GPUTextureBindingLayout { @@ -511,7 +518,7 @@ dictionary GPUTextureBindingLayout { }; enum GPUStorageTextureAccess { - "write-only" + "write-only", }; dictionary GPUStorageTextureBindingLayout { @@ -528,7 +535,8 @@ interface GPUBindGroup { }; GPUBindGroup includes GPUObjectBase; -dictionary GPUBindGroupDescriptor : GPUObjectDescriptorBase { +dictionary GPUBindGroupDescriptor + : GPUObjectDescriptorBase { required GPUBindGroupLayout layout; required sequence<GPUBindGroupEntry> entries; }; @@ -551,7 +559,8 @@ interface GPUPipelineLayout { }; GPUPipelineLayout includes GPUObjectBase; -dictionary GPUPipelineLayoutDescriptor : GPUObjectDescriptorBase { +dictionary GPUPipelineLayoutDescriptor + : GPUObjectDescriptorBase { required sequence<GPUBindGroupLayout> bindGroupLayouts; }; @@ -561,7 +570,8 @@ interface GPUShaderModule { }; GPUShaderModule includes GPUObjectBase; -dictionary GPUShaderModuleDescriptor : GPUObjectDescriptorBase { +dictionary GPUShaderModuleDescriptor + : GPUObjectDescriptorBase { required USVString code; object sourceMap; record<USVString, GPUShaderModuleCompilationHint> hints; @@ -574,7 +584,7 @@ dictionary GPUShaderModuleCompilationHint { enum GPUCompilationMessageType { "error", "warning", - "info" + "info", }; [Exposed=(Window, DedicatedWorker), Serializable, SecureContext] @@ -604,14 +614,15 @@ dictionary GPUPipelineErrorInit { enum GPUPipelineErrorReason { "validation", - "internal" + "internal", }; enum GPUAutoLayoutMode { - "auto" + "auto", }; -dictionary GPUPipelineDescriptorBase : GPUObjectDescriptorBase { +dictionary GPUPipelineDescriptorBase + : GPUObjectDescriptorBase { required (GPUPipelineLayout or GPUAutoLayoutMode) layout; }; @@ -633,7 +644,8 @@ interface GPUComputePipeline { GPUComputePipeline includes GPUObjectBase; GPUComputePipeline includes GPUPipelineBase; -dictionary GPUComputePipelineDescriptor : GPUPipelineDescriptorBase { +dictionary GPUComputePipelineDescriptor + : GPUPipelineDescriptorBase { required GPUProgrammableStage compute; }; @@ -643,7 +655,8 @@ interface GPURenderPipeline { GPURenderPipeline includes GPUObjectBase; GPURenderPipeline includes GPUPipelineBase; -dictionary GPURenderPipelineDescriptor : GPUPipelineDescriptorBase { +dictionary GPURenderPipelineDescriptor + : GPUPipelineDescriptorBase { required GPUVertexState vertex; GPUPrimitiveState primitive = {}; GPUDepthStencilState depthStencil; @@ -666,18 +679,18 @@ enum GPUPrimitiveTopology { "line-list", "line-strip", "triangle-list", - "triangle-strip" + "triangle-strip", }; enum GPUFrontFace { "ccw", - "cw" + "cw", }; enum GPUCullMode { "none", "front", - "back" + "back", }; dictionary GPUMultisampleState { @@ -686,7 +699,8 @@ dictionary GPUMultisampleState { boolean alphaToCoverageEnabled = false; }; -dictionary GPUFragmentState : GPUProgrammableStage { +dictionary GPUFragmentState + : GPUProgrammableStage { required sequence<GPUColorTargetState?> targets; }; @@ -731,7 +745,7 @@ enum GPUBlendFactor { "one-minus-dst-alpha", "src-alpha-saturated", "constant", - "one-minus-constant" + "one-minus-constant", }; enum GPUBlendOperation { @@ -739,7 +753,7 @@ enum GPUBlendOperation { "subtract", "reverse-subtract", "min", - "max" + "max", }; dictionary GPUDepthStencilState { @@ -774,12 +788,12 @@ enum GPUStencilOperation { "increment-clamp", "decrement-clamp", "increment-wrap", - "decrement-wrap" + "decrement-wrap", }; enum GPUIndexFormat { "uint16", - "uint32" + "uint32", }; enum GPUVertexFormat { @@ -812,15 +826,16 @@ enum GPUVertexFormat { "sint32", "sint32x2", "sint32x3", - "sint32x4" + "sint32x4", }; enum GPUVertexStepMode { "vertex", - "instance" + "instance", }; -dictionary GPUVertexState : GPUProgrammableStage { +dictionary GPUVertexState + : GPUProgrammableStage { sequence<GPUVertexBufferLayout?> buffers = []; }; @@ -837,17 +852,43 @@ dictionary GPUVertexAttribute { required GPUIndex32 shaderLocation; }; -dictionary GPUImageDataLayout { GPUSize64 offset = 0; GPUSize32 bytesPerRow; GPUSize32 rowsPerImage;}; -dictionary GPUImageCopyBuffer : GPUImageDataLayout { required GPUBuffer buffer;}; -dictionary GPUImageCopyTexture { required GPUTexture texture; GPUIntegerCoordinate mipLevel = 0; GPUOrigin3D origin = {}; GPUTextureAspect aspect = "all";}; -dictionary GPUImageCopyTextureTagged : GPUImageCopyTexture { PredefinedColorSpace colorSpace = "srgb"; boolean premultipliedAlpha = false;}; -dictionary GPUImageCopyExternalImage { required (ImageBitmap or HTMLVideoElement or HTMLCanvasElement or OffscreenCanvas) source; GPUOrigin2D origin = {}; boolean flipY = false;}; +dictionary GPUImageDataLayout { + GPUSize64 offset = 0; + GPUSize32 bytesPerRow; + GPUSize32 rowsPerImage; +}; + +dictionary GPUImageCopyBuffer + : GPUImageDataLayout { + required GPUBuffer buffer; +}; + +dictionary GPUImageCopyTexture { + required GPUTexture texture; + GPUIntegerCoordinate mipLevel = 0; + GPUOrigin3D origin = {}; + GPUTextureAspect aspect = "all"; +}; + +dictionary GPUImageCopyTextureTagged + : GPUImageCopyTexture { + PredefinedColorSpace colorSpace = "srgb"; + boolean premultipliedAlpha = false; +}; + +dictionary GPUImageCopyExternalImage { + required (ImageBitmap or HTMLVideoElement or HTMLCanvasElement or OffscreenCanvas) source; + GPUOrigin2D origin = {}; + boolean flipY = false; +}; + [Exposed=(Window, DedicatedWorker), SecureContext] interface GPUCommandBuffer { }; GPUCommandBuffer includes GPUObjectBase; -dictionary GPUCommandBufferDescriptor : GPUObjectDescriptorBase { +dictionary GPUCommandBufferDescriptor + : GPUObjectDescriptorBase { }; interface mixin GPUCommandsMixin { @@ -900,14 +941,15 @@ GPUCommandEncoder includes GPUObjectBase; GPUCommandEncoder includes GPUCommandsMixin; GPUCommandEncoder includes GPUDebugCommandsMixin; -dictionary GPUCommandEncoderDescriptor : GPUObjectDescriptorBase { +dictionary GPUCommandEncoderDescriptor + : GPUObjectDescriptorBase { }; interface mixin GPUBindingCommandsMixin { - undefined setBindGroup(GPUIndex32 index, GPUBindGroup bindGroup, + undefined setBindGroup(GPUIndex32 index, GPUBindGroup? bindGroup, optional sequence<GPUBufferDynamicOffset> dynamicOffsets = []); - undefined setBindGroup(GPUIndex32 index, GPUBindGroup bindGroup, + undefined setBindGroup(GPUIndex32 index, GPUBindGroup? bindGroup, Uint32Array dynamicOffsetsData, GPUSize64 dynamicOffsetsDataStart, GPUSize32 dynamicOffsetsDataLength); @@ -932,21 +974,15 @@ GPUComputePassEncoder includes GPUCommandsMixin; GPUComputePassEncoder includes GPUDebugCommandsMixin; GPUComputePassEncoder includes GPUBindingCommandsMixin; -enum GPUComputePassTimestampLocation { - "beginning", - "end" -}; - -dictionary GPUComputePassTimestampWrite { +dictionary GPUComputePassTimestampWrites { required GPUQuerySet querySet; - required GPUSize32 queryIndex; - required GPUComputePassTimestampLocation location; + GPUSize32 beginningOfPassWriteIndex; + GPUSize32 endOfPassWriteIndex; }; -typedef sequence<GPUComputePassTimestampWrite> GPUComputePassTimestampWrites; - -dictionary GPUComputePassDescriptor : GPUObjectDescriptorBase { - GPUComputePassTimestampWrites timestampWrites = []; +dictionary GPUComputePassDescriptor + : GPUObjectDescriptorBase { + GPUComputePassTimestampWrites timestampWrites; }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -973,24 +1009,18 @@ GPURenderPassEncoder includes GPUDebugCommandsMixin; GPURenderPassEncoder includes GPUBindingCommandsMixin; GPURenderPassEncoder includes GPURenderCommandsMixin; -enum GPURenderPassTimestampLocation { - "beginning", - "end" -}; - -dictionary GPURenderPassTimestampWrite { +dictionary GPURenderPassTimestampWrites { required GPUQuerySet querySet; - required GPUSize32 queryIndex; - required GPURenderPassTimestampLocation location; + GPUSize32 beginningOfPassWriteIndex; + GPUSize32 endOfPassWriteIndex; }; -typedef sequence<GPURenderPassTimestampWrite> GPURenderPassTimestampWrites; - -dictionary GPURenderPassDescriptor : GPUObjectDescriptorBase { +dictionary GPURenderPassDescriptor + : GPUObjectDescriptorBase { required sequence<GPURenderPassColorAttachment?> colorAttachments; GPURenderPassDepthStencilAttachment depthStencilAttachment; GPUQuerySet occlusionQuerySet; - GPURenderPassTimestampWrites timestampWrites = []; + GPURenderPassTimestampWrites timestampWrites; GPUSize64 maxDrawCount = 50000000; }; @@ -1019,15 +1049,16 @@ dictionary GPURenderPassDepthStencilAttachment { enum GPULoadOp { "load", - "clear" + "clear", }; enum GPUStoreOp { "store", - "discard" + "discard", }; -dictionary GPURenderPassLayout : GPUObjectDescriptorBase { +dictionary GPURenderPassLayout + : GPUObjectDescriptorBase { required sequence<GPUTextureFormat?> colorFormats; GPUTextureFormat depthStencilFormat; GPUSize32 sampleCount = 1; @@ -1037,7 +1068,7 @@ interface mixin GPURenderCommandsMixin { undefined setPipeline(GPURenderPipeline pipeline); undefined setIndexBuffer(GPUBuffer buffer, GPUIndexFormat indexFormat, optional GPUSize64 offset = 0, optional GPUSize64 size); - undefined setVertexBuffer(GPUIndex32 slot, GPUBuffer buffer, optional GPUSize64 offset = 0, optional GPUSize64 size); + undefined setVertexBuffer(GPUIndex32 slot, GPUBuffer? buffer, optional GPUSize64 offset = 0, optional GPUSize64 size); undefined draw(GPUSize32 vertexCount, optional GPUSize32 instanceCount = 1, optional GPUSize32 firstVertex = 0, optional GPUSize32 firstInstance = 0); @@ -1055,7 +1086,8 @@ interface GPURenderBundle { }; GPURenderBundle includes GPUObjectBase; -dictionary GPURenderBundleDescriptor : GPUObjectDescriptorBase { +dictionary GPURenderBundleDescriptor + : GPUObjectDescriptorBase { }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -1068,12 +1100,14 @@ GPURenderBundleEncoder includes GPUDebugCommandsMixin; GPURenderBundleEncoder includes GPUBindingCommandsMixin; GPURenderBundleEncoder includes GPURenderCommandsMixin; -dictionary GPURenderBundleEncoderDescriptor : GPURenderPassLayout { +dictionary GPURenderBundleEncoderDescriptor + : GPURenderPassLayout { boolean depthReadOnly = false; boolean stencilReadOnly = false; }; -dictionary GPUQueueDescriptor : GPUObjectDescriptorBase { +dictionary GPUQueueDescriptor + : GPUObjectDescriptorBase { }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -1111,14 +1145,15 @@ interface GPUQuerySet { }; GPUQuerySet includes GPUObjectBase; -dictionary GPUQuerySetDescriptor : GPUObjectDescriptorBase { +dictionary GPUQuerySetDescriptor + : GPUObjectDescriptorBase { required GPUQueryType type; required GPUSize32 count; }; enum GPUQueryType { "occlusion", - "timestamp" + "timestamp", }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -1133,7 +1168,7 @@ interface GPUCanvasContext { enum GPUCanvasAlphaMode { "opaque", - "premultiplied" + "premultiplied", }; dictionary GPUCanvasConfiguration { @@ -1147,7 +1182,7 @@ dictionary GPUCanvasConfiguration { enum GPUDeviceLostReason { "unknown", - "destroyed" + "destroyed", }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -1166,24 +1201,27 @@ interface GPUError { }; [Exposed=(Window, DedicatedWorker), SecureContext] -interface GPUValidationError : GPUError { +interface GPUValidationError + : GPUError { constructor(DOMString message); }; [Exposed=(Window, DedicatedWorker), SecureContext] -interface GPUOutOfMemoryError : GPUError { +interface GPUOutOfMemoryError + : GPUError { constructor(DOMString message); }; [Exposed=(Window, DedicatedWorker), SecureContext] -interface GPUInternalError : GPUError { +interface GPUInternalError + : GPUError { constructor(DOMString message); }; enum GPUErrorFilter { "validation", "out-of-memory", - "internal" + "internal", }; partial interface GPUDevice { diff --git a/tests/wpt/web-platform-tests/interfaces/webnn.idl b/tests/wpt/web-platform-tests/interfaces/webnn.idl index 2c2ab35e909..d2b973a624b 100644 --- a/tests/wpt/web-platform-tests/interfaces/webnn.idl +++ b/tests/wpt/web-platform-tests/interfaces/webnn.idl @@ -489,13 +489,8 @@ partial interface MLGraphBuilder { MLActivation sigmoid(); }; -dictionary MLSliceOptions { - sequence<unsigned long> axes; -}; - partial interface MLGraphBuilder { - MLOperand slice(MLOperand input, sequence<long> starts, sequence<long> sizes, - optional MLSliceOptions options = {}); + MLOperand slice(MLOperand input, sequence<unsigned long> starts, sequence<unsigned long> sizes); }; partial interface MLGraphBuilder { diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl index e48f1080c41..59710bf46c2 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl @@ -72,7 +72,8 @@ dictionary RTCEncodedVideoFrameMetadata { unsigned long temporalIndex; unsigned long synchronizationSource; octet payloadType; - sequence<unsigned long> contributingSources; + sequence<unsigned long> contributingSources; + long long timestamp; // microseconds }; // New interfaces to define encoded video and audio frames. Will eventually diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl index 7e820a26df4..a5fb3294b7e 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl @@ -94,6 +94,8 @@ dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats { boolean powerEfficientDecoder; unsigned long framesAssembledFromMultiplePackets; double totalAssemblyTime; + unsigned long long retransmittedPacketsReceived; + unsigned long long retransmittedBytesReceived; }; dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats { diff --git a/tests/wpt/web-platform-tests/interfaces/webxrlayers.idl b/tests/wpt/web-platform-tests/interfaces/webxrlayers.idl index e182f47b9c5..c8b3a71c699 100644 --- a/tests/wpt/web-platform-tests/interfaces/webxrlayers.idl +++ b/tests/wpt/web-platform-tests/interfaces/webxrlayers.idl @@ -11,6 +11,12 @@ enum XRLayerLayout { "stereo-top-bottom" }; +enum XRLayerQuality { + "default", + "text-optimized", + "graphics-optimized" +}; + [Exposed=Window] interface XRCompositionLayer : XRLayer { readonly attribute XRLayerLayout layout; @@ -18,6 +24,7 @@ enum XRLayerLayout { attribute boolean forceMonoPresentation; attribute float opacity; readonly attribute unsigned long mipLevels; + attribute XRLayerQuality quality; readonly attribute boolean needsRedraw; @@ -106,6 +113,7 @@ dictionary XRProjectionLayerInit { GLenum colorFormat = 0x1908; // RGBA GLenum depthFormat = 0x1902; // DEPTH_COMPONENT double scaleFactor = 1.0; + boolean clearOnAccess = true; }; dictionary XRLayerInit { @@ -117,6 +125,7 @@ dictionary XRLayerInit { required unsigned long viewPixelHeight; XRLayerLayout layout = "mono"; boolean isStatic = false; + boolean clearOnAccess = true; }; dictionary XRQuadLayerInit : XRLayerInit { diff --git a/tests/wpt/web-platform-tests/lint.ignore b/tests/wpt/web-platform-tests/lint.ignore index 7118adb1611..1672f3b52e7 100644 --- a/tests/wpt/web-platform-tests/lint.ignore +++ b/tests/wpt/web-platform-tests/lint.ignore @@ -362,7 +362,6 @@ SET TIMEOUT: speculation-rules/prerender/resources/media-autoplay-attribute.html SET TIMEOUT: speculation-rules/prerender/resources/media-play.html SET TIMEOUT: html/browsers/browsing-the-web/back-forward-cache/timers.html SET TIMEOUT: dom/abort/crashtests/timeout-close.html -SET TIMEOUT: common/rendering-utils.js # setTimeout use in reftests SET TIMEOUT: acid/acid3/test.html @@ -428,8 +427,12 @@ TRAILING WHITESPACE: css/css-fonts/support/fonts/gsubtest-lookup3.ufo/features.f SET TIMEOUT: css/compositing/mix-blend-mode/mix-blend-mode-parent-with-3D-transform-and-transition.html SET TIMEOUT: css/compositing/mix-blend-mode/mix-blend-mode-sibling-with-3D-transform-and-transition.html +SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html +SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-background-repaint.html SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-border-repaint-parent.html SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-border-repaint.html +SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html +SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-outline-repaint.html SET TIMEOUT: css/css-backgrounds/currentcolor-border-repaint-parent.html SET TIMEOUT: css/css-transitions/events-007.html SET TIMEOUT: css/css-transitions/support/generalParallelTest.js diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html index 97e781054f3..39e8676d19f 100644 --- a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html +++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html @@ -57,6 +57,15 @@ recorder.start(); }); }, "MediaRecorder cannot start recording when MediaRecorder' state is not inactive and an InvalidStateError should be thrown"); + test(t => { + const { stream: video } = createVideoStream(t); + assert_throws_dom("NotSupportedError", function () { + new MediaRecorder(video, { + videoKeyFrameIntervalDuration: 10, + videoKeyFrameIntervalCount: 10, + }); + }); + }, "MediaRecorder throws NotSupportedError when given both videoKeyFrameIntervalDuration and videoKeyFrameIntervalCount"); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-video-key-frame-distance.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-video-key-frame-distance.html new file mode 100644 index 00000000000..b986b3075ff --- /dev/null +++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-video-key-frame-distance.html @@ -0,0 +1,39 @@ +<!doctype html> +<html> +<head> + <title>MediaRecorder Stop</title> + <link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#mediarecorder"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="utils/sources.js"></script> +</head> +<body> +<script> + promise_test(async t => { + const {stream: video} = createVideoStream(t); + let videoKeyFrameIntervalDurationUsed = false; + var options = { + get videoKeyFrameIntervalDuration() { + videoKeyFrameIntervalDurationUsed = true; + return 1000; + } + } + const recorder = new MediaRecorder(video, options); + assert_true(videoKeyFrameIntervalDurationUsed); + }, "MediaRecorder interprets videoKeyFrameIntervalDuration"); + + promise_test(async t => { + const {stream: video} = createVideoStream(t); + let videoKeyFrameIntervalCountUsed = false; + var options = { + get videoKeyFrameIntervalCount() { + videoKeyFrameIntervalCountUsed = true; + return 5; + } + } + const recorder = new MediaRecorder(video, options); + assert_true(videoKeyFrameIntervalCountUsed); + }, "MediaRecorder interprets videoKeyFrameIntervalCount"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html index 733642fd032..c673e09cb46 100644 --- a/tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html +++ b/tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html @@ -14,6 +14,12 @@ const BackForwardCacheRestorationName = ''; const BackForwardCacheRestorationType = 'back-forward-cache-restoration'; + let getNavigationId = (i) => { + let identifier = 'mark' + i; + performance.mark(identifier); + return window.performance.getEntriesByName(identifier)[0].navigationId; + } + let getNumberofBackForwardCacheRestorationEntries = (BackForwardCacheRestorationType) => { return window.performance.getEntriesByType(BackForwardCacheRestorationType).length; } @@ -40,10 +46,10 @@ return await p; } - let checkEntry = (entry, expectedNavigationId) => { + let checkEntry = (entry, previousNavigationId) => { assert_equals(entry.name, BackForwardCacheRestorationName); assert_equals(entry.entryType, BackForwardCacheRestorationType); - assert_equals(entry.navigationId, expectedNavigationId); + assert_not_equals(entry.navigationId, previousNavigationId); assert_true(entry.pageshowEventStart > entry.startTime); assert_true(entry.pageshowEventEnd >= entry.pageshowEventStart); } @@ -64,18 +70,23 @@ let entry; for (i = 0; i < 2; i++) { + let curr_nav_id = await pageA.execute_script(getNavigationId, [i]); + // Navigate away to url B and back. await navigateAndThenBack(pageA, pageB, urlB); // Assert Performance Observer API supports BackForwardCacheRestoration. entry = await pageA.execute_script(getBackForwardCacheRestorationByPerformanceObserverBuffered, [BackForwardCacheRestorationType]); - checkEntry(entry, i + 2); // The expected navigation id of the entry created at i-th navigating away and back is i+2 because navigation id starts from 1 and increments before an instance of BackForwardRestoration is created. + // The navigation id after a bfcache restoration should be different + // from that before. + checkEntry(entry, curr_nav_id); + // Assert Performance Timeline API supports BackForwardCacheRestoration. entry = await pageA.execute_script(getBackForwardCacheRestorationByType, [BackForwardCacheRestorationType]); - checkEntry(entry, i + 2); + checkEntry(entry, curr_nav_id); entry = await pageA.execute_script(getBackForwardCacheRestorationByGetAllAndFilter, [BackForwardCacheRestorationType]); - checkEntry(entry, i + 2); + checkEntry(entry, curr_nav_id); } }, 'Performance API for the back forward cache restoration entry.'); </script> diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html index bc52f208b07..7ff415530bc 100644 --- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html +++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html @@ -8,7 +8,7 @@ <script src="navigation-id.helper.js"></script> <script> runNavigationIdTest({ - navigationTimes: 4, + navigationTimes: 3, testName: 'element_timing', }, "Element Timing navigation id test"); </script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html index 3228e12778b..93ddcff062e 100644 --- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html +++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html @@ -20,24 +20,30 @@ navigation id, not the increment. } promise_test(async t => { - // Assert navigation id exists in LCP entries and is the default value 1. - const navigationIds = await NavigationIdsFromLCP(); - assert_true(navigationIds.every(e => e.navigationId == 1), 'Navigation Id\ - of LCP entries should be default value 1 at initial navigations'); + // Assert navigation id exists in LCP entries and and are all the same. + const navigationIdsOfLCP = (await NavigationIdsFromLCP()).map(e => e.navigationId); + assert_true(navigationIdsOfLCP.every(e => e == navigationIdsOfLCP[0]), + 'Navigation Ids of LCP entries should be the same at initial navigation'); - // Assert navigation id exists in a NavigationTiming entry and is the - // default value 1. - const navigationId = performance.getEntriesByType('navigation')[0].navigationId; - assert_equals(navigationId, 1, 'Navigation Id of an navigation timing\ - entry should be default value 1 at initial navigations'); + // Assert navigation id exists in a NavigationTiming entry. + const navigationIdOfNavigationTiming = + performance.getEntriesByType('navigation')[0].navigationId; + assert_not_equals(navigationIdOfNavigationTiming, null, + 'Navigation Id of a navigation timing entry should exist at initial navigation'); - // Assert navigation id exists in PaintTiming entries and is the default - // value 1. - assert_true(performance.getEntriesByType('paint').every(e => - e.navigationId == 1), - 'Navigation Id of PaintTiming entries should be default value 1 at\ - initial navigations.'); + // Assert navigation id exists in PaintTiming entries and are all the same. + const navigationIdsOfPaintTiming = + performance.getEntriesByType('paint').map(e => e.navigationId); + assert_true(navigationIdsOfPaintTiming.every(e => + e == navigationIdsOfPaintTiming[0]), + 'Navigation Id of PaintTiming entries should be the same as the initial navigation.'); - }, 'Navigation Id should be 1 at initial navigations.'); + // Assert navigation ids are all the same. + const navigationIdsOfAll = + navigationIdsOfLCP.concat(navigationIdsOfPaintTiming, navigationIdOfNavigationTiming); + assert_true(navigationIdsOfAll.every(e => e == navigationIdsOfAll[0]), + 'Navigation Id of all entries should be the same as the initial navigation.'); + + }, 'Navigation Ids should exist and are all the same as the initial navigation.'); </script> -</body> +</body>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html index 662e17508b2..e1da9100aee 100644 --- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html +++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html @@ -8,7 +8,7 @@ <script src="navigation-id.helper.js"></script> <script> runNavigationIdTest({ - navigationTimes: 4, + navigationTimes: 3, testName: 'long_task_task_attribution', }, "Long Task/Task Attribution navigation id test"); </script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html index 42795f94a98..30613ebb980 100644 --- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html +++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html @@ -8,7 +8,7 @@ <script src="navigation-id.helper.js"></script> <script> runNavigationIdTest({ - navigationTimes: 4, + navigationTimes: 3, testName: 'mark_measure', }, "Mark/Measure navigation id test"); </script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html index 7386331d26e..f5a2428e5f5 100644 --- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html +++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html @@ -26,24 +26,28 @@ window.open(urlA, '_blank', 'noopener') await pageA.execute_script(waitForPageShow); - // Assert navigation id is 1 when the document is loaded first time. - - let navigationId = await pageA.execute_script(getNavigationId); - assert_equals(navigationId, 1, 'Navigation Id should be 1 initially.'); + let navigationIdInitial = await pageA.execute_script(getNavigationId); // Navigate away to url B and back. await navigateAndThenBack(pageA, pageB, urlB); - // Assert navigation id increments to 2 when the document is load from bfcache. - navigationId = await pageA.execute_script(getNavigationId); - assert_equals(navigationId, 2, 'Navigation Id should be 2 after increment.'); + // Assert navigation id is re-generated and thus different when the + // document is load from bfcache. + navigationIdAfterBFCacheNav = await pageA.execute_script(getNavigationId); + assert_not_equals(navigationIdInitial, navigationIdAfterBFCacheNav, 'Navigation Id should be \ + re-generated and different from the previous one after back-forward-cache navigation.'); // Reload page. await pageA.execute_script(reload); await pageA.execute_script(waitForPageShow); - // Assert navigation id is reset to 1 after reload. - navigationId = await pageA.execute_script(getNavigationId); - assert_equals(navigationId, 1, 'Navigation Id should be 1 after reload.'); - }, 'Navigation Id should be reset to 1 after reload.'); + navigationIdAfterReset = await pageA.execute_script(getNavigationId); + + assert_not_equals(navigationIdAfterReset, navigationIdAfterBFCacheNav, 'Navigation Id should\ + be re-generated after reload which is different from the previous one.'); + + assert_not_equals(navigationIdAfterReset, navigationIdInitial, 'Navigation Id should\ + be re-generated after reload which is different from the one of the initial load.'); + + }, 'Navigation Id should be re-generated after reload.'); </script> diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html index 1ec906ebbbb..6d0614a6e23 100644 --- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html +++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html @@ -8,7 +8,7 @@ <script src="navigation-id.helper.js"></script> <script> runNavigationIdTest({ - navigationTimes: 4, + navigationTimes: 3, testName: 'resource_timing', }, "Resource Timing navigation id test"); </script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-worker-created-entries.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-worker-created-entries.html new file mode 100644 index 00000000000..96fc57be1d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-worker-created-entries.html @@ -0,0 +1,27 @@ +<!doctype html> +<html> + +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script> + promise_test(async () => { + const worker = new Worker("resources/worker-navigation-id.js"); + + const navigationId = await new Promise(resolve => { + worker.onmessage = (e) => { + resolve(e.data); + }; + worker.postMessage(''); + }); + + assert_equals(navigationId.length, 0, + 'Navigation id of performance entries created by a worker should be empty.'); + }, 'Navigation id of performance entries created by workers should be empty'); + </script> +</body> + +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js b/tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js index 53099cadb25..1b72fe9908d 100644 --- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js +++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js @@ -9,10 +9,10 @@ let testInitial = () => { return window.performance.getEntries().map(e => e.navigationId); } -let testMarkMeasure = (expectedNavigationId, markName, MeasureName) => { +let testMarkMeasure = (markId, markName, MeasureName) => { const markName1 = 'test-mark'; - const markName2 = 'test-mark' + expectedNavigationId; - const measureName = 'test-measure' + expectedNavigationId; + const markName2 = 'test-mark' + markId; + const measureName = 'test-measure' + markId; window.performance.mark(markName1); window.performance.mark(markName2); @@ -21,12 +21,13 @@ let testMarkMeasure = (expectedNavigationId, markName, MeasureName) => { window.performance.getEntriesByName(measureName)).map(e => e.navigationId); } -let testResourceTiming = async (expectedNavigationId) => { - let navigationId = -1; +let testResourceTiming = async (resourceTimingEntryId) => { + let navigationId; let p = new Promise(resolve => { new PerformanceObserver((list) => { - const entry = list.getEntries().find(e => e.name.includes('json_resource') && e.navigationId == expectedNavigationId); + const entry = list.getEntries().find( + e => e.name.includes('json_resource' + resourceTimingEntryId)); if (entry) { navigationId = entry.navigationId; resolve(); @@ -34,16 +35,18 @@ let testResourceTiming = async (expectedNavigationId) => { }).observe({ type: 'resource' }); }); - const resp = await fetch('/performance-timeline/resources/json_resource.json'); + const resp = await fetch( + '/performance-timeline/resources/json_resource' + resourceTimingEntryId + '.json'); await p; return [navigationId]; } -let testElementTiming = async (expectedNavigationId) => { - let navigationId = -1; +let testElementTiming = async (elementTimingEntryId) => { + let navigationId; let p = new Promise(resolve => { new PerformanceObserver((list) => { - const entry = list.getEntries().find(e => e.entryType === 'element' && e.identifier === 'test-element-timing' + expectedNavigationId); + const entry = list.getEntries().find( + e => e.entryType === 'element' && e.identifier === 'test-element-timing' + elementTimingEntryId); if (entry) { navigationId = entry.navigationId; resolve(); @@ -52,7 +55,7 @@ let testElementTiming = async (expectedNavigationId) => { }); let el = document.createElement('p'); - el.setAttribute('elementtiming', 'test-element-timing' + expectedNavigationId); + el.setAttribute('elementtiming', 'test-element-timing' + elementTimingEntryId); el.textContent = 'test element timing text'; document.body.appendChild(el); await p; @@ -110,21 +113,32 @@ function runNavigationIdTest(params, description) { params.openFunc(urlA); await pageA.execute_script(waitForPageShow); - // Assert navigation id is 1 when the document is loaded first time. + // Assert navigation ids of all performance entries are the same. let navigationIds = await pageA.execute_script(testInitial); assert_true( - navigationIds.every(t => t === 1), 'All Navigation Ids should be 1.'); + navigationIds.every(t => t === navigationIds[0]), + 'Navigation Ids should be the same as the initial load.'); for (i = 1; i <= params.navigationTimes; i++) { // Navigate away to url B and back. await navigateAndThenBack(pageA, pageB, urlB); - // Assert navigation id increments when the document is load from bfcache. - navigationIds = await pageA.execute_script( + // Assert new navigation ids are generated when the document is load from bfcache. + let nextNavigationIds = await pageA.execute_script( testFunctionMap[params.testName], [i + 1]); + + // Assert navigation ids of all performance entries are the same. + assert_true( + nextNavigationIds.every(t => t === nextNavigationIds[0]), + 'All Navigation Ids should be same after bfcache navigation.'); + + // Assert navigation ids after bfcache navigation are different from those before. assert_true( - navigationIds.every(t => t === (i + 1)), - params.testName + ' Navigation Id should all be ' + (i + 1) + '.'); + navigationIds[0] !== nextNavigationIds[0], + params.testName + + ' Navigation Ids should be re-generated and different from the previous ones.'); + + navigationIds = nextNavigationIds; } }, description); -} +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/performance-timeline/resources/worker-navigation-id.js b/tests/wpt/web-platform-tests/performance-timeline/resources/worker-navigation-id.js new file mode 100644 index 00000000000..3a2740d0675 --- /dev/null +++ b/tests/wpt/web-platform-tests/performance-timeline/resources/worker-navigation-id.js @@ -0,0 +1,6 @@ +self.onmessage = () => { + const mark_name = 'user_timig_mark'; + performance.mark(mark_name); + postMessage(performance.getEntriesByName(mark_name)[0].navigationId); + self.close(); +} diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html index b3b7481d6ab..5ec1bab1649 100644 --- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html @@ -26,10 +26,15 @@ target.addEventListener("pointerdown", (e)=>{ function testFunction(test){ return test.step_func(e=>{ - assert_equals(e.constructor, window.PointerEvent, "auxclick should use a PointerEvent constructor"); - assert_true(e instanceof PointerEvent, "auxclick should be a PointerEvent"); - assert_equals(e.pointerId, pointerId, "auxclick's pointerId should match the pointerId of the pointer event that triggers it"); - assert_equals(e.pointerType, pointerType, "axclick's pointerType should match the pointerType of the pointer event that triggers it"); + assert_equals(e.constructor, window.PointerEvent, + "auxclick should use a PointerEvent constructor"); + assert_true(e instanceof PointerEvent, + "auxclick should be a PointerEvent"); + assert_equals(e.pointerId, pointerId, + "auxclick's pointerId should match the pointerId of the pointer event that triggers it"); + assert_equals(e.pointerType, pointerType, + "auxclick's pointerType should match the pointerType of the pointer event that triggers it"); + assert_equals(e.composed, true, "auxclick.composed should be true"); }); } @@ -51,10 +56,15 @@ function run_test(pointerType){ .pointerMove(0,0, {origin:target, sourceName:testPointer}) .pointerDown({button:actions.ButtonType.MIDDLE, sourceName:testPointer}) .pointerUp({button:actions.ButtonType.MIDDLE, sourceName:testPointer}); - Promise.all([pointerDownPrevented, eventWatcher.wait_for("auxclick"), actions.send()]).then(()=>resolve()); + Promise.all([ + pointerDownPrevented, + eventWatcher.wait_for("auxclick"), + actions.send() + ]).then(()=>resolve()); }), "auxclick using " + pointerType + " is a PointerEvent"); } run_test(inputSource); -// TODO(crbug.com/1150441): Add test for auxclick from touch.Note: Calling run_test("touch") here times out. +// TODO(crbug.com/1150441): Add test for auxclick from touch. Note: Calling +// run_test("touch") here times out. </script> diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html index 9e4b023a25a..2571c9c9034 100644 --- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html @@ -25,6 +25,7 @@ function assert_click_construction(click_event, window_object) { "click should use a PointerEvent constructor"); assert_true(click_event instanceof window_object.PointerEvent, "click should be a PointerEvent instance"); + assert_equals(click_event.composed, true, "click.composed should be true"); } function assert_click_attributes(click_event, pointerdown_event, pointerup_event) { @@ -36,7 +37,7 @@ function assert_click_attributes(click_event, pointerdown_event, pointerup_event assert_equals(click_event.pointerId, pointerup_event.pointerId, "click.pointerId should match the pointerId of the triggering pointerup"); assert_equals(click_event.pointerType, pointerup_event.pointerType, - "click.pointerType should match the pointerType of the triggering pointerup"); + "click.pointerType should match the pointerType of the triggering pointerup"); } promise_test(async () => { diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html index fe3a69942ef..d951be542a3 100644 --- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html @@ -20,10 +20,15 @@ let pointerdownPointerId, pointerdownPointerType; let inputSource = location.search.substring(1); target.addEventListener("contextmenu", contextmenuTest.step_func((e)=>{ - assert_equals(e.constructor, window.PointerEvent, "contextmenu should use a PointerEvent constructor"); - assert_true(e instanceof PointerEvent, "contextmenu should be a PointerEvent"); - assert_equals(e.pointerId, pointerdownPointerId, "contextmenu's pointerId should match the pointerId of the pointer event that triggers it"); - assert_equals(e.pointerType, pointerdownPointerType, "contextmenu's pointerType should match the pointerType of the pointer event that triggers it"); + assert_equals(e.constructor, window.PointerEvent, + "contextmenu should use a PointerEvent constructor"); + assert_true(e instanceof PointerEvent, + "contextmenu should be a PointerEvent"); + assert_equals(e.pointerId, pointerdownPointerId, + "contextmenu's pointerId should match the pointerId of the pointer event that triggers it"); + assert_equals(e.pointerType, pointerdownPointerType, + "contextmenu's pointerType should match the pointerType of the pointer event that triggers it"); + assert_equals(e.composed, true, "contextmenu.composed should be true"); })); target.addEventListener("pointerdown", e=>{ pointerdownPointerId = e.pointerId; diff --git a/tests/wpt/web-platform-tests/preload/modulepreload-as.html b/tests/wpt/web-platform-tests/preload/modulepreload-as.html new file mode 100644 index 00000000000..dd946e454a1 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/modulepreload-as.html @@ -0,0 +1,67 @@ +<!doctype html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="modulepreload" href="resources/module1.js?empty-string" as="" data-as=""> +<link rel="modulepreload" href="resources/module1.js?audio" as="audio" data-as="audio"> +<link rel="modulepreload" href="resources/module1.js?audioworklet" as="audioworklet" data-as="audioworklet"> +<link rel="modulepreload" href="resources/module1.js?document" as="document" data-as="document"> +<link rel="modulepreload" href="resources/module1.js?embed" as="embed" data-as="embed"> +<link rel="modulepreload" href="resources/module1.js?font" as="font" data-as="font"> +<link rel="modulepreload" href="resources/module1.js?frame" as="frame" data-as="frame"> +<link rel="modulepreload" href="resources/module1.js?iframe" as="iframe" data-as="iframe"> +<link rel="modulepreload" href="resources/module1.js?image" as="image" data-as="image"> +<link rel="modulepreload" href="resources/module1.js?manifest" as="manifest" data-as="manifest"> +<link rel="modulepreload" href="resources/module1.js?object" as="object" data-as="object"> +<link rel="modulepreload" href="resources/module1.js?paintworklet" as="paintworklet" data-as="paintworklet"> +<link rel="modulepreload" href="resources/module1.js?report" as="report" data-as="report"> +<link rel="modulepreload" href="resources/module1.js?script" as="script" data-as="script"> +<link rel="modulepreload" href="resources/module1.js?serviceworker" as="serviceworker" data-as="serviceworker"> +<link rel="modulepreload" href="resources/module1.js?sharedworker" as="sharedworker" data-as="sharedworker"> +<link rel="modulepreload" href="resources/module1.js?style" as="style" data-as="style"> +<link rel="modulepreload" href="resources/module1.js?track" as="track" data-as="track"> +<link rel="modulepreload" href="resources/module1.js?video" as="video" data-as="video"> +<link rel="modulepreload" href="resources/module1.js?webidentity" as="webidentity" data-as="webidentity"> +<link rel="modulepreload" href="resources/module1.js?worker" as="worker" data-as="worker"> +<link rel="modulepreload" href="resources/module1.js?xslt" as="xslt" data-as="xslt"> +<link rel="modulepreload" href="resources/module1.js?fetch" as="fetch" data-as="fetch"> +<link rel="modulepreload" href="resources/module1.js?invalid-dest" as="invalid-dest" data-as="invalid-dest"> +<link rel="modulepreload" href="resources/module1.js?iMaGe" as="iMaGe" data-as="iMaGe"> +<link rel="modulepreload" href="resources/module1.js?sCrIpT" as="sCrIpT" data-as="sCrIpT"> +<body> +<script> + // compared to modulepreload.html, this tests behavior when elements are + // initially on an HTML page instead of being added by JS + + const scriptLikes = [ + 'audioworklet', + 'paintworklet', + 'script', + 'serviceworker', + 'sharedworker', + 'worker', + ]; + + const goodAsValues = ['', 'invalid-dest', 'sCrIpT', ...scriptLikes]; + + for (const link of document.querySelectorAll('link')) { + const asValue = link.dataset.as; // don't depend on "as" attribute reflection + const good = goodAsValues.includes(asValue); + + // promise tests are queued sequentially, so create the promise here to + // ensure we don't miss the error event + const promise = new Promise((resolve, reject) => { + link.onload = good ? resolve : reject; + link.onerror = good ? reject : resolve; + }); + + promise_test(() => promise.then(() => { + const downloads = performance + .getEntriesByName(new URL(link.href, location.href)) + .filter(entry => entry.transferSize > 0) + .length; + assert_equals(downloads, good ? 1 : 0); + + }), `Modulepreload with as="${asValue}"`); + } +</script> diff --git a/tests/wpt/web-platform-tests/preload/modulepreload-sri.html b/tests/wpt/web-platform-tests/preload/modulepreload-sri.html new file mode 100644 index 00000000000..ea32a6a3025 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/modulepreload-sri.html @@ -0,0 +1,18 @@ +<!doctype html> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="modulepreload" href="resources/module1.js" integrity="sha384-invalid"> +<script type="module" src="resources/module1.js" id="myscript"></script> +<body> +<script> + // compared to modulepreload.html, this tests behavior when elements are + // initially on an HTML page instead of being added by JS + promise_test(() => { + return new Promise((resolve, reject) => { + let myscript = document.querySelector('#myscript'); + myscript.onerror = resolve; + myscript.onload = reject; + }); + }, "Script should not be loaded if modulepreload's integrity is invalid"); +</script> diff --git a/tests/wpt/web-platform-tests/preload/modulepreload.html b/tests/wpt/web-platform-tests/preload/modulepreload.html index 0e4b6923e32..4764b582619 100644 --- a/tests/wpt/web-platform-tests/preload/modulepreload.html +++ b/tests/wpt/web-platform-tests/preload/modulepreload.html @@ -33,6 +33,15 @@ function attachAndWaitForError(element) { }); } +function attachAndWaitForTimeout(element, t) { + return new Promise((resolve, reject) => { + element.onload = reject; + element.onerror = reject; + t.step_timeout(resolve, 1000); + document.body.appendChild(element); + }); +} + promise_test(function(t) { var link = document.createElement('link'); link.rel = 'modulepreload'; @@ -58,7 +67,7 @@ promise_test(function(t) { document.cookie = 'same=1'; var link = document.createElement('link'); link.rel = 'modulepreload'; - link.crossorigin = 'anonymous'; + link.crossOrigin = 'anonymous'; link.href = 'resources/dummy.js?sameOriginAnonymous'; return attachAndWaitForLoad(link).then(() => { verifyNumberOfDownloads('resources/dummy.js?sameOriginAnonymous', 1); @@ -66,7 +75,7 @@ promise_test(function(t) { // Verify that <script> doesn't fetch the module again. var script = document.createElement('script'); script.type = 'module'; - script.crossorigin = 'anonymous'; + script.crossOrigin = 'anonymous'; script.src = 'resources/dummy.js?sameOriginAnonymous'; return attachAndWaitForLoad(script); }).then(() => { @@ -77,7 +86,7 @@ promise_test(function(t) { promise_test(function(t) { var link = document.createElement('link'); link.rel = 'modulepreload'; - link.crossorigin = 'use-credentials'; + link.crossOrigin = 'use-credentials'; link.href = 'resources/dummy.js?sameOriginUseCredentials'; return attachAndWaitForLoad(link).then(() => { verifyNumberOfDownloads('resources/dummy.js?sameOriginUseCredentials', 1); @@ -85,7 +94,7 @@ promise_test(function(t) { // Verify that <script> doesn't fetch the module again. var script = document.createElement('script'); script.type = 'module'; - script.crossorigin = 'use-credentials'; + script.crossOrigin = 'use-credentials'; script.src = 'resources/dummy.js?sameOriginUseCredentials'; return attachAndWaitForLoad(script); }).then(() => { @@ -122,7 +131,7 @@ promise_test(function(t) { promise_test(function(t) { var link = document.createElement('link'); link.rel = 'modulepreload'; - link.crossorigin = 'anonymous'; + link.crossOrigin = 'anonymous'; link.href = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`; return attachAndWaitForLoad(link).then(() => { verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`, 1, true); @@ -130,7 +139,7 @@ promise_test(function(t) { // Verify that <script> doesn't fetch the module again. var script = document.createElement('script'); script.type = 'module'; - script.crossorigin = 'anonymous'; + script.crossOrigin = 'anonymous'; script.src = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`; return attachAndWaitForLoad(script); }).then(() => { @@ -141,7 +150,7 @@ promise_test(function(t) { promise_test(function(t) { var link = document.createElement('link'); link.rel = 'modulepreload'; - link.crossorigin = 'use-credentials'; + link.crossOrigin = 'use-credentials'; link.href = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`; return attachAndWaitForLoad(link).then(() => { verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`, 1, true); @@ -149,7 +158,7 @@ promise_test(function(t) { // Verify that <script> doesn't fetch the module again. var script = document.createElement('script'); script.type = 'module'; - script.crossorigin = 'use-credentials'; + script.crossOrigin = 'use-credentials'; script.src = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`; return attachAndWaitForLoad(script); }).then(() => { @@ -214,13 +223,21 @@ promise_test(function(t) { link.href = 'resources/module1.js?as-image'; link.as = 'image' return attachAndWaitForError(link); -}, 'link rel=modulepreload with invalid as= value'); +}, 'link rel=modulepreload with non-script-like as= value (image)'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = 'resources/module1.js?as-xslt'; + link.as = 'xslt' + return attachAndWaitForError(link); +}, 'link rel=modulepreload with non-script-like as= value (xslt)'); promise_test(function(t) { var link = document.createElement('link'); link.rel = 'modulepreload'; link.href = 'resources/module1.js?integrity-match'; - link.integrity = 'sha256-dOxReWMnMSPfUvxEbBqIrjNh8ZN8n05j7h3JmhF8gQc=%' + link.integrity = 'sha256-+Ks3iNIiTq2ujlWhvB056cmXobrCFpU9hd60xZ1WCaA=' return attachAndWaitForLoad(link); }, 'link rel=modulepreload with integrity match'); @@ -228,7 +245,7 @@ promise_test(function(t) { var link = document.createElement('link'); link.rel = 'modulepreload'; link.href = 'resources/module1.mjs?integrity-match'; - link.integrity = 'sha256-dOxReWMnMSPfUvxEbBqIrjNh8ZN8n05j7h3JmhF8gQc=%' + link.integrity = 'sha256-+Ks3iNIiTq2ujlWhvB056cmXobrCFpU9hd60xZ1WCaA=' return attachAndWaitForLoad(link); }, 'link rel=modulepreload with integrity match2'); @@ -240,5 +257,127 @@ promise_test(function(t) { return attachAndWaitForError(link); }, 'link rel=modulepreload with integrity mismatch'); +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = 'resources/module1.mjs?integrity-doesnotmatch'; + link.integrity = 'sha256-dOxReWMnMSPfUvxEbBqIrjNh8ZN8n05j7h3JmhF8gQc=' + return attachAndWaitForError(link); +}, 'link rel=modulepreload with integrity mismatch2'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = 'resources/module1.mjs?integrity-invalid'; + link.integrity = 'sha256-dOxReWMnMSPfUvxEbBqIrjNh8ZN8n05j7h3JmhF8gQc=%' + return attachAndWaitForError(link); +}, 'link rel=modulepreload with integrity mismatch3'); + +promise_test(function(t) { + var link1 = document.createElement('link'); + var link2 = document.createElement('link'); + link1.rel = 'modulepreload'; + link2.rel = 'modulepreload'; + link1.href = 'resources/module1.js?same-url'; + link2.href = 'resources/module1.js?same-url'; + return Promise.all([ + attachAndWaitForLoad(link1), + attachAndWaitForLoad(link2), + ]); +}, 'multiple link rel=modulepreload with same href'); + +promise_test(function(t) { + var link1 = document.createElement('link'); + var link2 = document.createElement('link'); + link1.rel = 'modulepreload'; + link2.rel = 'modulepreload'; + link1.href = 'resources/module2.js?child-before'; + link2.href = 'resources/module1.js?child-before'; + return attachAndWaitForLoad(link1) + .then(() => attachAndWaitForLoad(link2)) + .then(() => new Promise(r => t.step_timeout(r, 1000))) + .then(() => { + verifyNumberOfDownloads('resources/module2.js?child-before', 1); + }); + +}, 'multiple link rel=modulepreload with child module before parent'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = 'resources/module1.mjs?matching-media'; + link.media = 'all'; + return attachAndWaitForLoad(link); +}, 'link rel=modulepreload with matching media'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = 'resources/module1.mjs?non-matching-media'; + link.media = 'not all'; + return attachAndWaitForTimeout(link, t); +}, 'link rel=modulepreload with non-matching media'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = 'resources/module1.mjs?empty-media'; + link.media = ''; + return attachAndWaitForLoad(link); +}, 'link rel=modulepreload with empty media'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = ''; + return attachAndWaitForTimeout(link, t); +}, 'link rel=modulepreload with empty href'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = ''; + link.as = 'fetch'; + return attachAndWaitForTimeout(link, t); +}, 'link rel=modulepreload with empty href and invalid as= value'); + +promise_test(function(t) { + var link = document.createElement('link'); + var script = document.createElement('script'); + link.rel = 'modulepreload'; + script.type = 'module'; + link.href = 'resources/module1.mjs?non-matching-crossorigin'; + script.src = link.href; + script.crossOrigin = 'anonymous'; + document.body.append(link); + return attachAndWaitForLoad(script); +}, 'link rel=modulepreload and script with non-matching crossorigin values'); + +promise_test(function(t) { + var link = document.createElement('link'); + var script = document.createElement('script'); + link.rel = 'modulepreload'; + script.type = 'module'; + link.href = 'resources/module1.mjs?non-matching-crossorigin'; + script.src = link.href; + link.crossOrigin = 'anonymous'; + script.crossOrigin = 'use-credentials'; + document.body.append(link); + return attachAndWaitForLoad(script); +}, 'link rel=modulepreload and script with non-matching crossorigin values2'); + +promise_test(function(t) { + var link = document.createElement('link'); + var moduleScript = document.createElement('script'); + var classicScript = document.createElement('script'); + link.rel = 'modulepreload'; + moduleScript.type = 'module'; + link.href = 'resources/dummy.js?non-module script'; + classicScript.src = link.href; + moduleScript.src = link.href; + document.body.append(link); + document.body.append(classicScript); + return attachAndWaitForLoad(moduleScript); +}, 'link rel=modulepreload and non-module script'); </script> </body> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html index 375489c26a4..cfb7cf2c1e4 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html @@ -24,14 +24,14 @@ } #scroller { - scroll-timeline: timeline; + scroll-timeline: --timeline; } #element { z-index: -1; animation-name: anim; animation-duration: auto; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <main> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html index f08659635ea..dabb4ec5a60 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html @@ -32,8 +32,8 @@ } .animate { animation: anim auto linear; - view-timeline: timeline; - animation-timeline: timeline; + view-timeline: --timeline; + animation-timeline: --timeline; animation-range-start: entry 0%; animation-range-end: entry 100%; } diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html index 44b08cab969..a91e3d3e29a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html @@ -37,8 +37,8 @@ background-color: green; animation: anim-1 auto linear, anim-2 auto linear; animation-range: normal, cover; - view-timeline: t1; - animation-timeline: t1, t1; + view-timeline: --t1; + animation-timeline: --t1, --t1; } </style> <body> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test-ref.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test-ref.html new file mode 100644 index 00000000000..c246f7f1b0a --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test-ref.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#named-timeline-range"> +<link rel="stylesheet" href="support/animation-range.css"> +<style> +.meter { + animation: active-interval linear 100s paused; + animation-timeline: auto; +} + +.bar { + animation: slide-in linear 100s paused; + animation-timeline: auto; +} +</style> +</head> +<body> +<h3>View timeline</h3> +<template id="meters"> + <div class="meters"> + <div class="cover"><div class="meter"><div class="bar"></div></div><div>Cover</div></div> + <div class="contain"><div class="meter"><div class="bar"></div></div><div>Contain</div></div> + <div class="entry"><div class="meter"><div class="bar"></div></div><div>Entry</div></div> + <div class="exit"><div class="meter"><div class="bar"></div></div><div>Exit</div></div> + </div> +</template> +<div class="flex"> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 90px;" data-progress=".08333,-1,.5,-1"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 70px;" data-progress=".25,.125,2,-1"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 10px;" data-progress=".75,.875,2,-1"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: -10px;" data-progress=".91667,2,2,.5"></div> + <div class="spacer"></div> + </div> + </div> +</div> +</body> +<script> + let template = document.querySelector('#meters'); + let subjects = document.querySelectorAll('.subject'); + for (let i = 0; i < subjects.length; i++) { + let clone = template.content.cloneNode(true); + let meters = clone.querySelectorAll('.meter'); + let progress = subjects[i].getAttribute('data-progress').split(',').map(s => parseFloat(s)); + for (let meter of meters) { + let bar = meter.querySelector('.bar'); + let startTime = -progress.splice(0, 1)[0] * 100; + meter.style.animationDelay = `${startTime}s`; + bar.style.animationDelay = `${startTime}s`; + } + subjects[i].appendChild(clone); + } +</script> +</html> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test.html new file mode 100644 index 00000000000..f675f5108ae --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, initial-scale=1"> +<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#named-timeline-range"> +<link rel="match" href="animation-range-visual-test-ref.html"> +<link rel="stylesheet" href="support/animation-range.css"> +<script src="/common/reftest-wait.js"></script> +<script src="/web-animations/testcommon.js"></script> +</head> +<body> +<h3>View timeline</h3> +<template id="meters"> + <div class="meters"> + <div class="cover"><div class="meter"><div class="bar"></div></div><div>Cover</div></div> + <div class="contain"><div class="meter"><div class="bar"></div></div><div>Contain</div></div> + <div class="entry"><div class="meter"><div class="bar"></div></div><div>Entry</div></div> + <div class="exit"><div class="meter"><div class="bar"></div></div><div>Exit</div></div> + </div> +</template> +<div class="flex"> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 90px;"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 70px;"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 10px;"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: -10px;"></div> + <div class="spacer"></div> + </div> + </div> +</div> +</body> +<script> + let template = document.querySelector('#meters'); + let subjects = document.querySelectorAll('.subject'); + for (let i = 0; i < subjects.length; i++) { + subjects[i].appendChild(template.content.cloneNode(true)); + } + waitForCompositorReady().then(takeScreenshot); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html index 7bd17b99190..a17dd431264 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html @@ -49,7 +49,7 @@ test((t) => { }); target.style.animation = 'anim 1s'; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; assert_equals(target.style.animation, ''); assert_equals(target.style.animationName, 'anim'); assert_equals(target.style.animationDuration, '1s'); @@ -61,7 +61,7 @@ test((t) => { }); target.style.animation = 'anim 1s'; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; assert_equals(getComputedStyle(target).animation, ''); assert_equals(getComputedStyle(target).animationName, 'anim'); assert_equals(getComputedStyle(target).animationDuration, '1s'); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html index 7759e799c62..1e621eee531 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html @@ -5,15 +5,15 @@ <script src="/css/support/computed-testcommon.js"></script> </head> <style> - #outer { animation-timeline: foo; } - #target { animation-timeline: bar; } + #outer { animation-timeline: --foo; } + #target { animation-timeline: --bar; } </style> <div id="outer"> <div id="target"></div> </div> <script> test_computed_value('animation-timeline', 'initial', 'auto'); -test_computed_value('animation-timeline', 'inherit', 'foo'); +test_computed_value('animation-timeline', 'inherit', '--foo'); test_computed_value('animation-timeline', 'unset', 'auto'); test_computed_value('animation-timeline', 'revert', 'auto'); test_computed_value('animation-timeline', 'auto'); @@ -22,9 +22,9 @@ test_computed_value('animation-timeline', 'auto, auto'); test_computed_value('animation-timeline', 'none, none'); test_computed_value('animation-timeline', 'auto, none'); test_computed_value('animation-timeline', 'none, auto'); -test_computed_value('animation-timeline', 'test'); -test_computed_value('animation-timeline', 'test1, test2'); -test_computed_value('animation-timeline', 'test1, test2, none, test3, auto', 'test1, test2, none, test3, auto'); +test_computed_value('animation-timeline', '--test'); +test_computed_value('animation-timeline', '--test1, --test2'); +test_computed_value('animation-timeline', '--test1, --test2, none, --test3, auto'); test(() => { let style = getComputedStyle(document.getElementById('target')); @@ -39,13 +39,13 @@ test(() => { // https://drafts.csswg.org/scroll-animations-1/#scroll-notation // // animation-timeline: scroll(<axis>? <scroller>?); -// <axis> = block | inline | vertical | horizontal +// <axis> = block | inline | x | y // <scroller> = root | nearest | self test_computed_value('animation-timeline', 'scroll()'); test_computed_value('animation-timeline', 'scroll(block)', 'scroll()'); test_computed_value('animation-timeline', 'scroll(inline)'); -test_computed_value('animation-timeline', 'scroll(horizontal)'); -test_computed_value('animation-timeline', 'scroll(vertical)'); +test_computed_value('animation-timeline', 'scroll(x)'); +test_computed_value('animation-timeline', 'scroll(y)'); test_computed_value('animation-timeline', 'scroll(root)'); test_computed_value('animation-timeline', 'scroll(nearest)', 'scroll()'); test_computed_value('animation-timeline', 'scroll(self)'); @@ -54,20 +54,20 @@ test_computed_value('animation-timeline', 'scroll(inline nearest)', 'scroll(inli test_computed_value('animation-timeline', 'scroll(nearest inline)', 'scroll(inline)'); test_computed_value('animation-timeline', 'scroll(block self)', 'scroll(self)'); test_computed_value('animation-timeline', 'scroll(self block)', 'scroll(self)'); -test_computed_value('animation-timeline', 'scroll(vertical root)', 'scroll(root vertical)'); +test_computed_value('animation-timeline', 'scroll(y root)', 'scroll(root y)'); // https://drafts.csswg.org/scroll-animations-1/#view-notation test_computed_value('animation-timeline', 'view()'); test_computed_value('animation-timeline', 'view(block)', 'view()'); test_computed_value('animation-timeline', 'view(inline)', 'view(inline)'); -test_computed_value('animation-timeline', 'view(horizontal)', 'view(horizontal)'); -test_computed_value('animation-timeline', 'view(vertical)', 'view(vertical)'); -test_computed_value('animation-timeline', 'view(vertical 1px)'); +test_computed_value('animation-timeline', 'view(x)', 'view(x)'); +test_computed_value('animation-timeline', 'view(y)', 'view(y)'); +test_computed_value('animation-timeline', 'view(y 1px)'); test_computed_value('animation-timeline', 'view(1px auto)'); test_computed_value('animation-timeline', 'view(auto 1px)'); -test_computed_value('animation-timeline', 'view(vertical 1px auto)'); -test_computed_value('animation-timeline', 'view(1px vertical)', 'view(vertical 1px)'); -test_computed_value('animation-timeline', 'view(vertical auto)', 'view(vertical)'); -test_computed_value('animation-timeline', 'view(vertical auto auto)', 'view(vertical)'); +test_computed_value('animation-timeline', 'view(y 1px auto)'); +test_computed_value('animation-timeline', 'view(1px y)', 'view(y 1px)'); +test_computed_value('animation-timeline', 'view(y auto)', 'view(y)'); +test_computed_value('animation-timeline', 'view(y auto auto)', 'view(y)'); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html index 0ac7a9d63e8..8992cdc174f 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html @@ -8,7 +8,7 @@ overflow: hidden; height: 0px; scroll-timeline-attachment: defer; - scroll-timeline-name: timeline1, timeline2, timeline3; + scroll-timeline-name: --timeline1, --timeline2, --timeline3; } .scroller { overflow: hidden; @@ -24,13 +24,13 @@ to { width: 200px; } } #scroller1 { - scroll-timeline-name: timeline1; + scroll-timeline-name: --timeline1; } #scroller2 { - scroll-timeline-name: timeline2; + scroll-timeline-name: --timeline2; } #scroller3 { - scroll-timeline-name: timeline3; + scroll-timeline-name: --timeline3; } #element { width: 0px; @@ -38,10 +38,10 @@ animation-name: expand; animation-duration: 1000s; animation-timing-function: linear; - animation-timeline: timeline1; + animation-timeline: --timeline1; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { #element { animation-play-state: paused; } } </style> @@ -82,7 +82,7 @@ test_animation_timeline(async () => { await waitForNextFrame(); assert_equals(getComputedStyle(element).width, '120px'); - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '140px'); }, 'Changing animation-timeline changes the timeline (sanity check)'); @@ -100,7 +100,7 @@ assert_equals(getComputedStyle(element).width, '180px'); // Changing the animation-timeline property should have no effect. - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '180px'); }, 'animation-timeline ignored after setting timeline with JS (ScrollTimeline from JS)'); @@ -110,14 +110,14 @@ let animation = element.getAnimations()[0]; let timeline1 = animation.timeline; - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '140px'); animation.timeline = timeline1; assert_equals(getComputedStyle(element).width, '120px'); // Should have no effect. - element.style = 'animation-timeline:timeline3'; + element.style = 'animation-timeline:--timeline3'; assert_equals(getComputedStyle(element).width, '120px'); }, 'animation-timeline ignored after setting timeline with JS (ScrollTimeline from CSS)'); @@ -130,7 +130,7 @@ assert_equals(getComputedStyle(element).width, '120px'); // Changing the animation-timeline property should have no effect. - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '120px'); }, 'animation-timeline ignored after setting timeline with JS (document timeline)'); @@ -141,7 +141,7 @@ assert_equals(getComputedStyle(element).width, '120px'); // Changing the animation-timeline property should have no effect. - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '120px'); }, 'animation-timeline ignored after setting timeline with JS (null)'); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html index 75483331390..04b430c3242 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html @@ -6,8 +6,8 @@ </head> <style> @keyframes test { - from { width: 100px; animation-timeline: foo; } - to { width: 100px; animation-timeline: foo; } + from { width: 100px; animation-timeline: --foo; } + to { width: 100px; animation-timeline: --foo; } } #target { width: 50px; diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html index 50a829c5b6b..e812c7d67ea 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html @@ -7,7 +7,7 @@ <style> main { scroll-timeline-attachment: defer; - scroll-timeline-name: top_timeline, bottom_timeline, left_timeline, right_timeline; + scroll-timeline-name: --top_timeline, --bottom_timeline, --left_timeline, --right_timeline; } .scroller { @@ -39,19 +39,19 @@ } #top_scroller { - scroll-timeline-name: top_timeline; + scroll-timeline-name: --top_timeline; scroll-timeline-axis: block; } #bottom_scroller { - scroll-timeline-name: bottom_timeline; + scroll-timeline-name: --bottom_timeline; scroll-timeline-axis: inline; } #left_scroller { - scroll-timeline-name: left_timeline; + scroll-timeline-name: --left_timeline; scroll-timeline-axis: block; } #right_scroller { - scroll-timeline-name: right_timeline; + scroll-timeline-name: --right_timeline; scroll-timeline-axis: inline; } @@ -59,10 +59,10 @@ animation-name: top, bottom, left, right; animation-duration: 10s; animation-timing-function: linear; - animation-timeline: top_timeline, bottom_timeline, left_timeline, right_timeline; + animation-timeline: --top_timeline, --bottom_timeline, --left_timeline, --right_timeline; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { #element { animation-play-state: paused; } } </style> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html index ed2c32d31e9..71df9ceda87 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html @@ -13,6 +13,11 @@ from { translate: 50px; } to { translate: 150px; } } + @keyframes anim-2 { + from { z-index: 0; } + to { z-index: 100; } + } + #target { width: 100px; height: 100px; @@ -74,6 +79,18 @@ function createScrollerAndTarget(t, scrollerSizeClass) { return [createScroller(t, scrollerSizeClass), createTarget(t)]; } +async function waitForScrollTop(scroller, percentage) { + const maxScroll = scroller.scrollHeight - scroller.clientHeight; + scroller.scrollTop = maxScroll * percentage / 100; + return waitForNextFrame(); +} + +async function waitForScrollLeft(scroller, percentage) { + const maxScroll = scroller.scrollWidth - scroller.clientWidth; + scroller.scrollLeft = maxScroll * percentage / 100; + return waitForNextFrame(); +} + // ------------------------- // Test scroll-timeline-name // ------------------------- @@ -91,11 +108,11 @@ promise_test(async t => { document.body.appendChild(target); target.appendChild(content); - target.style.scrollTimelineName = 'timeline'; + target.style.scrollTimelineName = '--timeline'; target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; - target.scrollTop = 50; // 50%, in [0, 100]. + target.scrollTop = 50; // 50% await waitForNextFrame(); assert_equals(getComputedStyle(target).translate, '100px'); @@ -114,16 +131,17 @@ promise_test(async t => { document.body.appendChild(parent); parent.insertBefore(target, parent.firstElementChild); - parent.style.scrollTimelineName = 'timeline'; + parent.style.scrollTimelineName = '--timeline'; target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; - parent.scrollTop = 100; // 50%, in [0, 200]. + parent.scrollTop = 100; // 50% await waitForNextFrame(); assert_equals(getComputedStyle(target).translate, '100px'); }, "scroll-timeline-name is referenceable in animation-timeline on that " + "element's descendants"); +// See https://github.com/w3c/csswg-drafts/issues/7047 promise_test(async t => { let [sibling, target] = createScrollerAndTarget(t); @@ -132,281 +150,58 @@ promise_test(async t => { document.body.appendChild(sibling); document.body.appendChild(target); - sibling.style.scrollTimelineName = 'timeline'; + // Resolvable if using a deferred timeline, but otherwise can only resolve + // if an ancestor container of the target element. + sibling.style.scrollTimelineName = '--timeline'; target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; - sibling.scrollTop = 50; // 50%, in [0, 100]. - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); -}, "scroll-timeline-name is referenceable in animation-timeline on that " + - "element's following siblings"); - -promise_test(async t => { - let [sibling, target] = createScrollerAndTarget(t); - let parent = document.createElement('div'); - - // <div id='sibling' class='scroller'> ... </div> - // <div id='parent'> - // <div id='target'></div> - // </div> - document.body.appendChild(sibling); - document.body.appendChild(parent); - parent.appendChild(target); - - sibling.style.scrollTimelineName = 'timeline'; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; - - sibling.scrollTop = 50; // 50%, in [0, 100]. - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); - - parent.remove(); -}, "scroll-timeline-name is referenceable in animation-timeline on that " + - "element's following siblings' descendants"); - -// FIXME: We may use global scope for scroll-timeline-name. -// See https://github.com/w3c/csswg-drafts/issues/7047 -promise_test(async t => { - let [sibling, target] = createScrollerAndTarget(t); - - // <div id='target'></div> - // <div id='sibling' class='scroller'> ... </div> - document.body.appendChild(target); - document.body.appendChild(sibling); - - sibling.style.scrollTimelineName = 'timeline'; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; - - sibling.scrollTop = 50; // 50%, in [0, 100]. + sibling.scrollTop = 50; // 50% await waitForNextFrame(); assert_equals(getComputedStyle(target).translate, '50px', 'Animation with unknown timeline name holds current time at zero'); }, "scroll-timeline-name is not referenceable in animation-timeline on that " + - "element's previous siblings"); + "element's siblings"); promise_test(async t => { - let [sibling, target] = createScrollerAndTarget(t); let parent = document.createElement('div'); - parent.className = 'scroller square-container'; - let content = document.createElement('div'); - content.className = 'content'; + parent.className = 'square'; + parent.style.overflowX = 'clip'; // This makes overflow-y be clip as well. + let target = document.createElement('div'); + target.id = 'target'; - // <div id='parent' class='scroller'> - // <div id='sibling' class='scroller'> ... </div> + // <div id='parent' style='overflow-x: clip'>... // <div id='target'></div> - // <div id='content'></div> // </div> document.body.appendChild(parent); - parent.appendChild(sibling); parent.appendChild(target); - parent.appendChild(content); - - parent.style.scrollTimelineName = 'timeline'; - parent.style.scrollTimelineAxis = 'inline'; - sibling.style.scrollTimelineName = 'timeline'; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; - - parent.scrollTop = 50; // 25%, in [0, 200]. - sibling.scrollTop = 50; // 50%, in [0, 100]. - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); - - content.remove(); - parent.remove(); -}, 'scroll-timeline-name is matched based on tree order, which considers ' + - 'siblings closer than parents'); - -promise_test(async t => { - let sibling = document.createElement('div'); - sibling.className = 'square'; - sibling.style.overflowX = 'clip'; // This makes overflow-y be clip as well. - let target = document.createElement('div'); - target.id = 'target'; - - // <div id='sibling' style='overflow-x: clip'></div> - // <div id='target'></div> - document.body.appendChild(sibling); - document.body.appendChild(target); - sibling.style.scrollTimelineName = 'timeline'; + parent.style.scrollTimelineName = '--timeline'; target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; - sibling.scrollTop = 50; // 50%, in [0, 100]. await waitForNextFrame(); assert_equals(getComputedStyle(target).translate, 'none', 'Animation with an unresolved current time'); target.remove(); - sibling.remove(); + parent.remove(); }, 'scroll-timeline-name on an element which is not a scroll-container'); promise_test(async t => { - let [sibling, target] = createScrollerAndTarget(t); - let main = document.createElement('div'); - main.id = 'name'; + let [scroller, target] = createScrollerAndTarget(t); - // <div id='main'> - // <div id='sibling' class='scroller'> ... </div> + // <div id='scroller' class='scroller'> ... // <div id='target'></div> // </div> - document.body.appendChild(main); - main.appendChild(sibling); - main.appendChild(target); - - target.style.animation = 'anim 10s linear'; - target.style.animationTimeline = 'timeline'; - sibling.scrollTop = 50; // 50%, in [50, 150]. - await waitForNextFrame(); - - // Unknown animation-timeline, current time held at zero. - assert_equals(getComputedStyle(target).translate, '50px'); - - // Ensure that #main (an ancestor of the scroller) needs style recalc. - main.style.background = 'lightgray'; - sibling.style.scrollTimelineName = 'timeline'; - await waitForCSSScrollTimelineStyle(); - assert_equals(getComputedStyle(target).translate, '100px'); - - main.remove(); -}, 'scroll-timeline-name affects subsequent siblings when changed'); - -promise_test(async t => { - let target = createTarget(t); - - // <div id='target'></div> - document.body.appendChild(target); - - target.style.animation = 'anim 10s linear'; - target.style.animationTimeline = 'timeline'; - - // Unknown animation-timeline, current time held at zero. - assert_equals(getComputedStyle(target).translate, '50px'); - - let scroller = createScroller(t); - // <div class='scroller'> ... </div> - // <div id='target'></div> - document.body.insertBefore(scroller, target); - scroller.style.scrollTimelineName = 'timeline'; - - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '50px'); - - // Ensure that time is not just held at zero. - scroller.scrollTop = 50; // 50%, in [50, 150]. - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); -}, 'scroll-timeline-name on inserted element affects subsequent siblings'); - -promise_test(async t => { - let [scroller, target] = createScrollerAndTarget(t); - - // <div class='scroller'> ... </div> - // <div id='target'></div> - document.body.appendChild(scroller); - document.body.appendChild(target); - - scroller.scrollTop = 50; // 50%, in [50, 150]. - await waitForNextFrame(); - - scroller.style.scrollTimelineName = 'timeline'; - target.style.animation = 'anim 10s linear'; - target.style.animationTimeline = 'timeline'; - await waitForCSSScrollTimelineStyle(); - - assert_equals(getComputedStyle(target).translate, '100px'); - const anim = target.getAnimations()[0]; - assert_percents_equal(anim.startTime, 0); - assert_percents_equal(anim.currentTime, 50); - - // This effectively removes the CSS-created ScrollTimeline on this element, - // thus invoking "setting the timeline of an animation" [1] with a null- - // timeline on affected elements. This in turn runs the procedure to set the - // current time to previous progress * end time. Ultimately, this sets the - // hold time of the animation. - - // [1] https://www.w3.org/TR/web-animations-2/#setting-the-timeline - // [2] https://www.w3.org/TR/web-animations-2/ - // #setting-the-current-time-of-an-animation - scroller.remove(); - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); - assert_equals(anim.startTime, null); - assert_times_equal(anim.currentTime, 5000); -}, 'scroll-timeline-name on removed element affects subsequent siblings'); - -promise_test(async t => { - let [scroller, target] = createScrollerAndTarget(t); - - // <div class='scroller' style='display:none'> ... </div> - // <div id='target'></div> - scroller.style.display = 'none'; - document.body.appendChild(scroller); - document.body.appendChild(target); - - scroller.style.scrollTimelineName = 'timeline'; - target.style.animation = 'anim 10s linear'; - target.style.animationTimeline = 'timeline'; - - // Unknown animation-timeline, current time held at zero. - assert_equals(getComputedStyle(target).translate, '50px'); - - scroller.style.display = 'block'; - scroller.scrollTop = 50; // 50%, in [50, 150]. - await waitForNextFrame(); - - assert_equals(getComputedStyle(target).translate, '100px'); -}, 'scroll-timeline-name on element leaving display:none affects subsequent siblings'); - -promise_test(async t => { - let [scroller, target] = createScrollerAndTarget(t); - // <div class='scroller'> ... </div> - // <div id='target'></div> document.body.appendChild(scroller); - document.body.appendChild(target); + scroller.appendChild(target); - scroller.scrollTop = 50; // 50%, in [50, 150]. - await waitForNextFrame(); - - scroller.style.scrollTimelineName = 'timeline'; - target.style.animation = 'anim 10s linear'; - target.style.animationTimeline = 'timeline'; - await waitForCSSScrollTimelineStyle(); - - assert_equals(getComputedStyle(target).translate, '100px'); - const anim = target.getAnimations()[0]; - assert_percents_equal(anim.startTime, 0); - assert_percents_equal(anim.currentTime, 50); - - // See comment in the test "scroll-timeline-name on removed element ..." for - // an explantation of this result. (Setting display:none is similar to - // removing the element). - scroller.style.display = 'none'; - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); - assert_equals(anim.startTime, null); - assert_times_equal(anim.currentTime, 5000); - -}, 'scroll-timeline-name on element becoming display:none affects subsequent siblings'); - -promise_test(async t => { - let [scroller, target] = createScrollerAndTarget(t); - - // <div id='scroller' class='scroller'> ... </div> - // <div id='target'></div> - - document.body.appendChild(scroller); - document.body.appendChild(target); - - scroller.style.scrollTimelineName = 'timeline'; - scroller.style.display = 'none'; + scroller.style.scrollTimelineName = '--timeline-A'; + scroller.scrollTop = 50; // 25% target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline-B'; await waitForNextFrame(); @@ -416,75 +211,45 @@ promise_test(async t => { // Hold time of animation is zero. assert_equals(getComputedStyle(target).translate, '50px'); - scroller.style.display = 'block'; - scroller.scrollTop = 50; + scroller.style.scrollTimelineName = '--timeline-B'; await waitForNextFrame(); assert_true(!!anim.timeline, 'Failed to create timeline'); - assert_equals(getComputedStyle(target).translate, '100px'); - -}, 'scroll-timeline-name on element not resolved until element becomes visible'); - -promise_test(async t => { - let [scroller, target] = createScrollerAndTarget(t); - - // <div id='scroller' class='scroller'> ... </div> - // <div id='target'></div> - - document.body.appendChild(scroller); - document.body.appendChild(target); - - scroller.style.scrollTimelineName = 'timeline-A'; - scroller.scrollTop = 50; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline-B'; - - await waitForNextFrame(); - - const anim = target.getAnimations()[0]; - assert_true(!!anim, 'Failed to create animation'); - assert_equals(anim.timeline, null); - // Hold time of animation is zero. - assert_equals(getComputedStyle(target).translate, '50px'); - - scroller.style.scrollTimelineName = 'timeline-B'; - await waitForNextFrame(); - - assert_true(!!anim.timeline, 'Failed to create timeline'); - assert_equals(getComputedStyle(target).translate, '100px'); - + assert_equals(getComputedStyle(target).translate, '75px'); }, 'Change in scroll-timeline-name to match animation timeline updates animation.'); promise_test(async t => { let [scroller, target] = createScrollerAndTarget(t); - // <div id='scroller' class='scroller'> ... </div> - // <div id='target'></div> + // <div id='scroller' class='scroller'> ... + // <div id='target'></div> + // </div> document.body.appendChild(scroller); - document.body.appendChild(target); + scroller.appendChild(target); - scroller.style.scrollTimelineName = 'timeline-A'; - scroller.scrollTop = 50; + scroller.style.scrollTimelineName = '--timeline-A'; + scroller.scrollTop = 50; // 25% target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline-A'; + target.style.animationTimeline = '--timeline-A'; await waitForNextFrame(); const anim = target.getAnimations()[0]; assert_true(!!anim, 'Failed to create animation'); assert_true(!!anim.timeline, 'Failed to create timeline'); - assert_equals(getComputedStyle(target).translate, '100px'); + assert_equals(getComputedStyle(target).translate, '75px'); assert_percents_equal(anim.startTime, 0); - assert_percents_equal(anim.currentTime, 50); + assert_percents_equal(anim.currentTime, 25); - scroller.style.scrollTimelineName = 'timeline-B'; + scroller.style.scrollTimelineName = '--timeline-B'; await waitForNextFrame(); + // Switching to a null timeline pauses the animation. assert_equals(anim.timeline, null, 'Failed to remove timeline'); - assert_equals(getComputedStyle(target).translate, '100px'); + assert_equals(getComputedStyle(target).translate, '75px'); assert_equals(anim.startTime, null); - assert_times_equal(anim.currentTime, 5000); + assert_times_equal(anim.currentTime, 2500); }, 'Change in scroll-timeline-name to no longer match animation timeline updates animation.'); promise_test(async t => { @@ -493,55 +258,23 @@ promise_test(async t => { let scroller2 = createScroller(t); target.style.animation = 'anim 10s linear'; - target.style.animationTimeline = 'timeline'; - scroller1.style.scrollTimelineName = 'timeline'; - scroller2.style.scrollTimelineName = 'timeline'; + target.style.animationTimeline = '--timeline'; + scroller1.style.scrollTimelineName = '--timeline'; scroller1.id = 'A'; scroller2.id = 'B'; - // <div class='scroller' id='A'> ... </div> (scroller1) - // <div class='scroller' id="B"> ... </div> (scroller2) - // <div id='target'></div> - document.body.appendChild(scroller1); - document.body.appendChild(scroller2); - document.body.append(target); - - scroller1.scrollTop = 10; // 10%, in [50, 150]. - scroller2.scrollTop = 50; // 50%, in [50, 150]. - await waitForNextFrame(); - - - // The named timeline lookup should select scroller2. - let anim = target.getAnimations()[0]; - assert_true(!!anim, 'Failed to fetch animation'); - assert_equals(anim.timeline.source.id, 'B'); - assert_equals(getComputedStyle(target).translate, '100px'); - - scroller2.remove(); - - // Now it should select scroller1. - anim = target.getAnimations()[0]; - assert_true(!!anim, 'Failed to fetch animation after update'); - assert_true(!!anim.timeline, 'Animation no longer has a timeline'); - assert_equals(anim.timeline.source.id, 'A', 'Timeline not updated'); - assert_equals(getComputedStyle(target).translate, '60px'); -}, 'Timeline lookup finds next candidate when element is removed'); - -promise_test(async t => { - let target = createTarget(t); - let scroller1 = createScroller(t); - - target.style.animation = 'anim 10s linear'; - target.style.animationTimeline = 'timeline'; - scroller1.style.scrollTimelineName = 'timeline'; - scroller1.id = 'A'; - - // <div class='scroller' id='A'> ... </div> (scroller1) - // <div id='target'></div> + // <div class='scroller' id='A'> ... + // <div class='scroller' id='B'> ... + // <div id='target'></div> + // </div> + // </div> document.body.appendChild(scroller1); - document.body.append(target); + scroller1.appendChild(scroller2); + scroller2.appendChild(target); - scroller1.scrollTop = 10; // 10%, in [50, 150]. + scroller1.style.scrollTimelineName = '--timeline'; + scroller1.scrollTop = 50; // 25% + scroller2.scrollTop = 100; // 50% await waitForNextFrame(); @@ -549,21 +282,9 @@ promise_test(async t => { assert_true(!!anim.timeline, 'Failed to retrieve animation'); assert_equals(anim.timeline.source.id, 'A'); - assert_equals(getComputedStyle(target).translate, '60px'); - - await waitForNextFrame(); - - let scroller2 = createScroller(t); - scroller2.style.scrollTimelineName = 'timeline'; - scroller2.id = 'B'; - - // <div class='scroller' id="A"> ... </div> (scroller1) - // <div class='scroller' id="B"> ... </div> (scroller2) - // <div id='target'></div> - document.body.insertBefore(scroller2, target); - - scroller2.scrollTop = 50; // 50%, in [50, 150]. + assert_equals(getComputedStyle(target).translate, '75px'); + scroller2.style.scrollTimelineName = '--timeline'; await waitForNextFrame(); // The timeline should be updated to scroller2. @@ -573,12 +294,17 @@ promise_test(async t => { }, 'Timeline lookup updates candidate when closer match available.'); promise_test(async t => { + let wrapper = createScroller(t); + wrapper.classList.remove('scroller'); let target = createTarget(t); - // <div id='target'></div> - document.body.append(target); + // <div id='wrapper'> ... + // <div id='target'></div> + // </div> + document.body.appendChild(wrapper); + wrapper.appendChild(target); target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; await waitForNextFrame(); @@ -589,21 +315,20 @@ promise_test(async t => { await waitForNextFrame(); - let scroller = createScroller(t); - scroller.style.scrollTimelineName = 'timeline'; - - // <div class='scroller'> ... </div> (scroller1) - // <div id='target'></div> - document.body.insertBefore(scroller, target); - - scroller.scrollTop = 50; // 50%, in [50, 150]. + wrapper.classList.add('scroller'); + wrapper.style.scrollTimelineName = '--timeline'; + // <div id='wrapper' class="scroller"> ... + // <div id='target'></div> + // </div> + wrapper.scrollTop = 50; // 25% await waitForNextFrame(); // The timeline should be updated to scroller. - assert_equals(getComputedStyle(target).translate, '100px'); + assert_equals(getComputedStyle(target).translate, '75px'); }, 'Timeline lookup updates candidate when match becomes available.'); + // ------------------------- // Test scroll-timeline-axis // ------------------------- @@ -612,84 +337,94 @@ promise_test(async t => { let [scroller, target] = createScrollerAndTarget(t); scroller.style.writingMode = 'vertical-lr'; + // <div id='scroller' class='scroller'> ... + // <div id='target'></div> + // </div> document.body.appendChild(scroller); - document.body.appendChild(target); + scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline block'; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + scroller.style.scrollTimeline = '--timeline block'; + target.style.animation = "anim-2 10s linear"; + target.style.animationTimeline = '--timeline'; - scroller.scrollLeft = 50; - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); + await waitForScrollLeft(scroller, 50); + assert_equals(getComputedStyle(target).zIndex, '50'); }, 'scroll-timeline-axis is block'); promise_test(async t => { let [scroller, target] = createScrollerAndTarget(t); scroller.style.writingMode = 'vertical-lr'; + // <div id='scroller' class='scroller'> ... + // <div id='target'></div> + // </div> document.body.appendChild(scroller); - document.body.appendChild(target); + scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline inline'; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + scroller.style.scrollTimeline = '--timeline inline'; + target.style.animation = "anim-2 10s linear"; + target.style.animationTimeline = '--timeline'; - scroller.scrollTop = 50; - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); + await waitForScrollTop(scroller, 50); + assert_equals(getComputedStyle(target).zIndex, '50'); }, 'scroll-timeline-axis is inline'); promise_test(async t => { let [scroller, target] = createScrollerAndTarget(t); scroller.style.writingMode = 'vertical-lr'; + // <div id='scroller' class='scroller'> ... + // <div id='target'></div> + // </div> document.body.appendChild(scroller); - document.body.appendChild(target); + scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline horizontal'; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + scroller.style.scrollTimeline = '--timeline x'; + target.style.animation = "anim-2 10s linear"; + target.style.animationTimeline = '--timeline'; - scroller.scrollLeft = 50; - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); -}, 'scroll-timeline-axis is horizontal'); + await waitForScrollLeft(scroller, 50); + assert_equals(getComputedStyle(target).zIndex, '50'); +}, 'scroll-timeline-axis is x'); promise_test(async t => { let [scroller, target] = createScrollerAndTarget(t); scroller.style.writingMode = 'vertical-lr'; + // <div id='scroller' class='scroller'> ... + // <div id='target'></div> + // </div> document.body.appendChild(scroller); - document.body.appendChild(target); + scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline vertical'; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + scroller.style.scrollTimeline = '--timeline y'; + target.style.animation = "anim-2 10s linear"; + target.style.animationTimeline = '--timeline'; - scroller.scrollTop = 50; - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); -}, 'scroll-timeline-axis is vertical'); + await waitForScrollTop(scroller, 50); + assert_equals(getComputedStyle(target).zIndex, '50'); +}, 'scroll-timeline-axis is y'); promise_test(async t => { let [scroller, target] = createScrollerAndTarget(t); + // <div id='scroller' class='scroller'> ... + // <div id='target'></div> + // </div> document.body.appendChild(scroller); - document.body.appendChild(target); + scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline block'; - target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + scroller.style.scrollTimeline = '--timeline block'; + target.style.animation = "anim-2 10s linear"; + target.style.animationTimeline = '--timeline'; - scroller.scrollTop = 50; - scroller.scrollLeft = 25; - await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '100px'); + await waitForScrollTop(scroller, 25); + await waitForScrollLeft(scroller, 75); + assert_equals(getComputedStyle(target).zIndex, '25'); scroller.style.scrollTimelineAxis = 'inline'; await waitForNextFrame(); - assert_equals(getComputedStyle(target).translate, '75px'); + assert_equals(getComputedStyle(target).zIndex, '75'); }, 'scroll-timeline-axis is mutated'); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html index a8e07a44d6d..7092523c489 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html @@ -20,7 +20,7 @@ animation-timeline: none; } #element_unknown_timeline { - animation-timeline: unknown_timeline; + animation-timeline: --unknown_timeline; } </style> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html index 4916f7726f9..f0061c5705d 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html @@ -16,10 +16,11 @@ test_valid_value('animation-timeline', 'auto, auto'); test_valid_value('animation-timeline', 'none, none'); test_valid_value('animation-timeline', 'auto, none'); test_valid_value('animation-timeline', 'none, auto'); -test_valid_value('animation-timeline', 'test'); -test_valid_value('animation-timeline', 'test1, test2'); -test_valid_value('animation-timeline', 'test1, test2, none, test3, auto', ["test1, test2, none, test3, auto", 'test1, test2, none, test3, auto']); +test_valid_value('animation-timeline', '--test'); +test_valid_value('animation-timeline', '--test1, --test2'); +test_valid_value('animation-timeline', '--test1, --test2, none, --test3, auto'); +test_invalid_value('animation-timeline', 'test1'); test_invalid_value('animation-timeline', '10px'); test_invalid_value('animation-timeline', 'auto auto'); test_invalid_value('animation-timeline', 'none none'); @@ -32,13 +33,13 @@ test_invalid_value('animation-timeline', '"test"'); // https://drafts.csswg.org/scroll-animations-1/#scroll-notation // // animation-timeline: scroll(<axis>? <scroller>?); -// <axis> = block | inline | vertical | horizontal +// <axis> = block | inline | x | y // <scroller> = root | nearest | self test_valid_value('animation-timeline', 'scroll()'); test_valid_value('animation-timeline', 'scroll(block)', 'scroll()'); test_valid_value('animation-timeline', 'scroll(inline)'); -test_valid_value('animation-timeline', 'scroll(horizontal)'); -test_valid_value('animation-timeline', 'scroll(vertical)'); +test_valid_value('animation-timeline', 'scroll(x)'); +test_valid_value('animation-timeline', 'scroll(y)'); test_valid_value('animation-timeline', 'scroll(root)'); test_valid_value('animation-timeline', 'scroll(nearest)', 'scroll()'); test_valid_value('animation-timeline', 'scroll(self)'); @@ -46,27 +47,27 @@ test_valid_value('animation-timeline', 'scroll(inline nearest)', 'scroll(inline) test_valid_value('animation-timeline', 'scroll(nearest inline)', 'scroll(inline)'); test_valid_value('animation-timeline', 'scroll(block self)', 'scroll(self)'); test_valid_value('animation-timeline', 'scroll(self block)', 'scroll(self)'); -test_valid_value('animation-timeline', 'scroll(vertical root)', 'scroll(root vertical)'); +test_valid_value('animation-timeline', 'scroll(y root)', 'scroll(root y)'); test_invalid_value('animation-timeline', 'scroll(abc root)'); test_invalid_value('animation-timeline', 'scroll(abc)'); -test_invalid_value('animation-timeline', 'scroll(vertical abc)'); +test_invalid_value('animation-timeline', 'scroll(y abc)'); test_invalid_value('animation-timeline', 'scroll("string")'); // https://drafts.csswg.org/scroll-animations-1/#view-notation test_valid_value('animation-timeline', 'view()'); test_valid_value('animation-timeline', 'view(block)', 'view()'); test_valid_value('animation-timeline', 'view(inline)'); -test_valid_value('animation-timeline', 'view(horizontal)'); -test_valid_value('animation-timeline', 'view(vertical)'); -test_valid_value('animation-timeline', 'view(vertical 1px 2px)'); -test_valid_value('animation-timeline', 'view(vertical 1px)'); -test_valid_value('animation-timeline', 'view(vertical auto)', 'view(vertical)'); -test_valid_value('animation-timeline', 'view(vertical auto auto)', 'view(vertical)'); -test_valid_value('animation-timeline', 'view(vertical auto 1px)'); -test_valid_value('animation-timeline', 'view(1px 2px vertical)', 'view(vertical 1px 2px)'); -test_valid_value('animation-timeline', 'view(1px vertical)', 'view(vertical 1px)'); -test_valid_value('animation-timeline', 'view(auto horizontal)', 'view(horizontal)'); +test_valid_value('animation-timeline', 'view(x)'); +test_valid_value('animation-timeline', 'view(y)'); +test_valid_value('animation-timeline', 'view(y 1px 2px)'); +test_valid_value('animation-timeline', 'view(y 1px)'); +test_valid_value('animation-timeline', 'view(y auto)', 'view(y)'); +test_valid_value('animation-timeline', 'view(y auto auto)', 'view(y)'); +test_valid_value('animation-timeline', 'view(y auto 1px)'); +test_valid_value('animation-timeline', 'view(1px 2px y)', 'view(y 1px 2px)'); +test_valid_value('animation-timeline', 'view(1px y)', 'view(y 1px)'); +test_valid_value('animation-timeline', 'view(auto x)', 'view(x)'); test_valid_value('animation-timeline', 'view(1px 2px)'); test_valid_value('animation-timeline', 'view(1px)'); test_valid_value('animation-timeline', 'view(1px 1px)', 'view(1px)'); @@ -75,11 +76,11 @@ test_valid_value('animation-timeline', 'view(auto calc(1% + 1px))'); test_valid_value('animation-timeline', 'view(auto)', 'view()'); test_valid_value('animation-timeline', 'view(auto auto)', 'view()'); -test_invalid_value('animation-timeline', 'view(vertical 1px 2px 3px)'); -test_invalid_value('animation-timeline', 'view(1px vertical 3px)'); +test_invalid_value('animation-timeline', 'view(y 1px 2px 3px)'); +test_invalid_value('animation-timeline', 'view(1px y 3px)'); test_invalid_value('animation-timeline', 'view(1px 2px 3px)'); test_invalid_value('animation-timeline', 'view(abc block)'); test_invalid_value('animation-timeline', 'view(abc)'); -test_invalid_value('animation-timeline', 'view(vertical abc)'); +test_invalid_value('animation-timeline', 'view(y abc)'); test_invalid_value('animation-timeline', 'view("string")'); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html index 09917b4ba56..0bba4a03f40 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html @@ -143,21 +143,21 @@ promise_test(async t => { let [container, div] = createTargetWithStuff(t, 'block-content'); container.style.writingMode = 'vertical-lr'; div.style.animation = "anim 10s linear"; - div.style.animationTimeline = "scroll(horizontal)"; + div.style.animationTimeline = "scroll(x)"; await scrollLeft(container, 50); assert_equals(getComputedStyle(div).translate, '100px'); -}, 'animation-timeline: scroll(horizontal)'); +}, 'animation-timeline: scroll(x)'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, 'inline-content'); container.style.writingMode = 'vertical-lr'; div.style.animation = "anim 10s linear"; - div.style.animationTimeline = "scroll(vertical)"; + div.style.animationTimeline = "scroll(y)"; await scrollTop(container, 50); assert_equals(getComputedStyle(div).translate, '100px'); -}, 'animation-timeline: scroll(vertical)'); +}, 'animation-timeline: scroll(y)'); // TODO: Add more tests which change the overflow property of the container for // scroll(nearest) diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html index 745d76c7294..8a62199b524 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html @@ -202,7 +202,7 @@ promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflow = 'hidden'; div.style.animation = "fade-out-without-timeline-range 1s linear"; - div.style.animationTimeline = "view(horizontal)"; + div.style.animationTimeline = "view(x)"; // So the range is [-200px, 100px], but it is impossible to scroll to the // negative part. @@ -214,12 +214,12 @@ promise_test(async t => { assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%'); await scrollLeft(container, 100); assert_equals(getComputedStyle(div).opacity, '0', 'At 100%'); -}, 'animation-timeline: view(horizontal) without timeline range name'); +}, 'animation-timeline: view(x) without timeline range name'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); div.style.animation = "fade-out-without-timeline-range 1s linear"; - div.style.animationTimeline = "view(vertical)"; + div.style.animationTimeline = "view(y)"; // So the range is [-200px, 100px], but it is impossible to scroll to the // negative part. @@ -231,13 +231,13 @@ promise_test(async t => { assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%'); await scrollTop(container, 100); assert_equals(getComputedStyle(div).opacity, '0', 'At 100%'); -}, 'animation-timeline: view(vertical) without timeline range name'); +}, 'animation-timeline: view(y) without timeline range name'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflow = 'hidden'; div.style.animation = "fade-out-without-timeline-range 1s linear"; - div.style.animationTimeline = "view(horizontal 50px)"; + div.style.animationTimeline = "view(x 50px)"; // So the range is [-150px, 50px], but it is impossible to scroll to the // negative part. @@ -248,7 +248,7 @@ promise_test(async t => { assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%'); await scrollLeft(container, 50); assert_equals(getComputedStyle(div).opacity, '0', 'At 100%'); -}, 'animation-timeline: view(horizontal 50px) without timeline range name'); +}, 'animation-timeline: view(x 50px) without timeline range name'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); @@ -384,7 +384,7 @@ promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflow = 'scroll'; div.style.animation = "fade-out 1s linear"; - div.style.animationTimeline = "view(horizontal)"; + div.style.animationTimeline = "view(x)"; await scrollLeft(container, 0); assert_equals(getComputedStyle(div).opacity, '1', 'At exit 0%'); @@ -392,13 +392,13 @@ promise_test(async t => { assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%'); await scrollLeft(container, 100); assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%'); -}, 'animation-timeline: view(horizontal)'); +}, 'animation-timeline: view(x)'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflow = 'scroll'; div.style.animation = "fade-out 1s linear"; - div.style.animationTimeline = "view(vertical)"; + div.style.animationTimeline = "view(y)"; await scrollTop(container, 0); assert_equals(getComputedStyle(div).opacity, '1', 'At exit 0%'); @@ -406,20 +406,20 @@ promise_test(async t => { assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%'); await scrollTop(container, 100); assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%'); -}, 'animation-timeline: view(vertical)'); +}, 'animation-timeline: view(y)'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflowY = 'hidden'; container.style.overflowX = 'scroll'; div.style.animation = "fade-out 1s linear"; - div.style.animationTimeline = "view(horizontal 50px)"; + div.style.animationTimeline = "view(x 50px)"; await scrollLeft(container, 0); assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%'); await scrollLeft(container, 50); assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%'); -}, 'animation-timeline: view(horizontal 50px)'); +}, 'animation-timeline: view(x 50px)'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html b/tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html index 10bf00fbbc0..d3048913cef 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html @@ -18,7 +18,7 @@ overflow-x: scroll; height: 200px; width: 200px; - scroll-timeline-name: timeline; + scroll-timeline-name: --timeline; } #spacer { height: 200vh; @@ -28,7 +28,7 @@ height: 100px; width: 100px; animation: slide 1s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <body> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html b/tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html index c6d384fce54..e5d5037d622 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html @@ -42,8 +42,8 @@ animation-duration: auto; animation-fill-mode: both; animation-timing-function: linear; - view-timeline: target; - animation-timeline: target; + view-timeline: --target; + animation-timeline: --target; } #target.anim-1 { animation-name: anim-1; diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html index 3939a1df48d..c37c1b95ef5 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html @@ -12,7 +12,7 @@ } #scroller { - scroll-timeline: timeline; + scroll-timeline: --timeline; overflow: scroll; width: 100px; height: 100px; diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html index 05fab3e46ad..dd4add49b0f 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html @@ -13,7 +13,7 @@ } #scroller { - scroll-timeline: timeline; + scroll-timeline: --timeline; overflow: scroll; width: 100px; height: 100px; @@ -29,10 +29,10 @@ height: 100px; background-color: green; animation: anim 1s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } - @supports not (animation-timeline:timeline) { + @supports not (animation-timeline:--timeline) { #box { animation-play-state: paused; } diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html b/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html index eeb1e548e52..bbc60e3fbdd 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html @@ -21,18 +21,18 @@ } #scroller1 { - scroll-timeline: top_timeline; + scroll-timeline: --top_timeline; } #element { animation-name: top; animation-duration: 10s; animation-timing-function: linear; - animation-timeline: top_timeline; + animation-timeline: --top_timeline; position: absolute; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { #element { animation-play-state: paused; } } </style> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html index 96033859e29..c924302b224 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html @@ -39,10 +39,10 @@ background-color: coral; width: 0px; animation: anim auto linear; - animation-timeline: t1; + animation-timeline: --t1; } .timeline { - scroll-timeline-name: t1; + scroll-timeline-name: --t1; } .local { scroll-timeline-attachment: local; @@ -96,6 +96,25 @@ }, 'Deferred timeline with no attachments'); </script> +<template id=scroll_timeline_defer_no_attach_to_prev_sibling> + <div class="timeline defer"> + <div class="scroller timeline"> + <div class=content></div> + </div> + <div class=target>Test</div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_defer_no_attach_to_prev_sibling); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Deferred timeline with no attachments to previous sibling'); +</script> + <template id=scroll_timeline_local_ancestor> <div class="scroller timeline local"> <div class=content> @@ -142,7 +161,7 @@ <template id=scroll_timeline_defer_axis> <div class="timeline defer" style="scroll-timeline-axis:inline"> <div class=target>Test</div> - <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical"> + <div class="scroller timeline ancestor" style="scroll-timeline-axis:y"> <div class=content></div> </div> </div> @@ -154,7 +173,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Axis of deferred timeline is taken from attached timeline'); </script> @@ -162,7 +181,7 @@ <template id=scroll_timeline_defer_axis_multiple> <div class="timeline defer" style="scroll-timeline-axis:inline"> <div class=target>Test</div> - <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical"> + <div class="scroller timeline ancestor" style="scroll-timeline-axis:y"> <div class=content></div> </div> <!-- Extra attachment --> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html index b971aba6c0f..c942fb40932 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html @@ -5,7 +5,7 @@ <script src="/css/support/computed-testcommon.js"></script> <style> #outer { scroll-timeline-axis: inline; } - #target { scroll-timeline-axis: vertical; } + #target { scroll-timeline-axis: y; } </style> <div id="outer"> <div id="target"></div> @@ -17,11 +17,11 @@ test_computed_value('scroll-timeline-axis', 'unset', 'block'); test_computed_value('scroll-timeline-axis', 'revert', 'block'); test_computed_value('scroll-timeline-axis', 'block'); test_computed_value('scroll-timeline-axis', 'inline'); -test_computed_value('scroll-timeline-axis', 'vertical'); -test_computed_value('scroll-timeline-axis', 'horizontal'); +test_computed_value('scroll-timeline-axis', 'y'); +test_computed_value('scroll-timeline-axis', 'x'); test_computed_value('scroll-timeline-axis', 'block, inline'); test_computed_value('scroll-timeline-axis', 'inline, block'); -test_computed_value('scroll-timeline-axis', 'block, vertical, horizontal, inline'); +test_computed_value('scroll-timeline-axis', 'block, y, x, inline'); test_computed_value('scroll-timeline-axis', 'inline, inline, inline, inline'); test(() => { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html index 25f48f0c70a..a9a760a54a4 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html @@ -14,11 +14,11 @@ test_valid_value('scroll-timeline-axis', 'revert'); test_valid_value('scroll-timeline-axis', 'block'); test_valid_value('scroll-timeline-axis', 'inline'); -test_valid_value('scroll-timeline-axis', 'vertical'); -test_valid_value('scroll-timeline-axis', 'horizontal'); +test_valid_value('scroll-timeline-axis', 'y'); +test_valid_value('scroll-timeline-axis', 'x'); test_valid_value('scroll-timeline-axis', 'block, inline'); test_valid_value('scroll-timeline-axis', 'inline, block'); -test_valid_value('scroll-timeline-axis', 'block, vertical, horizontal, inline'); +test_valid_value('scroll-timeline-axis', 'block, y, x, inline'); test_valid_value('scroll-timeline-axis', 'inline, inline, inline, inline'); test_invalid_value('scroll-timeline-axis', 'abc'); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html index 958ce4964e8..872dc1b2b93 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html @@ -19,26 +19,26 @@ to { width: 200px; } } #timeline_initial_axis { - scroll-timeline: timeline_initial_axis; + scroll-timeline: --timeline_initial_axis; } - #timeline_vertical { - scroll-timeline: timeline_vertical vertical; + #timeline_y { + scroll-timeline: --timeline_y y; } - #timeline_horizontal { - scroll-timeline: timeline_horizontal horizontal; + #timeline_x { + scroll-timeline: --timeline_x x; } #timeline_block_in_horizontal { - scroll-timeline: timeline_block_in_horizontal block; + scroll-timeline: --timeline_block_in_horizontal block; } #timeline_inline_in_horizontal { - scroll-timeline: timeline_inline_in_horizontal inline; + scroll-timeline: --timeline_inline_in_horizontal inline; } #timeline_block_in_vertical { - scroll-timeline: timeline_block_in_vertical block; + scroll-timeline: --timeline_block_in_vertical block; writing-mode: vertical-lr; } #timeline_inline_in_vertical { - scroll-timeline: timeline_inline_in_vertical inline; + scroll-timeline: --timeline_inline_in_vertical inline; writing-mode: vertical-lr; } .target { @@ -49,28 +49,28 @@ position: absolute; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { .target { animation-play-state: paused; } } - #element_initial_axis { animation-timeline: timeline_initial_axis; } - #element_vertical { animation-timeline: timeline_vertical; } - #element_horizontal { animation-timeline: timeline_horizontal; } - #element_block_in_horizontal { animation-timeline: timeline_block_in_horizontal; } - #element_inline_in_horizontal { animation-timeline: timeline_inline_in_horizontal; } - #element_block_in_vertical { animation-timeline: timeline_block_in_vertical; } - #element_inline_in_vertical { animation-timeline: timeline_inline_in_vertical; } + #element_initial_axis { animation-timeline: --timeline_initial_axis; } + #element_y { animation-timeline: --timeline_y; } + #element_x { animation-timeline: --timeline_x; } + #element_block_in_horizontal { animation-timeline: --timeline_block_in_horizontal; } + #element_inline_in_horizontal { animation-timeline: --timeline_inline_in_horizontal; } + #element_block_in_vertical { animation-timeline: --timeline_block_in_vertical; } + #element_inline_in_vertical { animation-timeline: --timeline_inline_in_vertical; } </style> <div class=scroller id=timeline_initial_axis> <div class=contents></div> <div class=target id=element_initial_axis></div> </div> -<div class=scroller id=timeline_vertical> +<div class=scroller id=timeline_y> <div class=contents></div> - <div class=target id=element_vertical></div> + <div class=target id=element_y></div> </div> -<div class=scroller id=timeline_horizontal> +<div class=scroller id=timeline_x> <div class=contents></div> - <div class=target id=element_horizontal></div> + <div class=target id=element_x></div> </div> <div class=scroller id=timeline_block_in_horizontal> <div class=contents></div> @@ -91,11 +91,11 @@ <script> // Animations linked to vertical scroll-timelines are at 75% progress. timeline_initial_axis.scrollTop = 75; - timeline_vertical.scrollTop = 75; + timeline_y.scrollTop = 75; timeline_block_in_horizontal.scrollTop = 75; timeline_inline_in_vertical.scrollTop = 75; // Animations linked to horizontal scroll-timelines are at 25% progress. - timeline_horizontal.scrollLeft = 25; + timeline_x.scrollLeft = 25; timeline_block_in_vertical.scrollLeft = 25; timeline_inline_in_horizontal.scrollLeft = 25; @@ -106,12 +106,12 @@ promise_test(async (t) => { await waitForNextFrame(); - assert_equals(getComputedStyle(element_vertical).width, '175px'); + assert_equals(getComputedStyle(element_y).width, '175px'); }, 'Vertical axis'); promise_test(async (t) => { await waitForNextFrame(); - assert_equals(getComputedStyle(element_horizontal).width, '125px'); + assert_equals(getComputedStyle(element_x).width, '125px'); }, 'Horizontal axis'); promise_test(async (t) => { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html index 0d951e7b139..57c666e2412 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html @@ -6,6 +6,15 @@ <script src="/web-animations/testcommon.js"></script> <script src="support/testcommon.js"></script> <style> + main { + scroll-timeline-attachment: defer; + scroll-timeline-name: --timeline; + } + + .scroller { + scroll-timeline-attachment: ancestor; + } + main > div { overflow: hidden; width: 100px; @@ -29,9 +38,13 @@ animation-timing-function: steps(10, end); } </style> -<main> - <div id=scroller1><div></div></div> - <div id=scroller2><div></div></div> +<main id=main> + <div id=scroller1 class=scroller> + <div></div> + </div> + <div id=scroller2 class=scroller> + <div></div> + </div> <div id=container></div> </main> <script> @@ -64,6 +77,7 @@ } finally { while (container.firstChild) container.firstChild.remove(); + main.style = ''; scroller1.style = ''; scroller2.style = ''; } @@ -96,8 +110,8 @@ await assert_width(element, '100px'); // Switch to scroll timeline. - scroller1.style.scrollTimelineName = 'timeline'; - element.style.animationTimeline = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; + element.style.animationTimeline = '--timeline'; await assert_width(element, '120px'); // Switching from ScrollTimeline -> DocumentTimeline should preserve @@ -117,8 +131,8 @@ assert_true(anim.pending, "The animation is in play pending"); // Switch to scroll timeline for a pending animation. - scroller1.style.scrollTimelineName = 'timeline'; - element.style.animationTimeline = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; + element.style.animationTimeline = '--timeline'; await anim.ready; assert_false(anim.pending, "The animation is not pending"); @@ -130,18 +144,19 @@ let element = insertElement(); // Note: #scroller1 is at 20%, and #scroller2 is at 40%. - scroller1.style.scrollTimelineName = 'timeline1'; - scroller2.style.scrollTimelineName = 'timeline2'; + scroller1.style.scrollTimelineName = '--timeline1'; + scroller2.style.scrollTimelineName = '--timeline2'; + main.style.scrollTimelineName = "--timeline1, --timeline2"; await assert_width(element, '100px'); - element.style.animationTimeline = 'timeline1'; + element.style.animationTimeline = '--timeline1'; await assert_width(element, '120px'); - element.style.animationTimeline = 'timeline2'; + element.style.animationTimeline = '--timeline2'; await assert_width(element, '140px'); - element.style.animationTimeline = 'timeline1'; + element.style.animationTimeline = '--timeline1'; await assert_width(element, '120px'); // Switching from ScrollTimeline -> DocumentTimeline should preserve @@ -154,7 +169,7 @@ dynamic_rule_test(async (t, assert_width) => { let element = insertElement(); - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; // DocumentTimeline applies by default. await assert_width(element, '100px'); @@ -164,7 +179,7 @@ await element.getAnimations()[0].ready; // DocumentTimeline -> none - element.style.animationTimeline = 'none'; + element.style.animationTimeline = '--none'; await assert_width(element, '0px'); // none -> DocumentTimeline @@ -172,15 +187,15 @@ await assert_width(element, '100px'); // DocumentTimeline -> ScrollTimeline - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; await assert_width(element, '120px'); // ScrollTimeline -> none - element.style.animationTimeline = 'none'; + element.style.animationTimeline = '--none'; await assert_width(element, '120px'); // none -> ScrollTimeline - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; await assert_width(element, '120px'); }, 'Changing to/from animation-timeline:none'); @@ -188,34 +203,19 @@ dynamic_rule_test(async (t, assert_width) => { let element = insertElement(); - element.style.animationTimeline = 'timeline'; - - // Unknown animation-timeline, current time held at zero. - await assert_width(element, '100px'); - - scroller1.style.scrollTimelineName = 'timeline'; - await assert_width(element, '120px'); - - scroller2.style.scrollTimelineName = 'timeline'; - await assert_width(element, '140px'); - }, 'Changing scroll-timeline on preceding elements affects target element'); - - - dynamic_rule_test(async (t, assert_width) => { - let element = insertElement(); - element.style.animationDirection = 'reverse'; - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; - // Unknown animation-timeline, current time held at zero. - await assert_width(element, '200px'); + // Inactive animation-timeline. Animation is inactive. + await assert_width(element, '0px'); // Note: #scroller1 is at 20%. - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; await assert_width(element, '180px'); // Note: #scroller2 is at 40%. - scroller2.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = ''; + scroller2.style.scrollTimelineName = '--timeline'; await assert_width(element, '160px'); element.style.animationDirection = ''; @@ -224,13 +224,13 @@ dynamic_rule_test(async (t, assert_width) => { let element = insertElement(); - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; - // Unknown animation-timeline, current time held at zero. - await assert_width(element, '100px'); + // Inactive animation-timeline. Animation effect is inactive. + await assert_width(element, '0px'); // Note: #scroller1 is at 20%. - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; await assert_width(element, '120px'); element.style.animationPlayState = 'paused'; @@ -239,26 +239,26 @@ await assert_width(element, '120px'); // Note: #scroller2 is at 40%. - scroller2.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = ''; + scroller2.style.scrollTimelineName = '--timeline'; - // Even when switching timelines, we should be at the same position until - // we unpause. + // Should be at the same position until we unpause. await assert_width(element, '120px'); // Unpausing should synchronize to the scroll position. element.style.animationPlayState = ''; await assert_width(element, '140px'); - }, 'Switching timelines while paused'); + }, 'Change to timeline attachment while paused'); dynamic_rule_test(async (t, assert_width) => { let element = insertElement(); // Note: #scroller1 is at 20%. - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; await assert_width(element, '100px'); - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; element.style.animationPlayState = 'paused'; // Pausing should happen before the timeline is modified. (Tentative). diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html index 38b8ffdc15a..742c35b2580 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html @@ -29,7 +29,7 @@ /* This does not apply initially. */ @container (width > 200px) { #scroller { - scroll-timeline: timeline; + scroll-timeline: --timeline; } } @@ -42,7 +42,7 @@ height: 10px; width: 10px; animation: recolor 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; background-color: rgb(0, 0, 0); } </style> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html index 0953f1b3894..eedc8e3958a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html @@ -27,12 +27,12 @@ <template id=basic> <style> #timeline { - scroll-timeline: timeline; + scroll-timeline: --timeline; } #element { width: 0px; animation: expand 10s linear paused; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div id="container"> @@ -57,7 +57,7 @@ #element { width: 0px; animation: expand 10s linear paused; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div id="container"> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html index 651ba212ded..7e0c1339b26 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html @@ -18,7 +18,7 @@ main { height: 0px; overflow: hidden; - scroll-timeline: timeline1 defer, timeline2 defer; + scroll-timeline: --timeline1 defer, --timeline2 defer; } .scroller { height: 100px; @@ -30,12 +30,12 @@ #element1 { width: 1px; animation: expand_width 10s; - animation-timeline: timeline1; + animation-timeline: --timeline1; } #element2 { height: 1px; animation: expand_height 10s; - animation-timeline: timeline2; + animation-timeline: --timeline2; } </style> <main id=main> @@ -61,7 +61,7 @@ let events1 = []; let events2 = []; - insertScroller('timeline1'); + insertScroller('--timeline1'); // Even though the scroller was just inserted into the DOM, |timeline1| // remains inactive until the next frame. // @@ -69,7 +69,7 @@ assert_equals(getComputedStyle(element1).width, '1px'); (new ResizeObserver(entries => { events1.push(entries); - insertScroller('timeline2'); + insertScroller('--timeline2'); assert_equals(getComputedStyle(element2).height, '1px'); })).observe(element1); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html index bfffafc6523..b803ee8212b 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html @@ -5,24 +5,24 @@ <script src="/css/support/computed-testcommon.js"></script> </head> <style> - #outer { scroll-timeline-name: foo; } - #target { scroll-timeline-name: bar; } + #outer { scroll-timeline-name: --foo; } + #target { scroll-timeline-name: --bar; } </style> <div id="outer"> <div id="target"></div> </div> <script> test_computed_value('scroll-timeline-name', 'initial', 'none'); -test_computed_value('scroll-timeline-name', 'inherit', 'foo'); +test_computed_value('scroll-timeline-name', 'inherit', '--foo'); test_computed_value('scroll-timeline-name', 'unset', 'none'); test_computed_value('scroll-timeline-name', 'revert', 'none'); test_computed_value('scroll-timeline-name', 'none'); -test_computed_value('scroll-timeline-name', 'test'); -test_computed_value('scroll-timeline-name', 'foo, bar'); -test_computed_value('scroll-timeline-name', 'bar, foo'); -test_computed_value('scroll-timeline-name', 'a, b, c, D, e'); +test_computed_value('scroll-timeline-name', '--foo'); +test_computed_value('scroll-timeline-name', '--foo, --bar'); +test_computed_value('scroll-timeline-name', '--bar, --foo'); +test_computed_value('scroll-timeline-name', '--a, --b, --c, --D, --e'); test_computed_value('scroll-timeline-name', 'none, none'); -test_computed_value('scroll-timeline-name', 'a, b, c, none, d, e'); +test_computed_value('scroll-timeline-name', '--a, --b, --c, none, --d, --e'); test(() => { let style = getComputedStyle(document.getElementById('target')); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html index 0fb271250ad..d38b9640af9 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html @@ -12,15 +12,16 @@ test_valid_value('scroll-timeline-name', 'unset'); test_valid_value('scroll-timeline-name', 'revert'); test_valid_value('scroll-timeline-name', 'none'); -test_valid_value('scroll-timeline-name', 'abc'); -test_valid_value('scroll-timeline-name', ' abc', 'abc'); -test_valid_value('scroll-timeline-name', 'aBc'); -test_valid_value('scroll-timeline-name', 'foo, bar'); -test_valid_value('scroll-timeline-name', 'bar, foo'); +test_valid_value('scroll-timeline-name', '--abc'); +test_valid_value('scroll-timeline-name', ' --abc', '--abc'); +test_valid_value('scroll-timeline-name', '--aBc'); +test_valid_value('scroll-timeline-name', '--foo, --bar'); +test_valid_value('scroll-timeline-name', '--bar, --foo'); test_valid_value('scroll-timeline-name', 'none, none'); -test_valid_value('scroll-timeline-name', 'a, none, b'); -test_valid_value('scroll-timeline-name', 'auto'); +test_valid_value('scroll-timeline-name', '--a, none, --b'); +test_invalid_value('scroll-timeline-name', 'auto'); +test_invalid_value('scroll-timeline-name', 'abc'); test_invalid_value('scroll-timeline-name', 'default'); test_invalid_value('scroll-timeline-name', '10px'); test_invalid_value('scroll-timeline-name', 'foo bar'); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html index f5cd2ce47d7..f2bea29dd3c 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html @@ -31,10 +31,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } main > .scroller { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=scroller> @@ -42,7 +42,7 @@ <template shadowrootmode=open> <style> :host { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } </style> <slot></slot> @@ -60,7 +60,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Outer animation can see scroll timeline defined by :host'); </script> @@ -69,17 +69,17 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=host> <template shadowrootmode=open> <style> ::slotted(.scroller) { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } </style> <slot></slot> @@ -98,7 +98,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Outer animation can see scroll timeline defined by ::slotted'); </script> @@ -106,10 +106,10 @@ <template id=scroll_timeline_part> <style> .host { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } .host::part(foo) { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=host> @@ -122,7 +122,7 @@ } .target { animation: anim2 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div part=foo> @@ -140,7 +140,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'horizontal'); + assert_equals(anim.timeline.axis, 'x'); }, 'Inner animation can see scroll timeline defined by ::part'); </script> @@ -149,10 +149,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=scroller> @@ -160,7 +160,7 @@ <template shadowrootmode=open> <style> div { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } </style> <div> @@ -180,6 +180,6 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Slotted element can see scroll timeline within the shadow'); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html index 7fe2d12be30..57a1a947126 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html @@ -16,7 +16,7 @@ overflow-x: scroll; display: flex; flex-direction: row; - scroll-timeline: timeline inline; + scroll-timeline: --timeline inline; } .progress { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html index 51b60e73ce6..f77c5082200 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html @@ -8,7 +8,7 @@ overflow: hidden; width: 100px; height: 100px; - scroll-timeline: timeline; + scroll-timeline: --timeline; } #contents { height: 200px; @@ -20,10 +20,10 @@ #element { width: 0px; animation: expand 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { #element { animation-play-state: paused; } } </style> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html index 68e1cc955f5..7a6d9cdf4ae 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html @@ -9,67 +9,67 @@ <script> test_valid_value('scroll-timeline', 'none block', 'none'); test_valid_value('scroll-timeline', 'none inline'); -test_valid_value('scroll-timeline', 'abc horizontal'); -test_valid_value('scroll-timeline', 'abc inline'); -test_valid_value('scroll-timeline', 'aBc inline'); -test_valid_value('scroll-timeline', 'inline inline'); -test_valid_value('scroll-timeline', 'abc'); +test_valid_value('scroll-timeline', '--abc x'); +test_valid_value('scroll-timeline', '--abc inline'); +test_valid_value('scroll-timeline', '--aBc inline'); +test_valid_value('scroll-timeline', '--inline inline'); +test_valid_value('scroll-timeline', '--abc'); -test_valid_value('scroll-timeline', 'inline block', 'inline'); -test_valid_value('scroll-timeline', 'block block', 'block'); -test_valid_value('scroll-timeline', 'vertical block', 'vertical'); -test_valid_value('scroll-timeline', 'horizontal block', 'horizontal'); +test_valid_value('scroll-timeline', '--inline block', '--inline'); +test_valid_value('scroll-timeline', '--block block', '--block'); +test_valid_value('scroll-timeline', '--y block', '--y'); +test_valid_value('scroll-timeline', '--x block', '--x'); -test_valid_value('scroll-timeline', 'a, b, c'); -test_valid_value('scroll-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical'); -test_valid_value('scroll-timeline', 'auto'); -test_valid_value('scroll-timeline', 'abc defer vertical', 'abc vertical defer'); -test_valid_value('scroll-timeline', 'abc vertical defer'); +test_valid_value('scroll-timeline', '--a, --b, --c'); +test_valid_value('scroll-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y'); +test_valid_value('scroll-timeline', '--auto'); +test_valid_value('scroll-timeline', '--abc defer y', '--abc y defer'); +test_valid_value('scroll-timeline', '--abc y defer'); test_invalid_value('scroll-timeline', ''); -test_invalid_value('scroll-timeline', 'abc abc'); +test_invalid_value('scroll-timeline', '--abc --abc'); test_invalid_value('scroll-timeline', 'block none'); -test_invalid_value('scroll-timeline', 'inline abc'); +test_invalid_value('scroll-timeline', 'inline --abc'); test_invalid_value('scroll-timeline', 'default'); test_invalid_value('scroll-timeline', ','); test_invalid_value('scroll-timeline', ',,block,,'); test_computed_value('scroll-timeline', 'none block', 'none'); -test_computed_value('scroll-timeline', 'abc inline'); -test_computed_value('scroll-timeline', 'none vertical'); -test_computed_value('scroll-timeline', 'abc horizontal'); -test_computed_value('scroll-timeline', 'vertical vertical'); -test_computed_value('scroll-timeline', 'abc'); -test_computed_value('scroll-timeline', 'inline block', 'inline'); -test_computed_value('scroll-timeline', 'block block', 'block'); -test_computed_value('scroll-timeline', 'vertical block', 'vertical'); -test_computed_value('scroll-timeline', 'horizontal block', 'horizontal'); -test_computed_value('scroll-timeline', 'a, b, c'); -test_computed_value('scroll-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical'); -test_computed_value('scroll-timeline', 'abc defer vertical', 'abc vertical defer'); -test_computed_value('scroll-timeline', 'abc vertical defer'); +test_computed_value('scroll-timeline', '--abc inline'); +test_computed_value('scroll-timeline', 'none y'); +test_computed_value('scroll-timeline', '--abc x'); +test_computed_value('scroll-timeline', '--y y'); +test_computed_value('scroll-timeline', '--abc'); +test_computed_value('scroll-timeline', '--inline block', '--inline'); +test_computed_value('scroll-timeline', '--block block', '--block'); +test_computed_value('scroll-timeline', '--y block', '--y'); +test_computed_value('scroll-timeline', '--x block', '--x'); +test_computed_value('scroll-timeline', '--a, --b, --c'); +test_computed_value('scroll-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y'); +test_computed_value('scroll-timeline', '--abc defer y', '--abc y defer'); +test_computed_value('scroll-timeline', '--abc y defer'); -test_shorthand_value('scroll-timeline', 'abc vertical local', +test_shorthand_value('scroll-timeline', '--abc y local', { - 'scroll-timeline-name': 'abc', - 'scroll-timeline-axis': 'vertical', + 'scroll-timeline-name': '--abc', + 'scroll-timeline-axis': 'y', 'scroll-timeline-attachment': 'local', }); -test_shorthand_value('scroll-timeline', 'inline horizontal defer', +test_shorthand_value('scroll-timeline', '--inline x defer', { - 'scroll-timeline-name': 'inline', - 'scroll-timeline-axis': 'horizontal', + 'scroll-timeline-name': '--inline', + 'scroll-timeline-axis': 'x', 'scroll-timeline-attachment': 'defer', }); -test_shorthand_value('scroll-timeline', 'abc vertical ancestor, def', +test_shorthand_value('scroll-timeline', '--abc y ancestor, --def', { - 'scroll-timeline-name': 'abc, def', - 'scroll-timeline-axis': 'vertical, block', + 'scroll-timeline-name': '--abc, --def', + 'scroll-timeline-axis': 'y, block', 'scroll-timeline-attachment': 'ancestor, local', }); -test_shorthand_value('scroll-timeline', 'abc, def', +test_shorthand_value('scroll-timeline', '--abc, --def', { - 'scroll-timeline-name': 'abc, def', + 'scroll-timeline-name': '--abc, --def', 'scroll-timeline-axis': 'block, block', 'scroll-timeline-attachment': 'local, local', }); @@ -89,16 +89,16 @@ function test_shorthand_contraction(shorthand, longhands, expected) { } test_shorthand_contraction('scroll-timeline', { - 'scroll-timeline-name': 'abc', + 'scroll-timeline-name': '--abc', 'scroll-timeline-axis': 'inline', 'scroll-timeline-attachment': 'defer', -}, 'abc inline defer'); +}, '--abc inline defer'); test_shorthand_contraction('scroll-timeline', { - 'scroll-timeline-name': 'a, b', + 'scroll-timeline-name': '--a, --b', 'scroll-timeline-axis': 'inline, block', 'scroll-timeline-attachment': 'ancestor, local', -}, 'a inline ancestor, b'); +}, '--a inline ancestor, --b'); test_shorthand_contraction('scroll-timeline', { 'scroll-timeline-name': 'none, none', @@ -109,13 +109,13 @@ test_shorthand_contraction('scroll-timeline', { // Longhands with different lengths: test_shorthand_contraction('scroll-timeline', { - 'scroll-timeline-name': 'a, b, c', + 'scroll-timeline-name': '--a, --b, --c', 'scroll-timeline-axis': 'inline, inline', 'scroll-timeline-attachment': 'local, local', }, ''); test_shorthand_contraction('scroll-timeline', { - 'scroll-timeline-name': 'a, b', + 'scroll-timeline-name': '--a, --b', 'scroll-timeline-axis': 'inline, inline, inline', 'scroll-timeline-attachment': 'local, local', }, ''); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sibling-gcs.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sibling-gcs.html deleted file mode 100644 index 6062e795f43..00000000000 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sibling-gcs.html +++ /dev/null @@ -1,52 +0,0 @@ -<!DOCTYPE html> -<title>scroll-timeline and container queries</title> -<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-shorthand"> -<link rel="help" src="https://drafts.csswg.org/css-contain-3/#container-queries"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/web-animations/testcommon.js"></script> -<script src="support/testcommon.js"></script> -<style> - #scroller { - overflow: auto; - width: auto; - height: 100px; - } - #scroller > div { - height: 200px; - } - - @keyframes anim { - from { background-color: rgb(100, 100, 100); } - to { background-color: rgb(200, 200, 200); } - } - #element { - height: 10px; - width: 10px; - animation: anim 10s linear; - animation-timeline: timeline; - background-color: rgb(0, 0, 0); - } -</style> -<div> - <div id=scroller> - <div></div> - </div> - <div> - <div id=element></div> - </div> -</div> -<script> - setup(assert_implements_animation_timeline); - - promise_test(async (t) => { - element.offsetTop; - scroller.scrollTop = 50; - await waitForNextFrame(); - // Unknown timeline, time held at zero. - assert_equals(getComputedStyle(element).backgroundColor, 'rgb(100, 100, 100)'); - scroller.style.scrollTimeline = 'timeline'; - await waitForCSSScrollTimelineStyle(); - assert_equals(getComputedStyle(element).backgroundColor, 'rgb(150, 150, 150)'); - }, 'Timelines appearing on preceding siblings are visible to getComputedStyle'); -</script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html index 93ad6916ea7..6bc18544f4a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html @@ -18,7 +18,7 @@ overflow: hidden; width: 300px; height: 200px; - scroll-timeline: timeline; + scroll-timeline: --timeline; } #target { margin-bottom: 800px; @@ -33,7 +33,7 @@ } #target.update { animation-play-state: running; - animation-timeline: timeline; + animation-timeline: --timeline; animation-duration: auto; } </style> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/support/animation-range.css b/tests/wpt/web-platform-tests/scroll-animations/css/support/animation-range.css new file mode 100644 index 00000000000..453d076b6f3 --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/css/support/animation-range.css @@ -0,0 +1,82 @@ +.flex { + display: flex; +} + +.flex > div { + position: relative; + height: 160px; + margin: 0 10px; +} + +.scroller { + width: 100px; + height: 100px; + overflow: auto; + border: 1px solid black; +} + +.subject { + view-timeline-name: --view; + width: 20px; + height: 20px; + margin: 0 auto; + background: green; +} + +.meters { + position: absolute; + left: 0; + top: 110px; + height: 50px; +} + +.meters > div { + display: flex; + align-items: center; +} + +@keyframes active-interval { + 0% { opacity: 1; } + 100% { opacity: 1; } +} + +.meter { + width: 50px; + position: relative; + border: 2px solid black; + height: 5px; + overflow: clip; + opacity: 0.4; + animation: active-interval linear; + animation-timeline: --view; +} + +@keyframes slide-in { + 0% { transform: translateX(-100%)} + 100% { transform: translateX(0%)} +} + +.bar { + width: 100%; + height: 100%; + background: blue; + transform: translateX(-100%); + animation: slide-in linear; + animation-timeline: --view; +} + +.spacer { + height: 400px; +} + +.contain .bar, .contain .meter { + animation-range: contain; +} + +.entry .bar, .entry .meter { + animation-range: entry; +} + +.exit .bar, .exit .meter { + animation-range: exit; +} diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js b/tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js index 66bc27bb104..91540774d08 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js +++ b/tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js @@ -14,6 +14,6 @@ async function waitForCSSScrollTimelineStyle() { } function assert_implements_animation_timeline() { - assert_implements(CSS.supports('animation-timeline:foo'), + assert_implements(CSS.supports('animation-timeline:--foo'), 'animation-timeline not supported'); } diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html index eeb13150aa1..311b2c8929a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html @@ -27,7 +27,7 @@ overflow-x: hidden; width: 300px; height: 200px; - view-timeline: sibling defer; + view-timeline: --sibling defer; } #sibling { margin-top: 800px; @@ -36,7 +36,7 @@ width: 100px; height: 50px; background-color: blue; - view-timeline: sibling block ancestor; + view-timeline: --sibling block ancestor; } #target { margin-bottom: 800px; @@ -50,14 +50,14 @@ /* using document timeline by default */ animation-range-start: contain 0%; animation-range-end: contain 100%; - view-timeline: target block; + view-timeline: --target block; } #target.with-view-timeline { - animation-timeline: target; + animation-timeline: --target; } #target.with-view-timeline.retarget { - animation-timeline: sibling; + animation-timeline: --sibling; } </style> <body> @@ -90,7 +90,7 @@ // Once a view-timeline is added, the kefyrames must update to reflect // the new keyframe offsets. target.classList.add('with-view-timeline'); - assert_equals(getComputedStyle(target).animationTimeline, 'target', + assert_equals(getComputedStyle(target).animationTimeline, '--target', 'Switch to view timeline'); await waitForNextFrame(); @@ -110,7 +110,7 @@ assert_frame_lists_equal(frames, expected); target.classList.add('retarget'); - assert_equals(getComputedStyle(target).animationTimeline, 'sibling', + assert_equals(getComputedStyle(target).animationTimeline, '--sibling', 'Switch to another view timeline'); await waitForNextFrame(); frames = anim.effect.getKeyframes(); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html index 93ef7ffa1eb..10934347821 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html @@ -13,10 +13,10 @@ <style type="text/css"> @keyframes anim { cover 0% { - margin-left: 0px; + margin-left: 0px; } 50% { - opacity: 0.5; + opacity: 0.5; } cover 100% { margin-right: 0px; @@ -24,35 +24,34 @@ } #scroller { - scroll-timeline-attachment: defer t1; - border: 10px solid lightgray; + border: 10px solid lightgray; overflow-y: scroll; overflow-x: hidden; width: 300px; height: 200px; + view-timeline: --t1 defer; } #block { - scroll-timeline-attachment: ancestor; - margin-top: 800px; - margin-left: 10px; - margin-right: 10px; - width: 100px; - height: 50px; - background-color: blue; - view-timeline: t1 block; + margin-top: 800px; + margin-left: 10px; + margin-right: 10px; + width: 100px; + height: 50px; + background-color: blue; + view-timeline: --t1 ancestor; } #target { margin-bottom: 800px; - margin-left: 10px; - margin-right: 10px; + margin-left: 10px; + margin-right: 10px; width: 100px; height: 100px; z-index: -1; background-color: green; - animation: anim auto both linear; - animation-range-start: contain 0%; - animation-range-end: contain 100%; - animation-timeline: t1; + animation: anim auto both linear; + animation-range-start: contain 0%; + animation-range-end: contain 100%; + animation-timeline: --t1; } </style> <body> @@ -74,16 +73,16 @@ let frames = anim.effect.getKeyframes(); let expected_resolved_offsets = [ - { offset: 0, computedOffset: 0, easing: "linear", composite: "replace", + { offset: 0, computedOffset: 0, easing: "linear", composite: "replace", marginRight: "10px", opacity: "1" }, { offset: 1/2, computedOffset: 1/2, easing: "linear", composite: "auto", opacity: "0.5" }, { offset: 1, computedOffset: 1, easing: "linear", composite: "replace", marginLeft: "10px", opacity: "1" }, - { offset: { rangeName: 'cover', offset: CSS.percent(0) }, + { offset: { rangeName: "cover", offset: CSS.percent(0) }, computedOffset: -1/3, easing: "linear", composite: "auto", marginLeft: "0px" }, - { offset: { rangeName: 'cover', offset: CSS.percent(100) }, + { offset: { rangeName: "cover", offset: CSS.percent(100) }, computedOffset: 4/3, easing: "linear", composite: "auto", marginRight: "0px" }, ]; diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html index 54467bc83b1..cee90f3b1b0 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html @@ -17,9 +17,9 @@ background-color: rgba(0, 0, 255); height: 200px; width: 200px; - view-timeline-name: foo; + view-timeline-name: --foo; animation: linear 1s both fade-in-out-animation; - animation-timeline: foo; + animation-timeline: --foo; } #container { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-computed.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-computed.tentative.html new file mode 100644 index 00000000000..814933f7266 --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-computed.tentative.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7759"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +</head> +<style> + #outer { timeline-scope: foo; } + #target { timeline-scope: bar; } +</style> +<div id="outer"> + <div id="target"></div> +</div> +<script> +test_computed_value('timeline-scope', 'initial', 'none'); +test_computed_value('timeline-scope', 'inherit', 'foo'); +test_computed_value('timeline-scope', 'unset', 'none'); +test_computed_value('timeline-scope', 'revert', 'none'); +test_computed_value('timeline-scope', 'none'); +test_computed_value('timeline-scope', 'test'); +test_computed_value('timeline-scope', 'foo, bar'); +test_computed_value('timeline-scope', 'bar, foo'); +test_computed_value('timeline-scope', 'a, b, c, D, e'); + +test(() => { + let style = getComputedStyle(document.getElementById('target')); + assert_not_equals(Array.from(style).indexOf('timeline-scope'), -1); +}, 'The timeline-scope property shows up in CSSStyleDeclaration enumeration'); + +test(() => { + let style = document.getElementById('target').style; + assert_not_equals(style.cssText.indexOf('timeline-scope'), -1); +}, 'The timeline-scope property shows up in CSSStyleDeclaration.cssText'); + +</script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-parsing.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-parsing.tentative.html new file mode 100644 index 00000000000..2885cb758de --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-parsing.tentative.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7759"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<div id="target"></div> +<script> + +test_valid_value('timeline-scope', 'initial'); +test_valid_value('timeline-scope', 'inherit'); +test_valid_value('timeline-scope', 'unset'); +test_valid_value('timeline-scope', 'revert'); + +test_valid_value('timeline-scope', 'none'); +test_valid_value('timeline-scope', 'abc'); +test_valid_value('timeline-scope', ' abc', 'abc'); +test_valid_value('timeline-scope', 'aBc'); +test_valid_value('timeline-scope', 'foo, bar'); +test_valid_value('timeline-scope', 'bar, foo'); +test_valid_value('timeline-scope', 'auto'); + +test_invalid_value('timeline-scope', 'none, abc'); +test_invalid_value('timeline-scope', '10px'); +test_invalid_value('timeline-scope', 'foo bar'); +test_invalid_value('timeline-scope', '"foo" "bar"'); +test_invalid_value('timeline-scope', 'rgb(1, 2, 3)'); +test_invalid_value('timeline-scope', '#fefefe'); + +</script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope.html new file mode 100644 index 00000000000..985e694bfdc --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope.html @@ -0,0 +1,314 @@ +<!DOCTYPE html> +<title>Behavior of the timeline-scope property</title> +<link rel="help" src="https://github.com/w3c/csswg-drafts/issues/7759"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/web-animations/testcommon.js"></script> + +<main id=main></main> +<script> + function inflate(t, template) { + t.add_cleanup(() => main.replaceChildren()); + main.append(template.content.cloneNode(true)); + main.offsetTop; + } + + async function scrollTop(e, value) { + e.scrollTop = value; + await waitForNextFrame(); + } +</script> +<style> + @keyframes anim { + from { width: 0px; } + to { width: 200px; } + } + + .scroller { + overflow-y: hidden; + width: 200px; + height: 200px; + } + .scroller > .content { + margin: 400px 0px; + width: 100px; + height: 100px; + background-color: green; + } + .target { + background-color: coral; + width: 0px; + animation: anim auto linear; + animation-timeline: --t1; + } + .timeline { + scroll-timeline-name: --t1; + } + .scope { + timeline-scope: --t1; + } + +</style> + +<!-- Basic Behavior --> + +<template id=deferred_timeline> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Descendant can attach to deferred timeline'); +</script> + +<template id=deferred_timeline_no_attachments> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_no_attachments); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + }, 'Deferred timeline with no attachments'); +</script> + +<template id=scroll_timeline_inner_interference> + <div class="scroller timeline"> + <div class=content> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_inner_interference); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Inner timeline does not interfere with outer timeline'); +</script> + +<template id=deferred_timeline_two_attachments> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + <!-- Extra attachment --> + <div class="timeline"></div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_two_attachments); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + }, 'Deferred timeline with two attachments'); +</script> + +<!-- Dynamic Reattachment --> + +<template id=deferred_timeline_reattach> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + <div class="scroller"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_reattach); + let scrollers = main.querySelectorAll('.scroller'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 175); // 25% + + // Attached to scrollers[0]. + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Reattach to scrollers[1]. + scrollers[0].classList.remove('timeline'); + scrollers[1].classList.add('timeline'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25% + }, 'Dynamically re-attaching'); +</script> + +<template id=deferred_timeline_dynamic_detach> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_dynamic_detach); + let scrollers = main.querySelectorAll('.scroller'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 175); // 25% + + // Attached to two timelines initially: + assert_equals(getComputedStyle(target).width, '0px'); + + // Detach scrollers[1]. + scrollers[1].classList.remove('timeline'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Also detach scrollers[0]. + scrollers[0].classList.remove('timeline'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + }, 'Dynamically detaching'); +</script> + +<template id=deferred_timeline_attached_removed> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_attached_removed); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + let scroller_parent = scroller.parentElement; + scroller.remove(); + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + + scroller_parent.append(scroller); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Removing/inserting element with attaching timeline'); +</script> + +<template id=deferred_timeline_attached_display_none> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_attached_display_none); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + scroller.style.display = 'none'; + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + + scroller.style.display = 'block'; + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Ancestor attached element becoming display:none/block'); +</script> + +<template id=deferred_timeline_appearing> + <div class=container> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_appearing); + let container = main.querySelector('.container'); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + + await scrollTop(scroller, 350); // 50% + + // Not attached to any timeline initially. + assert_equals(getComputedStyle(target).width, '0px'); + + // Add the deferred timeline. + container.classList.add('scope'); + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Remove the deferred timeline. + container.classList.remove('scope'); + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + }, 'A deferred timeline appearing dynamically in the ancestor chain'); +</script> + +<template id=deferred_timeline_on_self> + <div class="scroller timeline scope"> + <div class=content> + <div class=target></div> + </div> + <div class=scroller2></div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_on_self); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 525); // 75% + + assert_equals(getComputedStyle(target).width, '150px'); // 0px => 200px, 75% + + // A second scroll-timeline now attaches to the same root. + let scroller2 = main.querySelector('.scroller2'); + scroller2.classList.add('timeline'); + await waitForNextFrame(); + + // The deferred timeline produced by timeline-scope is now inactive, + // but it doesn't matter, because we preferred to attach + // to the non-deferred timeline. + assert_equals(getComputedStyle(target).width, '150px'); // 0px => 200px, 75% + }, 'Animations prefer non-deferred timelines'); +</script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html index 6c2a792aeec..552461c9b6c 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html @@ -27,8 +27,8 @@ z-index: -1; background-color: green; animation: anim auto both linear; - animation-timeline: t1; - view-timeline: t1 block; + animation-timeline: --t1; + view-timeline: --t1 block; } .restrict-range { animation-range-start: contain 0%; diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html index a367ef9dd87..9f8ffd176e3 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html @@ -52,9 +52,9 @@ <template id=default_view_timeline> <style> #target { - view-timeline: t1; + view-timeline: --t1; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical-scroller> @@ -87,9 +87,9 @@ <template id=horizontal_timeline> <style> #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=horizontal-scroller> @@ -122,7 +122,7 @@ <template id=multiple_timelines> <style> #timelines { - view-timeline: tv vertical ancestor, th horizontal ancestor; + view-timeline: --tv y ancestor, --th x ancestor; background-color: red; } #scroller { @@ -132,7 +132,7 @@ display: grid; grid-template-columns: 50px 50px 50px 50px 50px 50px 50px; grid-template-row: 50px 50px 50px 50px 50px 50px 50px; - view-timeline: tv defer, th defer; + view-timeline: --tv defer, --th defer; } #scroller > div { z-index: -1; @@ -141,11 +141,11 @@ } #target_v { animation: anim 1s linear; - animation-timeline: tv; + animation-timeline: --tv; } #target_h { animation: anim 1s linear; - animation-timeline: th; + animation-timeline: --th; } </style> <div id=scroller> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html index ff98ed78258..a91ae13d64a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html @@ -39,10 +39,10 @@ background-color: coral; width: 0px; animation: anim auto linear; - animation-timeline: t1; + animation-timeline: --t1; } .timeline { - view-timeline-name: t1; + view-timeline-name: --t1; } .local { view-timeline-attachment: local; @@ -122,7 +122,7 @@ <div class="timeline defer" style="view-timeline-axis:inline"> <div class=target>Test</div> <div class=scroller> - <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div> + <div class="content timeline ancestor" style="view-timeline-axis:y"></div> </div> </div> </template> @@ -133,7 +133,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Axis of deferred timeline is taken from attached timeline'); </script> @@ -141,7 +141,7 @@ <div class="timeline defer" style="view-timeline-axis:inline"> <div class=target>Test</div> <div class=scroller> - <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div> + <div class="content timeline ancestor" style="view-timeline-axis:y"></div> <!-- Extra attachment --> <div class="timeline ancestor"></div> </div> @@ -403,11 +403,11 @@ <!-- ViewTimelines and ScrollTimelines --> <template id=view_scroll_timeline_defer> - <div style="scroll-timeline: t1 defer"> + <div style="scroll-timeline: --t1 defer"> <div class=target>Test1</div> <div class="timeline defer"> <div class=target>Test2</div> - <div class=scroller style="scroll-timeline: t1 ancestor;"> + <div class=scroller style="scroll-timeline: --t1 ancestor;"> <div class="content timeline ancestor" style="view-timeline-inset: 0px 50px"></div> </div> </div> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html index f4649dab040..30b2a1ae051 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html @@ -6,7 +6,7 @@ </head> <style> #outer { view-timeline-axis: block, inline; } - #target { view-timeline-axis: vertical; } + #target { view-timeline-axis: y; } </style> <div id=outer> <div id=target></div> @@ -18,11 +18,11 @@ test_computed_value('view-timeline-axis', 'unset', 'block'); test_computed_value('view-timeline-axis', 'revert', 'block'); test_computed_value('view-timeline-axis', 'block'); test_computed_value('view-timeline-axis', 'inline'); -test_computed_value('view-timeline-axis', 'vertical'); -test_computed_value('view-timeline-axis', 'horizontal'); +test_computed_value('view-timeline-axis', 'y'); +test_computed_value('view-timeline-axis', 'x'); test_computed_value('view-timeline-axis', 'block, inline'); test_computed_value('view-timeline-axis', 'inline, block'); -test_computed_value('view-timeline-axis', 'block, vertical, horizontal, inline'); +test_computed_value('view-timeline-axis', 'block, y, x, inline'); test_computed_value('view-timeline-axis', 'inline, inline, inline, inline'); test(() => { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html index ffcc36c3208..1ebe4410a95 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html @@ -13,11 +13,11 @@ test_valid_value('view-timeline-axis', 'revert'); test_valid_value('view-timeline-axis', 'block'); test_valid_value('view-timeline-axis', 'inline'); -test_valid_value('view-timeline-axis', 'vertical'); -test_valid_value('view-timeline-axis', 'horizontal'); +test_valid_value('view-timeline-axis', 'y'); +test_valid_value('view-timeline-axis', 'x'); test_valid_value('view-timeline-axis', 'block, inline'); test_valid_value('view-timeline-axis', 'inline, block'); -test_valid_value('view-timeline-axis', 'block, vertical, horizontal, inline'); +test_valid_value('view-timeline-axis', 'block, y, x, inline'); test_valid_value('view-timeline-axis', 'inline, inline, inline, inline'); test_invalid_value('view-timeline-axis', 'abc'); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html index 207c8c4e223..9e042b774b9 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html @@ -14,7 +14,7 @@ overflow: hidden; width: 100px; height: 100px; - view-timeline: t1 defer; + view-timeline: --t1 defer; } .scroller > div { height: 100px; @@ -46,11 +46,11 @@ <template id=dynamic_view_timeline_name> <style> .timeline { - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -106,11 +106,11 @@ width: 100px; height: 100px; margin: 100px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -126,7 +126,7 @@ await scrollLeft(scroller, 20); // 10% (horizontal) assert_equals(getComputedStyle(target).zIndex, '25', 'vertical'); - timeline.style.viewTimelineAxis = 'horizontal'; + timeline.style.viewTimelineAxis = 'x'; await waitForCSSScrollTimelineStyle(); assert_equals(getComputedStyle(target).zIndex, '10', 'horizontal'); }, 'Dynamically changing view-timeline-axis'); @@ -138,11 +138,11 @@ width: 100px; height: 100px; margin: 100px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -166,11 +166,11 @@ <template id=timeline_display_none> <style> #timeline { - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html index a7e807c2e81..9ba88fde507 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html @@ -91,10 +91,10 @@ <template id=test_one_value> <style> #target { - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: 10px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -115,10 +115,10 @@ <template id=test_two_values> <style> #target { - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: 10px 20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -140,10 +140,10 @@ <style> #target { font-size: 10px; - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: 10px 2em; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -165,10 +165,10 @@ <style> #target { font-size: 10px; - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: calc(5px + max(1%, 5%)) 20%; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -189,10 +189,10 @@ <template id=test_outset> <style> #target { - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: -10px -20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -213,10 +213,10 @@ <template id=test_horizontal> <style> #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: 10px 20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -237,10 +237,10 @@ <template id=test_block> <style> #target { - view-timeline: t1 block; + view-timeline: --t1 block; view-timeline-inset: 10px 20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -261,10 +261,10 @@ <template id=test_inline> <style> #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: 10px 20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -288,10 +288,10 @@ scroll-padding-block: 10px 20px; } #target { - view-timeline: t1 block; + view-timeline: --t1 block; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -316,10 +316,10 @@ writing-mode: vertical-lr; } #target { - view-timeline: t1 block; + view-timeline: --t1 block; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -344,10 +344,10 @@ writing-mode: vertical-rl; } #target { - view-timeline: t1 block; + view-timeline: --t1 block; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -372,10 +372,10 @@ scroll-padding-inline: 10px 20px; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -400,10 +400,10 @@ writing-mode: vertical-rl; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -428,10 +428,10 @@ writing-mode: vertical-lr; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -456,10 +456,10 @@ direction: rtl; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -485,10 +485,10 @@ direction: rtl; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -514,10 +514,10 @@ direction: rtl; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -541,10 +541,10 @@ scroll-padding-block: 10px 20px; } #target { - view-timeline: t1 vertical; + view-timeline: --t1 y; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -559,7 +559,7 @@ await assertValueAt(scroller, target, { scrollTop:125 + 5, expected:50 }); // 50% await assertValueAt(scroller, target, { scrollTop:200 - 10, expected:100 }); // 100% await assertValueAt(scroller, target, { scrollTop:200, expected:-1 }); - }, 'view-timeline-inset:auto, vertical'); + }, 'view-timeline-inset:auto, y'); </script> <template id=test_auto_vertical_vertical_rl> @@ -569,10 +569,10 @@ writing-mode: vertical-rl; } #target { - view-timeline: t1 vertical; + view-timeline: --t1 y; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -587,7 +587,7 @@ await assertValueAt(scroller, target, { scrollTop:125 + 5, expected:50 }); // 50% await assertValueAt(scroller, target, { scrollTop:200 - 10, expected:100 }); // 100% await assertValueAt(scroller, target, { scrollTop:200, expected:-1 }); - }, 'view-timeline-inset:auto, vertical, vertical-rl'); + }, 'view-timeline-inset:auto, y, vertical-rl'); </script> <template id=test_auto_vertical_vertical_rl_rtl> @@ -598,10 +598,10 @@ direction: rtl; } #target { - view-timeline: t1 vertical; + view-timeline: --t1 y; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -616,7 +616,7 @@ await assertValueAt(scroller, target, { scrollTop:-(125 + 5), expected:50 }); // 50% await assertValueAt(scroller, target, { scrollTop:-(200 - 10), expected:100 }); // 100% await assertValueAt(scroller, target, { scrollTop:-200, expected:-1 }); - }, 'view-timeline-inset:auto, vertical, vertical-rl, rtl'); + }, 'view-timeline-inset:auto, y, vertical-rl, rtl'); </script> <template id=test_auto_horizontal> @@ -625,10 +625,10 @@ scroll-padding-inline: 10px 20px; } #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -643,7 +643,7 @@ await assertValueAt(scroller, target, { scrollLeft:135 + 5, expected:50 }); // 50% await assertValueAt(scroller, target, { scrollLeft:200 - 10, expected:100 }); // 100% await assertValueAt(scroller, target, { scrollLeft:200, expected:-1 }); - }, 'view-timeline-inset:auto, horizontal'); + }, 'view-timeline-inset:auto, x'); </script> <template id=test_auto_horizontal_rtl> @@ -653,10 +653,10 @@ direction: rtl; } #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -671,7 +671,7 @@ await assertValueAt(scroller, target, { scrollLeft:-(135 + 5), expected:50 }); // 50% await assertValueAt(scroller, target, { scrollLeft:-(200 - 10), expected:100 }); // 100% await assertValueAt(scroller, target, { scrollLeft:-200, expected:-1 }); - }, 'view-timeline-inset:auto, horizontal, rtl'); + }, 'view-timeline-inset:auto, x, rtl'); </script> <template id=test_auto_horizontal_vertical_lr> @@ -681,10 +681,10 @@ writing-mode: vertical-lr; } #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -699,7 +699,7 @@ await assertValueAt(scroller, target, { scrollLeft:135 + 5, expected:50 }); // 50% await assertValueAt(scroller, target, { scrollLeft:200 - 10, expected:100 }); // 100% await assertValueAt(scroller, target, { scrollLeft:200, expected:-1 }); - }, 'view-timeline-inset:auto, horizontal, vertical-lr'); + }, 'view-timeline-inset:auto, x, vertical-lr'); </script> <template id=test_auto_horizontal_vertical_rl> @@ -709,10 +709,10 @@ writing-mode: vertical-rl; } #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -727,7 +727,7 @@ await assertValueAt(scroller, target, { scrollLeft:-(135 + 5), expected:50 }); // 50% await assertValueAt(scroller, target, { scrollLeft:-(200 - 10), expected:100 }); // 100% await assertValueAt(scroller, target, { scrollLeft:-200, expected:-1 }); - }, 'view-timeline-inset:auto, horizontal, vertical-rl'); + }, 'view-timeline-inset:auto, x, vertical-rl'); </script> <template id=test_auto_mix> @@ -737,10 +737,10 @@ scroll-padding-block: 50px calc(10% + 1em); } #target { - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: 10% auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html index 04eb6489490..011f03cb5db 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html @@ -38,10 +38,10 @@ z-index: -1; background-color: green; animation: anim auto both linear; - animation-timeline: t1; + animation-timeline: --t1; animation-range-start: contain 0%; animation-range-end: contain 100%; - view-timeline: t1 block; + view-timeline: --t1 block; } </style> <body> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html index 6cead9dc586..ea9acd22ba7 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html @@ -33,9 +33,9 @@ <style> #target { height: 0px; - view-timeline: t1; + view-timeline: --t1; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -58,15 +58,15 @@ <template id=timeline_preceding_sibling> <style> #scroller { - view-timeline: t1 defer; + view-timeline: --t1 defer; } #timeline { height: 0px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -91,11 +91,11 @@ <style> #timeline { height: 0px; - view-timeline: t1; + view-timeline: --t1; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -122,15 +122,15 @@ <template id=timeline_ancestor_sibling> <style> #scroller { - view-timeline: t1 defer; + view-timeline: --t1 defer; } #timeline { height: 0px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -157,15 +157,15 @@ <template id=timeline_ancestor_sibling_conflict> <style> #scroller { - view-timeline: t1 defer; + view-timeline: --t1 defer; } #timeline1, #timeline2 { height: 0px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -193,18 +193,18 @@ <template id=timeline_ancestor_closer_timeline_wins> <style> #scroller { - view-timeline: t1 defer; + view-timeline: --t1 defer; } #timeline { height: 0px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #parent { - scroll-timeline: t1 defer; + scroll-timeline: --t1 defer; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -229,13 +229,13 @@ <template id=timeline_ancestor_scroll_timeline_wins_on_same_element> <style> #scroller { - view-timeline: t1 defer; - scroll-timeline: t1 defer; + view-timeline: --t1 defer; + scroll-timeline: --t1 defer; } #timelines { height: 0px; - view-timeline: t1 ancestor; - scroll-timeline: t1 ancestor; + view-timeline: --t1 ancestor; + scroll-timeline: --t1 ancestor; overflow: auto; } #timelines > div { @@ -243,7 +243,7 @@ } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html index 5657dc78178..3304723f43f 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html @@ -5,24 +5,24 @@ <script src="/css/support/computed-testcommon.js"></script> </head> <style> - #outer { view-timeline-name: foo, bar; } - #target { view-timeline-name: faz; } + #outer { view-timeline-name: --foo, --bar; } + #target { view-timeline-name: --faz; } </style> <div id=outer> <div id=target></div> </div> <script> test_computed_value('view-timeline-name', 'initial', 'none'); -test_computed_value('view-timeline-name', 'inherit', 'foo, bar'); +test_computed_value('view-timeline-name', 'inherit', '--foo, --bar'); test_computed_value('view-timeline-name', 'unset', 'none'); test_computed_value('view-timeline-name', 'revert', 'none'); test_computed_value('view-timeline-name', 'none'); -test_computed_value('view-timeline-name', 'foo'); -test_computed_value('view-timeline-name', 'foo, bar'); -test_computed_value('view-timeline-name', 'bar, foo'); -test_computed_value('view-timeline-name', 'a, b, c, D, e'); +test_computed_value('view-timeline-name', '--foo'); +test_computed_value('view-timeline-name', '--foo, --bar'); +test_computed_value('view-timeline-name', '--bar, --foo'); +test_computed_value('view-timeline-name', '--a, --b, --c, --D, --e'); test_computed_value('view-timeline-name', 'none, none'); -test_computed_value('view-timeline-name', 'a, b, c, none, d, e'); +test_computed_value('view-timeline-name', '--a, --b, --c, none, --d, --e'); test(() => { let style = getComputedStyle(document.getElementById('target')); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html index 3878d5c5834..2b22cbe036e 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html @@ -11,16 +11,16 @@ test_valid_value('view-timeline-name', 'unset'); test_valid_value('view-timeline-name', 'revert'); test_valid_value('view-timeline-name', 'none'); -test_valid_value('view-timeline-name', 'abc'); -test_valid_value('view-timeline-name', ' abc', 'abc'); -test_valid_value('view-timeline-name', 'abc ', 'abc'); -test_valid_value('view-timeline-name', 'aBc'); -test_valid_value('view-timeline-name', 'foo, bar'); -test_valid_value('view-timeline-name', 'bar, foo'); +test_valid_value('view-timeline-name', '--abc'); +test_valid_value('view-timeline-name', ' --abc', '--abc'); +test_valid_value('view-timeline-name', '--aBc'); +test_valid_value('view-timeline-name', '--foo, --bar'); +test_valid_value('view-timeline-name', '--bar, --foo'); test_valid_value('view-timeline-name', 'none, none'); -test_valid_value('view-timeline-name', 'a, none, b'); -test_valid_value('view-timeline-name', 'auto'); +test_valid_value('view-timeline-name', '--a, none, --b'); +test_invalid_value('view-timeline-name', 'auto'); +test_invalid_value('view-timeline-name', 'abc'); test_invalid_value('view-timeline-name', 'default'); test_invalid_value('view-timeline-name', '10px'); test_invalid_value('view-timeline-name', 'foo bar'); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html index 55240efcfb5..bb14618c00a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html @@ -32,10 +32,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .scroller > div { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=scroller> @@ -44,7 +44,7 @@ <template shadowrootmode=open> <style> :host { - view-timeline: timeline vertical; + view-timeline: --timeline y; } </style> </template> @@ -61,7 +61,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Outer animation can see view timeline defined by :host'); </script> @@ -70,10 +70,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=scroller> @@ -81,7 +81,7 @@ <template shadowrootmode=open> <style> ::slotted(.target) { - view-timeline: timeline vertical; + view-timeline: --timeline y; } </style> <slot></slot> @@ -99,7 +99,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Outer animation can see view timeline defined by ::slotted'); </script> @@ -107,10 +107,10 @@ <template id=view_timeline_part> <style> .host { - view-timeline: timeline vertical; + view-timeline: --timeline y; } .host::part(foo) { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=host> @@ -123,7 +123,7 @@ } .target { animation: anim2 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div part=foo> @@ -141,7 +141,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'horizontal'); + assert_equals(anim.timeline.axis, 'x'); }, 'Inner animation can see view timeline defined by ::part'); </script> @@ -150,10 +150,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=scroller> @@ -161,7 +161,7 @@ <template shadowrootmode=open> <style> div { - view-timeline: timeline vertical; + view-timeline: --timeline y; } </style> <div> @@ -181,6 +181,6 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Slotted element can see view timeline within the shadow'); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html index 3d7593823db..1c657e40ceb 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html @@ -58,13 +58,13 @@ let scroller = main.querySelector('#scroller'); let target = main.querySelector('#target'); - target.style.viewTimeline = 't1 block'; + target.style.viewTimeline = '--t1 block'; // TODO(crbug.com/1375998): Create the timeline in a separate frame to // work around a bug. await waitForNextFrame(); target.style.animation = 'anim auto linear'; - target.style.animationTimeline = 't1'; + target.style.animationTimeline = '--t1'; target.style.animationRangeStart = options.rangeStart; target.style.animationRangeEnd = options.rangeEnd; diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html index c7199161607..960a8e6ecfb 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html @@ -29,8 +29,8 @@ z-index: -1; background-color: green; animation: anim auto linear; - animation-timeline: timeline; - view-timeline: timeline; + animation-timeline: --timeline; + view-timeline: --timeline; } #target.exit-range { animation-range-start: exit 0%; diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html index e8e761d86ba..5400d8314b0 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html @@ -29,8 +29,8 @@ z-index: -1; background-color: green; animation: anim auto linear; - animation-timeline: timeline; - view-timeline: timeline; + animation-timeline: --timeline; + view-timeline: --timeline; } #target.exit-range { animation-range-start: exit 0%; diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html index f19b9e6ac21..fd00acc73ab 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html @@ -9,63 +9,63 @@ <script src="/css/support/shorthand-testcommon.js"></script> <div id="target"></div> <script> -test_valid_value('view-timeline', 'abcd'); +test_valid_value('view-timeline', '--abcd'); test_valid_value('view-timeline', 'none block', 'none'); test_valid_value('view-timeline', 'none inline'); -// view-timeline-name: inline/block/horizontal/vertical. -test_valid_value('view-timeline', 'inline block', 'inline'); -test_valid_value('view-timeline', 'block block', 'block'); -test_valid_value('view-timeline', 'vertical block', 'vertical'); -test_valid_value('view-timeline', 'horizontal block', 'horizontal'); +// view-timeline-name: inline/block/x/y. +test_valid_value('view-timeline', '--inline block', '--inline'); +test_valid_value('view-timeline', '--block block', '--block'); +test_valid_value('view-timeline', '--y block', '--y'); +test_valid_value('view-timeline', '--x block', '--x'); -test_valid_value('view-timeline', 'a, b, c'); -test_valid_value('view-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical'); -test_valid_value('view-timeline', 'auto'); -test_valid_value('view-timeline', 'abc defer vertical', 'abc vertical defer'); -test_valid_value('view-timeline', 'abc vertical defer'); +test_valid_value('view-timeline', '--a, --b, --c'); +test_valid_value('view-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y'); +test_valid_value('view-timeline', '--auto'); +test_valid_value('view-timeline', '--abc defer y', '--abc y defer'); +test_valid_value('view-timeline', '--abc y defer'); -test_invalid_value('view-timeline', 'abc abc'); +test_invalid_value('view-timeline', '--abc --abc'); test_invalid_value('view-timeline', 'block none'); test_invalid_value('view-timeline', 'none none'); test_invalid_value('view-timeline', 'default'); test_invalid_value('view-timeline', ','); -test_invalid_value('view-timeline', ',,block,,'); +test_invalid_value('view-timeline', ',,--block,,'); -test_computed_value('view-timeline', 'abcd'); +test_computed_value('view-timeline', '--abcd'); test_computed_value('view-timeline', 'none block', 'none'); test_computed_value('view-timeline', 'none inline'); -test_computed_value('view-timeline', 'inline block', 'inline'); -test_computed_value('view-timeline', 'block block', 'block'); -test_computed_value('view-timeline', 'vertical block', 'vertical'); -test_computed_value('view-timeline', 'horizontal block', 'horizontal'); -test_computed_value('view-timeline', 'a, b, c'); -test_computed_value('view-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical'); -test_computed_value('view-timeline', 'abc defer vertical', 'abc vertical defer'); -test_computed_value('view-timeline', 'abc vertical defer'); +test_computed_value('view-timeline', '--inline block', '--inline'); +test_computed_value('view-timeline', '--block block', '--block'); +test_computed_value('view-timeline', '--y block', '--y'); +test_computed_value('view-timeline', '--x block', '--x'); +test_computed_value('view-timeline', '--a, --b, --c'); +test_computed_value('view-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y'); +test_computed_value('view-timeline', '--abc defer y', '--abc y defer'); +test_computed_value('view-timeline', '--abc y defer'); -test_shorthand_value('view-timeline', 'abc vertical', +test_shorthand_value('view-timeline', '--abc y', { - 'view-timeline-name': 'abc', - 'view-timeline-axis': 'vertical', + 'view-timeline-name': '--abc', + 'view-timeline-axis': 'y', 'view-timeline-attachment': 'local', }); -test_shorthand_value('view-timeline', 'abc vertical defer, def', +test_shorthand_value('view-timeline', '--abc y defer, --def', { - 'view-timeline-name': 'abc, def', - 'view-timeline-axis': 'vertical, block', + 'view-timeline-name': '--abc, --def', + 'view-timeline-axis': 'y, block', 'view-timeline-attachment': 'defer, local', }); -test_shorthand_value('view-timeline', 'abc, def', +test_shorthand_value('view-timeline', '--abc, --def', { - 'view-timeline-name': 'abc, def', + 'view-timeline-name': '--abc, --def', 'view-timeline-axis': 'block, block', 'view-timeline-attachment': 'local, local', }); -test_shorthand_value('view-timeline', 'inline horizontal ancestor', +test_shorthand_value('view-timeline', '--inline x ancestor', { - 'view-timeline-name': 'inline', - 'view-timeline-axis': 'horizontal', + 'view-timeline-name': '--inline', + 'view-timeline-axis': 'x', 'view-timeline-attachment': 'ancestor', }); @@ -84,16 +84,16 @@ function test_shorthand_contraction(shorthand, longhands, expected) { } test_shorthand_contraction('view-timeline', { - 'view-timeline-name': 'abc', + 'view-timeline-name': '--abc', 'view-timeline-axis': 'inline', 'view-timeline-attachment': 'ancestor', -}, 'abc inline ancestor'); +}, '--abc inline ancestor'); test_shorthand_contraction('view-timeline', { - 'view-timeline-name': 'a, b', + 'view-timeline-name': '--a, --b', 'view-timeline-axis': 'inline, block', 'view-timeline-attachment': 'defer, local', -}, 'a inline defer, b'); +}, '--a inline defer, --b'); test_shorthand_contraction('view-timeline', { 'view-timeline-name': 'none, none', @@ -104,13 +104,13 @@ test_shorthand_contraction('view-timeline', { // Longhands with different lengths: test_shorthand_contraction('view-timeline', { - 'view-timeline-name': 'a, b, c', + 'view-timeline-name': '--a, --b, --c', 'view-timeline-axis': 'inline, inline', 'view-timeline-attachment': 'local, local', }, ''); test_shorthand_contraction('view-timeline', { - 'view-timeline-name': 'a, b', + 'view-timeline-name': '--a, --b', 'view-timeline-axis': 'inline, inline, inline', 'view-timeline-attachment': 'local, local', }, ''); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html index 7001eceeaf8..2961fedd425 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html @@ -30,8 +30,8 @@ z-index: -1; background-color: green; animation: anim auto both linear; - animation-timeline: timeline; - view-timeline: timeline; + animation-timeline: --timeline; + view-timeline: --timeline; animation-range: exit; } #target.bounds-update { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html index 6627eeb9988..1bd6f0468c3 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html @@ -43,10 +43,10 @@ <template id=omitted_axis> <style> #target { - view-timeline-name: t1, t2; /* Two items */ + view-timeline-name: --t1, --t2; /* Two items */ view-timeline-axis: inline; /* One item */ animation: anim 1s linear; - animation-timeline: t2; + animation-timeline: --t2; } </style> <div id=scroller class=scroller> @@ -76,10 +76,10 @@ <template id=omitted_inset> <style> #target { - view-timeline-name: t1, t2; /* Two items */ + view-timeline-name: --t1, --t2; /* Two items */ view-timeline-inset: 100px; /* One item */ animation: anim 1s linear; - animation-timeline: t2; + animation-timeline: --t2; } </style> <div id=scroller class=scroller> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html index e8f537b188c..db260f15f07 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html @@ -27,8 +27,8 @@ z-index: -1; background-color: green; animation: anim auto linear; - animation-timeline: t1; - view-timeline: t1 block; + animation-timeline: --t1; + view-timeline: --t1 block; animation-range-start: entry 0%; animation-range-end: entry 100%; /* Sentinel value when in before or after phase of the animation. */ diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html index 8e211efa11a..88c6a453ec9 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html +++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html @@ -67,8 +67,8 @@ test(t => { const gValidAxisValues = [ 'block', 'inline', - 'horizontal', - 'vertical', + 'x', + 'y', ]; for (let axis of gValidAxisValues) { diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html index d18abcd48f5..748cda2f894 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html +++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html @@ -23,9 +23,9 @@ promise_test(async t => { const inlineScrollTimeline = new ScrollTimeline( {source: scroller, axis: 'inline'}); const horizontalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'horizontal'}); + {source: scroller, axis: 'x'}); const verticalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'vertical'}); + {source: scroller, axis: 'y'}); // Unscrolled, all timelines should read a current time of 0 even though the // X-axis will have started at the right hand side for rtl. @@ -67,9 +67,9 @@ promise_test(async t => { const inlineScrollTimeline = new ScrollTimeline( {source: scroller, axis: 'inline'}); const horizontalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'horizontal'}); + {source: scroller, axis: 'x'}); const verticalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'vertical'}); + {source: scroller, axis: 'y'}); // Unscrolled, all timelines should read a current time of 0 even though the // X-axis will have started at the right hand side for vertical-rl. @@ -113,9 +113,9 @@ promise_test(async t => { const inlineScrollTimeline = new ScrollTimeline( {source: scroller, axis: 'inline'}); const horizontalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'horizontal'}); + {source: scroller, axis: 'x'}); const verticalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'vertical'}); + {source: scroller, axis: 'y'}); // Unscrolled, all timelines should read a current time of 0. assert_percents_equal(blockScrollTimeline.currentTime, 0, diff --git a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html index 53330d32f1f..16b9c301417 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html +++ b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html @@ -33,8 +33,8 @@ z-index: -1; background-color: green; animation: anim auto both linear; - animation-timeline: t1; - view-timeline: t1; + animation-timeline: --t1; + view-timeline: --t1; } </style> <body> diff --git a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html index 9ae4b1df775..ee7ce906783 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html +++ b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html @@ -35,7 +35,7 @@ <script type="text/javascript"> promise_test(async t => { const options = { - timeline: { axis: 'vertical' }, + timeline: { axis: 'y' }, animation: { rangeStart: { rangeName: 'entry', offset: CSS.percent(0) }, rangeEnd: { rangeName: 'entry', offset: CSS.percent(100) }, diff --git a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html index e77cf4629cb..4eec5d8f13a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html @@ -33,8 +33,8 @@ z-index: -1; background-color: green; animation: anim auto linear; - animation-timeline: t1; - view-timeline: t1; + animation-timeline: --t1; + view-timeline: --t1; } </style> <body> diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html index ab667013a2b..5f6371cb428 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html @@ -23,6 +23,14 @@ promise_test(async t => { const scope = './resources/partitioned-cookies-' const absolute_scope = new URL(scope, window.location).href; + // Set a Partitioned cookie. + document.cookie = '__Host-partitioned=123; Secure; Path=/; SameSite=None; Partitioned;'; + assert_true(document.cookie.includes('__Host-partitioned=123')); + + // Set an unpartitioned cookie. + document.cookie = 'unpartitioned=456; Secure; Path=/; SameSite=None;'; + assert_true(document.cookie.includes('unpartitioned=456')); + const reg = await service_worker_unregister_and_register(t, script, scope); await wait_for_state(t, reg.installing, 'activated'); t.add_cleanup(() => reg.unregister()); @@ -55,10 +63,6 @@ promise_test(async t => { await wait_promise; assert_true(got.ok, 'Message passing'); - // Set a Partitioned cookie. - document.cookie = '__Host-partitioned=123; Secure; Path=/; SameSite=None; Partitioned;'; - assert_true(document.cookie.includes('__Host-partitioned=123')); - // Test that the partitioned cookie is available to this worker via HTTP. wait_promise = new Promise(resolve => { resolve_wait_promise = resolve; @@ -71,6 +75,7 @@ promise_test(async t => { await wait_promise; assert_true(got.ok, 'Get cookies'); assert_true(got.cookies.includes('__Host-partitioned'), 'Can access partitioned cookie via HTTP'); + assert_true(got.cookies.includes('unpartitioned'), 'Can access unpartitioned cookie via HTTP'); // Test that the partitioned cookie is available to this worker via CookieStore API. wait_promise = new Promise(resolve => { @@ -84,6 +89,22 @@ promise_test(async t => { await wait_promise; assert_true(got.ok, 'Get cookies'); assert_true(got.cookies.includes('__Host-partitioned'), 'Can access partitioned cookie via JS'); + assert_true(got.cookies.includes('unpartitioned'), 'Can access unpartitioned cookie via JS'); + + // Test that the partitioned cookie is not available to this worker in HTTP + // requests from importScripts. + wait_promise = new Promise(resolve => { + resolve_wait_promise = resolve; + }); + on_message = ev => { + got = ev.data; + resolve_wait_promise(); + }; + filtered_registrations[0].active.postMessage({type: 'echo_cookies_import'}); + await wait_promise; + assert_true(got.ok, 'Get cookies'); + assert_true(got.cookies.includes('__Host-partitioned'), 'Can access partitioned cookie via importScripts'); + assert_true(got.cookies.includes('unpartitioned'), 'Can access unpartitioned cookie via importScripts'); const popup = window.open( new URL( @@ -95,4 +116,4 @@ promise_test(async t => { </script> </body> -</html>
\ No newline at end of file +</html> diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html index 3fdf937ae1a..25ddf601457 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html @@ -21,6 +21,9 @@ promise_test(async t => { document.cookie = '__Host-partitioned=123; Secure; Path=/; SameSite=None; Partitioned;'; assert_true(document.cookie.includes('__Host-partitioned=123')); + // Make sure DOM cannot access the unpartitioned cookie. + assert_false(document.cookie.includes('unpartitioned=456')); + const reg = await service_worker_unregister_and_register(t, script, scope); await wait_for_state(t, reg.installing, 'activated'); @@ -61,9 +64,51 @@ promise_test(async t => { filtered_registrations[0].active.postMessage({type: 'echo_cookies_js'}); await wait_promise; assert_true(got.ok, 'Get cookies'); - assert_true(got.cookies.includes('__Host-partitioned'), 'Can access partitioned cookie');; + assert_true( + got.cookies.includes('__Host-partitioned'), + 'Credentialless frame worker can access partitioned cookie via JS'); + assert_false( + got.cookies.includes('unpartitioned'), + 'Credentialless frame worker cannot access unpartitioned cookie via JS'); + + // Test that the partitioned cookie is available to this worker via HTTP. + wait_promise = new Promise(resolve => { + resolve_wait_promise = resolve; + }); + on_message = ev => { + got = ev.data; + resolve_wait_promise(); + }; + filtered_registrations[0].active.postMessage({ type: 'echo_cookies_http' }); + await wait_promise; + assert_true(got.ok, 'Get cookies'); + assert_true( + got.cookies.includes('__Host-partitioned'), + 'Credentialless frame worker can access partitioned cookie via HTTP'); + assert_false( + got.cookies.includes('unpartitioned'), + 'Credentialless frame worker cannot access unpartitioned cookie via HTTP'); + + // Test that the partitioned cookie is not available to this worker in HTTP + // requests from importScripts. + wait_promise = new Promise(resolve => { + resolve_wait_promise = resolve; + }); + on_message = ev => { + got = ev.data; + resolve_wait_promise(); + }; + filtered_registrations[0].active.postMessage({ type: 'echo_cookies_import' }); + await wait_promise; + assert_true(got.ok, 'Get cookies'); + assert_true( + got.cookies.includes('__Host-partitioned'), + 'Credentialless frame worker can access partitioned cookie via importScripts'); + assert_false( + got.cookies.includes('unpartitioned'), + 'Credentialless frame worker cannot access unpartitioned cookie via importScripts'); }); </script> </body> -</html>
\ No newline at end of file +</html> diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html index 6a8ed6ca989..00b3412c41f 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html @@ -16,6 +16,7 @@ promise_test(async t => { const absolute_scope = new URL(scope, window.location).href; assert_false(document.cookie.includes('__Host-partitioned=123'), 'DOM cannot access partitioned cookie'); + assert_true(document.cookie.includes('unpartitioned=456'), 'DOM can access unpartitioned cookie'); const reg = await service_worker_unregister_and_register(t, script, scope); await wait_for_state(t, reg.installing, 'activated'); @@ -59,7 +60,10 @@ promise_test(async t => { assert_true(got.ok, 'Get cookies'); assert_false( got.cookies.includes('__Host-partitioned'), - 'Worker cannot access partitioned cookie'); + 'Worker cannot access partitioned cookie via HTTP'); + assert_true( + got.cookies.includes('unpartitioned'), + 'Worker can access unpartitioned cookie via HTTP'); // Test that the partitioned cookie is not available to this worker via CookieStore API. wait_promise = new Promise(resolve => { @@ -74,9 +78,31 @@ promise_test(async t => { assert_true(got.ok, 'Get cookies'); assert_false( got.cookies.includes('__Host-partitioned'), - 'Worker cannot access partitioned cookie'); + 'Worker cannot access partitioned cookie via JS'); + assert_true( + got.cookies.includes('unpartitioned'), + 'Worker can access unpartitioned cookie via JS'); + + // Test that the partitioned cookie is not available to this worker in HTTP + // requests from importScripts. + wait_promise = new Promise(resolve => { + resolve_wait_promise = resolve; + }); + on_message = ev => { + got = ev.data; + resolve_wait_promise(); + }; + filtered_registrations[0].active.postMessage({type: 'echo_cookies_import'}); + await wait_promise; + assert_true(got.ok, 'Get cookies'); + assert_false( + got.cookies.includes('__Host-partitioned'), + 'Worker cannot access partitioned cookie via importScripts'); + assert_true( + got.cookies.includes('unpartitioned'), + 'Worker can access unpartitioned cookie via importScripts'); }); </script> </body> -</html>
\ No newline at end of file +</html> diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js index bc2a2831568..767dbf44327 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js @@ -10,6 +10,8 @@ async function onMessage(event) { return onEchoCookiesHttp(event); case 'echo_cookies_js': return onEchoCookiesJs(event); + case 'echo_cookies_import': + return onEchoCookiesImport(event); default: return; } @@ -41,3 +43,11 @@ async function onEchoCookiesJs(event) { event.source.postMessage({ok: false}); } } + +// Sets `self._cookies` variable, array of the names of cookies available to +// the request. +importScripts(`${self.origin}/cookies/resources/list-cookies-for-script.py`); + +function onEchoCookiesImport(event) { + event.source.postMessage({ok: true, cookies: self._cookies}); +} diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js index bc2a2831568..767dbf44327 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js @@ -10,6 +10,8 @@ async function onMessage(event) { return onEchoCookiesHttp(event); case 'echo_cookies_js': return onEchoCookiesJs(event); + case 'echo_cookies_import': + return onEchoCookiesImport(event); default: return; } @@ -41,3 +43,11 @@ async function onEchoCookiesJs(event) { event.source.postMessage({ok: false}); } } + +// Sets `self._cookies` variable, array of the names of cookies available to +// the request. +importScripts(`${self.origin}/cookies/resources/list-cookies-for-script.py`); + +function onEchoCookiesImport(event) { + event.source.postMessage({ok: true, cookies: self._cookies}); +} diff --git a/tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js b/tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js index e8e5846c93b..baf26be8b0b 100644 --- a/tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js +++ b/tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js @@ -162,11 +162,11 @@ const validateSoftNavigationEntry = async (clicks, extraValidations, 'Event start timestamp matches'); assert_not_equals(entry.navigationId, performance.getEntriesByType("navigation")[0].navigationId, - "The navigation ID was incremented"); + "The navigation ID was re-generated and different from the initial one."); if (i > 0) { assert_not_equals(entry.navigationId, entries[i-1].navigationId, - "The navigation ID was incremented between clicks"); + "The navigation ID was re-generated between clicks"); } } assert_equals(performance.getEntriesByType("soft-navigation").length, diff --git a/tests/wpt/web-platform-tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js b/tests/wpt/web-platform-tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js new file mode 100644 index 00000000000..ba82edb72ec --- /dev/null +++ b/tests/wpt/web-platform-tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js @@ -0,0 +1,35 @@ +// META: title=Bucket quota enforcement for indexeddb +// META: script=/storage/buckets/resources/util.js + +promise_test(async t => { + const arraySize = 1e6; + const objectStoreName = "storageManager"; + const dbname = + this.window ? window.location.pathname : 'estimate-worker.https.html'; + + let quota = arraySize / 2; + const bucket = await navigator.storageBuckets.open('idb', {quota}); + + await indexedDbDeleteRequest(bucket.indexedDB, dbname); + + const db = + await indexedDbOpenRequest(t, bucket.indexedDB, dbname, (db_to_upgrade) => { + db_to_upgrade.createObjectStore(objectStoreName); + }); + + const txn = db.transaction(objectStoreName, 'readwrite'); + const buffer = new ArrayBuffer(arraySize); + const view = new Uint8Array(buffer); + + for (let i = 0; i < arraySize; i++) { + view[i] = Math.floor(Math.random() * 255); + } + + const testBlob = new Blob([buffer], {type: 'binary/random'}); + txn.objectStore(objectStoreName).add(testBlob, 1); + + await promise_rejects_dom( + t, 'QuotaExceededError', transactionPromise(txn)); + + db.close(); +}, 'IDB respects bucket quota'); diff --git a/tests/wpt/web-platform-tests/storage/buckets/bucket-storage-policy.tentative.https.any.js b/tests/wpt/web-platform-tests/storage/buckets/bucket-storage-policy.tentative.https.any.js new file mode 100644 index 00000000000..d6dce3675d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/storage/buckets/bucket-storage-policy.tentative.https.any.js @@ -0,0 +1,21 @@ +// META: title=Buckets API: Tests for bucket storage policies. +// META: script=/storage/buckets/resources/util.js +// META: global=window,worker + +'use strict'; + +promise_test(async testCase => { + await prepareForBucketTest(testCase); + + await promise_rejects_js( + testCase, TypeError, + navigator.storageBuckets.open('negative', {quota: -1})); + + await promise_rejects_js( + testCase, TypeError, navigator.storageBuckets.open('zero', {quota: 0})); + + await promise_rejects_js( + testCase, TypeError, + navigator.storageBuckets.open( + 'above_max', {quota: Number.MAX_SAFE_INTEGER + 1})); +}, 'The open promise should reject with a TypeError when quota is requested outside the range of 1 to Number.MAX_SAFE_INTEGER.'); diff --git a/tests/wpt/web-platform-tests/storage/buckets/buckets_storage_policy.tentative.https.any.js b/tests/wpt/web-platform-tests/storage/buckets/buckets_storage_policy.tentative.https.any.js deleted file mode 100644 index a66fd81cd43..00000000000 --- a/tests/wpt/web-platform-tests/storage/buckets/buckets_storage_policy.tentative.https.any.js +++ /dev/null @@ -1,46 +0,0 @@ -// META: title=Buckets API: Tests for bucket storage policies. -// META: script=/storage/buckets/resources/util.js -// META: global=window,worker - -'use strict'; - -promise_test(async testCase => { - await prepareForBucketTest(testCase); - - await promise_rejects_js( - testCase, TypeError, - navigator.storageBuckets.open('negative', {quota: -1})); - - await promise_rejects_js( - testCase, TypeError, navigator.storageBuckets.open('zero', {quota: 0})); - - await promise_rejects_js( - testCase, TypeError, - navigator.storageBuckets.open( - 'above_max', {quota: Number.MAX_SAFE_INTEGER + 1})); -}, 'The open promise should reject with a TypeError when quota is requested outside the range of 1 to Number.MAX_SAFE_INTEGER.'); - - -promise_test(async testCase => { - await prepareForBucketTest(testCase); - - // IndexedDB - { - const quota = 1; - const bucket = await navigator.storageBuckets.open('idb', {quota}); - - const objectStoreName = 'store'; - const db = await indexedDbOpenRequest( - testCase, bucket.indexedDB, 'db', (db_to_upgrade) => { - db_to_upgrade.createObjectStore(objectStoreName); - }); - - const overflowBuffer = new Uint8Array(quota + 1); - - const txn = db.transaction(objectStoreName, 'readwrite'); - txn.objectStore(objectStoreName).add('', overflowBuffer); - - await promise_rejects_dom( - testCase, 'QuotaExceededError', transactionPromise(txn)); - } -}, 'A QuotaExceededError is thrown when a storage API exceeds the quota of the bucket its in.'); diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-message-port.any.js b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-message-port.any.js new file mode 100644 index 00000000000..e9961ce0422 --- /dev/null +++ b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-message-port.any.js @@ -0,0 +1,49 @@ +// META: global=window,worker +// META: script=../resources/test-utils.js +// META: script=../resources/rs-utils.js +'use strict'; + +promise_test(async () => { + const channel = new MessageChannel; + const port1 = channel.port1; + const port2 = channel.port2; + + const source = { + start(controller) { + controller.enqueue(port1, { transfer : [ port1 ] }); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + + const chunk = await stream.getReader().read(); + + assert_not_equals(chunk.value, port1); + + let promise = new Promise(resolve => port2.onmessage = e => resolve(e.data)); + chunk.value.postMessage("toPort2"); + assert_equals(await promise, "toPort2"); + + promise = new Promise(resolve => chunk.value.onmessage = e => resolve(e.data)); + port2.postMessage("toPort1"); + assert_equals(await promise, "toPort1"); +}, 'Transferred MessageChannel works as expected'); + +promise_test(async t => { + const channel = new MessageChannel; + const port1 = channel.port1; + const port2 = channel.port2; + + const source = { + start(controller) { + controller.enqueue({ port1 }, { transfer : [ port1 ] }); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + const [clone1, clone2] = stream.tee(); + + await promise_rejects_dom(t, "DataCloneError", clone2.getReader().read()); +}, 'Second branch of owning ReadableStream tee should end up into errors with transfer only values'); diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-video-frame.any.js b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-video-frame.any.js new file mode 100644 index 00000000000..ec01fda0b3c --- /dev/null +++ b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-video-frame.any.js @@ -0,0 +1,128 @@ +// META: global=window,worker +// META: script=../resources/test-utils.js +// META: script=../resources/rs-utils.js +'use strict'; + +function createVideoFrame() +{ + let init = { + format: 'I420', + timestamp: 1234, + codedWidth: 4, + codedHeight: 2 + }; + let data = new Uint8Array([ + 1, 2, 3, 4, 5, 6, 7, 8, // y + 1, 2, // u + 1, 2, // v + ]); + + return new VideoFrame(data, init); +} + +promise_test(async () => { + const videoFrame = createVideoFrame(); + videoFrame.test = 1; + const source = { + start(controller) { + assert_equals(videoFrame.format, 'I420'); + controller.enqueue(videoFrame, { transfer : [ videoFrame ] }); + assert_equals(videoFrame.format, null); + assert_equals(videoFrame.test, 1); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + // Cancelling the stream should close all video frames, thus no console messages of GCing VideoFrames should happen. + stream.cancel(); +}, 'ReadableStream of type owning should close serialized chunks'); + +promise_test(async () => { + const videoFrame = createVideoFrame(); + videoFrame.test = 1; + const source = { + start(controller) { + assert_equals(videoFrame.format, 'I420'); + controller.enqueue({ videoFrame }, { transfer : [ videoFrame ] }); + assert_equals(videoFrame.format, null); + assert_equals(videoFrame.test, 1); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + const reader = stream.getReader(); + + const chunk = await reader.read(); + assert_equals(chunk.value.videoFrame.format, 'I420'); + assert_equals(chunk.value.videoFrame.test, undefined); + + chunk.value.videoFrame.close(); +}, 'ReadableStream of type owning should transfer JS chunks with transferred values'); + +promise_test(async t => { + const videoFrame = createVideoFrame(); + videoFrame.close(); + const source = { + start(controller) { + assert_throws_dom("DataCloneError", () => controller.enqueue(videoFrame, { transfer : [ videoFrame ] })); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + const reader = stream.getReader(); + + await promise_rejects_dom(t, "DataCloneError", reader.read()); +}, 'ReadableStream of type owning should error when trying to enqueue not serializable values'); + +promise_test(async () => { + const videoFrame = createVideoFrame(); + const source = { + start(controller) { + controller.enqueue(videoFrame, { transfer : [ videoFrame ] }); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + const [clone1, clone2] = stream.tee(); + + const chunk1 = await clone1.getReader().read(); + const chunk2 = await clone2.getReader().read(); + + assert_equals(videoFrame.format, null); + assert_equals(chunk1.value.format, 'I420'); + assert_equals(chunk2.value.format, 'I420'); + + chunk1.value.close(); + chunk2.value.close(); +}, 'ReadableStream of type owning should clone serializable objects when teeing'); + +promise_test(async () => { + const videoFrame = createVideoFrame(); + videoFrame.test = 1; + const source = { + start(controller) { + assert_equals(videoFrame.format, 'I420'); + controller.enqueue({ videoFrame }, { transfer : [ videoFrame ] }); + assert_equals(videoFrame.format, null); + assert_equals(videoFrame.test, 1); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + const [clone1, clone2] = stream.tee(); + + const chunk1 = await clone1.getReader().read(); + const chunk2 = await clone2.getReader().read(); + + assert_equals(videoFrame.format, null); + assert_equals(chunk1.value.videoFrame.format, 'I420'); + assert_equals(chunk2.value.videoFrame.format, 'I420'); + + chunk1.value.videoFrame.close(); + chunk2.value.videoFrame.close(); +}, 'ReadableStream of type owning should clone JS Objects with serializables when teeing'); diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/owning-type.any.js b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type.any.js new file mode 100644 index 00000000000..27a3dda894e --- /dev/null +++ b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type.any.js @@ -0,0 +1,91 @@ +// META: global=window,worker +// META: script=../resources/test-utils.js +// META: script=../resources/rs-utils.js +'use strict'; + +test(() => { + new ReadableStream({ type: 'owning' }); // ReadableStream constructed with 'owning' type +}, 'ReadableStream can be constructed with owning type'); + +test(() => { + let startCalled = false; + + const source = { + start(controller) { + assert_equals(this, source, 'source is this during start'); + assert_true(controller instanceof ReadableStreamDefaultController, 'default controller'); + startCalled = true; + }, + type: 'owning' + }; + + new ReadableStream(source); + assert_true(startCalled); +}, 'ReadableStream of type owning should call start with a ReadableStreamDefaultController'); + +test(() => { + let startCalled = false; + + const source = { + start(controller) { + controller.enqueue("a", { transfer: [] }); + controller.enqueue("a", { transfer: undefined }); + startCalled = true; + }, + type: 'owning' + }; + + new ReadableStream(source); + assert_true(startCalled); +}, 'ReadableStream should be able to call enqueue with an empty transfer list'); + +test(() => { + let startCalled = false; + + const uint8Array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); + const buffer = uint8Array.buffer; + let source = { + start(controller) { + startCalled = true; + assert_throws_js(TypeError, () => { controller.enqueue(buffer, { transfer : [ buffer ] }); }, "transfer list is not empty"); + } + }; + + new ReadableStream(source); + assert_true(startCalled); + + startCalled = false; + source = { + start(controller) { + startCalled = true; + assert_throws_js(TypeError, () => { controller.enqueue(buffer, { get transfer() { throw new TypeError(); } }) }, "getter throws"); + } + }; + + new ReadableStream(source); + assert_true(startCalled); +}, 'ReadableStream should check transfer parameter'); + +promise_test(async () => { + const uint8Array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); + const buffer = uint8Array.buffer; + buffer.test = 1; + const source = { + start(controller) { + assert_equals(buffer.byteLength, 8); + controller.enqueue(buffer, { transfer : [ buffer ] }); + assert_equals(buffer.byteLength, 0); + assert_equals(buffer.test, 1); + }, + type: 'owning' + }; + + const stream = new ReadableStream(source); + const reader = stream.getReader(); + + const chunk = await reader.read(); + + assert_not_equals(chunk.value, buffer); + assert_equals(chunk.value.byteLength, 8); + assert_equals(chunk.value.test, undefined); +}, 'ReadableStream of type owning should transfer enqueued chunks'); diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/read-task-handling.window.js b/tests/wpt/web-platform-tests/streams/readable-streams/read-task-handling.window.js new file mode 100644 index 00000000000..2edc0ddddfe --- /dev/null +++ b/tests/wpt/web-platform-tests/streams/readable-streams/read-task-handling.window.js @@ -0,0 +1,46 @@ +// META: global=window,worker +'use strict'; + +function performMicrotaskCheckpoint() { + document.createNodeIterator(document, -1, { + acceptNode() { + return NodeFilter.FILTER_ACCEPT; + } + }).nextNode(); +} + +test(() => { + // Add a getter for "then" that will incidentally be invoked + // during promise resolution. + Object.prototype.__defineGetter__('then', () => { + // Clean up behind ourselves. + delete Object.prototype.then; + + // This promise should (like all promises) be resolved + // asynchronously. + var executed = false; + Promise.resolve().then(_ => { executed = true; }); + + // This shouldn't run microtasks! They should only run + // after the fetch is resolved. + performMicrotaskCheckpoint(); + + // The fulfill handler above shouldn't have run yet. If it has run, + // throw to reject this promise and fail the test. + assert_false(executed, "shouldn't have run microtasks yet"); + + // Otherwise act as if there's no "then" property so the promise + // fulfills and the test passes. + return undefined; + }); + + const readable = new ReadableStream({ + pull(c) { + c.enqueue({}); + } + }, { highWaterMark: 0 }); + + // Create a read request, incidentally resolving a promise with an + // object value, thereby invoking the getter installed above. + readable.getReader().read(); +}, "reading from a stream should occur in a microtask scope"); diff --git a/tests/wpt/web-platform-tests/streams/transferable/transform-stream-members.any.js b/tests/wpt/web-platform-tests/streams/transferable/transform-stream-members.any.js new file mode 100644 index 00000000000..fca060b0c05 --- /dev/null +++ b/tests/wpt/web-platform-tests/streams/transferable/transform-stream-members.any.js @@ -0,0 +1,16 @@ +const combinations = [ + (t => [t, t.readable])(new TransformStream()), + (t => [t.readable, t])(new TransformStream()), + (t => [t, t.writable])(new TransformStream()), + (t => [t.writable, t])(new TransformStream()), +]; + +for (const combination of combinations) { + test(() => { + assert_throws_dom( + "DataCloneError", + () => structuredClone(combination, { transfer: combination }), + "structuredClone should throw" + ); + }, `Transferring ${combination} should fail`); +} diff --git a/tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html b/tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html index 2cbf50836df..defe4743c6a 100644 --- a/tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html +++ b/tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html @@ -82,8 +82,8 @@ promise_test(async t => { }; let mocked_response = [ - { "unhashedAppIdPath": url_1, "resultCode": Status.FAILURE }, - { "unhashedAppIdPath": url_2, "resultCode": Status.FAILURE } + { "manifestIdPath": url_1, "resultCode": Status.FAILURE }, + { "manifestIdPath": url_2, "resultCode": Status.FAILURE } ]; let expected_results = { @@ -106,8 +106,8 @@ promise_test(async t => { }; let mocked_response = [ - { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS }, - { "unhashedAppIdPath": url_2, "resultCode": Status.FAILURE } + { "manifestIdPath": url_1, "resultCode": Status.SUCCESS }, + { "manifestIdPath": url_2, "resultCode": Status.FAILURE } ]; let expected_results = { diff --git a/tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html b/tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html index 2453fdbdecd..a9a439b36ac 100644 --- a/tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html +++ b/tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html @@ -16,7 +16,7 @@ promise_test(async t => { }; let mocked_response = [ - { "unhashedAppIdPath": install_url, "resultCode": Status.SUCCESS } + { "manifestIdPath": install_url, "resultCode": Status.SUCCESS } ]; let expected_results = { @@ -38,8 +38,8 @@ promise_test(async t => { }; let mocked_response = [ - { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS }, - { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS } + { "manifestIdPath": url_1, "resultCode": Status.SUCCESS }, + { "manifestIdPath": url_2, "resultCode": Status.SUCCESS } ]; let expected_results = { diff --git a/tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html b/tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html index c1d281abc53..ea4f96124a9 100644 --- a/tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html +++ b/tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html @@ -15,8 +15,8 @@ promise_test(async t => { const url_2 = '/sub-app-2'; const mocked_response = [ - { "unhashedAppIdPath": url_1, "appName": "App 1" }, - { "unhashedAppIdPath": url_2, "appName": "App 2" }, + { "manifestIdPath": url_1, "appName": "App 1" }, + { "manifestIdPath": url_2, "appName": "App 2" }, ]; let expected_results = { diff --git a/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html b/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html index 917c3b4d022..a7271905dc7 100644 --- a/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html +++ b/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html @@ -48,9 +48,9 @@ promise_test(async t => { let remove_call_params = [url_1, url_2, url_3]; let mocked_response = [ - { "unhashedAppIdPath": url_1, "resultCode": Status.FAILURE }, - { "unhashedAppIdPath": url_2, "resultCode": Status.FAILURE }, - { "unhashedAppIdPath": url_3, "resultCode": Status.FAILURE } + { "manifestIdPath": url_1, "resultCode": Status.FAILURE }, + { "manifestIdPath": url_2, "resultCode": Status.FAILURE }, + { "manifestIdPath": url_3, "resultCode": Status.FAILURE } ]; let expected_results = { @@ -70,9 +70,9 @@ promise_test(async t => { let remove_call_params = [url_1, url_2, url_3]; let mocked_response = [ - { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS }, - { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS }, - { "unhashedAppIdPath": url_3, "resultCode": Status.FAILURE } + { "manifestIdPath": url_1, "resultCode": Status.SUCCESS }, + { "manifestIdPath": url_2, "resultCode": Status.SUCCESS }, + { "manifestIdPath": url_3, "resultCode": Status.FAILURE } ]; let expected_results = { diff --git a/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html b/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html index 6fd4305b434..ad60d6398dd 100644 --- a/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html +++ b/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html @@ -9,7 +9,7 @@ promise_test(async t => { const url = '/sub-app'; let remove_call_params = [url]; -let mocked_response = [{ "unhashedAppIdPath": url, "resultCode": Status.SUCCESS }]; +let mocked_response = [{ "manifestIdPath": url, "resultCode": Status.SUCCESS }]; let expected_results = {[url]: "success"}; await subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results); @@ -24,9 +24,9 @@ const url_3 = '/sub-app-3'; let remove_call_params = [url_1, url_2, url_3]; let mocked_response = [ - { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS }, - { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS }, - { "unhashedAppIdPath": url_3, "resultCode": Status.SUCCESS } + { "manifestIdPath": url_1, "resultCode": Status.SUCCESS }, + { "manifestIdPath": url_2, "resultCode": Status.SUCCESS }, + { "manifestIdPath": url_3, "resultCode": Status.SUCCESS } ]; let expected_results = { diff --git a/tests/wpt/web-platform-tests/svg/pservers/reftests/pattern-opacity-01.svg b/tests/wpt/web-platform-tests/svg/pservers/reftests/pattern-opacity-01.svg new file mode 100644 index 00000000000..eb2d2d7e9a9 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/pservers/reftests/pattern-opacity-01.svg @@ -0,0 +1,14 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml"> + <g id="testmeta"> + <title>Pattern: fill-opacity</title> + <html:link rel="help" + href="https://www.w3.org/TR/SVG2/pservers.html#Patterns"/> + <html:link rel="match" href="reference/pattern-opacity-01-ref.svg"/> + </g> + <defs> + <pattern id="pattern" width='1' height='1' patternContentUnits="objectBoundingBox">> + <rect fill="lime" width="1" height="1"/> + </pattern> + </defs> + <rect width="100%" height="100%" fill-opacity="0.5" fill="url(#pattern)"/> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg b/tests/wpt/web-platform-tests/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg new file mode 100644 index 00000000000..1c9c68bd9d5 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <rect width="100%" height="100%" fill-opacity="0.5" fill="lime"/> +</svg> diff --git a/tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml b/tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml index ffb1fe1f6fb..6d3d32acc82 100644 --- a/tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml +++ b/tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml @@ -14,6 +14,7 @@ steps: parameters: packages: virtualenv - template: install_certs.yml +- template: color_profile.yml - template: install_safari.yml - template: update_hosts.yml - template: update_manifest.yml diff --git a/tests/wpt/web-platform-tests/tools/ci/azure/color_profile.yml b/tests/wpt/web-platform-tests/tools/ci/azure/color_profile.yml new file mode 100644 index 00000000000..d90c6ca429d --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/azure/color_profile.yml @@ -0,0 +1,5 @@ +steps: +- script: | + ./wpt macos-color-profile + displayName: 'Set display color profile' + condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin')) diff --git a/tests/wpt/web-platform-tests/tools/ci/commands.json b/tests/wpt/web-platform-tests/tools/ci/commands.json index 59463144967..f26baddacad 100644 --- a/tests/wpt/web-platform-tests/tools/ci/commands.json +++ b/tests/wpt/web-platform-tests/tools/ci/commands.json @@ -13,6 +13,15 @@ "help": "Output a hosts file to stdout", "virtualenv": false }, + "macos-color-profile": { + "path": "macos_color_profile.py", + "script": "run", + "help": "Change the macOS color profile to sRGB", + "virtualenv": true, + "requirements": [ + "requirements_macos_color_profile.txt" + ] + }, "regen-certs": { "path": "regen_certs.py", "script": "run", diff --git a/tests/wpt/web-platform-tests/tools/ci/macos_color_profile.py b/tests/wpt/web-platform-tests/tools/ci/macos_color_profile.py new file mode 100644 index 00000000000..f0919d77159 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/macos_color_profile.py @@ -0,0 +1,43 @@ +from typing import Any + +from Cocoa import NSURL +from ColorSync import ( + CGDisplayCreateUUIDFromDisplayID, + ColorSyncDeviceSetCustomProfiles, + kColorSyncDeviceDefaultProfileID, + kColorSyncDisplayDeviceClass, +) +from Quartz import ( + CGGetOnlineDisplayList, + kCGErrorSuccess, +) + + +def set_all_displays(profile_url: NSURL) -> bool: + max_displays = 10 + + (err, display_ids, display_count) = CGGetOnlineDisplayList(max_displays, None, None) + if err != kCGErrorSuccess: + raise ValueError(err) + + display_uuids = [CGDisplayCreateUUIDFromDisplayID(d) for d in display_ids] + + for display_uuid in display_uuids: + profile_info = {kColorSyncDeviceDefaultProfileID: profile_url} + + success = ColorSyncDeviceSetCustomProfiles( + kColorSyncDisplayDeviceClass, + display_uuid, + profile_info, + ) + if not success: + raise Exception(f"failed to set profile on {display_uuid}") + + return True + + +def run(venv: Any, **kwargs: Any) -> None: + srgb_profile_url = NSURL.fileURLWithPath_( + "/System/Library/ColorSync/Profiles/sRGB Profile.icc" + ) + set_all_displays(srgb_profile_url) diff --git a/tests/wpt/web-platform-tests/tools/ci/requirements_macos_color_profile.txt b/tests/wpt/web-platform-tests/tools/ci/requirements_macos_color_profile.txt new file mode 100644 index 00000000000..c3448a98dff --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/requirements_macos_color_profile.txt @@ -0,0 +1,4 @@ +pyobjc-core==9.1.1 +pyobjc-framework-Cocoa==9.1.1 +pyobjc-framework-ColorSync==9.1.1 +pyobjc-framework-Quartz==9.1.1 diff --git a/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt b/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt index 91789c95e30..9ab88012762 100644 --- a/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt +++ b/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt @@ -1,4 +1,4 @@ pygithub==1.58.2 pyyaml==6.0 requests==2.30.0 -taskcluster==50.1.0 +taskcluster==50.1.3 diff --git a/tests/wpt/web-platform-tests/tools/mypy.ini b/tests/wpt/web-platform-tests/tools/mypy.ini index def40c0bd06..5dc55c5b747 100644 --- a/tests/wpt/web-platform-tests/tools/mypy.ini +++ b/tests/wpt/web-platform-tests/tools/mypy.ini @@ -27,6 +27,15 @@ show_error_codes = True # Ignore missing or untyped libraries. +[mypy-Cocoa.*] +ignore_missing_imports = True + +[mypy-ColorSync.*] +ignore_missing_imports = True + +[mypy-Quartz.*] +ignore_missing_imports = True + [mypy-github.*] ignore_missing_imports = True diff --git a/tests/wpt/web-platform-tests/tools/requirements_tests.txt b/tests/wpt/web-platform-tests/tools/requirements_tests.txt index ca946a306e7..ed41215bcc1 100644 --- a/tests/wpt/web-platform-tests/tools/requirements_tests.txt +++ b/tests/wpt/web-platform-tests/tools/requirements_tests.txt @@ -2,4 +2,4 @@ httpx[http2]==0.24.0 json-e==4.5.2 jsonschema==4.17.3 pyyaml==6.0 -taskcluster==50.1.0 +taskcluster==50.1.3 diff --git a/tests/wpt/web-platform-tests/tools/wpt/wpt.py b/tests/wpt/web-platform-tests/tools/wpt/wpt.py index e423a8c67c5..e1df4ef42dc 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/wpt.py +++ b/tests/wpt/web-platform-tests/tools/wpt/wpt.py @@ -132,7 +132,14 @@ def create_complete_parser(): for command in commands: props = commands[command] - venv.install_requirements(*props.get("requirements", [])) + try: + venv.install_requirements(*props.get("requirements", [])) + except Exception: + logging.warning( + f"Unable to install requirements ({props['requirements']!r}) for command {command}" + ) + continue + subparser = import_command('wpt', command, props)[1] if not subparser: diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt index fcaab2e6674..28be0b3c6e1 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt +++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt @@ -7,4 +7,4 @@ packaging==23.1 pillow==9.5.0 requests==2.30.0 six==1.16.0 -urllib3==1.26.15 +urllib3==2.0.2 diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py index 7092122d8c4..3bdbf6f962c 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py @@ -50,6 +50,7 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data, **kwargs) executor_kwargs["close_after_done"] = True executor_kwargs["sanitizer_enabled"] = sanitizer_enabled + executor_kwargs["reuse_window"] = kwargs.get("reuse_window", False) capabilities = { "goog:chromeOptions": { diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py index a3a733efbd2..5df9de5f7e3 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py @@ -1,10 +1,13 @@ # mypy: allow-untyped-defs import os +import time import traceback from typing import Type from urllib.parse import urljoin +from webdriver import error + from .base import ( CrashtestExecutor, TestharnessExecutor, @@ -16,6 +19,7 @@ from .executorwebdriver import ( WebDriverRefTestExecutor, WebDriverRun, WebDriverTestharnessExecutor, + WebDriverTestharnessProtocolPart, ) from .protocol import PrintProtocolPart @@ -57,12 +61,74 @@ def make_sanitizer_mixin(crashtest_executor_cls: Type[CrashtestExecutor]): # ty _SanitizerMixin = make_sanitizer_mixin(WebDriverCrashtestExecutor) -class ChromeDriverRefTestExecutor(WebDriverRefTestExecutor, _SanitizerMixin): # type: ignore - pass +class ChromeDriverTestharnessProtocolPart(WebDriverTestharnessProtocolPart): + """Implementation of `testharness.js` tests controlled by ChromeDriver. + The main difference from the default WebDriver testharness implementation is + that the test window can be reused between tests for better performance. + """ -class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMixin): # type: ignore - pass + def setup(self): + super().setup() + # Handle (an alphanumeric string) that may be set if window reuse is + # enabled. This state allows the protocol to distinguish the test + # window from other windows a test itself may create that the "Get + # Window Handles" command also returns. + # + # Because test window persistence is a Chrome-only feature, it's not + # exposed to the base WebDriver testharness executor. + self.test_window = None + self.reuse_window = self.parent.reuse_window + + def close_test_window(self): + if self.test_window: + self._close_window(self.test_window) + self.test_window = None + + def close_old_windows(self): + self.webdriver.actions.release() + for handle in self.webdriver.handles: + if handle not in {self.runner_handle, self.test_window}: + self._close_window(handle) + if not self.reuse_window: + self.close_test_window() + self.webdriver.window_handle = self.runner_handle + return self.runner_handle + + def open_test_window(self, window_id): + if self.test_window: + # Try to reuse the existing test window by emulating the `about:blank` + # page with no history you would get with a new window. + try: + self.webdriver.window_handle = self.test_window + # Reset navigation history with Chrome DevTools Protocol: + # https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-resetNavigationHistory + body = { + "cmd": "Page.resetNavigationHistory", + "params": {}, + } + self.webdriver.send_session_command("POST", "goog/cdp/execute", + body=body) + self.webdriver.url = "about:blank" + return + except error.NoSuchWindowException: + self.test_window = None + super().open_test_window(window_id) + + def get_test_window(self, window_id, parent, timeout=5): + if self.test_window: + return self.test_window + # Poll the handles endpoint for the test window like the base WebDriver + # protocol part, but don't bother checking for the serialized + # WindowProxy (not supported by Chrome currently). + deadline = time.time() + timeout + while time.time() < deadline: + self.test_window = self._poll_handles_for_test_window(parent) + if self.test_window is not None: + assert self.test_window != parent + return self.test_window + time.sleep(0.03) + raise Exception("unable to find test window") class ChromeDriverPrintProtocolPart(PrintProtocolPart): @@ -117,7 +183,25 @@ render('%s').then(result => callback(result))""" % pdf_base64) class ChromeDriverProtocol(WebDriverProtocol): - implements = WebDriverProtocol.implements + [ChromeDriverPrintProtocolPart] + implements = [ + ChromeDriverPrintProtocolPart, + ChromeDriverTestharnessProtocolPart, + *(part for part in WebDriverProtocol.implements + if part.name != ChromeDriverTestharnessProtocolPart.name) + ] + reuse_window = False + + +class ChromeDriverRefTestExecutor(WebDriverRefTestExecutor, _SanitizerMixin): # type: ignore + protocol_cls = ChromeDriverProtocol + + +class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMixin): # type: ignore + protocol_cls = ChromeDriverProtocol + + def __init__(self, *args, reuse_window=False, **kwargs): + super().__init__(*args, **kwargs) + self.protocol.reuse_window = reuse_window class ChromeDriverPrintRefTestExecutor(ChromeDriverRefTestExecutor): diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py index ab7d1ab0d4c..9a771f11c6c 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -119,14 +119,21 @@ class WebDriverTestharnessProtocolPart(TestharnessProtocolPart): self.webdriver.actions.release() handles = [item for item in self.webdriver.handles if item != self.runner_handle] for handle in handles: - try: - self.webdriver.window_handle = handle - self.webdriver.window.close() - except error.NoSuchWindowException: - pass + self._close_window(handle) self.webdriver.window_handle = self.runner_handle return self.runner_handle + def _close_window(self, window_handle): + try: + self.webdriver.window_handle = window_handle + self.webdriver.window.close() + except error.NoSuchWindowException: + pass + + def open_test_window(self, window_id): + self.webdriver.execute_script( + "window.open('about:blank', '%s', 'noopener')" % window_id) + def get_test_window(self, window_id, parent, timeout=5): """Find the test window amongst all the open windows. This is assumed to be either the named window or the one after the parent in the list of @@ -150,12 +157,7 @@ class WebDriverTestharnessProtocolPart(TestharnessProtocolPart): pass if test_window is None: - after = self.webdriver.handles - if len(after) == 2: - test_window = next(iter(set(after) - {parent})) - elif after[0] == parent and len(after) > 2: - # Hope the first one here is the test window - test_window = after[1] + test_window = self._poll_handles_for_test_window(parent) if test_window is not None: assert test_window != parent @@ -165,6 +167,16 @@ class WebDriverTestharnessProtocolPart(TestharnessProtocolPart): raise Exception("unable to find test window") + def _poll_handles_for_test_window(self, parent): + test_window = None + after = self.webdriver.handles + if len(after) == 2: + test_window = next(iter(set(after) - {parent})) + elif after[0] == parent and len(after) > 2: + # Hope the first one here is the test window + test_window = after[1] + return test_window + def test_window_loaded(self): """Wait until the page in the new window has been loaded. @@ -513,7 +525,7 @@ class WebDriverTestharnessExecutor(TestharnessExecutor): parent_window = protocol.testharness.close_old_windows() # Now start the test harness - protocol.base.execute_script("window.open('about:blank', '%s', 'noopener')" % self.window_id) + protocol.testharness.open_test_window(self.window_id) test_window = protocol.testharness.get_test_window(self.window_id, parent_window, timeout=5*self.timeout_multiplier) 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 c35e509776a..950273c3894 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py @@ -1,5 +1,6 @@ # mypy: allow-untyped-defs +import abc import hashlib import itertools import json @@ -8,6 +9,7 @@ from urllib.parse import urlsplit from abc import ABCMeta, abstractmethod from queue import Empty from collections import defaultdict, deque, namedtuple +from typing import Any, cast from . import manifestinclude from . import manifestexpected @@ -78,8 +80,8 @@ def update_include_for_groups(test_groups, include): return new_include -class TestChunker: - def __init__(self, total_chunks, chunk_number, **kwargs): +class TestChunker(abc.ABC): + def __init__(self, total_chunks: int, chunk_number: int, **kwargs: Any): self.total_chunks = total_chunks self.chunk_number = chunk_number assert self.chunk_number <= self.total_chunks @@ -87,8 +89,9 @@ class TestChunker: assert self.logger self.kwargs = kwargs + @abstractmethod def __call__(self, manifest): - raise NotImplementedError + ... class Unchunked(TestChunker): @@ -102,30 +105,50 @@ class Unchunked(TestChunker): 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.encode()).hexdigest(), 16) - if h % self.total_chunks == chunk_index: - yield test_type, test_path, tests + tests_for_chunk = { + test for test in tests + if self._key_in_chunk(self.chunk_key(test_type, test_path, test)) + } + if tests_for_chunk: + yield test_type, test_path, tests_for_chunk + + def _key_in_chunk(self, key: str) -> bool: + chunk_index = self.chunk_number - 1 + digest = hashlib.md5(key.encode()).hexdigest() + return int(digest, 16) % self.total_chunks == chunk_index + + @abstractmethod + def chunk_key(self, test_type: str, test_path: str, + test: wpttest.Test) -> str: + ... + +class PathHashChunker(HashChunker): + def chunk_key(self, test_type: str, test_path: str, + test: wpttest.Test) -> str: + return test_path -class DirectoryHashChunker(TestChunker): + +class IDHashChunker(HashChunker): + def chunk_key(self, test_type: str, test_path: str, + test: wpttest.Test) -> str: + return cast(str, test.id) + + +class DirectoryHashChunker(HashChunker): """Like HashChunker except the directory is hashed. This ensures that all tests in the same directory end up in the same chunk. """ - def __call__(self, manifest): - chunk_index = self.chunk_number - 1 + def chunk_key(self, test_type: str, test_path: str, + test: wpttest.Test) -> str: depth = self.kwargs.get("depth") - for test_type, test_path, tests in manifest: - if depth: - hash_path = os.path.sep.join(os.path.dirname(test_path).split(os.path.sep, depth)[:depth]) - else: - hash_path = os.path.dirname(test_path) - h = int(hashlib.md5(hash_path.encode()).hexdigest(), 16) - if h % self.total_chunks == chunk_index: - yield test_type, test_path, tests + if depth: + return os.path.sep.join(os.path.dirname(test_path).split(os.path.sep, depth)[:depth]) + else: + return os.path.dirname(test_path) class TestFilter: @@ -245,7 +268,8 @@ class TestLoader: if chunker_kwargs is None: chunker_kwargs = {} self.chunker = {"none": Unchunked, - "hash": HashChunker, + "hash": PathHashChunker, + "id_hash": IDHashChunker, "dir_hash": DirectoryHashChunker}[chunk_type](total_chunks, chunk_number, **chunker_kwargs) 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 45b78496d1b..cef75e03be1 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 @@ -7,8 +7,15 @@ import tempfile import pytest from mozlog import structured -from ..testloader import TestFilter, TestLoader, TagFilter -from ..testloader import read_include_from_file +from ..testloader import ( + DirectoryHashChunker, + IDHashChunker, + PathHashChunker, + TestFilter, + TestLoader, + TagFilter, + read_include_from_file, +) from .test_wpttest import make_mock_manifest here = os.path.dirname(__file__) @@ -27,6 +34,31 @@ skip: true """ +@pytest.fixture +def manifest(): + manifest_json = { + "items": { + "testharness": { + "a": { + "foo.html": [ + "abcdef123456", + ["a/foo.html?b", {}], + ["a/foo.html?c", {}], + ], + "bar.html": [ + "uvwxyz987654", + [None, {}], + ], + } + } + }, + "url_base": "/", + "version": 8, + } + return WPTManifest.from_json("/", manifest_json) + + + def test_loader_h2_tests(): manifest_json = { "items": { @@ -138,3 +170,65 @@ def test_loader_filter_tags(): assert len(loader.tests["testharness"]) == 1 assert loader.tests["testharness"][0].id == "/a/bar.html" assert loader.tests["testharness"][0].tags == {"dir:a", "test-include"} + + +def test_chunk_hash(manifest): + chunker1 = PathHashChunker(total_chunks=2, chunk_number=1) + chunker2 = PathHashChunker(total_chunks=2, chunk_number=2) + # Check that the chunkers partition the manifest (i.e., each item is + # assigned to exactly one chunk). + items = sorted([*chunker1(manifest), *chunker2(manifest)], + key=lambda item: item[1]) + assert len(items) == 2 + test_type, test_path, tests = items[0] + assert test_type == "testharness" + assert test_path == os.path.join("a", "bar.html") + assert {test.id for test in tests} == {"/a/bar.html"} + test_type, test_path, tests = items[1] + assert test_type == "testharness" + assert test_path == os.path.join("a", "foo.html") + assert {test.id for test in tests} == {"/a/foo.html?b", "/a/foo.html?c"} + + +def test_chunk_id_hash(manifest): + chunker1 = IDHashChunker(total_chunks=2, chunk_number=1) + chunker2 = IDHashChunker(total_chunks=2, chunk_number=2) + items = [] + for test_type, test_path, tests in [*chunker1(manifest), *chunker2(manifest)]: + assert len(tests) > 0 + items.extend((test_type, test_path, test) for test in tests) + assert len(items) == 3 + items.sort(key=lambda item: item[2].id) + test_type, test_path, test = items[0] + assert test_type == "testharness" + assert test_path == os.path.join("a", "bar.html") + assert test.id == "/a/bar.html" + test_type, test_path, test = items[1] + assert test_type == "testharness" + assert test_path == os.path.join("a", "foo.html") + assert test.id == "/a/foo.html?b" + test_type, test_path, test = items[2] + assert test_type == "testharness" + assert test_path == os.path.join("a", "foo.html") + assert test.id == "/a/foo.html?c" + + +def test_chunk_dir_hash(manifest): + chunker1 = DirectoryHashChunker(total_chunks=2, chunk_number=1) + chunker2 = DirectoryHashChunker(total_chunks=2, chunk_number=2) + # Check that tests in the same directory are located in the same chunk + # (which particular chunk is irrelevant). + empty_chunk, chunk_a = sorted([ + list(chunker1(manifest)), + list(chunker2(manifest)), + ], key=len) + assert len(empty_chunk) == 0 + assert len(chunk_a) == 2 + test_type, test_path, tests = chunk_a[0] + assert test_type == "testharness" + assert test_path == os.path.join("a", "bar.html") + assert {test.id for test in tests} == {"/a/bar.html"} + test_type, test_path, tests = chunk_a[1] + assert test_type == "testharness" + assert test_path == os.path.join("a", "foo.html") + assert {test.id for test in tests} == {"/a/foo.html?b", "/a/foo.html?c"} 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 416e75b417f..1c5895eec6e 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py @@ -280,7 +280,8 @@ scheme host and port.""") help="Total number of chunks to use") chunking_group.add_argument("--this-chunk", action="store", type=int, default=1, help="Chunk number to run") - chunking_group.add_argument("--chunk-type", action="store", choices=["none", "hash", "dir_hash"], + chunking_group.add_argument("--chunk-type", action="store", + choices=["none", "hash", "id_hash", "dir_hash"], default=None, help="Chunking type to use") ssl_group = parser.add_argument_group("SSL/TLS") @@ -367,6 +368,12 @@ scheme host and port.""") action="store_true", dest="sanitizer_enabled", help="Only alert on sanitizer-related errors and crashes.") + chrome_group.add_argument( + "--reuse-window", + action="store_true", + help=("Reuse a window across `testharness.js` tests where possible, " + "which can speed up testing. Also useful for ensuring that the " + "renderer process has a stable PID for a debugger to attach to.")) sauce_group = parser.add_argument_group("Sauce Labs-specific") sauce_group.add_argument("--sauce-browser", dest="sauce_browser", diff --git a/tests/wpt/web-platform-tests/wai-aria/role/abstract-roles.html b/tests/wpt/web-platform-tests/wai-aria/role/abstract-roles.html new file mode 100644 index 00000000000..8a98ba74ead --- /dev/null +++ b/tests/wpt/web-platform-tests/wai-aria/role/abstract-roles.html @@ -0,0 +1,35 @@ +<!doctype html> +<html> +<head> + <title>Abstract Role Verification Tests</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/wai-aria/scripts/aria-utils.js"></script> +</head> +<body> + + +<p>Verifies <a href="https://w3c.github.io/aria/#document-handling_author-errors_roles">9.1 Roles - handling author errors</a></p> + <nav role="command" data-testname="command role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="composite" data-testname="composite role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="input" data-testname="input role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="landmark" data-testname="landmark role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="range" data-testname="range role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="roletype" data-testname="roletype role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="section" data-testname="section role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="sectionhead" data-testname="sectionhead role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="select" data-testname="select role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="structure" data-testname="structure role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="widget" data-testname="widget role" data-expectedrole="navigation" class="ex">x</nav> + <nav role="window" data-testname="window role" data-expectedrole="navigation" class="ex">x</nav> + + +<script> +AriaUtils.verifyRolesBySelector(".ex"); +</script> + +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/wai-aria/role/fallback-roles.html b/tests/wpt/web-platform-tests/wai-aria/role/fallback-roles.html new file mode 100644 index 00000000000..5242a02deec --- /dev/null +++ b/tests/wpt/web-platform-tests/wai-aria/role/fallback-roles.html @@ -0,0 +1,35 @@ +<!doctype html> +<html> + <head> + <title>Fallback Role Verification Tests</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/wai-aria/scripts/aria-utils.js"></script> + </head> + <body> + + <p>Verifies Fallback Roles from <a href="https://w3c.github.io/aria/#document-handling_author-errors_roles">9.1 Roles - handling author errors</a></p> + + <navigation role="region group" data-testname="fallback role w/ region with no label" data-expectedrole="group" class="ex">x</nav> + <navigation role="region group" data-testname="fallback role w/ region with label" aria-label="x" data-expectedrole="region" class="ex">x</nav> + +<!-- todo: additional fallback roles: + +- valid/valid "switch checkbox" +- valid/invalid "foo group" +- unicode char tests with fallback +- whitespace tests with fallback +- unicode char tests with fallback +- "invalid, punctuation, tests, link, button" + +--> + +<script> +AriaUtils.verifyRolesBySelector(".ex"); +</script> + +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/wai-aria/role/form-roles.html b/tests/wpt/web-platform-tests/wai-aria/role/form-roles.html new file mode 100644 index 00000000000..935899c583b --- /dev/null +++ b/tests/wpt/web-platform-tests/wai-aria/role/form-roles.html @@ -0,0 +1,28 @@ +<!doctype html> +<html> +<head> + <title>Form Role Verification Tests</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/wai-aria/scripts/aria-utils.js"></script> +</head> +<body> + +<p>Verifies <a href="https://w3c.github.io/aria/#document-handling_author-errors_roles">9.1 Roles - handling author errors</a> and the <a href="https://w3c.github.io/aria/#form">form</a> role.</p> + + +<!-- no label --> +<nav role="form" data-testname="form without label" data-expectedrole="navigation" class="ex">x</nav> + +<!-- w/ label --> +<nav role="form" data-testname="form with label" data-expectedrole="form" aria-label="x" class="ex">x</nav> + +<script> +AriaUtils.verifyRolesBySelector(".ex"); +</script> + +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/wai-aria/role/invalid-roles.html b/tests/wpt/web-platform-tests/wai-aria/role/invalid-roles.html new file mode 100644 index 00000000000..e7d38dc8c95 --- /dev/null +++ b/tests/wpt/web-platform-tests/wai-aria/role/invalid-roles.html @@ -0,0 +1,37 @@ +<!doctype html> +<html> +<head> + <title>Invalid Role Verification Tests</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/wai-aria/scripts/aria-utils.js"></script> +</head> +<body> + +<p>Verifies Invalid Roles from <a href="https://w3c.github.io/aria/#document-handling_author-errors_roles">9.1 Roles - handling author errors</a></p> + +<nav role="foo" data-testname="invalid role name foo" data-expectedrole="navigation" class="ex">x</nav> +<nav role="foo bar" data-testname="multiple invalid role names" data-expectedrole="navigation" class="ex">x</nav> + +<!-- todo: additional invalid roles: + +- whitespace tests (including line breaks, tabs, zero-width space, braille space) +- diacritics +- joiners (e.g. like emoji variants use) +- non-western chars +- RTL strings (Hebrew & Arabic) +- escaped chars, URL-encoded chars +- backslash closing quote and other obvious hack attempts +- etc. + +--> + +<script> +AriaUtils.verifyRolesBySelector(".ex"); +</script> + +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/wai-aria/role/role_none_conflict_resolution.html b/tests/wpt/web-platform-tests/wai-aria/role/role_none_conflict_resolution.html new file mode 100644 index 00000000000..efb247fc77c --- /dev/null +++ b/tests/wpt/web-platform-tests/wai-aria/role/role_none_conflict_resolution.html @@ -0,0 +1,37 @@ +<!doctype html> +<html> +<head> + <title>Role None Conflict Resolution Verification Tests</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/wai-aria/scripts/aria-utils.js"></script> +</head> +<body> + +<p>Verifies <a href="https://w3c.github.io/aria/#conflict_resolution_presentation_none"></a>conflict resolution</a> requirements for the ARIA <a href="https://w3c.github.io/aria/#none">none</a> and <a href="https://w3c.github.io/aria/#presentation">presentation</a> roles.</p> + +<!-- none with label(global) on header --> +<h1 role="none" data-testname="heading role none with global attr aria-label" data-expectedrole="heading" aria-label="x" class="ex">x</h1> + +<!-- none with label(global) on paragraph --> +<p role="none" data-testname="p role none with global attr aria-label (prohibited role)" data-expectedrole="paragraph" aria-label="x" class="ex">x</p> +<p role="none" data-testname="p role none without global attr aria-label (prohibited role)" data-expectedrole="none" class="ex">x</p> + +<!-- none with focusable header --> +<h1 role="none" data-testname="focusable heading role none with tabindex=0" data-expectedrole="heading" tabindex="0" class="ex">x</h1> +<h1 role="none" data-testname="focusable heading role none with tabindex=-1" data-expectedrole="heading" tabindex="-1" class="ex">x</h1> +<h1 role="none" data-testname="non-focusable heading role none" data-expectedrole="none" class="ex">x</h1> + +<!-- none with non-global--> +<h1 role="none" data-testname="none with non-global" data-expectedrole="none" class="ex" aria-level="2"> Sample Content </h1> + + +<script> +AriaUtils.verifyRolesBySelector(".ex"); +</script> + +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/wai-aria/role/roles.html b/tests/wpt/web-platform-tests/wai-aria/role/roles.html index 71946cbffa5..72c9cdd0cd3 100644 --- a/tests/wpt/web-platform-tests/wai-aria/role/roles.html +++ b/tests/wpt/web-platform-tests/wai-aria/role/roles.html @@ -56,7 +56,7 @@ AriaUtils.assignAndVerifyRolesByRoleNames([ "emphasis", "feed", "figure", - "form", + // form -> ./form-roles.html "generic", // graphics-* roles -> /graphics-aria // "grid" -> ./grid-roles.html diff --git a/tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js b/tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js index 339f16df838..8de3b8c3cd0 100644 --- a/tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js +++ b/tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js @@ -27,9 +27,6 @@ function convertValue(value, optParent) { case 'function': return value.apply(optParent); case 'object': - if (value === null) { - return value; - } if (value.__proto__.constructor === Object) { var result = {}; Object.entries(value).map((k, v) => { @@ -68,7 +65,9 @@ function convertObject(obj, params) { switch (typeof (param)) { case 'string': assert_true(param in obj, `missing ${param}`); - result[param] = convertValue(obj[param], obj); + if (obj[param] !== null) { + result[param] = convertValue(obj[param], obj); + } break; case 'object': assert_true(param.name in obj, `missing ${param.name}`); diff --git a/tests/wpt/web-platform-tests/webdriver/tests/back/back.py b/tests/wpt/web-platform-tests/webdriver/tests/back/back.py index 21e8498ccd5..62434323e0a 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/back/back.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/back/back.py @@ -164,6 +164,6 @@ def test_cross_origin(session, url): assert session.url == first_page - with pytest.raises(error.StaleElementReferenceException): + with pytest.raises(error.NoSuchElementException): elem.click() elem = session.find.css("#delete", all=False) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py index 69c96c8c545..99a95df1049 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py @@ -81,9 +81,10 @@ async def test_console_log_cached_message_after_refresh( # Log a message, refresh, log another message and subscribe expected_text_1 = await create_log(bidi_session, new_tab, log_type, "cached_message_1") - await bidi_session.browsing_context.navigate( - context=new_tab["context"], url=new_tab["url"], wait="complete" - ) + context = new_tab["context"] + await bidi_session.browsing_context.navigate(context=context, + url='about:blank', + wait="complete") expected_text_2 = await create_log(bidi_session, new_tab, log_type, "cached_message_2") await subscribe_events(events=["log.entryAdded"]) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py index d23a4cf83e5..4d604f6877e 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py @@ -63,9 +63,10 @@ async def test_subscribe_unsubscribe(bidi_session, new_tab, wait_for_event, log_ assert len(events) == 0 # Refresh to create a new context - await bidi_session.browsing_context.navigate( - context=new_tab["context"], url=new_tab["url"], wait="complete" - ) + context = new_tab["context"] + await bidi_session.browsing_context.navigate(context=context, + url='about:blank', + wait="complete") # Check we still don't receive ConsoleLogEntry events from the new context expected_text_1 = await create_log(bidi_session, new_tab, log_type, "text_1") @@ -76,9 +77,10 @@ async def test_subscribe_unsubscribe(bidi_session, new_tab, wait_for_event, log_ # Refresh to create a new context. Note that we refresh to avoid getting # cached events from the log event buffer. - await bidi_session.browsing_context.navigate( - context=new_tab["context"], url=new_tab["url"], wait="complete" - ) + context = new_tab["context"] + await bidi_session.browsing_context.navigate(context=context, + url='about:blank', + wait="complete") # Check that if we subscribe again, we can receive events await bidi_session.session.subscribe(events=["log.entryAdded"]) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py index ea85b2c6c94..0cb571038b7 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py @@ -136,124 +136,94 @@ async def test_local_value(bidi_session, top_context, argument, expected_type): @pytest.mark.asyncio @pytest.mark.parametrize( - "setup_expression, function_declaration, await_promise, expected", + "setup_expression, function_declaration, expected", [ ( "Symbol('foo')", "(symbol) => symbol.toString()", - False, {"type": "string", "value": "Symbol(foo)"}, ), - ( - "[1,2]", - "(array) => array[0]", - False, - {"type": "number", "value": 1}), + ("[1,2]", "(array) => array[0]", {"type": "number", "value": 1}), ( "new RegExp('foo')", "(regexp) => regexp.source", - False, {"type": "string", "value": "foo"}, ), ( "new Date(1654004849000)", "(date) => date.toISOString()", - False, {"type": "string", "value": "2022-05-31T13:47:29.000Z"}, ), ( "new Map([['foo', 'bar']])", "(map) => map.get('foo')", - False, {"type": "string", "value": "bar"}, ), ( "new Set(['foo'])", "(set) => set.has('foo')", - False, {"type": "boolean", "value": True}, ), ( "{const weakMap = new WeakMap(); weakMap.set(weakMap, 'foo')}", "(weakMap)=> weakMap.get(weakMap)", - False, {"type": "string", "value": "foo"}, ), ( "{const weakSet = new WeakSet(); weakSet.add(weakSet)}", "(weakSet)=> weakSet.has(weakSet)", - False, {"type": "boolean", "value": True}, ), ( "new Error('error message')", "(error) => error.message", - False, {"type": "string", "value": "error message"}, ), ( "new SyntaxError('syntax error message')", "(error) => error.message", - False, {"type": "string", "value": "syntax error message"}, ), ( "new Promise((resolve) => resolve(3))", "(promise) => promise", - True, {"type": "number", "value": 3}, ), ( - "new Promise(() => {})", - "(promise) => promise", - False, - {"type": "promise"}, - ), - ( "new Int8Array(2)", "(int8Array) => int8Array.length", - False, {"type": "number", "value": 2}, ), ( "new ArrayBuffer(8)", "(arrayBuffer) => arrayBuffer.byteLength", - False, {"type": "number", "value": 8}, ), - ( - "() => true", - "(func) => func()", - False, - {"type": "boolean", "value": True}), + ("() => true", "(func) => func()", {"type": "boolean", "value": True}), ( "(function() {return false;})", "(func) => func()", - False, {"type": "boolean", "value": False}, ), ( "window.foo = 3; window", "(window) => window.foo", - False, {"type": "number", "value": 3}, ), ( "window.url = new URL('https://example.com'); window.url", "(url) => url.hostname", - False, {"type": "string", "value": "example.com"}, ), ( "({SOME_PROPERTY:'SOME_VALUE'})", "(obj) => obj.SOME_PROPERTY", - False, {"type": "string", "value": "SOME_VALUE"}, ), ], ) async def test_remote_reference_argument( - bidi_session, top_context, setup_expression, function_declaration, await_promise, expected + bidi_session, top_context, setup_expression, function_declaration, expected ): remote_value_result = await bidi_session.script.evaluate( expression=setup_expression, @@ -268,7 +238,7 @@ async def test_remote_reference_argument( result = await bidi_session.script.call_function( function_declaration=function_declaration, arguments=[{"handle": remote_value_handle}], - await_promise=await_promise, + await_promise=True if remote_value_result["type"] == "promise" else False, target=ContextTarget(top_context["context"]), ) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py index 1dd6cd0aadf..005574b03ca 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py @@ -148,7 +148,10 @@ async def test_subscribe_to_closed_tab(bidi_session, send_blocking_command): # Try to subscribe to the closed context with pytest.raises(NoSuchFrameException): - response = await send_blocking_command( + await send_blocking_command( "session.subscribe", - {"events": ["log.entryAdded"], "contexts": [new_tab["context"]]}, + { + "events": ["log.entryAdded"], + "contexts": [new_tab["context"]] + }, ) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py b/tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py index bada57942b4..492718292a1 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py @@ -1,5 +1,6 @@ import pytest -from webdriver import error + +from webdriver.error import NoSuchElementException from tests.support.asserts import assert_success from tests.support.helpers import wait_for_new_handle @@ -120,7 +121,7 @@ def test_link_from_toplevel_context_with_target(session, inline, target): wait = Poll( session, timeout=5, - ignored_exceptions=error.NoSuchElementException, + ignored_exceptions=NoSuchElementException, message="Expected element has not been found") wait.until(lambda s: s.find.css("#foo")) @@ -159,7 +160,7 @@ def test_link_from_nested_context_with_target(session, inline, iframe, target): wait = Poll( session, timeout=5, - ignored_exceptions=error.NoSuchElementException, + ignored_exceptions=NoSuchElementException, message="Expected element has not been found") wait.until(lambda s: s.find.css("#foo")) @@ -179,8 +180,6 @@ def test_link_cross_origin(session, inline, url): assert_success(response) assert session.url == target_page - with pytest.raises(error.StaleElementReferenceException): - link.click() session.find.css("#delete", all=False) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py b/tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py index 61c66e201b9..f27be403f9e 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py @@ -190,6 +190,6 @@ def test_cross_origin(session, url): assert session.url == second_page - with pytest.raises(error.StaleElementReferenceException): + with pytest.raises(error.NoSuchElementException): elem.click() elem = session.find.css("#delete", all=False) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py b/tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py index a367fc105e1..d61377af275 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py @@ -74,7 +74,7 @@ def test_cross_origin(session, inline, url): assert_success(response) assert session.url == second_page - with pytest.raises(error.StaleElementReferenceException): + with pytest.raises(error.NoSuchElementException): elem.click() session.find.css("#delete", all=False) diff --git a/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpParameters-codec.html b/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpParameters-codec.html new file mode 100644 index 00000000000..5c81349b152 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpParameters-codec.html @@ -0,0 +1,422 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>RTCRtpEncodingParameters codec property</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../webrtc/RTCPeerConnection-helper.js"></script> +<script src="../webrtc/third_party/sdp/sdp.js"></script> +<script src="../webrtc/simulcast/simulcast.js"></script> +<script> + 'use strict'; + + function findFirstCodec(name) { + return RTCRtpSender.getCapabilities(name.split('/')[0]).codecs.filter(c => c.mimeType.localeCompare(name, undefined, { sensitivity: 'base' }) === 0)[0]; + } + + function codecsNotMatching(mimeType) { + return RTCRtpSender.getCapabilities(mimeType.split('/')[0]).codecs.filter(c => c.mimeType.localeCompare(mimeType, undefined, {sensitivity: 'base'}) !== 0); + } + + function assertCodecEquals(a, b) { + assert_equals(a.mimeType, b.mimeType); + assert_equals(a.clockRate, b.clockRate); + assert_equals(a.channels, b.channels); + assert_equals(a.sdpFmtpLine, b.sdpFmtpLine); + } + + async function codecsForSender(sender) { + const rids = sender.getParameters().encodings.map(e => e.rid); + const stats = await sender.getStats(); + const codecs = [...stats] + .filter(([k, v]) => v.type === 'outbound-rtp') + .sort(([k, v], [k2, v2]) => rids.indexOf(v.rid) - rids.indexOf(v2.rid)) + .map(([k, v]) => stats.get(v.codecId).mimeType); + return codecs; + } + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const { sender } = pc.addTransceiver('audio'); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + assert_equals(encoding.codec, undefined); + }, `Codec should be undefined by default on audio encodings`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const { sender } = pc.addTransceiver('video'); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + assert_equals(encoding.codec, undefined); + }, `Codec should be undefined by default on video encodings`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const opus = findFirstCodec('audio/opus'); + + const { sender } = pc.addTransceiver('audio', { + sendEncodings: [{codec: opus}], + }); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + assertCodecEquals(opus, encoding.codec); + }, `Creating an audio sender with addTransceiver and codec should work`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const vp8 = findFirstCodec('video/VP8'); + + const { sender } = pc.addTransceiver('video', { + sendEncodings: [{codec: vp8}], + }); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + assertCodecEquals(vp8, encoding.codec); + }, `Creating a video sender with addTransceiver and codec should work`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const opus = findFirstCodec('audio/opus'); + + const { sender } = pc.addTransceiver('audio'); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + encoding.codec = opus; + await sender.setParameters(param); + param = sender.getParameters(); + encoding = param.encodings[0]; + + assertCodecEquals(opus, encoding.codec); + + delete encoding.codec; + await sender.setParameters(param); + param = sender.getParameters(); + encoding = param.encodings[0]; + + assert_equals(encoding.codec, undefined); + }, `Setting codec on an audio sender with setParameters should work`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const vp8 = findFirstCodec('video/VP8'); + + const { sender } = pc.addTransceiver('video'); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + encoding.codec = vp8; + await sender.setParameters(param); + param = sender.getParameters(); + encoding = param.encodings[0]; + + assertCodecEquals(vp8, encoding.codec); + + delete encoding.codec; + await sender.setParameters(param); + param = sender.getParameters(); + encoding = param.encodings[0]; + + assert_equals(encoding.codec, undefined); + }, `Setting codec on a video sender with setParameters should work`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const newCodec = { + mimeType: "audio/newCodec", + clockRate: 90000, + channel: 2, + }; + + assert_throws_dom('OperationError', () => pc.addTransceiver('video', { + sendEncodings: [{codec: newCodec}], + })); + }, `Creating an audio sender with addTransceiver and non-existing codec should throw OperationError`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const newCodec = { + mimeType: "video/newCodec", + clockRate: 90000, + }; + + assert_throws_dom('OperationError', () => pc.addTransceiver('video', { + sendEncodings: [{codec: newCodec}], + })); + }, `Creating a video sender with addTransceiver and non-existing codec should throw OperationError`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const newCodec = { + mimeType: "audio/newCodec", + clockRate: 90000, + channel: 2, + }; + + const { sender } = pc.addTransceiver('audio'); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + encoding.codec = newCodec; + await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param)); + }, `Setting a non-existing codec on an audio sender with setParameters should throw InvalidModificationError`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const newCodec = { + mimeType: "video/newCodec", + clockRate: 90000, + }; + + const { sender } = pc.addTransceiver('video'); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + encoding.codec = newCodec; + await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param)); + }, `Setting a non-existing codec on a video sender with setParameters should throw InvalidModificationError`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const opus = findFirstCodec('audio/opus'); + const nonOpus = codecsNotMatching(opus.mimeType); + + const transceiver = pc.addTransceiver('audio'); + const sender = transceiver.sender; + + transceiver.setCodecPreferences(nonOpus); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + encoding.codec = opus; + await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param)); + }, `Setting a non-preferred codec on an audio sender with setParameters should throw InvalidModificationError`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const vp8 = findFirstCodec('video/VP8'); + const nonVP8 = codecsNotMatching(vp8.mimeType); + + const transceiver = pc.addTransceiver('video'); + const sender = transceiver.sender; + + transceiver.setCodecPreferences(nonVP8); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + encoding.codec = vp8; + await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param)); + }, `Setting a non-preferred codec on a video sender with setParameters should throw InvalidModificationError`); + + promise_test(async (t) => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + + const opus = findFirstCodec('audio/opus'); + const nonOpus = codecsNotMatching(opus.mimeType); + + const transceiver = pc1.addTransceiver('audio'); + const sender = transceiver.sender; + + transceiver.setCodecPreferences(nonOpus); + + exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + encoding.codec = opus; + await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param)); + }, `Setting a non-negotiated codec on an audio sender with setParameters should throw InvalidModificationError`); + + promise_test(async (t) => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + + const vp8 = findFirstCodec('video/VP8'); + const nonVP8 = codecsNotMatching(vp8.mimeType); + + const transceiver = pc1.addTransceiver('video'); + const sender = transceiver.sender; + + transceiver.setCodecPreferences(nonVP8); + + exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + encoding.codec = vp8; + await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param)); + }, `Setting a non-negotiated codec on a video sender with setParameters should throw InvalidModificationError`); + + promise_test(async (t) => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + + const opus = findFirstCodec('audio/opus'); + const nonOpus = codecsNotMatching(opus.mimeType); + + const transceiver = pc1.addTransceiver('audio', { + sendEncodings: [{codec: opus}], + }); + const sender = transceiver.sender; + + exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + assertCodecEquals(opus, encoding.codec); + + transceiver.setCodecPreferences(nonOpus); + await exchangeOfferAnswer(pc1, pc2); + + param = sender.getParameters(); + encoding = param.encodings[0]; + + assert_equals(encoding.codec, undefined); + }, `Codec should be undefined after negotiating away the currently set codec on an audio sender`); + + promise_test(async (t) => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + + const vp8 = findFirstCodec('video/VP8'); + const nonVP8 = codecsNotMatching(vp8.mimeType); + + const transceiver = pc1.addTransceiver('video', { + sendEncodings: [{codec: vp8}], + }); + const sender = transceiver.sender; + + exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + + assertCodecEquals(vp8, encoding.codec); + + transceiver.setCodecPreferences(nonVP8); + await exchangeOfferAnswer(pc1, pc2); + + param = sender.getParameters(); + encoding = param.encodings[0]; + + assert_equals(encoding.codec, undefined); + }, `Codec should be undefined after negotiating away the currently set codec on a video sender`); + + promise_test(async (t) => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + const stream = await getNoiseStream({audio:true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + + const opus = findFirstCodec('audio/opus'); + const nonOpus = codecsNotMatching(opus.mimeType); + + const transceiver = pc1.addTransceiver(stream.getTracks()[0]); + const sender = transceiver.sender; + + transceiver.setCodecPreferences(nonOpus.concat([opus])); + + exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + + let codecs = await codecsForSender(sender); + assert_not_equals(codecs[0], opus.mimeType); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + encoding.codec = opus; + + await sender.setParameters(param); + + codecs = await codecsForSender(sender); + assert_array_equals(codecs, [opus.mimeType]); + }, `Stats output-rtp should match the selected codec in non-simulcast usecase on an audio sender`); + + promise_test(async (t) => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + const stream = await getNoiseStream({video:true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + + const vp8 = findFirstCodec('video/VP8'); + const nonVP8 = codecsNotMatching(vp8.mimeType); + + const transceiver = pc1.addTransceiver(stream.getTracks()[0]); + const sender = transceiver.sender; + + transceiver.setCodecPreferences(nonVP8.concat([vp8])); + + exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + + let codecs = await codecsForSender(sender); + assert_not_equals(codecs[0], vp8.mimeType); + + let param = sender.getParameters(); + let encoding = param.encodings[0]; + encoding.codec = vp8; + + await sender.setParameters(param); + + codecs = await codecsForSender(sender); + assert_array_equals(codecs, [vp8.mimeType]); + }, `Stats output-rtp should match the selected codec in non-simulcast usecase on a video sender`); +</script> diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/current/current.html b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/current/current.html new file mode 100644 index 00000000000..82a48d40990 --- /dev/null +++ b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/current/current.html @@ -0,0 +1,2 @@ +<!DOCTYPE html> +<title>Current page used as a test helper</title> diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/incumbent/incumbent.html b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/incumbent/incumbent.html new file mode 100644 index 00000000000..2c5572b7749 --- /dev/null +++ b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/incumbent/incumbent.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<title>Incumbent page used as a test helper</title> + +<iframe src="../current/current.html" id="current"></iframe> + +<script> + const current = document.querySelector("#current").contentWindow; + + window.hello = () => { + window.ws = new current.WebSocket('foo'); + ws.close(); + }; +</script> diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/url-parsing.html b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/url-parsing.html new file mode 100644 index 00000000000..21ef6cd3a95 --- /dev/null +++ b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/url-parsing.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<title>Multiple globals for base URL in WebSocket constructor</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<!-- This is the entry global --> + +<iframe src="incumbent/incumbent.html"></iframe> + +<script> +async_test((t) => { + onload = t.step_func_done(() => { + frames[0].hello(); + // Inside constructors, "this's relevant settings object" === "current settings object", + // because of how "this" is constructed. + // https://github.com/whatwg/websockets/issues/46 + const expectedUrl = new URL('current/foo', location.href); + expectedUrl.protocol = 'ws:'; + assert_equals(frames[0].ws.url, expectedUrl.href); + }); +}); +</script> diff --git a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js index dc7133bb867..d5b8e3bbda1 100644 --- a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js +++ b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js @@ -171,17 +171,24 @@ promise_test(async t => { promise_test(async t => { // Establish a WebTransport session. - const wt = new WebTransport(webtransport_url('echo.py')); + const wt = new WebTransport(webtransport_url('echo_datagram_length.py')); await wt.ready; const writer = wt.datagrams.writable.getWriter(); const reader = wt.datagrams.readable.getReader(); // Write and read max-size datagram. - await writer.write(new Uint8Array(wt.datagrams.maxDatagramSize)); + const maxDatagramSize = wt.datagrams.maxDatagramSize; + await writer.write(new Uint8Array(maxDatagramSize)); + + // the server should echo the datagram length encoded in JSON const { value: token, done } = await reader.read(); assert_false(done); - assert_equals(token.length, wt.datagrams.maxDatagramSize); + + const decoder = new TextDecoder(); + const datagramStr = decoder.decode(token); + const jsonObject = JSON.parse(datagramStr); + assert_equals(jsonObject['length'], maxDatagramSize); }, 'Transfer max-size datagram'); promise_test(async t => { diff --git a/tests/wpt/web-platform-tests/webtransport/handlers/echo_datagram_length.py b/tests/wpt/web-platform-tests/webtransport/handlers/echo_datagram_length.py new file mode 100644 index 00000000000..f0610b085fe --- /dev/null +++ b/tests/wpt/web-platform-tests/webtransport/handlers/echo_datagram_length.py @@ -0,0 +1,8 @@ +import json + +def datagram_received(session, data: bytes): + # encode the received length into a JSON string and send back + data_len = len(data) + out_datagram_json = json.dumps({'length': data_len}) + out_data = out_datagram_json.encode() + session.send_datagram(out_data) |