mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Merge branch 'master' into master
This commit is contained in:
commit
b0b2acb8f8
173 changed files with 3833 additions and 2289 deletions
617
Cargo.lock
generated
617
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -28,6 +28,8 @@ opt-level = 3
|
|||
|
||||
# This is here to dedupe winapi since mio 0.6 is still using winapi 0.2.
|
||||
mio = { git = "https://github.com/servo/mio.git", branch = "servo-mio-0.6.22" }
|
||||
# Work around bug in winit 0.24 crashing servo headless in macOS
|
||||
winit = { git = "https://github.com/rust-windowing/winit.git", rev = "4192d04a53202c199f94d1b7d883a34c9ad09272" }
|
||||
|
||||
[patch."https://github.com/jrmuizel/raqote"]
|
||||
raqote = { git = "https://github.com/jdm/raqote", branch = "fkup" }
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
* 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/. */
|
||||
|
||||
#![allow(unused_imports)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate lazy_static;
|
||||
|
||||
|
@ -127,6 +129,8 @@ fn test_hang_monitoring() {
|
|||
}
|
||||
|
||||
#[test]
|
||||
// https://github.com/servo/servo/issues/28270
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
fn test_hang_monitoring_unregister() {
|
||||
let _lock = SERIAL.lock().unwrap();
|
||||
|
||||
|
@ -161,6 +165,8 @@ fn test_hang_monitoring_unregister() {
|
|||
}
|
||||
|
||||
#[test]
|
||||
// https://github.com/servo/servo/issues/28270
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
fn test_hang_monitoring_exit_signal() {
|
||||
let _lock = SERIAL.lock().unwrap();
|
||||
|
||||
|
|
|
@ -40,8 +40,8 @@ sparkle = "0.1.25"
|
|||
style = { path = "../style" }
|
||||
style_traits = { path = "../style_traits" }
|
||||
# NOTE: the sm-angle feature only enables angle on windows, not other platforms!
|
||||
surfman = { version = "0.3", features = ["sm-angle","sm-angle-default"] }
|
||||
surfman-chains = "0.5"
|
||||
surfman = { version = "0.4", features = ["sm-angle","sm-angle-default"] }
|
||||
surfman-chains = "0.6"
|
||||
surfman-chains-api = "0.2"
|
||||
time = { version = "0.1.0", optional = true }
|
||||
webrender = { git = "https://github.com/servo/webrender" }
|
||||
|
|
|
@ -835,7 +835,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn on_resize_window_event(&mut self) {
|
||||
pub fn on_resize_window_event(&mut self) -> bool {
|
||||
debug!("compositor resize requested");
|
||||
|
||||
let old_coords = self.embedder_coordinates;
|
||||
|
@ -847,11 +847,12 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
|
|||
}
|
||||
|
||||
if self.embedder_coordinates.viewport == old_coords.viewport {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
self.send_window_size(WindowSizeType::Resize);
|
||||
self.composite_if_necessary(CompositingReason::Resize);
|
||||
return true;
|
||||
}
|
||||
|
||||
pub fn on_mouse_window_event_class(&mut self, mouse_window_event: MouseWindowEvent) {
|
||||
|
|
|
@ -210,7 +210,8 @@ impl<'tcx> LateLintPass<'tcx> for UnrootedPass {
|
|||
/// All structs containing #[unrooted_must_root_lint::must_root] types
|
||||
/// must be #[unrooted_must_root_lint::must_root] themselves
|
||||
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item) {
|
||||
if has_lint_attr(&self.symbols, &item.attrs, self.symbols.must_root) {
|
||||
let attrs = cx.tcx.hir().attrs(item.hir_id());
|
||||
if has_lint_attr(&self.symbols, &attrs, self.symbols.must_root) {
|
||||
return;
|
||||
}
|
||||
if let hir::ItemKind::Struct(def, ..) = &item.kind {
|
||||
|
@ -235,7 +236,8 @@ impl<'tcx> LateLintPass<'tcx> for UnrootedPass {
|
|||
fn check_variant(&mut self, cx: &LateContext, var: &hir::Variant) {
|
||||
let ref map = cx.tcx.hir();
|
||||
let parent_item = map.expect_item(map.get_parent_item(var.id));
|
||||
if !has_lint_attr(&self.symbols, &parent_item.attrs, self.symbols.must_root) {
|
||||
let attrs = cx.tcx.hir().attrs(parent_item.hir_id());
|
||||
if !has_lint_attr(&self.symbols, &attrs, self.symbols.must_root) {
|
||||
match var.data {
|
||||
hir::VariantData::Tuple(fields, ..) => {
|
||||
for field in fields {
|
||||
|
@ -268,10 +270,10 @@ impl<'tcx> LateLintPass<'tcx> for UnrootedPass {
|
|||
id: HirId,
|
||||
) {
|
||||
let in_new_function = match kind {
|
||||
visit::FnKind::ItemFn(n, _, _, _, _) | visit::FnKind::Method(n, _, _, _) => {
|
||||
visit::FnKind::ItemFn(n, _, _, _) | visit::FnKind::Method(n, _, _) => {
|
||||
&*n.as_str() == "new" || n.as_str().starts_with("new_")
|
||||
},
|
||||
visit::FnKind::Closure(_) => return,
|
||||
visit::FnKind::Closure => return,
|
||||
};
|
||||
|
||||
if !in_derive_expn(span) {
|
||||
|
|
|
@ -78,7 +78,7 @@ servo_url = { path = "../url" }
|
|||
sparkle = "0.1"
|
||||
style = { path = "../style", features = ["servo"] }
|
||||
style_traits = { path = "../style_traits", features = ["servo"] }
|
||||
surfman = "0.3"
|
||||
surfman = "0.4"
|
||||
webdriver_server = { path = "../webdriver_server", optional = true }
|
||||
webgpu = { path = "../webgpu" }
|
||||
webrender = { git = "https://github.com/servo/webrender" }
|
||||
|
|
|
@ -549,7 +549,7 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
fn handle_window_event(&mut self, event: WindowEvent) {
|
||||
fn handle_window_event(&mut self, event: WindowEvent) -> bool {
|
||||
match event {
|
||||
WindowEvent::Idle => {},
|
||||
|
||||
|
@ -558,7 +558,7 @@ where
|
|||
},
|
||||
|
||||
WindowEvent::Resize => {
|
||||
self.compositor.on_resize_window_event();
|
||||
return self.compositor.on_resize_window_event();
|
||||
},
|
||||
|
||||
WindowEvent::AllowNavigationResponse(pipeline_id, allowed) => {
|
||||
|
@ -745,6 +745,7 @@ where
|
|||
}
|
||||
},
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
fn receive_messages(&mut self) {
|
||||
|
@ -776,18 +777,20 @@ where
|
|||
::std::mem::replace(&mut self.embedder_events, Vec::new())
|
||||
}
|
||||
|
||||
pub fn handle_events(&mut self, events: Vec<WindowEvent>) {
|
||||
pub fn handle_events(&mut self, events: Vec<WindowEvent>) -> bool {
|
||||
if self.compositor.receive_messages() {
|
||||
self.receive_messages();
|
||||
}
|
||||
let mut need_resize = false;
|
||||
for event in events {
|
||||
self.handle_window_event(event);
|
||||
need_resize |= self.handle_window_event(event);
|
||||
}
|
||||
if self.compositor.shutdown_state != ShutdownState::FinishedShuttingDown {
|
||||
self.compositor.perform_updates();
|
||||
} else {
|
||||
self.embedder_events.push((None, EmbedderMsg::Shutdown));
|
||||
}
|
||||
need_resize
|
||||
}
|
||||
|
||||
pub fn repaint_synchronously(&mut self) {
|
||||
|
|
|
@ -12,6 +12,6 @@ path = "lib.rs"
|
|||
|
||||
[dependencies]
|
||||
euclid = "0.20"
|
||||
surfman = "0.3"
|
||||
surfman-chains = "0.5"
|
||||
surfman = "0.4"
|
||||
surfman-chains = "0.6"
|
||||
|
||||
|
|
|
@ -29,8 +29,8 @@ libservo = { path = "../../components/servo" }
|
|||
log = "0.4"
|
||||
servo-media = { git = "https://github.com/servo/media" }
|
||||
sparkle = "0.1"
|
||||
surfman = "0.3"
|
||||
surfman-chains = "0.5"
|
||||
surfman = "0.4"
|
||||
surfman-chains = "0.6"
|
||||
surfman-chains-api = "0.2"
|
||||
webxr = { git = "https://github.com/servo/webxr", features = ["glwindow"] }
|
||||
|
||||
|
|
|
@ -249,7 +249,9 @@ impl ServoThread {
|
|||
ServoWebSrcMsg::GetSwapChain(sender) => self.send_swap_chain(sender),
|
||||
ServoWebSrcMsg::SetSwapChain(swap_chain) => self.swap_chain = Some(swap_chain.0),
|
||||
ServoWebSrcMsg::Resize(size) => self.resize(size),
|
||||
ServoWebSrcMsg::Heartbeat => self.servo.handle_events(vec![]),
|
||||
ServoWebSrcMsg::Heartbeat => {
|
||||
self.servo.handle_events(vec![]);
|
||||
},
|
||||
ServoWebSrcMsg::Stop => break,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ ipc-channel = "0.14"
|
|||
libservo = { path = "../../../components/servo" }
|
||||
log = "0.4"
|
||||
servo-media = { git = "https://github.com/servo/media" }
|
||||
surfman = { version = "0.3", features = ["sm-angle-default"] }
|
||||
surfman = { version = "0.4", features = ["sm-angle-default"] }
|
||||
webxr = { git = "https://github.com/servo/webxr"}
|
||||
webxr-api = { git = "https://github.com/servo/webxr", features = ["ipc"] }
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ env_logger = "0.8"
|
|||
lazy_static = "1"
|
||||
log = "0.4"
|
||||
simpleservo = { path = "../api" }
|
||||
surfman = "0.3"
|
||||
surfman = "0.4"
|
||||
keyboard-types = "0.5"
|
||||
|
||||
[target.'cfg(target_os = "windows")'.dependencies]
|
||||
|
|
|
@ -57,10 +57,10 @@ libservo = { path = "../../components/servo" }
|
|||
log = "0.4"
|
||||
servo-media = { git = "https://github.com/servo/media" }
|
||||
shellwords = "1.0.0"
|
||||
surfman = { version = "0.3", features = ["sm-winit", "sm-x11"] }
|
||||
surfman = { version = "0.4", features = ["sm-winit", "sm-x11"] }
|
||||
tinyfiledialogs = "3.0"
|
||||
webxr = { git = "https://github.com/servo/webxr", features = ["ipc", "glwindow", "headless"] }
|
||||
winit = "0.19"
|
||||
winit = "0.24"
|
||||
|
||||
[target.'cfg(any(target_os = "linux", target_os = "windows"))'.dependencies]
|
||||
image = "0.23"
|
||||
|
|
|
@ -6,9 +6,11 @@
|
|||
|
||||
use crate::browser::Browser;
|
||||
use crate::embedder::EmbedderCallbacks;
|
||||
use crate::events_loop::EventsLoop;
|
||||
use crate::events_loop::{EventsLoop, ServoEvent};
|
||||
use crate::window_trait::WindowPortsMethods;
|
||||
use crate::{headed_window, headless_window};
|
||||
use winit::window::WindowId;
|
||||
use winit::event_loop::EventLoopWindowTarget;
|
||||
use servo::compositing::windowing::WindowEvent;
|
||||
use servo::config::opts::{self, parse_url_or_filename};
|
||||
use servo::servo_config::pref;
|
||||
|
@ -20,15 +22,13 @@ use std::env;
|
|||
use std::mem;
|
||||
use std::rc::Rc;
|
||||
use webxr::glwindow::GlWindowDiscovery;
|
||||
use winit::WindowId;
|
||||
|
||||
thread_local! {
|
||||
pub static WINDOWS: RefCell<HashMap<WindowId, Rc<dyn WindowPortsMethods>>> = RefCell::new(HashMap::new());
|
||||
}
|
||||
|
||||
pub struct App {
|
||||
events_loop: Rc<RefCell<EventsLoop>>,
|
||||
servo: RefCell<Servo<dyn WindowPortsMethods>>,
|
||||
servo: Option<Servo<dyn WindowPortsMethods>>,
|
||||
browser: RefCell<Browser<dyn WindowPortsMethods>>,
|
||||
event_queue: RefCell<Vec<WindowEvent>>,
|
||||
suspended: Cell<bool>,
|
||||
|
@ -48,49 +48,96 @@ impl App {
|
|||
} else {
|
||||
Rc::new(headed_window::Window::new(
|
||||
opts::get().initial_window_size,
|
||||
events_loop.clone(),
|
||||
&events_loop,
|
||||
no_native_titlebar,
|
||||
device_pixels_per_px,
|
||||
))
|
||||
};
|
||||
|
||||
let xr_discovery = if pref!(dom.webxr.glwindow.enabled) {
|
||||
let window = window.clone();
|
||||
let surfman = window.webrender_surfman();
|
||||
let events_loop = events_loop.clone();
|
||||
let factory = Box::new(move || Ok(window.new_glwindow(&*events_loop.borrow())));
|
||||
Some(GlWindowDiscovery::new(
|
||||
surfman.connection(),
|
||||
surfman.adapter(),
|
||||
surfman.context_attributes(),
|
||||
factory,
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
// Implements embedder methods, used by libservo and constellation.
|
||||
let embedder = Box::new(EmbedderCallbacks::new(events_loop.clone(), xr_discovery));
|
||||
|
||||
// Handle browser state.
|
||||
let browser = Browser::new(window.clone());
|
||||
|
||||
let mut servo = Servo::new(embedder, window.clone(), user_agent);
|
||||
let browser_id = BrowserId::new();
|
||||
servo.handle_events(vec![WindowEvent::NewBrowser(get_default_url(), browser_id)]);
|
||||
servo.setup_logging();
|
||||
|
||||
register_window(window);
|
||||
|
||||
let app = App {
|
||||
let mut app = App {
|
||||
event_queue: RefCell::new(vec![]),
|
||||
events_loop,
|
||||
browser: RefCell::new(browser),
|
||||
servo: RefCell::new(servo),
|
||||
servo: None,
|
||||
suspended: Cell::new(false),
|
||||
};
|
||||
|
||||
app.run_loop();
|
||||
let ev_waker = events_loop.create_event_loop_waker();
|
||||
events_loop.run_forever(move |e, w, control_flow| {
|
||||
if let winit::event::Event::NewEvents(winit::event::StartCause::Init) = e {
|
||||
let surfman = window.webrender_surfman();
|
||||
|
||||
let xr_discovery = if pref!(dom.webxr.glwindow.enabled) && ! opts::get().headless {
|
||||
let window = window.clone();
|
||||
// This should be safe because run_forever does, in fact,
|
||||
// run forever. The event loop window target doesn't get
|
||||
// moved, and does outlast this closure, and we won't
|
||||
// ever try to make use of it once shutdown begins and
|
||||
// it stops being valid.
|
||||
let w = unsafe {
|
||||
std::mem::transmute::<
|
||||
&EventLoopWindowTarget<ServoEvent>,
|
||||
&'static EventLoopWindowTarget<ServoEvent>
|
||||
>(w.unwrap())
|
||||
};
|
||||
let factory = Box::new(move || Ok(window.new_glwindow(w)));
|
||||
Some(GlWindowDiscovery::new(
|
||||
surfman.connection(),
|
||||
surfman.adapter(),
|
||||
surfman.context_attributes(),
|
||||
factory,
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let window = window.clone();
|
||||
// Implements embedder methods, used by libservo and constellation.
|
||||
let embedder = Box::new(EmbedderCallbacks::new(
|
||||
ev_waker.clone(),
|
||||
xr_discovery,
|
||||
));
|
||||
|
||||
let mut servo = Servo::new(embedder, window.clone(), user_agent.clone());
|
||||
let browser_id = BrowserId::new();
|
||||
servo.handle_events(vec![WindowEvent::NewBrowser(get_default_url(), browser_id)]);
|
||||
servo.setup_logging();
|
||||
|
||||
register_window(window.clone());
|
||||
app.servo = Some(servo);
|
||||
}
|
||||
|
||||
// If self.servo is None here, it means that we're in the process of shutting down,
|
||||
// let's ignore events.
|
||||
if app.servo.is_none() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle the event
|
||||
app.winit_event_to_servo_event(e);
|
||||
|
||||
let animating = WINDOWS.with(|windows| {
|
||||
windows
|
||||
.borrow()
|
||||
.iter()
|
||||
.any(|(_, window)| window.is_animating())
|
||||
});
|
||||
|
||||
// Block until the window gets an event
|
||||
if !animating || app.suspended.get() {
|
||||
*control_flow = winit::event_loop::ControlFlow::Wait;
|
||||
} else {
|
||||
*control_flow = winit::event_loop::ControlFlow::Poll;
|
||||
}
|
||||
|
||||
let stop = app.handle_events();
|
||||
if stop {
|
||||
*control_flow = winit::event_loop::ControlFlow::Exit;
|
||||
app.servo.take().unwrap().deinit();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn get_events(&self) -> Vec<WindowEvent> {
|
||||
|
@ -98,87 +145,50 @@ impl App {
|
|||
}
|
||||
|
||||
// This function decides whether the event should be handled during `run_forever`.
|
||||
fn winit_event_to_servo_event(&self, event: winit::Event) -> winit::ControlFlow {
|
||||
fn winit_event_to_servo_event(&self, event: winit::event::Event<ServoEvent>) {
|
||||
match event {
|
||||
// App level events
|
||||
winit::Event::Suspended(suspended) => {
|
||||
self.suspended.set(suspended);
|
||||
if !suspended {
|
||||
self.event_queue.borrow_mut().push(WindowEvent::Idle);
|
||||
}
|
||||
winit::event::Event::Suspended => {
|
||||
self.suspended.set(true);
|
||||
},
|
||||
winit::Event::Awakened => {
|
||||
winit::event::Event::Resumed => {
|
||||
self.suspended.set(false);
|
||||
self.event_queue.borrow_mut().push(WindowEvent::Idle);
|
||||
},
|
||||
winit::event::Event::UserEvent(_) => {
|
||||
self.event_queue.borrow_mut().push(WindowEvent::Idle);
|
||||
},
|
||||
winit::event::Event::DeviceEvent { .. } => {},
|
||||
|
||||
winit::event::Event::RedrawRequested(_) => {
|
||||
self.event_queue.borrow_mut().push(WindowEvent::Idle);
|
||||
},
|
||||
winit::Event::DeviceEvent { .. } => {},
|
||||
|
||||
// Window level events
|
||||
winit::Event::WindowEvent {
|
||||
winit::event::Event::WindowEvent {
|
||||
window_id, event, ..
|
||||
} => {
|
||||
return WINDOWS.with(|windows| {
|
||||
match windows.borrow().get(&window_id) {
|
||||
None => {
|
||||
warn!("Got an event from unknown window");
|
||||
winit::ControlFlow::Break
|
||||
},
|
||||
Some(window) => {
|
||||
// Resize events need to be handled during run_forever
|
||||
let cont = if let winit::WindowEvent::Resized(_) = event {
|
||||
winit::ControlFlow::Continue
|
||||
} else {
|
||||
winit::ControlFlow::Break
|
||||
};
|
||||
window.winit_event_to_servo_event(event);
|
||||
return cont;
|
||||
},
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
winit::event::Event::LoopDestroyed |
|
||||
winit::event::Event::NewEvents(..) |
|
||||
winit::event::Event::MainEventsCleared |
|
||||
winit::event::Event::RedrawEventsCleared => {},
|
||||
}
|
||||
winit::ControlFlow::Break
|
||||
}
|
||||
|
||||
fn run_loop(self) {
|
||||
loop {
|
||||
let animating = WINDOWS.with(|windows| {
|
||||
windows
|
||||
.borrow()
|
||||
.iter()
|
||||
.any(|(_, window)| window.is_animating())
|
||||
});
|
||||
if !animating || self.suspended.get() {
|
||||
// If there's no animations running then we block on the window event loop.
|
||||
self.events_loop.borrow_mut().run_forever(|e| {
|
||||
let cont = self.winit_event_to_servo_event(e);
|
||||
if cont == winit::ControlFlow::Continue {
|
||||
// Note we need to be careful to make sure that any events
|
||||
// that are handled during run_forever aren't re-entrant,
|
||||
// since we are handling them while holding onto a mutable borrow
|
||||
// of the events loop
|
||||
self.handle_events();
|
||||
}
|
||||
cont
|
||||
});
|
||||
}
|
||||
// Grab any other events that may have happened
|
||||
self.events_loop.borrow_mut().poll_events(|e| {
|
||||
self.winit_event_to_servo_event(e);
|
||||
});
|
||||
// If animations are running, we block on compositing
|
||||
// (self.handle_events() ends up calling swap_buffers)
|
||||
let stop = self.handle_events();
|
||||
if stop {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
self.servo.into_inner().deinit()
|
||||
}
|
||||
|
||||
fn handle_events(&self) -> bool {
|
||||
fn handle_events(&mut self) -> bool {
|
||||
let mut browser = self.browser.borrow_mut();
|
||||
let mut servo = self.servo.borrow_mut();
|
||||
|
||||
// FIXME:
|
||||
// As of now, we support only one browser (self.browser)
|
||||
|
@ -194,30 +204,24 @@ impl App {
|
|||
}
|
||||
});
|
||||
|
||||
// FIXME: this could be handled by Servo. We don't need
|
||||
// a repaint_synchronously function exposed.
|
||||
let need_resize = app_events.iter().any(|e| match *e {
|
||||
WindowEvent::Resize => true,
|
||||
_ => false,
|
||||
});
|
||||
|
||||
browser.handle_window_events(app_events);
|
||||
|
||||
let mut servo_events = servo.get_events();
|
||||
let mut servo_events = self.servo.as_mut().unwrap().get_events();
|
||||
let mut need_resize = false;
|
||||
loop {
|
||||
browser.handle_servo_events(servo_events);
|
||||
servo.handle_events(browser.get_events());
|
||||
need_resize |= self.servo.as_mut().unwrap().handle_events(browser.get_events());
|
||||
if browser.shutdown_requested() {
|
||||
return true;
|
||||
}
|
||||
servo_events = servo.get_events();
|
||||
servo_events = self.servo.as_mut().unwrap().get_events();
|
||||
if servo_events.is_empty() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if need_resize {
|
||||
servo.repaint_synchronously();
|
||||
self.servo.as_mut().unwrap().repaint_synchronously();
|
||||
}
|
||||
false
|
||||
}
|
||||
|
|
|
@ -4,26 +4,23 @@
|
|||
|
||||
//! Implements the global methods required by Servo (not window/gl/compositor related).
|
||||
|
||||
use crate::events_loop::EventsLoop;
|
||||
use servo::compositing::windowing::EmbedderMethods;
|
||||
use servo::embedder_traits::{EmbedderProxy, EventLoopWaker};
|
||||
use servo::servo_config::pref;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
use webxr::glwindow::GlWindowDiscovery;
|
||||
|
||||
pub struct EmbedderCallbacks {
|
||||
events_loop: Rc<RefCell<EventsLoop>>,
|
||||
event_loop_waker: Box<dyn EventLoopWaker>,
|
||||
xr_discovery: Option<GlWindowDiscovery>,
|
||||
}
|
||||
|
||||
impl EmbedderCallbacks {
|
||||
pub fn new(
|
||||
events_loop: Rc<RefCell<EventsLoop>>,
|
||||
event_loop_waker: Box<dyn EventLoopWaker>,
|
||||
xr_discovery: Option<GlWindowDiscovery>,
|
||||
) -> EmbedderCallbacks {
|
||||
EmbedderCallbacks {
|
||||
events_loop,
|
||||
event_loop_waker,
|
||||
xr_discovery,
|
||||
}
|
||||
}
|
||||
|
@ -31,7 +28,7 @@ impl EmbedderCallbacks {
|
|||
|
||||
impl EmbedderMethods for EmbedderCallbacks {
|
||||
fn create_event_loop_waker(&mut self) -> Box<dyn EventLoopWaker> {
|
||||
self.events_loop.borrow().create_event_loop_waker()
|
||||
self.event_loop_waker.clone()
|
||||
}
|
||||
|
||||
fn register_webxr(
|
||||
|
|
|
@ -5,16 +5,19 @@
|
|||
//! An event loop implementation that works in headless mode.
|
||||
|
||||
use servo::embedder_traits::EventLoopWaker;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
use std::sync::{Arc, Condvar, Mutex};
|
||||
use std::time;
|
||||
use winit;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum ServoEvent {
|
||||
Awakened,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
enum EventLoop {
|
||||
/// A real Winit windowing event loop.
|
||||
Winit(Option<winit::EventsLoop>),
|
||||
Winit(Option<winit::event_loop::EventLoop<ServoEvent>>),
|
||||
/// A fake event loop which contains a signalling flag used to ensure
|
||||
/// that pending events get processed in a timely fashion, and a condition
|
||||
/// variable to allow waiting on that flag changing state.
|
||||
|
@ -26,20 +29,17 @@ pub struct EventsLoop(EventLoop);
|
|||
impl EventsLoop {
|
||||
// Ideally, we could use the winit event loop in both modes,
|
||||
// but on Linux, the event loop requires a X11 server.
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
pub fn new(_headless: bool) -> Rc<RefCell<EventsLoop>> {
|
||||
Rc::new(RefCell::new(EventsLoop(EventLoop::Winit(Some(
|
||||
winit::EventsLoop::new(),
|
||||
)))))
|
||||
#[cfg(not(any(target_os = "linux", target_os = "macos")))]
|
||||
pub fn new(_headless: bool) -> EventsLoop {
|
||||
EventsLoop(EventLoop::Winit(Some(winit::event_loop::EventLoop::with_user_event())))
|
||||
}
|
||||
#[cfg(target_os = "linux")]
|
||||
pub fn new(headless: bool) -> Rc<RefCell<EventsLoop>> {
|
||||
let events_loop = if headless {
|
||||
#[cfg(any(target_os = "linux", target_os = "macos"))]
|
||||
pub fn new(headless: bool) -> EventsLoop {
|
||||
EventsLoop(if headless {
|
||||
EventLoop::Headless(Arc::new((Mutex::new(false), Condvar::new())))
|
||||
} else {
|
||||
EventLoop::Winit(Some(winit::EventsLoop::new()))
|
||||
};
|
||||
Rc::new(RefCell::new(EventsLoop(events_loop)))
|
||||
EventLoop::Winit(Some(winit::event_loop::EventLoop::with_user_event()))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ impl EventsLoop {
|
|||
EventLoop::Headless(ref data) => Box::new(HeadlessEventLoopWaker(data.clone())),
|
||||
}
|
||||
}
|
||||
pub fn as_winit(&self) -> &winit::EventsLoop {
|
||||
pub fn as_winit(&self) -> &winit::event_loop::EventLoop<ServoEvent> {
|
||||
match self.0 {
|
||||
EventLoop::Winit(Some(ref event_loop)) => event_loop,
|
||||
EventLoop::Winit(None) | EventLoop::Headless(..) => {
|
||||
|
@ -64,49 +64,45 @@ impl EventsLoop {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn poll_events<F>(&mut self, callback: F)
|
||||
where
|
||||
F: FnMut(winit::Event),
|
||||
{
|
||||
pub fn run_forever<F: 'static>(self, mut callback: F)
|
||||
where F: FnMut(
|
||||
winit::event::Event<ServoEvent>,
|
||||
Option<&winit::event_loop::EventLoopWindowTarget<ServoEvent>>,
|
||||
&mut winit::event_loop::ControlFlow
|
||||
) {
|
||||
match self.0 {
|
||||
EventLoop::Winit(Some(ref mut events_loop)) => events_loop.poll_events(callback),
|
||||
EventLoop::Winit(None) => (),
|
||||
EventLoop::Headless(ref data) => {
|
||||
// This is subtle - the use of the event loop in App::run_loop
|
||||
// optionally calls run_forever, then always calls poll_events.
|
||||
// If our signalling flag is true before we call run_forever,
|
||||
// we don't want to reset it before poll_events is called or
|
||||
// we'll end up sleeping even though there are events waiting
|
||||
// to be handled. We compromise by only resetting the flag here
|
||||
// in poll_events, so that both poll_events and run_forever can
|
||||
// check it first and avoid sleeping unnecessarily.
|
||||
self.sleep(&data.0, &data.1);
|
||||
*data.0.lock().unwrap() = false;
|
||||
},
|
||||
}
|
||||
}
|
||||
pub fn run_forever<F>(&mut self, mut callback: F)
|
||||
where
|
||||
F: FnMut(winit::Event) -> winit::ControlFlow,
|
||||
{
|
||||
match self.0 {
|
||||
EventLoop::Winit(ref mut events_loop) => {
|
||||
EventLoop::Winit(events_loop) => {
|
||||
let events_loop = events_loop
|
||||
.as_mut()
|
||||
.expect("Can't run an unavailable event loop.");
|
||||
events_loop.run_forever(callback);
|
||||
},
|
||||
events_loop.run(move |e, window_target, ref mut control_flow| {
|
||||
callback(e, Some(window_target), control_flow)
|
||||
});
|
||||
}
|
||||
EventLoop::Headless(ref data) => {
|
||||
let &(ref flag, ref condvar) = &**data;
|
||||
while !*flag.lock().unwrap() {
|
||||
let mut event = winit::event::Event::NewEvents(winit::event::StartCause::Init);
|
||||
loop {
|
||||
self.sleep(flag, condvar);
|
||||
if callback(winit::Event::Awakened) == winit::ControlFlow::Break {
|
||||
let mut control_flow = winit::event_loop::ControlFlow::Poll;
|
||||
callback(
|
||||
event,
|
||||
None,
|
||||
&mut control_flow
|
||||
);
|
||||
event = winit::event::Event::<ServoEvent>::UserEvent(ServoEvent::Awakened);
|
||||
|
||||
if control_flow != winit::event_loop::ControlFlow::Poll {
|
||||
*flag.lock().unwrap() = false;
|
||||
}
|
||||
|
||||
if control_flow == winit::event_loop::ControlFlow::Exit {
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn sleep(&self, lock: &Mutex<bool>, condvar: &Condvar) {
|
||||
// To avoid sleeping when we should be processing events, do two things:
|
||||
// * before sleeping, check whether our signalling flag has been set
|
||||
|
@ -123,18 +119,18 @@ impl EventsLoop {
|
|||
}
|
||||
|
||||
struct HeadedEventLoopWaker {
|
||||
proxy: Arc<winit::EventsLoopProxy>,
|
||||
proxy: Arc<Mutex<winit::event_loop::EventLoopProxy<ServoEvent>>>,
|
||||
}
|
||||
impl HeadedEventLoopWaker {
|
||||
fn new(events_loop: &winit::EventsLoop) -> HeadedEventLoopWaker {
|
||||
let proxy = Arc::new(events_loop.create_proxy());
|
||||
fn new(events_loop: &winit::event_loop::EventLoop<ServoEvent>) -> HeadedEventLoopWaker {
|
||||
let proxy = Arc::new(Mutex::new(events_loop.create_proxy()));
|
||||
HeadedEventLoopWaker { proxy }
|
||||
}
|
||||
}
|
||||
impl EventLoopWaker for HeadedEventLoopWaker {
|
||||
fn wake(&self) {
|
||||
// kick the OS event loop awake.
|
||||
if let Err(err) = self.proxy.wakeup() {
|
||||
// Kick the OS event loop awake.
|
||||
if let Err(err) = self.proxy.lock().unwrap().send_event(ServoEvent::Awakened) {
|
||||
warn!("Failed to wake up event loop ({}).", err);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,10 +4,18 @@
|
|||
|
||||
//! A winit window implementation.
|
||||
|
||||
use crate::events_loop::EventsLoop;
|
||||
use crate::events_loop::{EventsLoop, ServoEvent};
|
||||
use crate::keyutils::keyboard_event_from_winit;
|
||||
use crate::window_trait::{WindowPortsMethods, LINE_HEIGHT};
|
||||
use euclid::{Angle, Point2D, Rotation3D, Scale, Size2D, UnknownUnit, Vector2D, Vector3D};
|
||||
use euclid::{
|
||||
Angle, Point2D, Rotation3D, Scale, Size2D, UnknownUnit,
|
||||
Vector2D, Vector3D,
|
||||
};
|
||||
#[cfg(target_os = "macos")]
|
||||
use winit::platform::macos::{ActivationPolicy, WindowBuilderExtMacOS};
|
||||
#[cfg(any(target_os = "linux", target_os = "windows"))]
|
||||
use winit::window::Icon;
|
||||
use winit::event::{ElementState, KeyboardInput, MouseButton, MouseScrollDelta, TouchPhase, VirtualKeyCode};
|
||||
#[cfg(any(target_os = "linux", target_os = "windows"))]
|
||||
use image;
|
||||
use keyboard_types::{Key, KeyState, KeyboardEvent};
|
||||
|
@ -39,17 +47,11 @@ use surfman::GLVersion;
|
|||
use surfman::SurfaceType;
|
||||
#[cfg(target_os = "windows")]
|
||||
use winapi;
|
||||
use winit::dpi::{LogicalPosition, LogicalSize, PhysicalSize};
|
||||
#[cfg(target_os = "macos")]
|
||||
use winit::os::macos::{ActivationPolicy, WindowBuilderExt};
|
||||
#[cfg(any(target_os = "linux", target_os = "windows"))]
|
||||
use winit::Icon;
|
||||
use winit::{
|
||||
ElementState, KeyboardInput, MouseButton, MouseScrollDelta, TouchPhase, VirtualKeyCode,
|
||||
};
|
||||
use winit::dpi::{LogicalPosition, PhysicalPosition, PhysicalSize};
|
||||
use winit::event::ModifiersState;
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
fn builder_with_platform_options(mut builder: winit::WindowBuilder) -> winit::WindowBuilder {
|
||||
fn builder_with_platform_options(mut builder: winit::window::WindowBuilder) -> winit::window::WindowBuilder {
|
||||
if opts::get().output_file.is_some() {
|
||||
// Prevent the window from showing in Dock.app, stealing focus,
|
||||
// when generating an output file.
|
||||
|
@ -59,18 +61,18 @@ fn builder_with_platform_options(mut builder: winit::WindowBuilder) -> winit::Wi
|
|||
}
|
||||
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
fn builder_with_platform_options(builder: winit::WindowBuilder) -> winit::WindowBuilder {
|
||||
fn builder_with_platform_options(builder: winit::window::WindowBuilder) -> winit::window::WindowBuilder {
|
||||
builder
|
||||
}
|
||||
|
||||
pub struct Window {
|
||||
winit_window: winit::Window,
|
||||
winit_window: winit::window::Window,
|
||||
webrender_surfman: WebrenderSurfman,
|
||||
screen_size: Size2D<u32, DeviceIndependentPixel>,
|
||||
inner_size: Cell<Size2D<u32, DeviceIndependentPixel>>,
|
||||
mouse_down_button: Cell<Option<winit::MouseButton>>,
|
||||
mouse_down_button: Cell<Option<winit::event::MouseButton>>,
|
||||
mouse_down_point: Cell<Point2D<i32, DevicePixel>>,
|
||||
primary_monitor: winit::MonitorId,
|
||||
primary_monitor: winit::monitor::MonitorHandle,
|
||||
event_queue: RefCell<Vec<WindowEvent>>,
|
||||
mouse_pos: Cell<Point2D<i32, DevicePixel>>,
|
||||
last_pressed: Cell<Option<(KeyboardEvent, Option<VirtualKeyCode>)>>,
|
||||
|
@ -81,6 +83,7 @@ pub struct Window {
|
|||
fullscreen: Cell<bool>,
|
||||
device_pixels_per_px: Option<f32>,
|
||||
xr_window_poses: RefCell<Vec<Rc<XRWindowPose>>>,
|
||||
modifiers_state: Cell<ModifiersState>,
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
|
@ -98,7 +101,7 @@ fn window_creation_scale_factor() -> Scale<f32, DeviceIndependentPixel, DevicePi
|
|||
impl Window {
|
||||
pub fn new(
|
||||
win_size: Size2D<u32, DeviceIndependentPixel>,
|
||||
events_loop: Rc<RefCell<EventsLoop>>,
|
||||
events_loop: &EventsLoop,
|
||||
no_native_titlebar: bool,
|
||||
device_pixels_per_px: Option<f32>,
|
||||
) -> Window {
|
||||
|
@ -114,19 +117,16 @@ impl Window {
|
|||
let width = win_size.to_untyped().width;
|
||||
let height = win_size.to_untyped().height;
|
||||
|
||||
let mut window_builder = winit::WindowBuilder::new()
|
||||
let mut window_builder = winit::window::WindowBuilder::new()
|
||||
.with_title("Servo".to_string())
|
||||
.with_decorations(!no_native_titlebar)
|
||||
.with_transparency(no_native_titlebar)
|
||||
.with_dimensions(LogicalSize::new(width as f64, height as f64))
|
||||
.with_visibility(visible)
|
||||
.with_multitouch();
|
||||
.with_transparent(no_native_titlebar)
|
||||
.with_inner_size(PhysicalSize::new(width as f64, height as f64))
|
||||
.with_visible(visible);
|
||||
|
||||
window_builder = builder_with_platform_options(window_builder);
|
||||
|
||||
let winit_window = window_builder
|
||||
.build(events_loop.borrow().as_winit())
|
||||
.expect("Failed to create window.");
|
||||
let winit_window = window_builder.build(events_loop.as_winit()).expect("Failed to create window.");
|
||||
|
||||
#[cfg(any(target_os = "linux", target_os = "windows"))]
|
||||
{
|
||||
|
@ -134,21 +134,16 @@ impl Window {
|
|||
winit_window.set_window_icon(Some(load_icon(icon_bytes)));
|
||||
}
|
||||
|
||||
let primary_monitor = events_loop.borrow().as_winit().get_primary_monitor();
|
||||
let primary_monitor = events_loop.as_winit().available_monitors().nth(0).expect("No monitor detected");
|
||||
|
||||
let PhysicalSize {
|
||||
width: screen_width,
|
||||
height: screen_height,
|
||||
} = primary_monitor.get_dimensions();
|
||||
} = primary_monitor.clone().size();
|
||||
let screen_size = Size2D::new(screen_width as u32, screen_height as u32);
|
||||
// TODO(ajeffrey): can this fail?
|
||||
let LogicalSize { width, height } = winit_window
|
||||
.get_inner_size()
|
||||
.expect("Failed to get window inner size.");
|
||||
let PhysicalSize { width, height } = winit_window.inner_size();
|
||||
let inner_size = Size2D::new(width as u32, height as u32);
|
||||
|
||||
winit_window.show();
|
||||
|
||||
// Initialize surfman
|
||||
let connection =
|
||||
Connection::from_winit_window(&winit_window).expect("Failed to create connection");
|
||||
|
@ -179,6 +174,7 @@ impl Window {
|
|||
screen_size,
|
||||
device_pixels_per_px,
|
||||
xr_window_poses: RefCell::new(vec![]),
|
||||
modifiers_state: Cell::new(ModifiersState::empty()),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -227,7 +223,7 @@ impl Window {
|
|||
}
|
||||
|
||||
fn handle_keyboard_input(&self, input: KeyboardInput) {
|
||||
let mut event = keyboard_event_from_winit(input);
|
||||
let mut event = keyboard_event_from_winit(input, self.modifiers_state.get());
|
||||
trace!("handling {:?}", event);
|
||||
if event.state == KeyState::Down && event.key == Key::Unidentified {
|
||||
// If pressed and probably printable, we expect a ReceivedCharacter event.
|
||||
|
@ -247,7 +243,7 @@ impl Window {
|
|||
self.last_pressed.set(None);
|
||||
let xr_poses = self.xr_window_poses.borrow();
|
||||
for xr_window_pose in &*xr_poses {
|
||||
xr_window_pose.handle_xr_rotation(&input);
|
||||
xr_window_pose.handle_xr_rotation(&input, self.modifiers_state.get());
|
||||
}
|
||||
self.event_queue
|
||||
.borrow_mut()
|
||||
|
@ -258,17 +254,17 @@ impl Window {
|
|||
/// Helper function to handle a click
|
||||
fn handle_mouse(
|
||||
&self,
|
||||
button: winit::MouseButton,
|
||||
action: winit::ElementState,
|
||||
button: winit::event::MouseButton,
|
||||
action: winit::event::ElementState,
|
||||
coords: Point2D<i32, DevicePixel>,
|
||||
) {
|
||||
use servo::script_traits::MouseButton;
|
||||
|
||||
let max_pixel_dist = 10.0 * self.servo_hidpi_factor().get();
|
||||
let mouse_button = match &button {
|
||||
winit::MouseButton::Left => MouseButton::Left,
|
||||
winit::MouseButton::Right => MouseButton::Right,
|
||||
winit::MouseButton::Middle => MouseButton::Middle,
|
||||
winit::event::MouseButton::Left => MouseButton::Left,
|
||||
winit::event::MouseButton::Right => MouseButton::Right,
|
||||
winit::event::MouseButton::Middle => MouseButton::Middle,
|
||||
_ => MouseButton::Left,
|
||||
};
|
||||
let event = match action {
|
||||
|
@ -305,7 +301,7 @@ impl Window {
|
|||
}
|
||||
|
||||
fn device_hidpi_factor(&self) -> Scale<f32, DeviceIndependentPixel, DevicePixel> {
|
||||
Scale::new(self.winit_window.get_hidpi_factor() as f32)
|
||||
Scale::new(self.winit_window.scale_factor() as f32)
|
||||
}
|
||||
|
||||
fn servo_hidpi_factor(&self) -> Scale<f32, DeviceIndependentPixel, DevicePixel> {
|
||||
|
@ -332,8 +328,7 @@ impl WindowPortsMethods for Window {
|
|||
let dpr = self.servo_hidpi_factor();
|
||||
let size = self
|
||||
.winit_window
|
||||
.get_inner_size()
|
||||
.expect("Failed to get window inner size.");
|
||||
.inner_size();
|
||||
size.height as f32 * dpr.get()
|
||||
}
|
||||
|
||||
|
@ -342,24 +337,23 @@ impl WindowPortsMethods for Window {
|
|||
}
|
||||
|
||||
fn set_inner_size(&self, size: DeviceIntSize) {
|
||||
let size = size.to_f32() / self.device_hidpi_factor();
|
||||
self.winit_window
|
||||
.set_inner_size(LogicalSize::new(size.width.into(), size.height.into()))
|
||||
.set_inner_size::<PhysicalSize<i32>>(PhysicalSize::new(size.width.into(), size.height.into()))
|
||||
}
|
||||
|
||||
fn set_position(&self, point: DeviceIntPoint) {
|
||||
let point = point.to_f32() / self.device_hidpi_factor();
|
||||
self.winit_window
|
||||
.set_position(LogicalPosition::new(point.x.into(), point.y.into()))
|
||||
.set_outer_position::<PhysicalPosition<i32>>(PhysicalPosition::new(point.x.into(), point.y.into()))
|
||||
}
|
||||
|
||||
fn set_fullscreen(&self, state: bool) {
|
||||
if self.fullscreen.get() != state {
|
||||
self.winit_window.set_fullscreen(if state {
|
||||
Some(self.primary_monitor.clone())
|
||||
} else {
|
||||
None
|
||||
});
|
||||
self.winit_window
|
||||
.set_fullscreen(
|
||||
if state {
|
||||
Some(winit::window::Fullscreen::Borderless(Some(self.primary_monitor.clone())))
|
||||
} else { None }
|
||||
);
|
||||
}
|
||||
self.fullscreen.set(state);
|
||||
}
|
||||
|
@ -369,68 +363,68 @@ impl WindowPortsMethods for Window {
|
|||
}
|
||||
|
||||
fn set_cursor(&self, cursor: Cursor) {
|
||||
use winit::MouseCursor;
|
||||
use winit::window::CursorIcon;
|
||||
|
||||
let winit_cursor = match cursor {
|
||||
Cursor::Default => MouseCursor::Default,
|
||||
Cursor::Pointer => MouseCursor::Hand,
|
||||
Cursor::ContextMenu => MouseCursor::ContextMenu,
|
||||
Cursor::Help => MouseCursor::Help,
|
||||
Cursor::Progress => MouseCursor::Progress,
|
||||
Cursor::Wait => MouseCursor::Wait,
|
||||
Cursor::Cell => MouseCursor::Cell,
|
||||
Cursor::Crosshair => MouseCursor::Crosshair,
|
||||
Cursor::Text => MouseCursor::Text,
|
||||
Cursor::VerticalText => MouseCursor::VerticalText,
|
||||
Cursor::Alias => MouseCursor::Alias,
|
||||
Cursor::Copy => MouseCursor::Copy,
|
||||
Cursor::Move => MouseCursor::Move,
|
||||
Cursor::NoDrop => MouseCursor::NoDrop,
|
||||
Cursor::NotAllowed => MouseCursor::NotAllowed,
|
||||
Cursor::Grab => MouseCursor::Grab,
|
||||
Cursor::Grabbing => MouseCursor::Grabbing,
|
||||
Cursor::EResize => MouseCursor::EResize,
|
||||
Cursor::NResize => MouseCursor::NResize,
|
||||
Cursor::NeResize => MouseCursor::NeResize,
|
||||
Cursor::NwResize => MouseCursor::NwResize,
|
||||
Cursor::SResize => MouseCursor::SResize,
|
||||
Cursor::SeResize => MouseCursor::SeResize,
|
||||
Cursor::SwResize => MouseCursor::SwResize,
|
||||
Cursor::WResize => MouseCursor::WResize,
|
||||
Cursor::EwResize => MouseCursor::EwResize,
|
||||
Cursor::NsResize => MouseCursor::NsResize,
|
||||
Cursor::NeswResize => MouseCursor::NeswResize,
|
||||
Cursor::NwseResize => MouseCursor::NwseResize,
|
||||
Cursor::ColResize => MouseCursor::ColResize,
|
||||
Cursor::RowResize => MouseCursor::RowResize,
|
||||
Cursor::AllScroll => MouseCursor::AllScroll,
|
||||
Cursor::ZoomIn => MouseCursor::ZoomIn,
|
||||
Cursor::ZoomOut => MouseCursor::ZoomOut,
|
||||
_ => MouseCursor::Default,
|
||||
Cursor::Default => CursorIcon::Default,
|
||||
Cursor::Pointer => CursorIcon::Hand,
|
||||
Cursor::ContextMenu => CursorIcon::ContextMenu,
|
||||
Cursor::Help => CursorIcon::Help,
|
||||
Cursor::Progress => CursorIcon::Progress,
|
||||
Cursor::Wait => CursorIcon::Wait,
|
||||
Cursor::Cell => CursorIcon::Cell,
|
||||
Cursor::Crosshair => CursorIcon::Crosshair,
|
||||
Cursor::Text => CursorIcon::Text,
|
||||
Cursor::VerticalText => CursorIcon::VerticalText,
|
||||
Cursor::Alias => CursorIcon::Alias,
|
||||
Cursor::Copy => CursorIcon::Copy,
|
||||
Cursor::Move => CursorIcon::Move,
|
||||
Cursor::NoDrop => CursorIcon::NoDrop,
|
||||
Cursor::NotAllowed => CursorIcon::NotAllowed,
|
||||
Cursor::Grab => CursorIcon::Grab,
|
||||
Cursor::Grabbing => CursorIcon::Grabbing,
|
||||
Cursor::EResize => CursorIcon::EResize,
|
||||
Cursor::NResize => CursorIcon::NResize,
|
||||
Cursor::NeResize => CursorIcon::NeResize,
|
||||
Cursor::NwResize => CursorIcon::NwResize,
|
||||
Cursor::SResize => CursorIcon::SResize,
|
||||
Cursor::SeResize => CursorIcon::SeResize,
|
||||
Cursor::SwResize => CursorIcon::SwResize,
|
||||
Cursor::WResize => CursorIcon::WResize,
|
||||
Cursor::EwResize => CursorIcon::EwResize,
|
||||
Cursor::NsResize => CursorIcon::NsResize,
|
||||
Cursor::NeswResize => CursorIcon::NeswResize,
|
||||
Cursor::NwseResize => CursorIcon::NwseResize,
|
||||
Cursor::ColResize => CursorIcon::ColResize,
|
||||
Cursor::RowResize => CursorIcon::RowResize,
|
||||
Cursor::AllScroll => CursorIcon::AllScroll,
|
||||
Cursor::ZoomIn => CursorIcon::ZoomIn,
|
||||
Cursor::ZoomOut => CursorIcon::ZoomOut,
|
||||
_ => CursorIcon::Default,
|
||||
};
|
||||
self.winit_window.set_cursor(winit_cursor);
|
||||
self.winit_window.set_cursor_icon(winit_cursor);
|
||||
}
|
||||
|
||||
fn is_animating(&self) -> bool {
|
||||
self.animation_state.get() == AnimationState::Animating
|
||||
}
|
||||
|
||||
fn id(&self) -> winit::WindowId {
|
||||
fn id(&self) -> winit::window::WindowId {
|
||||
self.winit_window.id()
|
||||
}
|
||||
|
||||
fn winit_event_to_servo_event(&self, event: winit::WindowEvent) {
|
||||
fn winit_event_to_servo_event(&self, event: winit::event::WindowEvent) {
|
||||
match event {
|
||||
winit::WindowEvent::ReceivedCharacter(ch) => self.handle_received_character(ch),
|
||||
winit::WindowEvent::KeyboardInput { input, .. } => self.handle_keyboard_input(input),
|
||||
winit::WindowEvent::MouseInput { state, button, .. } => {
|
||||
winit::event::WindowEvent::ReceivedCharacter(ch) => self.handle_received_character(ch),
|
||||
winit::event::WindowEvent::KeyboardInput { input, .. } => self.handle_keyboard_input(input),
|
||||
winit::event::WindowEvent::ModifiersChanged(state) => self.modifiers_state.set(state),
|
||||
winit::event::WindowEvent::MouseInput { state, button, .. } => {
|
||||
if button == MouseButton::Left || button == MouseButton::Right {
|
||||
self.handle_mouse(button, state, self.mouse_pos.get());
|
||||
}
|
||||
},
|
||||
winit::WindowEvent::CursorMoved { position, .. } => {
|
||||
let pos = position.to_physical(self.device_hidpi_factor().get() as f64);
|
||||
let (x, y): (i32, i32) = pos.into();
|
||||
winit::event::WindowEvent::CursorMoved { position, .. } => {
|
||||
let (x, y): (i32, i32) = position.into();
|
||||
self.mouse_pos.set(Point2D::new(x, y));
|
||||
self.event_queue
|
||||
.borrow_mut()
|
||||
|
@ -438,15 +432,15 @@ impl WindowPortsMethods for Window {
|
|||
x as f32, y as f32,
|
||||
)));
|
||||
},
|
||||
winit::WindowEvent::MouseWheel { delta, phase, .. } => {
|
||||
winit::event::WindowEvent::MouseWheel { delta, phase, .. } => {
|
||||
let (mut dx, mut dy, mode) = match delta {
|
||||
MouseScrollDelta::LineDelta(dx, dy) => {
|
||||
(dx as f64, (dy * LINE_HEIGHT) as f64, WheelMode::DeltaLine)
|
||||
},
|
||||
MouseScrollDelta::PixelDelta(position) => {
|
||||
let position =
|
||||
position.to_physical(self.device_hidpi_factor().get() as f64);
|
||||
(position.x as f64, position.y as f64, WheelMode::DeltaPixel)
|
||||
let position: LogicalPosition<f64> =
|
||||
position.to_logical(self.device_hidpi_factor().get() as f64);
|
||||
(position.x, position.y, WheelMode::DeltaPixel)
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -478,30 +472,24 @@ impl WindowPortsMethods for Window {
|
|||
self.event_queue.borrow_mut().push(wheel_event);
|
||||
self.event_queue.borrow_mut().push(scroll_event);
|
||||
},
|
||||
winit::WindowEvent::Touch(touch) => {
|
||||
winit::event::WindowEvent::Touch(touch) => {
|
||||
use servo::script_traits::TouchId;
|
||||
|
||||
let phase = winit_phase_to_touch_event_type(touch.phase);
|
||||
let id = TouchId(touch.id as i32);
|
||||
let position = touch
|
||||
.location
|
||||
.to_physical(self.device_hidpi_factor().get() as f64);
|
||||
let position = touch.location;
|
||||
let point = Point2D::new(position.x as f32, position.y as f32);
|
||||
self.event_queue
|
||||
.borrow_mut()
|
||||
.push(WindowEvent::Touch(phase, id, point));
|
||||
},
|
||||
winit::WindowEvent::Refresh => {
|
||||
self.event_queue.borrow_mut().push(WindowEvent::Refresh);
|
||||
},
|
||||
winit::WindowEvent::CloseRequested => {
|
||||
winit::event::WindowEvent::CloseRequested => {
|
||||
self.event_queue.borrow_mut().push(WindowEvent::Quit);
|
||||
},
|
||||
winit::WindowEvent::Resized(size) => {
|
||||
let (width, height) = size.into();
|
||||
winit::event::WindowEvent::Resized(physical_size) => {
|
||||
let (width, height) = physical_size.into();
|
||||
let new_size = Size2D::new(width, height);
|
||||
if self.inner_size.get() != new_size {
|
||||
let physical_size = size.to_physical(self.device_hidpi_factor().get() as f64);
|
||||
let physical_size = Size2D::new(physical_size.width, physical_size.height);
|
||||
self.webrender_surfman
|
||||
.resize(physical_size.to_i32())
|
||||
|
@ -514,21 +502,20 @@ impl WindowPortsMethods for Window {
|
|||
}
|
||||
}
|
||||
|
||||
fn new_glwindow(&self, events_loop: &EventsLoop) -> Box<dyn webxr::glwindow::GlWindow> {
|
||||
let size = self
|
||||
.winit_window
|
||||
.get_outer_size()
|
||||
.expect("Failed to get window outer size");
|
||||
fn new_glwindow(
|
||||
&self,
|
||||
event_loop: &winit::event_loop::EventLoopWindowTarget<ServoEvent>
|
||||
) -> Box<dyn webxr::glwindow::GlWindow> {
|
||||
let size = self.winit_window.outer_size();
|
||||
|
||||
let mut window_builder = winit::WindowBuilder::new()
|
||||
let mut window_builder = winit::window::WindowBuilder::new()
|
||||
.with_title("Servo XR".to_string())
|
||||
.with_dimensions(size)
|
||||
.with_visibility(true);
|
||||
.with_inner_size(size)
|
||||
.with_visible(true);
|
||||
|
||||
window_builder = builder_with_platform_options(window_builder);
|
||||
|
||||
let winit_window = window_builder
|
||||
.build(events_loop.as_winit())
|
||||
let winit_window = window_builder.build(event_loop)
|
||||
.expect("Failed to create window.");
|
||||
|
||||
let pose = Rc::new(XRWindowPose {
|
||||
|
@ -542,24 +529,23 @@ impl WindowPortsMethods for Window {
|
|||
|
||||
impl WindowMethods for Window {
|
||||
fn get_coordinates(&self) -> EmbedderCoordinates {
|
||||
// TODO(ajeffrey): can this fail?
|
||||
let dpr = self.device_hidpi_factor();
|
||||
let LogicalSize { width, height } = self
|
||||
// Needed to convince the type system that winit's physical pixels
|
||||
// are actually device pixels.
|
||||
let dpr: Scale<f32, DeviceIndependentPixel, DevicePixel> = Scale::new(1.0);
|
||||
let PhysicalSize { width, height } = self
|
||||
.winit_window
|
||||
.get_outer_size()
|
||||
.expect("Failed to get window outer size.");
|
||||
let LogicalPosition { x, y } = self
|
||||
.outer_size();
|
||||
let PhysicalPosition { x, y } = self
|
||||
.winit_window
|
||||
.get_position()
|
||||
.unwrap_or(LogicalPosition::new(0., 0.));
|
||||
.outer_position()
|
||||
.unwrap_or(PhysicalPosition::new(0, 0));
|
||||
let win_size = (Size2D::new(width as f32, height as f32) * dpr).to_i32();
|
||||
let win_origin = (Point2D::new(x as f32, y as f32) * dpr).to_i32();
|
||||
let screen = (self.screen_size.to_f32() * dpr).to_i32();
|
||||
|
||||
let LogicalSize { width, height } = self
|
||||
let PhysicalSize { width, height } = self
|
||||
.winit_window
|
||||
.get_inner_size()
|
||||
.expect("Failed to get window inner size.");
|
||||
.inner_size();
|
||||
let inner_size = (Size2D::new(width as f32, height as f32) * dpr).to_i32();
|
||||
let viewport = DeviceIntRect::new(Point2D::zero(), inner_size);
|
||||
let framebuffer = DeviceIntSize::from_untyped(viewport.size.to_untyped());
|
||||
|
@ -684,7 +670,7 @@ fn load_icon(icon_bytes: &[u8]) -> Icon {
|
|||
}
|
||||
|
||||
struct XRWindow {
|
||||
winit_window: winit::Window,
|
||||
winit_window: winit::window::Window,
|
||||
pose: Rc<XRWindowPose>,
|
||||
}
|
||||
|
||||
|
@ -757,8 +743,8 @@ impl XRWindowPose {
|
|||
self.xr_translation.set(vec);
|
||||
}
|
||||
|
||||
fn handle_xr_rotation(&self, input: &KeyboardInput) {
|
||||
if input.state != winit::ElementState::Pressed {
|
||||
fn handle_xr_rotation(&self, input: &KeyboardInput, modifiers: ModifiersState) {
|
||||
if input.state != winit::event::ElementState::Pressed {
|
||||
return;
|
||||
}
|
||||
let mut x = 0.0;
|
||||
|
@ -770,7 +756,7 @@ impl XRWindowPose {
|
|||
Some(VirtualKeyCode::Right) => y = -1.0,
|
||||
_ => return,
|
||||
};
|
||||
if input.modifiers.shift {
|
||||
if modifiers.shift() {
|
||||
x = 10.0 * x;
|
||||
y = 10.0 * y;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! A headless window implementation.
|
||||
|
||||
use crate::events_loop::EventsLoop;
|
||||
use crate::events_loop::ServoEvent;
|
||||
use crate::window_trait::WindowPortsMethods;
|
||||
use euclid::{Point2D, Rotation3D, Scale, Size2D, UnknownUnit, Vector3D};
|
||||
use servo::compositing::windowing::{AnimationState, WindowEvent};
|
||||
|
@ -71,8 +71,8 @@ impl WindowPortsMethods for Window {
|
|||
false
|
||||
}
|
||||
|
||||
fn id(&self) -> winit::WindowId {
|
||||
unsafe { winit::WindowId::dummy() }
|
||||
fn id(&self) -> winit::window::WindowId {
|
||||
unsafe { winit::window::WindowId::dummy() }
|
||||
}
|
||||
|
||||
fn page_height(&self) -> f32 {
|
||||
|
@ -98,11 +98,14 @@ impl WindowPortsMethods for Window {
|
|||
self.animation_state.get() == AnimationState::Animating
|
||||
}
|
||||
|
||||
fn winit_event_to_servo_event(&self, _event: winit::WindowEvent) {
|
||||
fn winit_event_to_servo_event(&self, _event: winit::event::WindowEvent) {
|
||||
// Not expecting any winit events.
|
||||
}
|
||||
|
||||
fn new_glwindow(&self, _events_loop: &EventsLoop) -> Box<dyn webxr::glwindow::GlWindow> {
|
||||
fn new_glwindow(
|
||||
&self,
|
||||
_events_loop: &winit::event_loop::EventLoopWindowTarget<ServoEvent>
|
||||
) -> Box<dyn webxr::glwindow::GlWindow> {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
* 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 winit::event::{ElementState, KeyboardInput, ModifiersState, VirtualKeyCode};
|
||||
use keyboard_types::{Code, Key, KeyState, KeyboardEvent, Location, Modifiers};
|
||||
use winit::{ElementState, KeyboardInput, ModifiersState, VirtualKeyCode};
|
||||
|
||||
// Some shortcuts use Cmd on Mac and Control on other systems.
|
||||
#[cfg(target_os = "macos")]
|
||||
|
@ -18,7 +18,7 @@ pub const CMD_OR_ALT: Modifiers = Modifiers::META;
|
|||
pub const CMD_OR_ALT: Modifiers = Modifiers::ALT;
|
||||
|
||||
fn get_servo_key_from_winit_key(key: Option<VirtualKeyCode>) -> Key {
|
||||
use winit::VirtualKeyCode::*;
|
||||
use winit::event::VirtualKeyCode::*;
|
||||
// TODO: figure out how to map NavigateForward, NavigateBackward
|
||||
// TODO: map the remaining keys if possible
|
||||
let key = if let Some(key) = key {
|
||||
|
@ -127,7 +127,7 @@ fn get_servo_key_from_winit_key(key: Option<VirtualKeyCode>) -> Key {
|
|||
}
|
||||
|
||||
fn get_servo_location_from_winit_key(key: Option<VirtualKeyCode>) -> Location {
|
||||
use winit::VirtualKeyCode::*;
|
||||
use winit::event::VirtualKeyCode::*;
|
||||
// TODO: add more numpad keys
|
||||
let key = if let Some(key) = key {
|
||||
key
|
||||
|
@ -243,14 +243,14 @@ fn get_servo_code_from_scancode(_scancode: u32) -> Code {
|
|||
|
||||
fn get_modifiers(mods: ModifiersState) -> Modifiers {
|
||||
let mut modifiers = Modifiers::empty();
|
||||
modifiers.set(Modifiers::CONTROL, mods.ctrl);
|
||||
modifiers.set(Modifiers::SHIFT, mods.shift);
|
||||
modifiers.set(Modifiers::ALT, mods.alt);
|
||||
modifiers.set(Modifiers::META, mods.logo);
|
||||
modifiers.set(Modifiers::CONTROL, mods.ctrl());
|
||||
modifiers.set(Modifiers::SHIFT, mods.shift());
|
||||
modifiers.set(Modifiers::ALT, mods.alt());
|
||||
modifiers.set(Modifiers::META, mods.logo());
|
||||
modifiers
|
||||
}
|
||||
|
||||
pub fn keyboard_event_from_winit(input: KeyboardInput) -> KeyboardEvent {
|
||||
pub fn keyboard_event_from_winit(input: KeyboardInput, state: ModifiersState) -> KeyboardEvent {
|
||||
info!("winit keyboard input: {:?}", input);
|
||||
KeyboardEvent {
|
||||
state: match input.state {
|
||||
|
@ -260,7 +260,7 @@ pub fn keyboard_event_from_winit(input: KeyboardInput) -> KeyboardEvent {
|
|||
key: get_servo_key_from_winit_key(input.virtual_keycode),
|
||||
code: get_servo_code_from_scancode(input.scancode),
|
||||
location: get_servo_location_from_winit_key(input.virtual_keycode),
|
||||
modifiers: get_modifiers(input.modifiers),
|
||||
modifiers: get_modifiers(state),
|
||||
repeat: false,
|
||||
is_composing: false,
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
//! Definition of Window.
|
||||
//! Implemented by headless and headed windows.
|
||||
|
||||
use crate::events_loop::EventsLoop;
|
||||
use crate::events_loop::ServoEvent;
|
||||
use servo::compositing::windowing::{WindowEvent, WindowMethods};
|
||||
use servo::embedder_traits::Cursor;
|
||||
use servo::webrender_api::units::{DeviceIntPoint, DeviceIntSize};
|
||||
|
@ -16,16 +16,19 @@ pub const LINE_HEIGHT: f32 = 38.0;
|
|||
|
||||
pub trait WindowPortsMethods: WindowMethods {
|
||||
fn get_events(&self) -> Vec<WindowEvent>;
|
||||
fn id(&self) -> winit::WindowId;
|
||||
fn id(&self) -> winit::window::WindowId;
|
||||
fn has_events(&self) -> bool;
|
||||
fn page_height(&self) -> f32;
|
||||
fn get_fullscreen(&self) -> bool;
|
||||
fn winit_event_to_servo_event(&self, event: winit::WindowEvent);
|
||||
fn winit_event_to_servo_event(&self, event: winit::event::WindowEvent);
|
||||
fn is_animating(&self) -> bool;
|
||||
fn set_title(&self, _title: &str) {}
|
||||
fn set_inner_size(&self, _size: DeviceIntSize) {}
|
||||
fn set_position(&self, _point: DeviceIntPoint) {}
|
||||
fn set_fullscreen(&self, _state: bool) {}
|
||||
fn set_cursor(&self, _cursor: Cursor) {}
|
||||
fn new_glwindow(&self, events_loop: &EventsLoop) -> Box<dyn webxr::glwindow::GlWindow>;
|
||||
fn new_glwindow(
|
||||
&self,
|
||||
events_loop: &winit::event_loop::EventLoopWindowTarget<ServoEvent>
|
||||
) -> Box<dyn webxr::glwindow::GlWindow>;
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ ply == 3.8
|
|||
colorama == 0.3.7
|
||||
|
||||
# For package uploading
|
||||
boto3 == 1.4.4
|
||||
boto3 == 1.17.27
|
||||
|
||||
# Default root CAs on Windows CI do not trust CloudFront certificates,
|
||||
# connecting to https://static.rust-lang.org would fail:
|
||||
|
|
|
@ -1 +1 @@
|
|||
nightly-2021-02-25
|
||||
nightly-2021-03-12
|
||||
|
|
|
@ -67,17 +67,18 @@ packages = [
|
|||
# Lots of crates to update.
|
||||
"smallvec",
|
||||
|
||||
# https://github.com/servo/servo/issues/24421
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
|
||||
# https://github.com/servo/servo/pull/25518
|
||||
"core-foundation",
|
||||
"core-foundation-sys",
|
||||
"core-graphics",
|
||||
"lyon_geom",
|
||||
|
||||
# https://github.com/servo/servo/pull/28236
|
||||
"dlib",
|
||||
"nix",
|
||||
"nom",
|
||||
"strsim",
|
||||
|
||||
# Duplicated by webrender debugger via ws
|
||||
"digest",
|
||||
"generic-array",
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[legacy-factor-function-subclass.window.html]
|
||||
[[LegacyFactoryFunction\] can be subclassed and correctly handles NewTarget]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-005.html]
|
||||
[Miss clipped float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[svg-transform-animation.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,22 @@
|
|||
[color-mix-basic-001.tentative.html]
|
||||
[From blue to red at 0.5]
|
||||
expected: FAIL
|
||||
|
||||
[From blue to green at 0.5]
|
||||
expected: FAIL
|
||||
|
||||
[From rgb(255, 0, 0, .2) to red at 0.5]
|
||||
expected: FAIL
|
||||
|
||||
[From blue to red at 0.9]
|
||||
expected: FAIL
|
||||
|
||||
[From blue to red at 0]
|
||||
expected: FAIL
|
||||
|
||||
[From currentColor to white at 0.5]
|
||||
expected: FAIL
|
||||
|
||||
[From currentColor to rgba(0, 0, 0, .5) at 0.5]
|
||||
expected: FAIL
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[flexible-order.html]
|
||||
expected: FAIL
|
|
@ -479,156 +479,6 @@
|
|||
[left percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-right length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-right length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[color color(rgba) / events]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -326,453 +326,3 @@
|
|||
[margin-right length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-right length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-right length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[color color(rgba) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-weight font-weight(keyword) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-weight font-weight(numeric) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height number(integer) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height number(decimal) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-shadow shadow(shadow) / values]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[elementFromPoint-001.html]
|
||||
[CSSOM View - 5 - extensions to the Document interface]
|
||||
expected: FAIL
|
||||
|
|
@ -17,3 +17,6 @@
|
|||
[CustomStateSet behavior of ElementInternals.states: Modifications]
|
||||
expected: FAIL
|
||||
|
||||
[Updating a CustomStateSet while iterating it should work]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
[api-and-duplicate-headers.any.html]
|
||||
[fetch() and duplicate Content-Length/Content-Type headers]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest and duplicate Content-Length/Content-Type headers]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[api-and-duplicate-headers.any.worker.html]
|
||||
[fetch() and duplicate Content-Length/Content-Type headers]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest and duplicate Content-Length/Content-Type headers]
|
||||
expected: FAIL
|
||||
|
|
@ -312,9 +312,12 @@
|
|||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,12 +56,6 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript; charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 error text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[document-tree-child-browsing-context-name-property-set.sub.html]
|
||||
[Cross origin child window's name shadows the second candidate of a same origin iframe]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[embedded-opener-remove-frame.html]
|
||||
expected: CRASH
|
||||
[opener of discarded nested browsing context]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[dir-slots-directionality.tentative.html]
|
||||
expected: ERROR
|
|
@ -1,5 +1,5 @@
|
|||
[iframe_sandbox_popups_nonescaping-2.html]
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[form-double-submit-3.html]
|
||||
[<button> should have the same double-submit protection as <input type=submit>]
|
||||
expected: FAIL
|
||||
|
|
@ -2,54 +2,21 @@
|
|||
[input type search: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -59,21 +26,30 @@
|
|||
[input type search: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
[htmlanchorelement_noopener.html]
|
||||
expected: TIMEOUT
|
||||
[Check that targeting of rel=noopener with a given name reuses an existing window with that name]
|
||||
expected: FAIL
|
||||
|
||||
[Check that rel=noopener with target=_top does a normal load]
|
||||
expected: FAIL
|
||||
expected: NOTRUN
|
||||
|
||||
[Check that rel=noopener with target=_parent does a normal load]
|
||||
expected: FAIL
|
||||
expected: NOTRUN
|
||||
|
||||
[Check that rel=noopener with target=_self does a normal load]
|
||||
expected: FAIL
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[tag-name.xhtml]
|
||||
[tagName case]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[module-static-import-delayed.html]
|
||||
[document.write in an imported module]
|
||||
expected: FAIL
|
||||
|
|
@ -3,3 +3,6 @@
|
|||
[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
|
||||
|
||||
|
|
|
@ -8,3 +8,6 @@
|
|||
[Font resources should generate conformant entries]
|
||||
expected: FAIL
|
||||
|
||||
[Same-origin redirects should populate redirectStart/redirectEnd]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
[resource_timing_content_length.html]
|
||||
expected: ERROR
|
||||
[encodedBodySize should be equal to the actual byte size of the content]
|
||||
expected: FAIL
|
||||
|
||||
[encodedBodySize should be equal to the actual byte size of the content when no header present]
|
||||
expected: TIMEOUT
|
||||
|
||||
[encodedBodySize should be equal to the actual byte size of the content when header value is lower than actual content]
|
||||
expected: NOTRUN
|
||||
|
||||
[encodedBodySize should be equal to the actual byte size of the content when header value is higher than actual content]
|
||||
expected: NOTRUN
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -674,3 +674,9 @@
|
|||
[X SNR (-685.8850649422825 dB) is not greater than or equal to 65.737. Got -685.8850649422825.]
|
||||
expected: FAIL
|
||||
|
||||
[X Stitched sine-wave buffers at sample rate 44100 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.000090957,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[15240\]\t2.9073400062878995e-17\t3.3531737327575684e-1\t3.3531737327575678e-1\t9.9999999999999989e-1\t9.0957000000000003e-5\n\t[15241\]\t4.5602455924522522e-41\t3.9367997646331787e-1\t3.9367997646331787e-1\t1.0000000000000000e+0\t9.0957000000000003e-5\n\tMax AbsError of 3.9367997646331787e-1 at index of 15241.\n\tMax RelError of 1.0000000000000000e+0 at index of 15241.\n]
|
||||
expected: FAIL
|
||||
|
||||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[7189\]\t3.0530422463609499e-17\t-9.8956179618835449e-1\t9.8956179618835449e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[7190\]\t-8.8409073650836945e-2\t-9.9664616584777832e-1\t9.0823709219694138e-1\t9.1129341918891205e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.8956179618835449e-1 at index of 7189.\n\tMax RelError of 1.0000000000000000e+0 at index of 7189.\n]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[find.py]
|
||||
expected: ERROR
|
||||
[test_find_elements_link_text[<a href=#>link text</a>-link text\]]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[user_prompts.py]
|
||||
expected: ERROR
|
||||
[test_accept_and_notify[capabilities0-prompt-\]]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[017.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, about:blank]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[018.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, javascript:]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[import-in-moduleworker.html]
|
||||
expected: ERROR
|
||||
[Base URL in module dedicated workers: import]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -849,6 +849,15 @@
|
|||
]
|
||||
}
|
||||
},
|
||||
"custom-elements": {
|
||||
"xhtml-crash.xhtml": [
|
||||
"8b45d2ecc830c088019b4896f1cdf0d29c0d47fb",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
]
|
||||
},
|
||||
"dom": {
|
||||
"events": {
|
||||
"replace-event-listener-null-browsing-context-crash.html": [
|
||||
|
@ -21360,13 +21369,6 @@
|
|||
},
|
||||
"order-of-events": {
|
||||
"focus-events": {
|
||||
"focus-contained-manual.html": [
|
||||
"3f6e584d1ea3f9d34dd56d3ff1102708dc772983",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"legacy-manual.html": [
|
||||
"e71273973e615932addc8cd69dc76e3a0cd0a000",
|
||||
[
|
||||
|
@ -120862,6 +120864,19 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"svg-transform-animation.html": [
|
||||
"b08629c2eb76b86c80fe64436a364078c5376dcd",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-animations/svg-transform-animation-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"transform-animation-under-large-scale.html": [
|
||||
"359380d698bb26a4404d027285150de3b63492a0",
|
||||
[
|
||||
|
@ -128494,6 +128509,19 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"out-of-flow-in-multicolumn-015.html": [
|
||||
"2bbcf8fa847d50ce66f56c701351b79d0ac995a6",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"out-of-flow-in-multicolumn-016.html": [
|
||||
"26590bc9064268a0e9188be36011e5f60b38f159",
|
||||
[
|
||||
|
@ -128559,6 +128587,19 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"out-of-flow-in-multicolumn-021.html": [
|
||||
"05ce3d98339afbfba6103e4f779368e3a3d4d604",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"overflowed-block-with-no-room-after-000.html": [
|
||||
"084e16fb38de072fb83f92ba01302a2e404cdd97",
|
||||
[
|
||||
|
@ -152331,7 +152372,7 @@
|
|||
]
|
||||
],
|
||||
"select-element-zero-height-001.html": [
|
||||
"e39461ef129e99baae52fe93f01773ab27d8e4ac",
|
||||
"9e07c8019dce59b3e0d7ceb60d97f39556d0354f",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -152344,7 +152385,7 @@
|
|||
]
|
||||
],
|
||||
"select-element-zero-height-002.html": [
|
||||
"6b6b92896bcca7451703baf1e432bf3d28430b34",
|
||||
"4ca56cc6e9d5b27bd1ac399bc6ed4dfe455a652b",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -171659,6 +171700,19 @@
|
|||
]
|
||||
},
|
||||
"mask-image": {
|
||||
"mask-image-clip-exclude.html": [
|
||||
"f3d4c78d7a17f26d944324c73c0f00b58926ef60",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-masking/mask-image/mask-image-clip-exclude-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"mask-image-data-url-image.html": [
|
||||
"aac59f3c4aabeb362aef0734ca9315d3a2331af4",
|
||||
[
|
||||
|
@ -189089,7 +189143,7 @@
|
|||
]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-001.html": [
|
||||
"7dcf1102fb9cbf6a9495d6ef11ba8de111c4f12d",
|
||||
"b7c57bb7abe161bf66cdec988953ba1d2c0035ab",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -189102,7 +189156,7 @@
|
|||
]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-002.html": [
|
||||
"54470925dd5ab28238e5919a6d5fdc7f5c5fe46a",
|
||||
"70f7447679a7e1346ab660a3587a859da00e21bc",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -189115,7 +189169,7 @@
|
|||
]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-003.html": [
|
||||
"8da6b4c853baf2eb5c90b911fad9abce3d394b78",
|
||||
"b1c87e64c6f9fb2988c6561e7a816d744542e83a",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -189128,7 +189182,7 @@
|
|||
]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-004.html": [
|
||||
"b9955af2fcaa1cad54da055c005a47ffe2358395",
|
||||
"431bfa5c474dc6d39ed121bbf41a795d8027fc2c",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -189141,12 +189195,12 @@
|
|||
]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-005.html": [
|
||||
"86a2a72f6bfb89b6d77ff0e2339968dac9e436b7",
|
||||
"a5f308ea2fcdbf964a6ebec47c05c420aeeb1e9f",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-sizing/image-min-max-content-intrinsic-size-change-005-ref.html",
|
||||
"/css/css-sizing/image-min-max-content-intrinsic-size-change-001-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
|
@ -189154,12 +189208,12 @@
|
|||
]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-006.html": [
|
||||
"ddb89242a93a9dbd7cbc485bcba3d8c7528ac127",
|
||||
"68cbee7fa8d8c5dd6dd32a90281ad9eb5e0f086b",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-sizing/image-min-max-content-intrinsic-size-change-005-ref.html",
|
||||
"/css/css-sizing/image-min-max-content-intrinsic-size-change-001-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
|
@ -189167,12 +189221,12 @@
|
|||
]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-007.html": [
|
||||
"150052fa5116c469f4730638cd25a8ac47c6d2c9",
|
||||
"c1daabfa282aeb2dd8d86f88ac535c8bd2c9a67c",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-sizing/image-min-max-content-intrinsic-size-change-007-ref.html",
|
||||
"/css/css-sizing/image-min-max-content-intrinsic-size-change-003-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
|
@ -189180,12 +189234,12 @@
|
|||
]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-008.html": [
|
||||
"259e2f3fc004ede6ee107b041875f9842a166a08",
|
||||
"12f7d35ac0fe7e34955a87c18b9666e0ca86f3e3",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-sizing/image-min-max-content-intrinsic-size-change-007-ref.html",
|
||||
"/css/css-sizing/image-min-max-content-intrinsic-size-change-003-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
|
@ -243870,7 +243924,7 @@
|
|||
},
|
||||
"ruby": {
|
||||
"nested-ruby-pairing-001.html": [
|
||||
"1c00017cca8e3a2462229d2ee8b265a540ad22d9",
|
||||
"d502dbca9b2d4c8a6e47668a2158a3f4d0995105",
|
||||
[
|
||||
null,
|
||||
[
|
||||
|
@ -251964,6 +252018,32 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"input-date-content-size.html": [
|
||||
"d026771f3c89c736b397db6a10c15fde5d73a3a8",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/html/rendering/widgets/input-date-content-size-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"input-time-content-size.html": [
|
||||
"4a378f6923a8910b96f8afa84125a8fbac4a5d05",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/html/rendering/widgets/input-time-content-size-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"the-select-element": {
|
||||
"option-add-label.html": [
|
||||
"5110164c3115a087cffadaac9b7b26d677156fb7",
|
||||
|
@ -262899,6 +262979,10 @@
|
|||
"9ecc0df746bc0875aa30c8d8722776a4712f8c63",
|
||||
[]
|
||||
],
|
||||
"dependabot.yml": [
|
||||
"bf513bd1e445dd0c3e01035c8dd02ed3ae6ecaca",
|
||||
[]
|
||||
],
|
||||
"workflows": {
|
||||
"documentation.yml": [
|
||||
"b8bf7972b0f7666f8a01a81b05e8dec432732225",
|
||||
|
@ -266755,6 +266839,10 @@
|
|||
"6805c323df5a975231648b830e33ce183c3cbbd3",
|
||||
[]
|
||||
],
|
||||
"window-name-setter.html": [
|
||||
"c0603aa300838bad111899b1efaf058943f88e11",
|
||||
[]
|
||||
],
|
||||
"worklet-reftest.js": [
|
||||
"e05d4ee801b53be521e589e37704f3bd9ef001f6",
|
||||
[]
|
||||
|
@ -285883,6 +285971,14 @@
|
|||
"afe4753cf93f8d68884eb731ce69e004a4b5e9ff",
|
||||
[]
|
||||
],
|
||||
"message-opener-and-navigate-back.html": [
|
||||
"6e0d3f5579fb7b37cf2a0c2cbe0bb3596f3581c6",
|
||||
[]
|
||||
],
|
||||
"message-top-and-navigate-back.html": [
|
||||
"6fccbaaaf39326e56bb5d83c637b2ec9bafcdc98",
|
||||
[]
|
||||
],
|
||||
"navigate-parent-to-blob.html": [
|
||||
"df4a4438935a5798d3672111081984d6ef9d0ef1",
|
||||
[]
|
||||
|
@ -285900,7 +285996,7 @@
|
|||
[]
|
||||
],
|
||||
"postmessage-opener.html": [
|
||||
"3282711dbc2c9bac534e44fa9d11ef3870a8c563",
|
||||
"4278c0e6732fc5b614487c6ff0cc83f41f6e1c27",
|
||||
[]
|
||||
],
|
||||
"postmessage-top.html": [
|
||||
|
@ -305616,6 +305712,10 @@
|
|||
[]
|
||||
]
|
||||
},
|
||||
"svg-transform-animation-ref.html": [
|
||||
"d8666e8a73b6cb1be88edc4549e03a85045f86d1",
|
||||
[]
|
||||
],
|
||||
"transform-animation-under-large-scale-ref.html": [
|
||||
"14b41366268c3a33f2d49e477bab2d40c6acb432",
|
||||
[]
|
||||
|
@ -311747,11 +311847,11 @@
|
|||
[]
|
||||
],
|
||||
"select-element-zero-height-001-ref.html": [
|
||||
"37a102e0f605b575384de0a99601e77fd0f8a462",
|
||||
"fab8bf73554143fb8033f2d0130d3378c23ae460",
|
||||
[]
|
||||
],
|
||||
"select-element-zero-height-002-ref.html": [
|
||||
"93222f70617378a33799224ede30a330f9933e7d",
|
||||
"234ecd4e84f22100aa023b152e56e38399dda8a2",
|
||||
[]
|
||||
],
|
||||
"support": {
|
||||
|
@ -321813,6 +321913,10 @@
|
|||
}
|
||||
},
|
||||
"mask-image": {
|
||||
"mask-image-clip-exclude-ref.html": [
|
||||
"5d82c5cf27a1ec69c5f646830ebbbf0f04c5264c",
|
||||
[]
|
||||
],
|
||||
"reference": {
|
||||
"1x1-black-30-alpha.png": [
|
||||
"e334f44a038408f6b608f9aca4582a9b61e7beb4",
|
||||
|
@ -325631,19 +325735,11 @@
|
|||
[]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-001-ref.html": [
|
||||
"160914c3e840a031f861f5701c444b57aed4819b",
|
||||
"9d3a3f534e65e5c344334dd75dd8d0e89208e8e7",
|
||||
[]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-003-ref.html": [
|
||||
"56b71a0ffe475e27d37d6d81de28d4ab12cdfabe",
|
||||
[]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-005-ref.html": [
|
||||
"9964f07cfa5834824f5a81b0cf77ee60f92744d5",
|
||||
[]
|
||||
],
|
||||
"image-min-max-content-intrinsic-size-change-007-ref.html": [
|
||||
"8b9da1c9bf6e895ab3084bb1748f80968b916ff8",
|
||||
"c3253f750c58126dcd71d93b7c4142b10b1e77d1",
|
||||
[]
|
||||
],
|
||||
"intrinsic-percent-non-replaced-001-ref.html": [
|
||||
|
@ -337896,7 +337992,7 @@
|
|||
},
|
||||
"ruby": {
|
||||
"nested-ruby-pairing-001-ref.html": [
|
||||
"ab1fee01a92c3e92691f239f554c9f65f13337e4",
|
||||
"8c470232876d5a3d3b0c988f2cfef0936d142a10",
|
||||
[]
|
||||
],
|
||||
"ruby-autohide-001-ref.html": [
|
||||
|
@ -339753,7 +339849,7 @@
|
|||
[]
|
||||
],
|
||||
"delete.js": [
|
||||
"138a749500b7a438811eec7f9c56f94e3436b421",
|
||||
"57ddb1520cfd847b4899fb87b0d8bc16ab13e35a",
|
||||
[]
|
||||
],
|
||||
"fontname.js": [
|
||||
|
@ -339773,7 +339869,7 @@
|
|||
[]
|
||||
],
|
||||
"forwarddelete.js": [
|
||||
"cc67b35c27e3ff9b7ef9c9de90d5073e5c79c246",
|
||||
"eeee322169df58eec9cd5c7e07a0ddb33f0bf16a",
|
||||
[]
|
||||
],
|
||||
"hilitecolor.js": [
|
||||
|
@ -342096,6 +342192,10 @@
|
|||
"content-lengths.json": [
|
||||
"dac9c82dc0978439841f4981eb3ffde1056aeaac",
|
||||
[]
|
||||
],
|
||||
"identical-duplicates.asis": [
|
||||
"f38c9a4b8a05ae12bdad1db7148ba8a25ee274c2",
|
||||
[]
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -342794,6 +342894,10 @@
|
|||
"f22fa98076fde127961c9b58fc5f76db55b21a42",
|
||||
[]
|
||||
],
|
||||
"focus-event-after-different-site-iframe-gets-focus-outer.sub.html": [
|
||||
"c59b2ce72f8dcbab5528e9ea0d1c2f39062503fd",
|
||||
[]
|
||||
],
|
||||
"focus-event-after-focusing-different-site-iframes-outer.sub.html": [
|
||||
"7d2fb504d661d5a919f4d8141444d2b626c3aaeb",
|
||||
[]
|
||||
|
@ -342806,6 +342910,22 @@
|
|||
"08f2c3f7ae2b1205158d1ce1f4c70c6742e9c330",
|
||||
[]
|
||||
],
|
||||
"focus-event-after-iframe-gets-focus-inner.html": [
|
||||
"bab32c087964471ad3d068ae340fdfa7e90e524c",
|
||||
[]
|
||||
],
|
||||
"focus-event-after-innermost-different-site-iframe-gets-focus-middle.sub.html": [
|
||||
"ba2a9c7657357b25ec33431504a78968636270e1",
|
||||
[]
|
||||
],
|
||||
"focus-event-after-innermost-different-site-iframe-gets-focus-outer.sub.html": [
|
||||
"12af71e8aaed38ea7227eba72a9a95368897388b",
|
||||
[]
|
||||
],
|
||||
"focus-event-after-same-site-iframe-gets-focus-outer.html": [
|
||||
"b191be580eae1862aef4bffa9d3f46b89af98140",
|
||||
[]
|
||||
],
|
||||
"focus-restoration-in-different-site-iframes-inner-window.html": [
|
||||
"a5c75f496bd788c1c6ae389f308d0f2902ef71e4",
|
||||
[]
|
||||
|
@ -352349,6 +352469,14 @@
|
|||
"dcef656bad00792262e05ab643195ef6804d5336",
|
||||
[]
|
||||
],
|
||||
"input-date-content-size-ref.html": [
|
||||
"18019c56b1bd2535b998c05f301fca3abc8ae1bb",
|
||||
[]
|
||||
],
|
||||
"input-time-content-size-ref.html": [
|
||||
"938d2659a8a8c02230c92db5b575818a5d056809",
|
||||
[]
|
||||
],
|
||||
"the-select-element": {
|
||||
"option-label-ref.html": [
|
||||
"3dd07b8dc2b4778d7f2f2e69202d680902c7e838",
|
||||
|
@ -358057,7 +358185,7 @@
|
|||
]
|
||||
},
|
||||
"lint.ignore": [
|
||||
"0b95e5a9f50adaf4f91a510919ed27d7fb48b319",
|
||||
"4c826d0d40841a4f3649b5ab6361a5ec1e0b0a11",
|
||||
[]
|
||||
],
|
||||
"loading": {
|
||||
|
@ -363246,6 +363374,10 @@
|
|||
"168850e2a88dbdc74d07c4813b2ef4e5fd812d7d",
|
||||
[]
|
||||
],
|
||||
"resource-timing-content-length.py": [
|
||||
"6dbce047b72ef05976d5296ea38961e205a0f04e",
|
||||
[]
|
||||
],
|
||||
"resource_timing_test0.css": [
|
||||
"8bc8326ba675adcc8aa809dd0b885dba3285782d",
|
||||
[]
|
||||
|
@ -363908,7 +364040,7 @@
|
|||
[]
|
||||
],
|
||||
"testharness.js": [
|
||||
"21fa7933ed2b5a9ff038de212ac69bde523a967c",
|
||||
"a49e604ee2e7dbab5c6eba95b19208d04b72832e",
|
||||
[]
|
||||
],
|
||||
"testharness.js.headers": [
|
||||
|
@ -366619,6 +366751,10 @@
|
|||
"4ed5beea7457846c60694a279169c4bfba07d661",
|
||||
[]
|
||||
],
|
||||
"xhr-content-length-worker.js": [
|
||||
"604deece2d252d68b4f156403b6041b0290d5a9c",
|
||||
[]
|
||||
],
|
||||
"xhr-iframe.html": [
|
||||
"4c57bbbc6589d9738924b0acb91b440efc141622",
|
||||
[]
|
||||
|
@ -377393,7 +377529,7 @@
|
|||
[]
|
||||
],
|
||||
"executormarionette.py": [
|
||||
"ea4cbe12b24e73ac98f9ad02a033a3809d3f2382",
|
||||
"81be731b06d6e31ddf96f0ba0de4ff302e65cffa",
|
||||
[]
|
||||
],
|
||||
"executoropera.py": [
|
||||
|
@ -396539,6 +396675,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"legacy-factor-function-subclass.window.js": [
|
||||
"1fd64f41bb2e8ecd95ba15104886e7ec16f3cc6d",
|
||||
[
|
||||
"WebIDL/ecmascript-binding/legacy-factor-function-subclass.window.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"legacy-platform-object": {
|
||||
"DefineOwnProperty.html": [
|
||||
"8de0bac683268b6f57781dff98c8cb400dff45d7",
|
||||
|
@ -407027,6 +407170,20 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"history-iframe.sub.html": [
|
||||
"fc5904c649ea1a092c31e4938738143de36a9bfd",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"history.sub.html": [
|
||||
"f5481cc1206f0e6a434dfcdcc1ce617119fbef9d",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"iframe-all-local-schemes-inherit-self.sub.html": [
|
||||
"73e974e51a87dc80eab797ad3a4ddee20759aa7b",
|
||||
[
|
||||
|
@ -407069,6 +407226,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"location-reload.html": [
|
||||
"5d68e381bc76ddd5a0bb6556a0809b002e2e040f",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"sandboxed-blob-scheme.html": [
|
||||
"590fa7ec1a9caafc6f18e6821f100629688bd300",
|
||||
[
|
||||
|
@ -414495,6 +414659,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"color-mix-basic-001.tentative.html": [
|
||||
"9e3b8146a3272900a0f2571f036ad460d19c0be4",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"color-resolving-hsl.html": [
|
||||
"d33701759d6068e3d335a9bf17795df1a4235cd0",
|
||||
[
|
||||
|
@ -423062,6 +423233,13 @@
|
|||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"size-001.html": [
|
||||
"1be8648da213dad2a678e349030fa8a1c10e6e23",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -424045,7 +424223,7 @@
|
|||
},
|
||||
"css-ruby": {
|
||||
"inheritance.html": [
|
||||
"9f546c23bb864fc83588d326b7314141401e50dd",
|
||||
"0128ea1ee8fe3e28a1a8e409eeb87b41b857f20f",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -424109,6 +424287,13 @@
|
|||
]
|
||||
]
|
||||
},
|
||||
"ruby-position-alternate.html": [
|
||||
"e2e10d9be27e51adec364ee6979be0e19408c535",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"ruby-position.html": [
|
||||
"014c52404477e2184936c121e887f73aaf0478b9",
|
||||
[
|
||||
|
@ -437751,7 +437936,7 @@
|
|||
]
|
||||
],
|
||||
"focus-visible-006.html": [
|
||||
"f607df250a5a528f83e31e616317f027b4360a15",
|
||||
"c203c06f6eaaf5f388237f3f1b792c3708c8a089",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -439250,7 +439435,7 @@
|
|||
"state": {
|
||||
"tentative": {
|
||||
"ElementInternals-states.html": [
|
||||
"22c95a75bdf9d5d0ab65783502f2c6526ee8f9c4",
|
||||
"96dcb841eec28ed001dba1ff8994ba3b209e28a3",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -456081,7 +456266,7 @@
|
|||
]
|
||||
],
|
||||
"crossiframe.html": [
|
||||
"6beb9aa357f9490eeff55bc762ab178b1dc58619",
|
||||
"7a9ede0f9ae78d6ea28add6fcafc8497d8789b8d",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -464362,6 +464547,17 @@
|
|||
]
|
||||
},
|
||||
"content-length": {
|
||||
"api-and-duplicate-headers.any.js": [
|
||||
"8015289f8d661cc56fc715c7be4f3c61b773bb64",
|
||||
[
|
||||
"fetch/content-length/api-and-duplicate-headers.any.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"fetch/content-length/api-and-duplicate-headers.any.worker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"content-length.html": [
|
||||
"cda9b5b523701558c0d613bf6e0e5462b0ffa9c2",
|
||||
[
|
||||
|
@ -468091,6 +468287,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"focus-event-after-iframe-gets-focus.html": [
|
||||
"32c4d544b6ca9dfb6df752a7b62a6f4c836a8fe2",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"focus-restoration-in-different-site-iframes-window.html": [
|
||||
"61e604b3c77010866e54507211b6c57d84bc781a",
|
||||
[
|
||||
|
@ -471886,6 +472089,13 @@
|
|||
]
|
||||
},
|
||||
"the-windowproxy-exotic-object": {
|
||||
"document-tree-child-browsing-context-name-property-set.sub.html": [
|
||||
"171aa019991ee7f85265bafdaab3f3ad52a386c4",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"windowproxy-prevent-extensions.html": [
|
||||
"97a156290a1c5ad15a36f24b0009d9f599c8be3e",
|
||||
[
|
||||
|
@ -491503,6 +491713,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"dir-slots-directionality.tentative.html": [
|
||||
"851fd2edba7398c04b51c82f76611eca81ceb5f3",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"document-dir.html": [
|
||||
"675b4bc9d937c0928712b218318daa611018a6f2",
|
||||
[
|
||||
|
@ -494194,7 +494411,7 @@
|
|||
]
|
||||
},
|
||||
"baseline-alignment-and-overflow.tentative.html": [
|
||||
"5f677b5f0f6df7b35cbe789a80f660bcd71ad082",
|
||||
"45ac762bd181a7e2c0cb28acaa154bd2e5c4a904",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -499065,7 +499282,7 @@
|
|||
]
|
||||
],
|
||||
"object-events.html": [
|
||||
"151923ac2fdddd1701e079b12ee2a5a04beb9b3d",
|
||||
"38f92c3d356c297a779d6ebaefed6547bc654b43",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -500107,7 +500324,7 @@
|
|||
]
|
||||
],
|
||||
"cloning-steps.html": [
|
||||
"9e6c46fd7aa5beccd9cd8e357c7d0f9b9063c900",
|
||||
"52cd57705e4b998e1f7a002206f923a2ee801b84",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -500591,6 +500808,15 @@
|
|||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"proxy-modifier-click-to-associated-element.tentative.html": [
|
||||
"fa50c080250699cf48d2661951ad73abc03655d4",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"the-legend-element": {
|
||||
|
@ -501140,7 +501366,7 @@
|
|||
]
|
||||
],
|
||||
"dialog-form-submission.html": [
|
||||
"5c561e162d062df2fa1fba1f7c46850f59dacbe4",
|
||||
"73c9ee95bc5619cb1debf33e70ba9820f2780692",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -504218,6 +504444,13 @@
|
|||
]
|
||||
]
|
||||
},
|
||||
"moving-between-documents-during-evaluation.html": [
|
||||
"e4cd887c6146344a9b2d12c3ff491ab1d0eeea99",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"muted-errors.sub.html": [
|
||||
"61643c5f08c09efcc2ffb6ef5106809bb01658d6",
|
||||
[
|
||||
|
@ -504433,6 +504666,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"tag-name.xhtml": [
|
||||
"a1e293d1cbf142fee66a5d84e27cc962907ed640",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"template-child-nodes.html": [
|
||||
"40abda5684b256601c976cffc54974c9ff52ebe7",
|
||||
[
|
||||
|
@ -510243,6 +510483,15 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"input-events-get-target-ranges-deleting-range-across-editing-host-boundaries.tentative.html": [
|
||||
"04f632a929994e15186d7bd4fafb3cb6b4c18e20",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"input-events-get-target-ranges-during-and-after-dispatch.tentative.html": [
|
||||
"be4656d04a84fada7f8b318a1df97ea062c39a95",
|
||||
[
|
||||
|
@ -512027,14 +512276,28 @@
|
|||
]
|
||||
],
|
||||
"shift-while-scrolled.html": [
|
||||
"88eeedea87782939d0191c64f7771e7e4f8828c3",
|
||||
"3cdd3571a37d74e7cfbf8a6cfab68bbd17878d70",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"shift-with-counter-scroll-and-transform.html": [
|
||||
"b4e4a99c1c8abdb3f1f411bb07c4aea9ab60d606",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"shift-with-counterscroll-2.html": [
|
||||
"d99723010ef87036f8db24c4d959a2400b876796",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"shift-with-counterscroll.html": [
|
||||
"8ad1a463443ef1b6b8b8ca06a9435157cb38a1f5",
|
||||
"85a8ed93364ecbb760bfba9a48bcd85dea4d8c23",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -536626,7 +536889,7 @@
|
|||
]
|
||||
],
|
||||
"cross-origin-status-codes.html": [
|
||||
"e8ece5ff2fea3d4d856cdf3774870c59080a1c45",
|
||||
"512e43722225adb95e2e01e22278496c6adbba89",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -536661,7 +536924,7 @@
|
|||
]
|
||||
],
|
||||
"entry-attributes.html": [
|
||||
"013f4d7989c0f22758e113e8a457d175bec869d7",
|
||||
"5f330bb1fdb59ac2700e2eda5b0cbcea2ef59bd3",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -537016,6 +537279,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"resource_timing_content_length.html": [
|
||||
"32bd8a97e07341323061512698a565232f1972bd",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"resource_timing_cross_origin_redirect.html": [
|
||||
"60a7ef1564b788ab529b8d1f5e35429d82f76911",
|
||||
[
|
||||
|
@ -537030,13 +537300,6 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"resource_timing_same_origin_redirect.html": [
|
||||
"d9fbf944f6c65b7a247b4764ee39e6aa33bc465d",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"single-entry-per-resource.html": [
|
||||
"c7f777a174a6a307c81fba3d6082fb152be99b1f",
|
||||
[
|
||||
|
@ -541709,6 +541972,20 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"xhr-content-length.window.js": [
|
||||
"1ae320e9c3c5713a2d47291d83ba7d72dc03c152",
|
||||
[
|
||||
"service-workers/service-worker/xhr-content-length.window.html",
|
||||
{
|
||||
"script_metadata": [
|
||||
[
|
||||
"script",
|
||||
"resources/test-helpers.sub.js"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"xhr-response-url.https.html": [
|
||||
"673ca52cc67450f8b296ea50f7ac4c4fee310602",
|
||||
[
|
||||
|
@ -551252,7 +551529,7 @@
|
|||
"types": {
|
||||
"elements": {
|
||||
"SVGGeometryElement-rect.svg": [
|
||||
"d4b278f2836f75fd3f6cbe8460d20147116e4bfe",
|
||||
"93d25b6bfddb8c483044db3092d2c0e67ae0fac2",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -551429,7 +551706,7 @@
|
|||
]
|
||||
],
|
||||
"SVGAnimatedRect.html": [
|
||||
"eb5bb1db166414b456ac8785ca87ec91e15216a1",
|
||||
"1dfbc77b51266ccc50cadc79a3c0f5dae8f479b9",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -551520,7 +551797,7 @@
|
|||
]
|
||||
],
|
||||
"SVGGraphicsElement.svg": [
|
||||
"8d5808f0db782984852f89289eda56973dde00d2",
|
||||
"893882b3cce452b39eef410ea6dbed10181faca1",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -552568,6 +552845,15 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"focus-contained.html": [
|
||||
"8df612c1080a82ed4ffaae0c72287735af1e8cf0",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"focus-management-expectations.html": [
|
||||
"1845c15d71679276b6fbf4a19188d111da5ea70b",
|
||||
[
|
||||
|
@ -563147,13 +563433,6 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"video-track-reader.html": [
|
||||
"925e8374f58f4e1983d9ed7d05c0324a9028c22a",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"videoFrame-canvasImageSource.html": [
|
||||
"78572693536f8362a7996e529ca30a0400acffce",
|
||||
[
|
||||
|
@ -576688,7 +576967,7 @@
|
|||
]
|
||||
],
|
||||
"event-upload-progress.any.js": [
|
||||
"87223c172d50bb01379a86075d355e5a4bcbbcfd",
|
||||
"6fe659193b58fc76b5d234b76d866bd0cc101ef1",
|
||||
[
|
||||
"xhr/event-upload-progress.any.html",
|
||||
{
|
||||
|
@ -577343,6 +577622,17 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"request-content-length.any.js": [
|
||||
"054d2cce9d27ab1044f7e99932f7b11a1d807a0e",
|
||||
[
|
||||
"xhr/request-content-length.any.html",
|
||||
{}
|
||||
],
|
||||
[
|
||||
"xhr/request-content-length.any.worker.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"response-body-errors.any.js": [
|
||||
"4edfed00fdd50082f7cb3a82c1c84d640c562553",
|
||||
[
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[legacy-factor-function-subclass.window.html]
|
||||
[[LegacyFactoryFunction\] can be subclassed and correctly handles NewTarget]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-005.html]
|
||||
[Miss clipped float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[svg-transform-animation.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,22 @@
|
|||
[color-mix-basic-001.tentative.html]
|
||||
[From blue to red at 0.5]
|
||||
expected: FAIL
|
||||
|
||||
[From blue to green at 0.5]
|
||||
expected: FAIL
|
||||
|
||||
[From rgb(255, 0, 0, .2) to red at 0.5]
|
||||
expected: FAIL
|
||||
|
||||
[From blue to red at 0.9]
|
||||
expected: FAIL
|
||||
|
||||
[From blue to red at 0]
|
||||
expected: FAIL
|
||||
|
||||
[From currentColor to white at 0.5]
|
||||
expected: FAIL
|
||||
|
||||
[From currentColor to rgba(0, 0, 0, .5) at 0.5]
|
||||
expected: FAIL
|
||||
|
|
@ -479,156 +479,6 @@
|
|||
[left percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-right length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-right length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[height percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[width percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-height percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(ex) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(mm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(cm) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(in) / events]
|
||||
expected: FAIL
|
||||
|
||||
[min-width percentage(%) / events]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(pt) / events]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(pc) / events]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(px) / events]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(em) / events]
|
||||
expected: FAIL
|
||||
|
||||
[color color(rgba) / events]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -326,453 +326,3 @@
|
|||
[margin-right length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-right length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-right length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[margin-top length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[height percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[width percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-height percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[min-width percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-height percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[max-width percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[top percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[right percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[bottom percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[left percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[color color(rgba) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-size percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-weight font-weight(keyword) / values]
|
||||
expected: FAIL
|
||||
|
||||
[font-weight font-weight(numeric) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height number(integer) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height number(decimal) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[line-height percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[letter-spacing length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[word-spacing percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(pt) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(pc) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(px) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(em) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(ex) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(mm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(cm) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent length(in) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-indent percentage(%) / values]
|
||||
expected: FAIL
|
||||
|
||||
[text-shadow shadow(shadow) / values]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[elementFromPoint-001.html]
|
||||
[CSSOM View - 5 - extensions to the Document interface]
|
||||
expected: FAIL
|
||||
|
|
@ -17,3 +17,6 @@
|
|||
[CustomStateSet behavior of ElementInternals.states: Modifications]
|
||||
expected: FAIL
|
||||
|
||||
[Updating a CustomStateSet while iterating it should work]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
[api-and-duplicate-headers.any.html]
|
||||
[fetch() and duplicate Content-Length/Content-Type headers]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest and duplicate Content-Length/Content-Type headers]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[api-and-duplicate-headers.any.worker.html]
|
||||
[fetch() and duplicate Content-Length/Content-Type headers]
|
||||
expected: FAIL
|
||||
|
||||
[XMLHttpRequest and duplicate Content-Length/Content-Type headers]
|
||||
expected: FAIL
|
||||
|
|
@ -312,9 +312,12 @@
|
|||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,12 +56,6 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript; charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 error text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[document-tree-child-browsing-context-name-property-set.sub.html]
|
||||
[Cross origin child window's name shadows the second candidate of a same origin iframe]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[embedded-opener-remove-frame.html]
|
||||
expected: CRASH
|
||||
[opener and "removed" embedded documents]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[dir-slots-directionality.tentative.html]
|
||||
expected: ERROR
|
|
@ -1,6 +1,6 @@
|
|||
[iframe_sandbox_popups_nonescaping-2.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[form-double-submit-3.html]
|
||||
[<button> should have the same double-submit protection as <input type=submit>]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
[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
|
||||
|
||||
|
@ -7,11 +8,11 @@
|
|||
expected: FAIL
|
||||
|
||||
[Check that rel=noopener with target=_top does a normal load]
|
||||
expected: FAIL
|
||||
expected: NOTRUN
|
||||
|
||||
[Check that rel=noopener with target=_parent does a normal load]
|
||||
expected: FAIL
|
||||
expected: NOTRUN
|
||||
|
||||
[Check that rel=noopener with target=_self does a normal load]
|
||||
expected: FAIL
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[tag-name.xhtml]
|
||||
[tagName case]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[module-static-import-delayed.html]
|
||||
[document.write in an imported module]
|
||||
expected: FAIL
|
||||
|
|
@ -4,3 +4,6 @@
|
|||
[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
|
||||
|
||||
|
|
|
@ -8,3 +8,6 @@
|
|||
[Font resources should generate conformant entries]
|
||||
expected: FAIL
|
||||
|
||||
[Same-origin redirects should populate redirectStart/redirectEnd]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
[resource_timing_content_length.html]
|
||||
expected: ERROR
|
||||
[encodedBodySize should be equal to the actual byte size of the content]
|
||||
expected: FAIL
|
||||
|
||||
[encodedBodySize should be equal to the actual byte size of the content when no header present]
|
||||
expected: TIMEOUT
|
||||
|
||||
[encodedBodySize should be equal to the actual byte size of the content when header value is lower than actual content]
|
||||
expected: NOTRUN
|
||||
|
||||
[encodedBodySize should be equal to the actual byte size of the content when header value is higher than actual content]
|
||||
expected: NOTRUN
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[resource_timing_same_origin_redirect.html]
|
||||
expected: ERROR
|
||||
[This test validates the values of the redirectStart/End in resource timing for a same-origin resource redirect.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -902,3 +902,9 @@
|
|||
[X SNR (-685.8850649422825 dB) is not greater than or equal to 65.737. Got -685.8850649422825.]
|
||||
expected: FAIL
|
||||
|
||||
[X Stitched sine-wave buffers at sample rate 44100 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.000090957,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[15240\]\t2.9073400062878995e-17\t3.3531737327575684e-1\t3.3531737327575678e-1\t9.9999999999999989e-1\t9.0957000000000003e-5\n\t[15241\]\t4.5602455924522522e-41\t3.9367997646331787e-1\t3.9367997646331787e-1\t1.0000000000000000e+0\t9.0957000000000003e-5\n\tMax AbsError of 3.9367997646331787e-1 at index of 15241.\n\tMax RelError of 1.0000000000000000e+0 at index of 15241.\n]
|
||||
expected: FAIL
|
||||
|
||||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[7189\]\t3.0530422463609499e-17\t-9.8956179618835449e-1\t9.8956179618835449e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[7190\]\t-8.8409073650836945e-2\t-9.9664616584777832e-1\t9.0823709219694138e-1\t9.1129341918891205e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.8956179618835449e-1 at index of 7189.\n\tMax RelError of 1.0000000000000000e+0 at index of 7189.\n]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,34 @@
|
|||
[event-insertion.html]
|
||||
[< [Insert same event at same time\] 1 out of 15 assertions were failed.]
|
||||
expected: FAIL
|
||||
|
||||
[X Linear+Expo: At time 0.01556396484375 (frame 255) output is not close to 1.99609375 within a relative error of 0 (RelErr=0.4964742940465998). Got 2.98710298538208.]
|
||||
expected: FAIL
|
||||
|
||||
[X Expo+Linear: At time 0.01556396484375 (frame 255) output is not close to 2.9871532226369792 within a relative error of 0.0000042533 (RelErr=0.3317790074896618). Got 1.9960784912109375.]
|
||||
expected: FAIL
|
||||
|
||||
[< [Linear + Expo\] 1 out of 6 assertions were failed.]
|
||||
expected: FAIL
|
||||
|
||||
[< [Expo + Linear\] 1 out of 6 assertions were failed.]
|
||||
expected: FAIL
|
||||
|
||||
[X Linear+SetTarget: At time 0.015625 (frame 256) output is not equal to 100. Got NaN.]
|
||||
expected: FAIL
|
||||
|
||||
[X Multiple linear ramps: Output at frame 63 is not close to 1.984375 within a relative error of 0 (RelErr=3.9673788716473917). Got 9.857142448425293.]
|
||||
expected: FAIL
|
||||
|
||||
[X Multiple exponential ramps: Output at frame 63 is not close to 1.978456026387951 within a relative error of 5.3924e-7 (RelErr=3.873046650665318). Got 9.641108512878418.]
|
||||
expected: FAIL
|
||||
|
||||
[< [Multiple linear ramps at the same time\] 1 out of 6 assertions were failed.]
|
||||
expected: FAIL
|
||||
|
||||
[< [Multiple exponential ramps at the same time\] 1 out of 6 assertions were failed.]
|
||||
expected: FAIL
|
||||
|
||||
[X Output at frame 512 (time 0.03125) is not equal to 4. Got 3.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[find.py]
|
||||
expected: ERROR
|
||||
[test_find_elements_link_text[<a href=#>link text</a>-link text\]]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[user_prompts.py]
|
||||
expected: ERROR
|
||||
[test_accept_and_notify[capabilities0-prompt-\]]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[017.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, about:blank]
|
||||
expected: TIMEOUT
|
||||
|
5
tests/wpt/metadata/webmessaging/with-ports/018.html.ini
Normal file
5
tests/wpt/metadata/webmessaging/with-ports/018.html.ini
Normal file
|
@ -0,0 +1,5 @@
|
|||
[018.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, javascript:]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[import-in-moduleworker.html]
|
||||
expected: ERROR
|
||||
[Base URL in module dedicated workers: import]
|
||||
expected: FAIL
|
||||
|
||||
|
|
22
tests/wpt/web-platform-tests/.github/dependabot.yml
vendored
Normal file
22
tests/wpt/web-platform-tests/.github/dependabot.yml
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: github-actions
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
open-pull-requests-limit: 10
|
||||
- package-ecosystem: npm
|
||||
directory: "webrtc/tools/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
open-pull-requests-limit: 10
|
||||
- package-ecosystem: npm
|
||||
directory: "tools/scripts/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
open-pull-requests-limit: 10
|
||||
- package-ecosystem: npm
|
||||
directory: "css/css-writing-modes/tools/generators/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
open-pull-requests-limit: 10
|
|
@ -0,0 +1,13 @@
|
|||
"use strict";
|
||||
|
||||
test(() => {
|
||||
class CustomImage extends Image {}
|
||||
var instance = new CustomImage();
|
||||
|
||||
assert_equals(
|
||||
Object.getPrototypeOf(instance), CustomImage.prototype,
|
||||
"Object.getPrototypeOf(instance) === CustomImage.prototype");
|
||||
|
||||
assert_true(instance instanceof CustomImage, "instance instanceof CustomImage");
|
||||
assert_true(instance instanceof HTMLImageElement, "instance instanceof HTMLImageElement");
|
||||
}, "[LegacyFactoryFunction] can be subclassed and correctly handles NewTarget");
|
12
tests/wpt/web-platform-tests/common/window-name-setter.html
Normal file
12
tests/wpt/web-platform-tests/common/window-name-setter.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>A page that sets window.name</title>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
window.onload = () => {
|
||||
window.name = location.hash.slice(1); // Drop the first '#' character.
|
||||
window.name = "spices";
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,153 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<meta http-equiv="Content-Security-Policy" content="img-src 'none'">
|
||||
<body>
|
||||
<script>
|
||||
let message_from = (w, starts_with) => {
|
||||
return new Promise(resolve => {
|
||||
window.addEventListener('message', msg => {
|
||||
if (msg.source == w) {
|
||||
if (!starts_with || msg.data.startsWith(starts_with))
|
||||
resolve(msg.data);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const function_messageBack_string = `
|
||||
function messageBack(msg) {
|
||||
top.postMessage(msg ,"*");
|
||||
}
|
||||
`;
|
||||
|
||||
const img_url = window.origin + "/content-security-policy/support/fail.png";
|
||||
const img_tag_string = `
|
||||
<img src="${img_url}"
|
||||
onload="messageBack('img loaded');"
|
||||
onerror="messageBack('img blocked');"
|
||||
>
|
||||
`;
|
||||
|
||||
const html_test_payload = `
|
||||
<!doctype html>
|
||||
<script>${function_messageBack_string}</scr`+`ipt>
|
||||
<div>${img_tag_string}</div>
|
||||
`;
|
||||
let blob_url = URL.createObjectURL(
|
||||
new Blob([html_test_payload], { type: 'text/html' }));
|
||||
|
||||
let write_img_to_about_blank = async (t, iframe) => {
|
||||
await t.step_wait(
|
||||
condition = () => {
|
||||
try {
|
||||
return iframe.contentWindow.location.href == "about:blank";
|
||||
} catch {}
|
||||
return false;
|
||||
},
|
||||
description = "Wait for the iframe to navigate.",
|
||||
timeout=6000,
|
||||
interval=50);
|
||||
|
||||
let script = iframe.contentDocument.createElement('script');
|
||||
script.innerText = function_messageBack_string;
|
||||
iframe.contentDocument.head.appendChild(script);
|
||||
let div = iframe.contentDocument.createElement('div');
|
||||
div.innerHTML = img_tag_string;
|
||||
iframe.contentDocument.body.appendChild(div);
|
||||
};
|
||||
|
||||
let testCases = [
|
||||
{
|
||||
url: "about:blank",
|
||||
other_origin: window.origin,
|
||||
name: '"about:blank" document is navigated back from history same-origin.',
|
||||
},
|
||||
{
|
||||
url: "about:blank",
|
||||
other_origin: "http://{{hosts[alt][]}}:{{ports[http][0]}}",
|
||||
name: '"about:blank" document is navigated back from history cross-origin.',
|
||||
},
|
||||
{
|
||||
url: blob_url,
|
||||
other_origin: window.origin,
|
||||
name: 'blob URL document is navigated back from history same-origin.',
|
||||
},
|
||||
{
|
||||
url: blob_url,
|
||||
other_origin: "http://{{hosts[alt][]}}:{{ports[http][0]}}",
|
||||
name: 'blob URL document is navigated back from history cross-origin.',
|
||||
},
|
||||
{
|
||||
url: `data:text/html,${html_test_payload}`,
|
||||
other_origin: window.origin,
|
||||
name: 'data URL document is navigated back from history same-origin.',
|
||||
},
|
||||
{
|
||||
url: `data:text/html,${html_test_payload}`,
|
||||
other_origin: "http://{{hosts[alt][]}}:{{ports[http][0]}}",
|
||||
name: 'data URL document is navigated back from history cross-origin.',
|
||||
},
|
||||
{
|
||||
srcdoc: `${html_test_payload}`,
|
||||
other_origin: window.origin,
|
||||
name: 'srcdoc iframe is navigated back from history same-origin.',
|
||||
},
|
||||
{
|
||||
srcdoc: `${html_test_payload}`,
|
||||
other_origin: "http://{{hosts[alt][]}}:{{ports[http][0]}}",
|
||||
name: 'srcdoc iframe is navigated back from history cross-origin.',
|
||||
},
|
||||
];
|
||||
|
||||
testCases.forEach(testCase => {
|
||||
promise_test(async t => {
|
||||
// Create an iframe.
|
||||
let iframe = document.createElement('iframe');
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
// Perform a real navigation in the iframe. This is needed because the
|
||||
// initial empty document is not stored in history (so there is no way of
|
||||
// navigating back to it and test history inheritance).
|
||||
let loaded_1 = message_from(iframe.contentWindow);
|
||||
iframe.contentWindow.location = testCase.other_origin + "/content-security-policy/inheritance/support/postmessage-top.html";
|
||||
assert_equals(await loaded_1, "ready",
|
||||
"Could not navigate iframe.");
|
||||
|
||||
// Navigate to the local scheme document.
|
||||
let message = message_from(iframe.contentWindow);
|
||||
if (testCase.url)
|
||||
iframe.contentWindow.location = testCase.url;
|
||||
else
|
||||
iframe.srcdoc = testCase.srcdoc;
|
||||
|
||||
// If the local scheme document is "about:blank", we need to write its
|
||||
// content now.
|
||||
if (testCase.url === "about:blank")
|
||||
await write_img_to_about_blank(t, iframe);
|
||||
|
||||
// Check that the local scheme document inherits CSP from the initiator.
|
||||
assert_equals(await message, "img blocked",
|
||||
"Image should be blocked by CSP inherited from navigation initiator.");
|
||||
|
||||
// Navigate to another page, which will navigate back.
|
||||
let loaded_2 = message_from(iframe.contentWindow, "ready");
|
||||
let message_2 = message_from(iframe.contentWindow, "img");
|
||||
iframe.contentWindow.location = testCase.other_origin + "/content-security-policy/inheritance/support/message-top-and-navigate-back.html";
|
||||
assert_equals(await loaded_2, "ready",
|
||||
"Could not navigate iframe.");
|
||||
|
||||
// If the local scheme document is "about:blank", we need to write its
|
||||
// content again.
|
||||
if (testCase.url === "about:blank")
|
||||
await write_img_to_about_blank(t, iframe);
|
||||
|
||||
// Check that the local scheme document reloaded from history still has
|
||||
// the original CSPs.
|
||||
assert_equals(await message_2, "img blocked",
|
||||
"Image should be blocked by CSP reloaded from history.");
|
||||
}, "History navigation in iframe: " + testCase.name);
|
||||
});
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,138 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<meta http-equiv="Content-Security-Policy" content="img-src 'none'">
|
||||
|
||||
<script>
|
||||
let message_from = (w, starts_with) => {
|
||||
return new Promise(resolve => {
|
||||
window.addEventListener('message', msg => {
|
||||
if (msg.source == w) {
|
||||
if (!starts_with || msg.data.startsWith(starts_with))
|
||||
resolve(msg.data);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const function_messageBack_string = `
|
||||
function messageBack(msg) {
|
||||
opener.postMessage(msg ,"*");
|
||||
}
|
||||
`;
|
||||
|
||||
const img_url = window.origin + "/content-security-policy/support/fail.png";
|
||||
const img_tag_string = `
|
||||
<img src="${img_url}"
|
||||
onload="messageBack('img loaded');"
|
||||
onerror="messageBack('img blocked');"
|
||||
>
|
||||
`;
|
||||
|
||||
let write_img_to_popup = (popup) => {
|
||||
let script = popup.document.createElement('script');
|
||||
script.innerText = function_messageBack_string;
|
||||
popup.document.head.appendChild(script);
|
||||
let div = popup.document.createElement('div');
|
||||
div.innerHTML = img_tag_string;
|
||||
popup.document.body.appendChild(div);
|
||||
};
|
||||
|
||||
const blob_payload = `
|
||||
<!doctype html>
|
||||
<script>${function_messageBack_string}</scr`+`ipt>
|
||||
<div>${img_tag_string}</div>
|
||||
`;
|
||||
let blob_url = URL.createObjectURL(
|
||||
new Blob([blob_payload], { type: 'text/html' }));
|
||||
|
||||
let testCases = [
|
||||
{
|
||||
url: "about:blank",
|
||||
add_img_function: write_img_to_popup,
|
||||
other_origin: window.origin,
|
||||
name: '"about:blank" document is navigated back from history same-origin.',
|
||||
},
|
||||
{
|
||||
url: "about:blank",
|
||||
add_img_function: write_img_to_popup,
|
||||
other_origin: "http://{{hosts[alt][]}}:{{ports[http][0]}}",
|
||||
name: '"about:blank" document is navigated back from history cross-origin.',
|
||||
},
|
||||
{
|
||||
url: blob_url,
|
||||
add_img_function: () => {},
|
||||
other_origin: window.origin,
|
||||
name: 'blob URL document is navigated back from history same-origin.',
|
||||
},
|
||||
{
|
||||
url: blob_url,
|
||||
add_img_function: () => {},
|
||||
other_origin: "http://{{hosts[alt][]}}:{{ports[http][0]}}",
|
||||
name: 'blob URL document is navigated back from history cross-origin.',
|
||||
},
|
||||
];
|
||||
|
||||
let async_promise_test = (promise, description) => {
|
||||
async_test(test => {
|
||||
promise(test)
|
||||
.then(() => {test.done();})
|
||||
.catch(test.step_func(error => { throw error; }));
|
||||
}, description);
|
||||
};
|
||||
|
||||
testCases.forEach(testCase => {
|
||||
async_promise_test(async t => {
|
||||
// Create a popup.
|
||||
let popup = window.open();
|
||||
t.add_cleanup(popup.close);
|
||||
|
||||
// Perform a real navigation in the popup. This is needed because the
|
||||
// initial empty document is not stored in history (so there is no way of
|
||||
// navigating back to it and test history inheritance).
|
||||
let loaded_1 = message_from(popup);
|
||||
popup.location = testCase.other_origin + "/content-security-policy/inheritance/support/postmessage-opener.html";
|
||||
assert_equals(await loaded_1, "ready",
|
||||
"Could not open and navigate popup.");
|
||||
|
||||
// Navigate to the local scheme document. We need to wait for the
|
||||
// navigation to succeed.
|
||||
let wait = () => t.step_wait(
|
||||
condition = () => {
|
||||
try {
|
||||
return popup.location.href == testCase.url;
|
||||
} catch {}
|
||||
return false;
|
||||
},
|
||||
description = "Wait for the popup to navigate.",
|
||||
timeout=3000,
|
||||
interval=50);
|
||||
|
||||
let message = message_from(popup);
|
||||
popup.location = testCase.url;
|
||||
await wait();
|
||||
|
||||
testCase.add_img_function(popup);
|
||||
// Check that the local scheme document inherits CSP from the initiator.
|
||||
assert_equals(await message, "img blocked",
|
||||
"Image should be blocked by CSP inherited from navigation initiator.");
|
||||
|
||||
let loaded_2 = message_from(popup, "ready");
|
||||
let message_2 = message_from(popup, "img");
|
||||
// Navigate to another page, which will navigate back.
|
||||
popup.location = testCase.other_origin + "/content-security-policy/inheritance/support/message-opener-and-navigate-back.html";
|
||||
assert_equals(await loaded_2, "ready",
|
||||
"Could not navigate popup.");
|
||||
|
||||
// We need to wait for the history navigation to be performed.
|
||||
await wait();
|
||||
|
||||
// Check that the "about:blank" document reloaded from history has the
|
||||
// original CSPs.
|
||||
testCase.add_img_function(popup);
|
||||
assert_equals(await message_2, "img blocked",
|
||||
"Image should be blocked by CSP reloaded from history.");
|
||||
}, "History navigation: " + testCase.name);
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,120 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<meta http-equiv="Content-Security-Policy" content="img-src 'none'">
|
||||
<body>
|
||||
<script>
|
||||
let message_from = (w, starts_with) => {
|
||||
return new Promise(resolve => {
|
||||
window.addEventListener('message', msg => {
|
||||
if (msg.source == w) {
|
||||
if (!starts_with || msg.data.startsWith(starts_with))
|
||||
resolve(msg.data);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const img_url = window.origin + "/content-security-policy/support/fail.png";
|
||||
const img_tag_string = `
|
||||
<img src="${img_url}"
|
||||
onload="top.postMessage('img loaded', '*');"
|
||||
onerror="top.postMessage('img blocked', '*');"
|
||||
>
|
||||
`;
|
||||
|
||||
const html_test_payload = `
|
||||
<!doctype html>
|
||||
<div>${img_tag_string}</div>
|
||||
`;
|
||||
let blob_url = URL.createObjectURL(
|
||||
new Blob([html_test_payload], { type: 'text/html' }));
|
||||
|
||||
let write_img_to_iframe = (iframe) => {
|
||||
let div = iframe.contentDocument.createElement('div');
|
||||
div.innerHTML = img_tag_string;
|
||||
iframe.contentDocument.body.appendChild(div);
|
||||
};
|
||||
|
||||
|
||||
// Test location.reload() for "about:blank".
|
||||
promise_test(async t => {
|
||||
// Create an empty iframe.
|
||||
window.iframe = document.createElement('iframe');
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
// Add an img.
|
||||
let message = message_from(iframe.contentWindow);
|
||||
write_img_to_iframe(iframe);
|
||||
|
||||
// Check that the empty document inherits CSP from the initiator.
|
||||
assert_equals(await message, "img blocked",
|
||||
"Image should be blocked by CSP inherited from the parent.");
|
||||
|
||||
// Now perform a reload.
|
||||
let message_2 = message_from(iframe.contentWindow);
|
||||
let loaded = new Promise(resolve => iframe.onload = resolve);
|
||||
iframe.contentWindow.location.reload();
|
||||
await loaded;
|
||||
|
||||
// Add an img.
|
||||
write_img_to_iframe(iframe);
|
||||
|
||||
// Check that the empty document still has the right CSP after reload.
|
||||
assert_equals(await message_2, "img blocked",
|
||||
"Image should be blocked by CSP after reload.");
|
||||
}, "location.reload() of empty iframe.");
|
||||
|
||||
|
||||
// Test location.reload() for a blob URL.
|
||||
promise_test(async t => {
|
||||
// Create an iframe.
|
||||
window.iframe = document.createElement('iframe');
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
// Navigate to the blob URL.
|
||||
let message = message_from(iframe.contentWindow);
|
||||
iframe.contentWindow.location = blob_url;
|
||||
|
||||
// Check that the blob URL inherits CSP from the initiator.
|
||||
assert_equals(await message, "img blocked",
|
||||
"Image should be blocked by CSP inherited from navigation initiator.");
|
||||
|
||||
// Now perform a reload.
|
||||
let message_2 = message_from(iframe.contentWindow);
|
||||
let loaded = new Promise(resolve => iframe.onload = resolve);
|
||||
iframe.contentWindow.location.reload();
|
||||
await loaded;
|
||||
|
||||
// Check that the blob URL document still has the right CSP after reload.
|
||||
assert_equals(await message_2, "img blocked",
|
||||
"Image should be blocked by CSP after reload.");
|
||||
}, "location.reload() of blob URL iframe.");
|
||||
|
||||
|
||||
// Test location.reload() for a srcdoc iframe.
|
||||
promise_test(async t => {
|
||||
// Create a srcdoc iframe.
|
||||
window.iframe = document.createElement('iframe');
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
let message = message_from(iframe.contentWindow);
|
||||
iframe.srcdoc = `${html_test_payload}`;
|
||||
|
||||
// Check that the srcdoc iframe inherits from the parent.
|
||||
assert_equals(await message, "img blocked",
|
||||
"Image should be blocked by CSP inherited from navigation initiator.");
|
||||
|
||||
// Now perform a reload.
|
||||
let message_2 = message_from(iframe.contentWindow);
|
||||
let loaded = new Promise(resolve => iframe.onload = resolve);
|
||||
iframe.contentWindow.location.reload();
|
||||
await loaded;
|
||||
|
||||
// Check that the srcdoc iframe still has the right CSP after reload.
|
||||
assert_equals(await message_2, "img blocked",
|
||||
"Image should be blocked by CSP after reload.");
|
||||
}, "location.reload() of srcdoc iframe.");
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,4 @@
|
|||
<script>
|
||||
opener.postMessage("ready", "*");
|
||||
window.history.back();
|
||||
</script>
|
|
@ -0,0 +1,4 @@
|
|||
<script>
|
||||
top.postMessage("ready", "*");
|
||||
window.history.back();
|
||||
</script>
|
|
@ -1,4 +1,3 @@
|
|||
<!DOCTYPE html>
|
||||
<script>
|
||||
opener.postMessage("ready", "*");
|
||||
</script>
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<!DOCTYPE html>
|
||||
<div style="width: 100px; height: 100px; position: relative; top: 100px; left: 100px;
|
||||
background: green"></div>
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Transform animation on SVG element with zoom</title>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-animations-1/">
|
||||
<link rel="match" href="svg-transform-animation-ref.html">
|
||||
<style>
|
||||
@keyframes transform {
|
||||
from {transform: translate(100px, 100px)}
|
||||
to {transform: translate(100px, 100px)}
|
||||
}
|
||||
</style>
|
||||
<svg width="200" height="200">
|
||||
<rect x="100" y="100" width="100" height="100" fill="red"/>
|
||||
<rect style="animation: transform 2s infinite" x="0" y="0" width="100" height="100" fill="green"/>
|
||||
</svg>
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
#multicol {
|
||||
columns: 2;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
column-fill: auto;
|
||||
column-gap: 0px;
|
||||
background-color: red;
|
||||
}
|
||||
.rel {
|
||||
height: 100px;
|
||||
position: relative;
|
||||
}
|
||||
.abs {
|
||||
position: absolute;
|
||||
width: 50px;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div id="multicol">
|
||||
<div class="rel">
|
||||
<div class="abs" style="top: 0px; height: 160px;"></div>
|
||||
<div class="abs" style="top: 100px; height: 20px;"></div>
|
||||
</div>
|
||||
<div style="column-span:all; height: 20px; background: green;"></div>
|
||||
<div style="height: 60px;"></div>
|
||||
</div>
|
|
@ -0,0 +1,40 @@
|
|||
<!DOCTYPE html>
|
||||
<title>
|
||||
Nested fragmentation for out-of-flow positioned elements create new columns.
|
||||
</title>
|
||||
<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
.multicol {
|
||||
column-count: 2;
|
||||
column-fill: auto;
|
||||
column-gap: 0px;
|
||||
background-color: red;
|
||||
}
|
||||
#outer {
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
#inner {
|
||||
width: 50px;
|
||||
}
|
||||
.rel {
|
||||
position: relative;
|
||||
}
|
||||
.abs {
|
||||
position: absolute;
|
||||
height: 400px;
|
||||
width: 25px;
|
||||
top: 800px;
|
||||
left: -200px;
|
||||
background-color: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="multicol" id="outer">
|
||||
<div class="multicol" id="inner">
|
||||
<div class="rel">
|
||||
<div class="abs"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue