diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 6f32780a790..1bf2b917a9d 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -3290,6 +3290,13 @@ rooted!(in(*cx) let mut prototype_proto = ptr::null_mut::()); %s; assert!(!prototype_proto.is_null());""" % getPrototypeProto)] + if self.descriptor.hasNamedPropertiesObject(): + assert not self.haveUnscopables + code.append(CGGeneric("""\ +rooted!(in(*cx) let mut prototype_proto_proto = prototype_proto.get()); +dom::types::%s::create_named_properties_object(cx, prototype_proto_proto.handle(), prototype_proto.handle_mut()); +assert!(!prototype_proto.is_null());""" % name)) + properties = { "id": name, "unscopables": "unscopable_names" if self.haveUnscopables else "&[]", @@ -5508,15 +5515,15 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): attrs += " | JSPROP_READONLY" fillDescriptor = ("set_property_descriptor(\n" " MutableHandle::from_raw(desc),\n" - " result_root.handle(),\n" + " rval.handle(),\n" " (%s) as u32,\n" " &mut *is_none\n" ");\n" "return true;" % attrs) templateValues = { - 'jsvalRef': 'result_root.handle_mut()', + 'jsvalRef': 'rval.handle_mut()', 'successCode': fillDescriptor, - 'pre': 'rooted!(in(*cx) let mut result_root = UndefinedValue());' + 'pre': 'rooted!(in(*cx) let mut rval = UndefinedValue());' } get += ("if let Some(index) = index {\n" + " let this = UnwrapProxy(proxy);\n" @@ -5524,8 +5531,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): + CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define() + "\n" + "}\n") - namedGetter = self.descriptor.operations['NamedGetter'] - if namedGetter: + if self.descriptor.supportsNamedProperties(): attrs = [] if not self.descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties"): attrs.append("JSPROP_ENUMERATE") @@ -5537,15 +5543,15 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): attrs = "0" fillDescriptor = ("set_property_descriptor(\n" " MutableHandle::from_raw(desc),\n" - " result_root.handle(),\n" + " rval.handle(),\n" " (%s) as u32,\n" " &mut *is_none\n" ");\n" "return true;" % attrs) templateValues = { - 'jsvalRef': 'result_root.handle_mut()', + 'jsvalRef': 'rval.handle_mut()', 'successCode': fillDescriptor, - 'pre': 'rooted!(in(*cx) let mut result_root = UndefinedValue());' + 'pre': 'rooted!(in(*cx) let mut rval = UndefinedValue());' } # See the similar-looking in CGDOMJSProxyHandler_get for the spec quote. @@ -5638,7 +5644,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): + CGIndenter(CGProxyNamedSetter(self.descriptor)).define() + " return (*opresult).succeed();\n" + "}\n") - elif self.descriptor.operations['NamedGetter']: + elif self.descriptor.supportsNamedProperties(): set += ("if id.is_string() || id.is_int() {\n" + CGIndenter(CGProxyNamedGetter(self.descriptor)).define() + " if result.is_some() {\n" @@ -5722,7 +5728,7 @@ class CGDOMJSProxyHandler_ownPropertyKeys(CGAbstractExternMethod): } """) - if self.descriptor.operations['NamedGetter']: + if self.descriptor.supportsNamedProperties(): body += dedent( """ for name in (*unwrapped_proxy).SupportedPropertyNames() { @@ -5844,11 +5850,10 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod): + " return true;\n" + "}\n\n") - namedGetter = self.descriptor.operations['NamedGetter'] condition = "id.is_string() || id.is_int()" if indexedGetter: condition = "index.is_none() && (%s)" % condition - if namedGetter: + if self.descriptor.supportsNamedProperties(): named = """\ if %s { let mut has_on_proto = false; @@ -5943,8 +5948,7 @@ if !expando.is_null() { else: getIndexedOrExpando = getFromExpando + "\n" - namedGetter = self.descriptor.operations['NamedGetter'] - if namedGetter: + if self.descriptor.supportsNamedProperties(): condition = "id.is_string() || id.is_int()" # From step 1: # If O supports indexed properties and P is an array index, then: @@ -6214,7 +6218,7 @@ class CGInterfaceTrait(CGThing): ), rettype) - if descriptor.proxy: + if descriptor.proxy or descriptor.isGlobal(): for name, operation in descriptor.operations.items(): if not operation or operation.isStringifier(): continue diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index fb360a020aa..bd455f5288e 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -280,7 +280,8 @@ class Descriptor(DescriptorProvider): continue def addIndexedOrNamedOperation(operation, m): - self.proxy = True + if not self.isGlobal(): + self.proxy = True if m.isIndexed(): operation = 'Indexed' + operation else: @@ -369,6 +370,15 @@ class Descriptor(DescriptorProvider): def internalNameFor(self, name): return self._internalNames.get(name, name) + def hasNamedPropertiesObject(self): + if self.interface.isExternal(): + return False + + return self.isGlobal() and self.supportsNamedProperties() + + def supportsNamedProperties(self): + return self.operations['NamedGetter'] is not None + def getExtendedAttributes(self, member, getter=False, setter=False): def maybeAppendInfallibleToAttrs(attrs, throws): if throws is None: diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 28b820f8919..d8a01e68b4d 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -464,12 +464,6 @@ impl CollectionFilter for AnchorsFilter { } } -enum ElementLookupResult { - None, - One(DomRoot), - Many, -} - #[allow(non_snake_case)] impl Document { pub fn note_node_with_dirty_descendants(&self, node: &Node) { @@ -2870,73 +2864,12 @@ impl Document { .for_each(|(_, context)| context.send_swap_chain_present()); } - // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:supported-property-names - // (This takes the filter as a method so the window named getter can use it too) - pub fn supported_property_names_impl( - &self, - nameditem_filter: fn(&Node, &Atom) -> bool, - ) -> Vec { - // The tricky part here is making sure we return the names in - // tree order, without just resorting to a full tree walkthrough. + pub fn id_map(&self) -> Ref>>> { + self.id_map.borrow() + } - let mut first_elements_with_name: HashMap<&Atom, &Dom> = HashMap::new(); - - // Get the first-in-tree-order element for each name in the name_map - let name_map = self.name_map.borrow(); - name_map.iter().for_each(|(name, value)| { - if let Some(first) = value - .iter() - .find(|n| nameditem_filter((***n).upcast::(), &name)) - { - first_elements_with_name.insert(name, first); - } - }); - - // Get the first-in-tree-order element for each name in the id_map; - // if we already had one from the name_map, figure out which of - // the two is first. - let id_map = self.id_map.borrow(); - id_map.iter().for_each(|(name, value)| { - if let Some(first) = value - .iter() - .find(|n| nameditem_filter((***n).upcast::(), &name)) - { - match first_elements_with_name.get(&name) { - None => { - first_elements_with_name.insert(name, first); - }, - Some(el) => { - if *el != first && first.upcast::().is_before(el.upcast::()) { - first_elements_with_name.insert(name, first); - } - }, - } - } - }); - - // first_elements_with_name now has our supported property names - // as keys, and the elements to order on as values. - let mut sortable_vec: Vec<(&Atom, &Dom)> = first_elements_with_name - .iter() - .map(|(k, v)| (*k, *v)) - .collect(); - sortable_vec.sort_unstable_by(|a, b| { - if a.1 == b.1 { - // This can happen if an img has an id different from its name, - // spec does not say which string to put first. - a.0.cmp(&b.0) - } else if a.1.upcast::().is_before(b.1.upcast::()) { - Ordering::Less - } else { - Ordering::Greater - } - }); - - // And now that they're sorted, we can return the keys - sortable_vec - .iter() - .map(|(k, _v)| DOMString::from(&***k)) - .collect() + pub fn name_map(&self) -> Ref>>> { + self.name_map.borrow() } } @@ -3869,79 +3802,16 @@ impl Document { ) } - // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:determine-the-value-of-a-named-property - // Support method for steps 1-3: - // Count if there are 0, 1, or >1 elements that match the name. - // (This takes the filter as a method so the window named getter can use it too) - fn look_up_named_elements( - &self, - name: &Atom, - nameditem_filter: fn(&Node, &Atom) -> bool, - ) -> ElementLookupResult { - // We might match because of either id==name or name==name, so there - // are two sets of nodes to look through, but we don't need a - // full tree traversal. - let id_map = self.id_map.borrow(); - let name_map = self.name_map.borrow(); - let id_vec = id_map.get(&name); - let name_vec = name_map.get(&name); + pub fn get_elements_with_id(&self, id: &Atom) -> Ref<[Dom]> { + Ref::map(self.id_map.borrow(), |map| { + map.get(id).map(|vec| &**vec).unwrap_or_default() + }) + } - // If nothing can possibly have the name, exit fast - if id_vec.is_none() && name_vec.is_none() { - return ElementLookupResult::None; - } - - let one_from_id_map = if let Some(id_vec) = id_vec { - let mut elements = id_vec - .iter() - .filter(|n| nameditem_filter((***n).upcast::(), &name)) - .peekable(); - if let Some(first) = elements.next() { - if elements.peek().is_none() { - Some(first) - } else { - return ElementLookupResult::Many; - } - } else { - None - } - } else { - None - }; - - let one_from_name_map = if let Some(name_vec) = name_vec { - let mut elements = name_vec - .iter() - .filter(|n| nameditem_filter((***n).upcast::(), &name)) - .peekable(); - if let Some(first) = elements.next() { - if elements.peek().is_none() { - Some(first) - } else { - return ElementLookupResult::Many; - } - } else { - None - } - } else { - None - }; - - // We now have two elements, or one element, or the same - // element twice, or no elements. - match (one_from_id_map, one_from_name_map) { - (Some(one), None) | (None, Some(one)) => { - ElementLookupResult::One(DomRoot::from_ref(&one)) - }, - (Some(one), Some(other)) => { - if one == other { - ElementLookupResult::One(DomRoot::from_ref(&one)) - } else { - ElementLookupResult::Many - } - }, - (None, None) => ElementLookupResult::None, - } + pub fn get_elements_with_name(&self, name: &Atom) -> Ref<[Dom]> { + Ref::map(self.name_map.borrow(), |map| { + map.get(name).map(|vec| &**vec).unwrap_or_default() + }) } #[allow(unrooted_must_root)] @@ -4871,45 +4741,76 @@ impl DocumentMethods for Document { #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:dom-document-nameditem-filter fn NamedGetter(&self, _cx: JSContext, name: DOMString) -> Option> { - #[derive(JSTraceable, MallocSizeOf)] - struct NamedElementFilter { - name: Atom, + if name.is_empty() { + return None; } - impl CollectionFilter for NamedElementFilter { - fn filter(&self, elem: &Element, _root: &Node) -> bool { - elem.upcast::().is_document_named_item(&self.name) + let name = Atom::from(name); + + // Step 1. + let elements_with_name = self.get_elements_with_name(&name); + let name_iter = elements_with_name + .iter() + .filter(|elem| is_named_element_with_name_attribute(elem)); + let elements_with_id = self.get_elements_with_id(&name); + let id_iter = elements_with_id + .iter() + .filter(|elem| is_named_element_with_id_attribute(elem)); + let mut elements = name_iter.chain(id_iter); + + let first = elements.next()?; + + if elements.next().is_none() { + // Step 2. + if let Some(nested_window_proxy) = first + .downcast::() + .and_then(|iframe| iframe.GetContentWindow()) + { + unsafe { + return Some(NonNull::new_unchecked( + nested_window_proxy.reflector().get_jsobject().get(), + )); + } + } + + // Step 3. + unsafe { + return Some(NonNull::new_unchecked( + first.reflector().get_jsobject().get(), + )); } } - let name = Atom::from(name); - - match self.look_up_named_elements(&name, Node::is_document_named_item) { - ElementLookupResult::None => { - return None; - }, - ElementLookupResult::One(element) => { - if let Some(nested_proxy) = element - .downcast::() - .and_then(|iframe| iframe.GetContentWindow()) - { - unsafe { - return Some(NonNull::new_unchecked( - nested_proxy.reflector().get_jsobject().get(), - )); - } - } - unsafe { - return Some(NonNull::new_unchecked( - element.reflector().get_jsobject().get(), - )); - } - }, - ElementLookupResult::Many => {}, - }; - // Step 4. - let filter = NamedElementFilter { name: name }; - let collection = HTMLCollection::create(self.window(), self.upcast(), Box::new(filter)); + #[derive(JSTraceable, MallocSizeOf)] + struct DocumentNamedGetter { + name: Atom, + } + impl CollectionFilter for DocumentNamedGetter { + fn filter(&self, elem: &Element, _root: &Node) -> bool { + let type_ = match elem.upcast::().type_id() { + NodeTypeId::Element(ElementTypeId::HTMLElement(type_)) => type_, + _ => return false, + }; + match type_ { + HTMLElementTypeId::HTMLFormElement | HTMLElementTypeId::HTMLIFrameElement => { + elem.get_name().as_ref() == Some(&self.name) + }, + HTMLElementTypeId::HTMLImageElement => elem.get_name().map_or(false, |name| { + name == *self.name || + !name.is_empty() && elem.get_id().as_ref() == Some(&self.name) + }), + // TODO handle and ; these depend on whether the element is + // “exposed”, a concept that doesn’t fully make sense until embed/object + // behaviour is actually implemented + _ => false, + } + } + } + let collection = HTMLCollection::create( + self.window(), + self.upcast(), + Box::new(DocumentNamedGetter { name }), + ); unsafe { Some(NonNull::new_unchecked( collection.reflector().get_jsobject().get(), @@ -4919,7 +4820,61 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:supported-property-names fn SupportedPropertyNames(&self) -> Vec { - self.supported_property_names_impl(Node::is_document_named_item) + let mut names_with_first_named_element_map: HashMap<&Atom, &Element> = HashMap::new(); + + let name_map = self.name_map.borrow(); + for (name, elements) in &*name_map { + if name.is_empty() { + continue; + } + let mut name_iter = elements + .iter() + .filter(|elem| is_named_element_with_name_attribute(elem)); + if let Some(first) = name_iter.next() { + names_with_first_named_element_map.insert(name, first); + } + } + let id_map = self.id_map.borrow(); + for (id, elements) in &*id_map { + if id.is_empty() { + continue; + } + let mut id_iter = elements + .iter() + .filter(|elem| is_named_element_with_id_attribute(elem)); + if let Some(first) = id_iter.next() { + match names_with_first_named_element_map.entry(id) { + Vacant(entry) => drop(entry.insert(first)), + Occupied(mut entry) => { + if first.upcast::().is_before(entry.get().upcast()) { + *entry.get_mut() = first; + } + }, + } + } + } + + let mut names_with_first_named_element_vec: Vec<(&Atom, &Element)> = + names_with_first_named_element_map + .iter() + .map(|(k, v)| (*k, *v)) + .collect(); + names_with_first_named_element_vec.sort_unstable_by(|a, b| { + if a.1 == b.1 { + // This can happen if an img has an id different from its name, + // spec does not say which string to put first. + a.0.cmp(&b.0) + } else if a.1.upcast::().is_before(b.1.upcast::()) { + Ordering::Less + } else { + Ordering::Greater + } + }); + + names_with_first_named_element_vec + .iter() + .map(|(k, _v)| DOMString::from(&***k)) + .collect() } // https://html.spec.whatwg.org/multipage/#dom-document-clear @@ -5394,3 +5349,26 @@ pub enum ReflowTriggerCondition { PendingRestyles, PaintPostponed, } + +fn is_named_element_with_name_attribute(elem: &Element) -> bool { + let type_ = match elem.upcast::().type_id() { + NodeTypeId::Element(ElementTypeId::HTMLElement(type_)) => type_, + _ => return false, + }; + match type_ { + HTMLElementTypeId::HTMLFormElement | + HTMLElementTypeId::HTMLIFrameElement | + HTMLElementTypeId::HTMLImageElement => true, + // TODO handle and ; these depend on whether the element is + // “exposed”, a concept that doesn’t fully make sense until embed/object + // behaviour is actually implemented + _ => false, + } +} + +fn is_named_element_with_id_attribute(elem: &Element) -> bool { + // TODO handle and ; these depend on whether the element is + // “exposed”, a concept that doesn’t fully make sense until embed/object + // behaviour is actually implemented + elem.is::() && elem.get_name().map_or(false, |name| !name.is_empty()) +} diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 7f8a0b87bcc..fe5caa5fbda 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -82,7 +82,6 @@ use script_traits::UntrustedNodeAddress; use selectors::matching::{matches_selector_list, MatchingContext, MatchingMode}; use selectors::parser::SelectorList; use servo_arc::Arc; -use servo_atoms::Atom; use servo_url::ServoUrl; use smallvec::SmallVec; use std::borrow::Cow; @@ -1242,34 +1241,6 @@ impl Node { } } - // https://html.spec.whatwg.org/multipage/#dom-document-nameditem-filter - pub fn is_document_named_item(&self, name: &Atom) -> bool { - let html_elem_type = match self.type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(type_)) => type_, - _ => return false, - }; - let elem = self - .downcast::() - .expect("Node with an Element::HTMLElement NodeTypeID must be an Element"); - match html_elem_type { - HTMLElementTypeId::HTMLFormElement | HTMLElementTypeId::HTMLIFrameElement => { - elem.get_name().map_or(false, |n| n == *name) - }, - HTMLElementTypeId::HTMLImageElement => - // Images can match by id, but only when their name is non-empty. - { - elem.get_name().map_or(false, |n| { - n == *name || elem.get_id().map_or(false, |i| i == *name) - }) - }, - // TODO: Handle and ; these depend on - // whether the element is "exposed", a concept which - // doesn't fully make sense until embed/object behaviors - // are actually implemented. - _ => false, - } - } - pub fn is_styled(&self) -> bool { self.style_and_layout_data.borrow().is_some() } diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl index 64855d42860..901af062903 100644 --- a/components/script/dom/webidls/Window.webidl +++ b/components/script/dom/webidls/Window.webidl @@ -45,8 +45,7 @@ optional DOMString features = ""); //getter WindowProxy (unsigned long index); - // https://github.com/servo/servo/issues/14453 - // getter object (DOMString name); + getter object (DOMString name); // the user agent readonly attribute Navigator navigator; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 7e36c8086fb..38465a4af06 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -6,6 +6,7 @@ use crate::dom::bindings::cell::{DomRefCell, Ref}; use crate::dom::bindings::codegen::Bindings::DocumentBinding::{ DocumentMethods, DocumentReadyState, }; +use crate::dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementMethods; use crate::dom::bindings::codegen::Bindings::HistoryBinding::HistoryBinding::HistoryMethods; use crate::dom::bindings::codegen::Bindings::ImageBitmapBinding::{ ImageBitmapOptions, ImageBitmapSource, @@ -19,7 +20,7 @@ use crate::dom::bindings::codegen::Bindings::WindowBinding::{ use crate::dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions}; use crate::dom::bindings::codegen::UnionTypes::{RequestOrUSVString, StringOrFunction}; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; -use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; use crate::dom::bindings::num::Finite; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; @@ -40,6 +41,8 @@ use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; use crate::dom::hashchangeevent::HashChangeEvent; use crate::dom::history::History; +use crate::dom::htmlcollection::{CollectionFilter, HTMLCollection}; +use crate::dom::htmliframeelement::HTMLIFrameElement; use crate::dom::identityhub::Identities; use crate::dom::location::Location; use crate::dom::mediaquerylist::{MediaQueryList, MediaQueryListMatchState}; @@ -71,6 +74,7 @@ use crate::task_manager::TaskManager; use crate::task_source::{TaskSource, TaskSourceName}; use crate::timers::{IsInterval, TimerCallback}; use crate::webdriver_handlers::jsval_to_webdriver; +use crate::window_named_properties; use app_units::Au; use backtrace::Backtrace; use base64; @@ -94,7 +98,9 @@ use js::jsapi::{GCReason, StackFormat, JS_GC}; use js::jsval::UndefinedValue; use js::jsval::{JSVal, NullValue}; use js::rust::wrappers::JS_DefineProperty; -use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleValue}; +use js::rust::{ + CustomAutoRooter, CustomAutoRooterGuard, HandleObject, HandleValue, MutableHandleObject, +}; use media::WindowGLContext; use msg::constellation_msg::{BrowsingContextId, PipelineId}; use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse}; @@ -120,17 +126,20 @@ use script_traits::{ use script_traits::{TimerSchedulerMsg, WebrenderIpcSender, WindowSizeData, WindowSizeType}; use selectors::attr::CaseSensitivity; use servo_arc::Arc as ServoArc; +use servo_atoms::Atom; use servo_geometry::{f32_rect_to_au_rect, MaxRect}; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; use std::borrow::Cow; use std::borrow::ToOwned; use std::cell::Cell; +use std::cmp; use std::collections::hash_map::Entry; use std::collections::{HashMap, HashSet}; use std::default::Default; use std::env; use std::io::{stderr, stdout, Write}; use std::mem; +use std::ptr::NonNull; use std::rc::Rc; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; @@ -1386,9 +1395,179 @@ impl WindowMethods for Window { fn IsSecureContext(&self) -> bool { self.upcast::().is_secure_context() } + + // https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object + #[allow(unsafe_code)] + fn NamedGetter(&self, _cx: JSContext, name: DOMString) -> Option> { + if name.is_empty() { + return None; + } + let document = self.Document(); + + // https://html.spec.whatwg.org/multipage/#document-tree-child-browsing-context-name-property-set + let iframes: Vec<_> = document + .iter_iframes() + .filter(|iframe| { + if let Some(window) = iframe.GetContentWindow() { + return window.get_name() == name; + } + false + }) + .collect(); + + let iframe_iter = iframes.iter().map(|iframe| iframe.upcast::()); + + let name = Atom::from(&*name); + + // Step 1. + let elements_with_name = document.get_elements_with_name(&name); + let name_iter = elements_with_name + .iter() + .map(|element| &**element) + .filter(|elem| is_named_element_with_name_attribute(elem)); + let elements_with_id = document.get_elements_with_id(&name); + let id_iter = elements_with_id + .iter() + .map(|element| &**element) + .filter(|elem| is_named_element_with_id_attribute(elem)); + + // Step 2. + for elem in iframe_iter.clone() { + if let Some(nested_window_proxy) = elem + .downcast::() + .and_then(|iframe| iframe.GetContentWindow()) + { + unsafe { + return Some(NonNull::new_unchecked( + nested_window_proxy.reflector().get_jsobject().get(), + )); + } + } + } + + let mut elements = iframe_iter.chain(name_iter).chain(id_iter); + + let first = elements.next()?; + + if elements.next().is_none() { + // Step 3. + unsafe { + return Some(NonNull::new_unchecked( + first.reflector().get_jsobject().get(), + )); + } + } + + // Step 4. + #[derive(JSTraceable, MallocSizeOf)] + struct WindowNamedGetter { + name: Atom, + } + impl CollectionFilter for WindowNamedGetter { + fn filter(&self, elem: &Element, _root: &Node) -> bool { + let type_ = match elem.upcast::().type_id() { + NodeTypeId::Element(ElementTypeId::HTMLElement(type_)) => type_, + _ => return false, + }; + if elem.get_id().as_ref() == Some(&self.name) { + return true; + } + match type_ { + HTMLElementTypeId::HTMLEmbedElement | + HTMLElementTypeId::HTMLFormElement | + HTMLElementTypeId::HTMLImageElement | + HTMLElementTypeId::HTMLObjectElement => { + elem.get_name().as_ref() == Some(&self.name) + }, + _ => false, + } + } + } + let collection = HTMLCollection::create( + self, + document.upcast(), + Box::new(WindowNamedGetter { name }), + ); + unsafe { + Some(NonNull::new_unchecked( + collection.reflector().get_jsobject().get(), + )) + } + } + + // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:supported-property-names + fn SupportedPropertyNames(&self) -> Vec { + let mut names_with_first_named_element_map: HashMap<&Atom, &Element> = HashMap::new(); + + let document = self.Document(); + let name_map = document.name_map(); + for (name, elements) in &*name_map { + if name.is_empty() { + continue; + } + let mut name_iter = elements + .iter() + .filter(|elem| is_named_element_with_name_attribute(elem)); + if let Some(first) = name_iter.next() { + names_with_first_named_element_map.insert(name, first); + } + } + let id_map = document.id_map(); + for (id, elements) in &*id_map { + if id.is_empty() { + continue; + } + let mut id_iter = elements + .iter() + .filter(|elem| is_named_element_with_id_attribute(elem)); + if let Some(first) = id_iter.next() { + match names_with_first_named_element_map.entry(id) { + Entry::Vacant(entry) => drop(entry.insert(first)), + Entry::Occupied(mut entry) => { + if first.upcast::().is_before(entry.get().upcast()) { + *entry.get_mut() = first; + } + }, + } + } + } + + let mut names_with_first_named_element_vec: Vec<(&Atom, &Element)> = + names_with_first_named_element_map + .iter() + .map(|(k, v)| (*k, *v)) + .collect(); + names_with_first_named_element_vec.sort_unstable_by(|a, b| { + if a.1 == b.1 { + // This can happen if an img has an id different from its name, + // spec does not say which string to put first. + a.0.cmp(&b.0) + } else if a.1.upcast::().is_before(b.1.upcast::()) { + cmp::Ordering::Less + } else { + cmp::Ordering::Greater + } + }); + + names_with_first_named_element_vec + .iter() + .map(|(k, _v)| DOMString::from(&***k)) + .collect() + } } impl Window { + // https://heycam.github.io/webidl/#named-properties-object + // https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object + #[allow(unsafe_code)] + pub fn create_named_properties_object( + cx: JSContext, + proto: HandleObject, + object: MutableHandleObject, + ) { + window_named_properties::create(cx, proto, object) + } + pub(crate) fn set_current_event(&self, event: Option<&Event>) -> Option> { let current = self .current_event @@ -2659,3 +2838,21 @@ impl ParseErrorReporter for CSSErrorReporter { )); } } + +fn is_named_element_with_name_attribute(elem: &Element) -> bool { + let type_ = match elem.upcast::().type_id() { + NodeTypeId::Element(ElementTypeId::HTMLElement(type_)) => type_, + _ => return false, + }; + match type_ { + HTMLElementTypeId::HTMLEmbedElement | + HTMLElementTypeId::HTMLFormElement | + HTMLElementTypeId::HTMLImageElement | + HTMLElementTypeId::HTMLObjectElement => true, + _ => false, + } +} + +fn is_named_element_with_id_attribute(elem: &Element) -> bool { + elem.is_html_element() +} diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index d5cfbe02f72..35850f76092 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -910,7 +910,7 @@ unsafe extern "C" fn getOwnPropertyDescriptor( window.to_jsval(cx, val.handle_mut()); set_property_descriptor( MutableHandle::from_raw(desc), - val.handle().into(), + val.handle(), attrs, &mut *is_none, ); diff --git a/components/script/lib.rs b/components/script/lib.rs index 8f458557a7c..b34b1fb11ee 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -110,6 +110,8 @@ mod timers; mod unpremultiplytable; #[warn(deprecated)] mod webdriver_handlers; +#[warn(deprecated)] +mod window_named_properties; pub use init::init; pub use script_runtime::JSEngineSetup; diff --git a/components/script/window_named_properties.rs b/components/script/window_named_properties.rs new file mode 100644 index 00000000000..46cf61d7c2e --- /dev/null +++ b/components/script/window_named_properties.rs @@ -0,0 +1,260 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; +use crate::dom::bindings::proxyhandler::set_property_descriptor; +use crate::dom::bindings::root::Root; +use crate::dom::bindings::utils::has_property_on_prototype; +use crate::dom::globalscope::GlobalScope; +use crate::dom::window::Window; +use crate::js::conversions::ToJSValConvertible; +use crate::script_runtime::JSContext as SafeJSContext; +use js::conversions::jsstr_to_string; +use js::glue::{AppendToIdVector, CreateProxyHandler, NewProxyObject, ProxyTraps}; +use js::jsapi::{GetWellKnownSymbol, JS_SetImmutablePrototype, SymbolCode, JSPROP_READONLY}; +use js::jsapi::{ + Handle, HandleObject, JSClass, JSContext, JSErrNum, MutableHandleObject, UndefinedHandleValue, +}; +use js::jsapi::{ + HandleId, JSClass_NON_NATIVE, MutableHandle, MutableHandleIdVector, ObjectOpResult, + PropertyDescriptor, ProxyClassExtension, ProxyClassOps, ProxyObjectOps, + JSCLASS_DELAY_METADATA_BUILDER, JSCLASS_IS_PROXY, JSCLASS_RESERVED_SLOTS_MASK, + JSCLASS_RESERVED_SLOTS_SHIFT, +}; +use js::jsid::SymbolId; +use js::jsval::UndefinedValue; +use js::rust::IntoHandle; +use js::rust::{Handle as RustHandle, MutableHandle as RustMutableHandle}; +use js::rust::{HandleObject as RustHandleObject, MutableHandleObject as RustMutableHandleObject}; +use libc; +use std::ptr; + +struct SyncWrapper(*const libc::c_void); +#[allow(unsafe_code)] +unsafe impl Sync for SyncWrapper {} + +lazy_static! { + static ref HANDLER: SyncWrapper = { + let traps = ProxyTraps { + enter: None, + getOwnPropertyDescriptor: Some(get_own_property_descriptor), + defineProperty: Some(define_property), + ownPropertyKeys: Some(own_property_keys), + delete_: Some(delete), + enumerate: None, + getPrototypeIfOrdinary: Some(get_prototype_if_ordinary), + getPrototype: None, + setPrototype: None, + setImmutablePrototype: None, + preventExtensions: Some(prevent_extensions), + isExtensible: Some(is_extensible), + has: None, + get: None, + set: None, + call: None, + construct: None, + hasOwn: None, + getOwnEnumerablePropertyKeys: None, + nativeCall: None, + objectClassIs: None, + className: Some(class_name), + fun_toString: None, + boxedValue_unbox: None, + defaultValue: None, + trace: None, + finalize: None, + objectMoved: None, + isCallable: None, + isConstructor: None, + }; + + #[allow(unsafe_code)] + unsafe { + SyncWrapper(CreateProxyHandler(&traps, ptr::null())) + } + }; +} + +#[allow(unsafe_code)] +unsafe extern "C" fn get_own_property_descriptor( + cx: *mut JSContext, + proxy: HandleObject, + id: HandleId, + desc: MutableHandle, + is_none: *mut bool, +) -> bool { + let cx = SafeJSContext::from_ptr(cx); + + if id.is_symbol() { + if id.get().asBits_ == SymbolId(GetWellKnownSymbol(*cx, SymbolCode::toStringTag)).asBits_ { + rooted!(in(*cx) let mut rval = UndefinedValue()); + "WindowProperties".to_jsval(*cx, rval.handle_mut()); + set_property_descriptor( + RustMutableHandle::from_raw(desc), + rval.handle(), + JSPROP_READONLY.into(), + &mut *is_none, + ); + } + return true; + } + + let mut found = false; + if !has_property_on_prototype( + *cx, + RustHandle::from_raw(proxy), + RustHandle::from_raw(id), + &mut found, + ) { + return false; + } + if found { + return true; + } + + let s = if id.is_string() { + jsstr_to_string(*cx, id.to_string()) + } else if id.is_int() { + // If the property key is an integer index, convert it to a String too. + // For indexed access on the window object, which may shadow this, see + // the getOwnPropertyDescriptor trap in dom/windowproxy.rs. + id.to_int().to_string() + } else if id.is_symbol() { + // Symbol properties were already handled above. + unreachable!() + } else { + unimplemented!() + }; + if s.is_empty() { + return true; + } + + let window = Root::downcast::(GlobalScope::from_object(proxy.get())) + .expect("global is not a window"); + if let Some(obj) = window.NamedGetter(cx, s.into()) { + rooted!(in(*cx) let mut rval = UndefinedValue()); + obj.to_jsval(*cx, rval.handle_mut()); + set_property_descriptor( + RustMutableHandle::from_raw(desc), + rval.handle(), + 0, + &mut *is_none, + ); + } + return true; +} + +#[allow(unsafe_code)] +unsafe extern "C" fn own_property_keys( + cx: *mut JSContext, + _proxy: HandleObject, + props: MutableHandleIdVector, +) -> bool { + // TODO is this all we need to return? compare with gecko: + // https://searchfox.org/mozilla-central/rev/af78418c4b5f2c8721d1a06486cf4cf0b33e1e8d/dom/base/WindowNamedPropertiesHandler.cpp#175-232 + // see also https://github.com/whatwg/html/issues/9068 + rooted!(in(cx) let mut rooted = SymbolId(GetWellKnownSymbol(cx, SymbolCode::toStringTag))); + AppendToIdVector(props, rooted.handle().into()); + true +} + +#[allow(unsafe_code)] +unsafe extern "C" fn define_property( + _cx: *mut JSContext, + _proxy: HandleObject, + _id: HandleId, + _desc: Handle, + result: *mut ObjectOpResult, +) -> bool { + (*result).code_ = JSErrNum::JSMSG_CANT_DEFINE_WINDOW_NAMED_PROPERTY as usize; + true +} + +#[allow(unsafe_code)] +unsafe extern "C" fn delete( + _cx: *mut JSContext, + _proxy: HandleObject, + _id: HandleId, + result: *mut ObjectOpResult, +) -> bool { + (*result).code_ = JSErrNum::JSMSG_CANT_DELETE_WINDOW_NAMED_PROPERTY as usize; + true +} + +#[allow(unsafe_code)] +unsafe extern "C" fn get_prototype_if_ordinary( + _cx: *mut JSContext, + proxy: HandleObject, + is_ordinary: *mut bool, + proto: MutableHandleObject, +) -> bool { + *is_ordinary = true; + proto.set(js::jsapi::GetStaticPrototype(proxy.get())); + true +} + +#[allow(unsafe_code)] +unsafe extern "C" fn prevent_extensions( + _cx: *mut JSContext, + _proxy: HandleObject, + result: *mut ObjectOpResult, +) -> bool { + (*result).code_ = JSErrNum::JSMSG_CANT_PREVENT_EXTENSIONS as usize; + true +} + +#[allow(unsafe_code)] +unsafe extern "C" fn is_extensible( + _cx: *mut JSContext, + _proxy: HandleObject, + extensible: *mut bool, +) -> bool { + *extensible = true; + true +} + +#[allow(unsafe_code)] +unsafe extern "C" fn class_name(_cx: *mut JSContext, _proxy: HandleObject) -> *const libc::c_char { + &b"WindowProperties\0" as *const _ as *const _ +} + +// Maybe this should be a DOMJSClass. See https://bugzilla.mozilla.org/show_bug.cgi?id=787070 +#[allow(unsafe_code)] +static CLASS: JSClass = JSClass { + name: b"WindowProperties\0" as *const u8 as *const libc::c_char, + flags: JSClass_NON_NATIVE | + JSCLASS_IS_PROXY | + JSCLASS_DELAY_METADATA_BUILDER | + ((1 & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT), /* JSCLASS_HAS_RESERVED_SLOTS(1) */ + cOps: unsafe { &ProxyClassOps }, + spec: ptr::null(), + ext: unsafe { &ProxyClassExtension }, + oOps: unsafe { &ProxyObjectOps }, +}; + +#[allow(unsafe_code)] +pub fn create( + cx: SafeJSContext, + proto: RustHandleObject, + mut properties_obj: RustMutableHandleObject, +) { + unsafe { + properties_obj.set(NewProxyObject( + *cx, + HANDLER.0, + UndefinedHandleValue, + proto.get(), + &CLASS, + false, + )); + assert!(!properties_obj.get().is_null()); + let mut succeeded = false; + assert!(JS_SetImmutablePrototype( + *cx, + properties_obj.handle().into_handle(), + &mut succeeded + )); + assert!(succeeded); + } +} diff --git a/tests/wpt/metadata/FileAPI/Blob-methods-from-detached-frame.html.ini b/tests/wpt/metadata/FileAPI/Blob-methods-from-detached-frame.html.ini deleted file mode 100644 index e9bfde19772..00000000000 --- a/tests/wpt/metadata/FileAPI/Blob-methods-from-detached-frame.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[Blob-methods-from-detached-frame.html] - [slice()] - expected: FAIL - - [text()] - expected: FAIL - - [arrayBuffer()] - expected: FAIL - - [stream()] - expected: FAIL diff --git a/tests/wpt/metadata/cors/script-304.html.ini b/tests/wpt/metadata/cors/script-304.html.ini deleted file mode 100644 index 914b364b684..00000000000 --- a/tests/wpt/metadata/cors/script-304.html.ini +++ /dev/null @@ -1,7 +0,0 @@ -[script-304.html] - [Load a fresh cross-origin script] - expected: FAIL - - [Reload same cross-origin script from the memory cache after revalidation] - expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/abspos/adjacent-to-relpos-inline-in-inline-that-had-block.html.ini b/tests/wpt/metadata/css/CSS2/abspos/adjacent-to-relpos-inline-in-inline-that-had-block.html.ini deleted file mode 100644 index f1b2c08cf15..00000000000 --- a/tests/wpt/metadata/css/CSS2/abspos/adjacent-to-relpos-inline-in-inline-that-had-block.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[adjacent-to-relpos-inline-in-inline-that-had-block.html] - [Make sure that we're sized by the right ancestor] - expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/abspos/adjacent-to-relpos-inline-that-had-block.html.ini b/tests/wpt/metadata/css/CSS2/abspos/adjacent-to-relpos-inline-that-had-block.html.ini deleted file mode 100644 index 27df1212878..00000000000 --- a/tests/wpt/metadata/css/CSS2/abspos/adjacent-to-relpos-inline-that-had-block.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[adjacent-to-relpos-inline-that-had-block.html] - [Make sure that we're sized by the right ancestor] - expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/floats-clear/remove-block-before-self-collapsing-sibling-with-clearance.html.ini b/tests/wpt/metadata/css/CSS2/floats-clear/remove-block-before-self-collapsing-sibling-with-clearance.html.ini deleted file mode 100644 index 70784ff0b07..00000000000 --- a/tests/wpt/metadata/css/CSS2/floats-clear/remove-block-before-self-collapsing-sibling-with-clearance.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[remove-block-before-self-collapsing-sibling-with-clearance.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/floats/computed-float-position-absolute.html.ini b/tests/wpt/metadata/css/CSS2/floats/computed-float-position-absolute.html.ini deleted file mode 100644 index 1d641a0d80c..00000000000 --- a/tests/wpt/metadata/css/CSS2/floats/computed-float-position-absolute.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[computed-float-position-absolute.html] - [The computed value of float with absolute positioning when there is no box should be "none"] - expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-client-rects-001.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-client-rects-001.html.ini index d1d5ae47848..853b6c7e943 100644 --- a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-client-rects-001.html.ini +++ b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-client-rects-001.html.ini @@ -1,7 +1,4 @@ [block-in-inline-client-rects-001.html] - [t1.getBoundingClientRect().width] - expected: FAIL - [t2.getBoundingClientRect().width] expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html.ini deleted file mode 100644 index 585f7f61434..00000000000 --- a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[block-in-inline-hittest-float-001.html] - [block-in-inline-hittest-float-001] - expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-insert-018.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-insert-018.html.ini deleted file mode 100644 index 383d628e829..00000000000 --- a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-insert-018.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[block-in-inline-insert-018.html] - expected: ERROR diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/margin-collapse-through-percentage-padding.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/margin-collapse-through-percentage-padding.html.ini deleted file mode 100644 index 5100ee5c5a1..00000000000 --- a/tests/wpt/metadata/css/CSS2/normal-flow/margin-collapse-through-percentage-padding.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[margin-collapse-through-percentage-padding.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/positioning/abspos-change-in-inline-block.html.ini b/tests/wpt/metadata/css/CSS2/positioning/abspos-change-in-inline-block.html.ini deleted file mode 100644 index f6d3f5120c5..00000000000 --- a/tests/wpt/metadata/css/CSS2/positioning/abspos-change-in-inline-block.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[abspos-change-in-inline-block.html] - [No crash] - expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/positioning/abspos-width-change-inline-container-001.html.ini b/tests/wpt/metadata/css/CSS2/positioning/abspos-width-change-inline-container-001.html.ini deleted file mode 100644 index 4d53d32f1c1..00000000000 --- a/tests/wpt/metadata/css/CSS2/positioning/abspos-width-change-inline-container-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[abspos-width-change-inline-container-001.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/positioning/detach-abspos-before-layout.html.ini b/tests/wpt/metadata/css/CSS2/positioning/detach-abspos-before-layout.html.ini deleted file mode 100644 index 4cc6e839ea4..00000000000 --- a/tests/wpt/metadata/css/CSS2/positioning/detach-abspos-before-layout.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[detach-abspos-before-layout.html] - [No crash or DCHECK failure] - expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-left-in-scrollable-2.html.ini b/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-left-in-scrollable-2.html.ini deleted file mode 100644 index e2607f69bb4..00000000000 --- a/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-left-in-scrollable-2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[relpos-percentage-left-in-scrollable-2.html] - expected: ERROR - [relpos-percentage-left-in-scrollable-2] - expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-left-in-scrollable.html.ini b/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-left-in-scrollable.html.ini deleted file mode 100644 index 6d5530dd5f5..00000000000 --- a/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-left-in-scrollable.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[relpos-percentage-left-in-scrollable.html] - expected: ERROR - [relpos-percentage-left-in-scrollable] - expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-top-in-scrollable.html.ini b/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-top-in-scrollable.html.ini index 7d7251809cd..8e9dc9d0a53 100644 --- a/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-top-in-scrollable.html.ini +++ b/tests/wpt/metadata/css/CSS2/positioning/relpos-percentage-top-in-scrollable.html.ini @@ -1,5 +1,3 @@ [relpos-percentage-top-in-scrollable.html] - expected: ERROR - [relpos-percentage-top-in-scrollable] + [Top percentage resolved correctly for overflow contribution] expected: FAIL - diff --git a/tests/wpt/metadata/css/CSS2/stacking-context/composite-change-after-scroll-preserves-stacking-order.html.ini b/tests/wpt/metadata/css/CSS2/stacking-context/composite-change-after-scroll-preserves-stacking-order.html.ini deleted file mode 100644 index 805fb5ef146..00000000000 --- a/tests/wpt/metadata/css/CSS2/stacking-context/composite-change-after-scroll-preserves-stacking-order.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[composite-change-after-scroll-preserves-stacking-order.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/CSS2/stacking-context/opacity-change-parent-stacking-context.html.ini b/tests/wpt/metadata/css/CSS2/stacking-context/opacity-change-parent-stacking-context.html.ini deleted file mode 100644 index cd8ee521d3d..00000000000 --- a/tests/wpt/metadata/css/CSS2/stacking-context/opacity-change-parent-stacking-context.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[opacity-change-parent-stacking-context.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/CSS2/stacking-context/opacity-change-twice-stacking-context.html.ini b/tests/wpt/metadata/css/CSS2/stacking-context/opacity-change-twice-stacking-context.html.ini deleted file mode 100644 index 2e6fd71a501..00000000000 --- a/tests/wpt/metadata/css/CSS2/stacking-context/opacity-change-twice-stacking-context.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[opacity-change-twice-stacking-context.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/CSS2/stacking-context/opacity-transition-change-parent-stacking-context.html.ini b/tests/wpt/metadata/css/CSS2/stacking-context/opacity-transition-change-parent-stacking-context.html.ini deleted file mode 100644 index ad137c1fe98..00000000000 --- a/tests/wpt/metadata/css/CSS2/stacking-context/opacity-transition-change-parent-stacking-context.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[opacity-transition-change-parent-stacking-context.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-animations/animation-base-response-001.html.ini b/tests/wpt/metadata/css/css-animations/animation-base-response-001.html.ini index de1e20d78ad..0e735a2b627 100644 --- a/tests/wpt/metadata/css/css-animations/animation-base-response-001.html.ini +++ b/tests/wpt/metadata/css/css-animations/animation-base-response-001.html.ini @@ -1,2 +1,3 @@ [animation-base-response-001.html] - expected: ERROR + [var() references respond to custom property animation] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-animations/animation-base-response-002.html.ini b/tests/wpt/metadata/css/css-animations/animation-base-response-002.html.ini deleted file mode 100644 index 60c7e969659..00000000000 --- a/tests/wpt/metadata/css/css-animations/animation-base-response-002.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[animation-base-response-002.html] - [Animated font-size on root affects rem units] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-animations/computed-style-animation-parsing.html.ini b/tests/wpt/metadata/css/css-animations/computed-style-animation-parsing.html.ini index 6a1ab9d1ea0..f42522d2ece 100644 --- a/tests/wpt/metadata/css/css-animations/computed-style-animation-parsing.html.ini +++ b/tests/wpt/metadata/css/css-animations/computed-style-animation-parsing.html.ini @@ -1,16 +1,12 @@ [computed-style-animation-parsing.html] - [Test an animation name that is the same as a possible animation fill-mode.] - expected: FAIL - - [Test an animation name that is the same as a possible running state.] - expected: FAIL - - [Test animation name being empty.] - expected: FAIL - [Test a non-conflicting animation name.] expected: FAIL + [Test an animation name that is the same as a possible animation fill-mode.] + expected: FAIL + [Test an animation name that is the same as a possible animation direction.] expected: FAIL + [Test an animation name that is the same as a possible running state.] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-animations/style-animation-parsing.html.ini b/tests/wpt/metadata/css/css-animations/style-animation-parsing.html.ini deleted file mode 100644 index 46d53ea9343..00000000000 --- a/tests/wpt/metadata/css/css-animations/style-animation-parsing.html.ini +++ /dev/null @@ -1,16 +0,0 @@ -[style-animation-parsing.html] - [Test an animation name that is the same as a possible animation fill-mode.] - expected: FAIL - - [Test an animation name that is the same as a possible running state.] - expected: FAIL - - [Test animation name being empty.] - expected: FAIL - - [Test a non-conflicting animation name.] - expected: FAIL - - [Test an animation name that is the same as a possible animation direction.] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-backgrounds/background-clip-color-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-clip-color-repaint.html.ini deleted file mode 100644 index 625620c95fe..00000000000 --- a/tests/wpt/metadata/css/css-backgrounds/background-clip-color-repaint.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[background-clip-color-repaint.html] - bug: https://github.com/servo/servo/issues/8984 - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-conic-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-conic-repaint.html.ini deleted file mode 100644 index 4dd4c319a04..00000000000 --- a/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-conic-repaint.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[background-image-gradient-currentcolor-conic-repaint.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-linear-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-linear-repaint.html.ini deleted file mode 100644 index 68e125b782b..00000000000 --- a/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-linear-repaint.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[background-image-gradient-currentcolor-linear-repaint.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-radial-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-radial-repaint.html.ini deleted file mode 100644 index ecf7146b974..00000000000 --- a/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-radial-repaint.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[background-image-gradient-currentcolor-radial-repaint.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-visited.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-visited.html.ini index dec12adcfc7..ad844b004e7 100644 --- a/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-visited.html.ini +++ b/tests/wpt/metadata/css/css-backgrounds/background-image-gradient-currentcolor-visited.html.ini @@ -1,2 +1,2 @@ [background-image-gradient-currentcolor-visited.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/css/css-backgrounds/background-image-none-gradient-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-image-none-gradient-repaint.html.ini deleted file mode 100644 index d279b5501ce..00000000000 --- a/tests/wpt/metadata/css/css-backgrounds/background-image-none-gradient-repaint.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[background-image-none-gradient-repaint.html] - bug: https://github.com/servo/servo/issues/8984 - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-backgrounds/border-radius-dynamic-from-no-radius.html.ini b/tests/wpt/metadata/css/css-backgrounds/border-radius-dynamic-from-no-radius.html.ini deleted file mode 100644 index fc8f7177549..00000000000 --- a/tests/wpt/metadata/css/css-backgrounds/border-radius-dynamic-from-no-radius.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[border-radius-dynamic-from-no-radius.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-backgrounds/child-move-reveals-parent-background.html.ini b/tests/wpt/metadata/css/css-backgrounds/child-move-reveals-parent-background.html.ini deleted file mode 100644 index 96193b9a323..00000000000 --- a/tests/wpt/metadata/css/css-backgrounds/child-move-reveals-parent-background.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[child-move-reveals-parent-background.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-backgrounds/inheritance.sub.html.ini b/tests/wpt/metadata/css/css-backgrounds/inheritance.sub.html.ini index a22655943a0..06216373de1 100644 --- a/tests/wpt/metadata/css/css-backgrounds/inheritance.sub.html.ini +++ b/tests/wpt/metadata/css/css-backgrounds/inheritance.sub.html.ini @@ -1,5 +1,21 @@ [inheritance.sub.html] - expected: ERROR [Inheritance of CSS Backgrounds and Borders properties] expected: FAIL + [Property background-position has initial value 0% 0%] + expected: FAIL + + [Property background-position does not inherit] + expected: FAIL + + [Property border-bottom-width has initial value undefined] + expected: FAIL + + [Property border-left-width has initial value undefined] + expected: FAIL + + [Property border-right-width has initial value undefined] + expected: FAIL + + [Property border-top-width has initial value undefined] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-backgrounds/local-attachment-content-box-scroll.html.ini b/tests/wpt/metadata/css/css-backgrounds/local-attachment-content-box-scroll.html.ini index 960c6448f86..d692f709742 100644 --- a/tests/wpt/metadata/css/css-backgrounds/local-attachment-content-box-scroll.html.ini +++ b/tests/wpt/metadata/css/css-backgrounds/local-attachment-content-box-scroll.html.ini @@ -1,2 +1,2 @@ [local-attachment-content-box-scroll.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/css/css-color/canvas-change-opacity.html.ini b/tests/wpt/metadata/css/css-color/canvas-change-opacity.html.ini index 1351702c8fe..b79b0b91889 100644 --- a/tests/wpt/metadata/css/css-color/canvas-change-opacity.html.ini +++ b/tests/wpt/metadata/css/css-color/canvas-change-opacity.html.ini @@ -1,2 +1,2 @@ [canvas-change-opacity.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/css/css-color/color-initial-canvastext.html.ini b/tests/wpt/metadata/css/css-color/color-initial-canvastext.html.ini deleted file mode 100644 index 1ab1e809e50..00000000000 --- a/tests/wpt/metadata/css/css-color/color-initial-canvastext.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[color-initial-canvastext.html] - expected: ERROR diff --git a/tests/wpt/metadata/css/css-color/filters-under-will-change-opacity.html.ini b/tests/wpt/metadata/css/css-color/filters-under-will-change-opacity.html.ini deleted file mode 100644 index 29881b53c4b..00000000000 --- a/tests/wpt/metadata/css/css-color/filters-under-will-change-opacity.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[filters-under-will-change-opacity.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-001.html.ini b/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-001.html.ini deleted file mode 100644 index b22638a8537..00000000000 --- a/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[anonymous-flex-item-001.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-003.html.ini b/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-003.html.ini deleted file mode 100644 index 331eec32683..00000000000 --- a/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-003.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[anonymous-flex-item-003.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-005.html.ini b/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-005.html.ini new file mode 100644 index 00000000000..f5db1aa1610 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-005.html.ini @@ -0,0 +1,2 @@ +[anonymous-flex-item-005.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-006.html.ini b/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-006.html.ini new file mode 100644 index 00000000000..5865ea15bc8 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/anonymous-flex-item-006.html.ini @@ -0,0 +1,2 @@ +[anonymous-flex-item-006.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/dynamic-bsize-change.html.ini b/tests/wpt/metadata/css/css-flexbox/dynamic-bsize-change.html.ini deleted file mode 100644 index dc8b13ba93d..00000000000 --- a/tests/wpt/metadata/css/css-flexbox/dynamic-bsize-change.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[dynamic-bsize-change.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-column-010.html.ini b/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-column-010.html.ini index ad948146e74..cba19de7ad2 100644 --- a/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-column-010.html.ini +++ b/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-column-010.html.ini @@ -1,2 +1,2 @@ [flex-aspect-ratio-img-column-010.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-row-004.html.ini b/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-row-004.html.ini index b0fbc095ed5..cc57c8329ea 100644 --- a/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-row-004.html.ini +++ b/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-row-004.html.ini @@ -1,2 +1,2 @@ [flex-aspect-ratio-img-row-004.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-row-016.html.ini b/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-row-016.html.ini deleted file mode 100644 index 6ecbc192094..00000000000 --- a/tests/wpt/metadata/css/css-flexbox/flex-aspect-ratio-img-row-016.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flex-aspect-ratio-img-row-016.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-fonts/crash-large-grapheme-cluster.html.ini b/tests/wpt/metadata/css/css-fonts/crash-large-grapheme-cluster.html.ini index ff27bc4b5ba..2eabe8aca0f 100644 --- a/tests/wpt/metadata/css/css-fonts/crash-large-grapheme-cluster.html.ini +++ b/tests/wpt/metadata/css/css-fonts/crash-large-grapheme-cluster.html.ini @@ -1,3 +1,4 @@ [crash-large-grapheme-cluster.html] + expected: CRASH [Should not crash when there is an exceedingly large grapheme cluster] expected: FAIL diff --git a/tests/wpt/metadata/css/css-fonts/font-size-monospace-adjust.html.ini b/tests/wpt/metadata/css/css-fonts/font-size-monospace-adjust.html.ini new file mode 100644 index 00000000000..700d382f080 --- /dev/null +++ b/tests/wpt/metadata/css/css-fonts/font-size-monospace-adjust.html.ini @@ -0,0 +1,2 @@ +[font-size-monospace-adjust.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-format.html.ini b/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-format.html.ini index b80ce93bea2..79ca5aba421 100644 --- a/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-format.html.ini +++ b/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-format.html.ini @@ -1,2 +1,105 @@ [font-face-src-format.html] - expected: ERROR + [Check that src: url("foo.ttf") is valid] + expected: FAIL + + [Check that src: url("foo.ttf"), url("bar.ttf") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format() is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") dummy() is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format("woff") dummy() is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") dummy() format("woff") is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format("collection") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format("opentype") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format("truetype") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format("woff") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format("woff2") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format("opentype", "truetype") is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(collection) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(opentype) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(truetype) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(woff) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(woff2) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(opentype, truetype) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(opentype truetype) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(auto) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(default) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(inherit) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(initial) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(none) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(normal) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(xyzzy) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format("embedded-opentype"), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(embedded-opentype), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format("svg"), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(svg), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(xyzz 200px), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(xyzz), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") dummy(xyzzy), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") format(none), url("bar.html") is valid] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-list.html.ini b/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-list.html.ini index 4cd7f216588..5d06b7fe69e 100644 --- a/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-list.html.ini +++ b/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-list.html.ini @@ -1,2 +1,45 @@ [font-face-src-list.html] - expected: ERROR + [Check that src: local(inherit), url(foo.ttf) is valid] + expected: FAIL + + [Check that src: local("myfont"), local(unset) is valid] + expected: FAIL + + [Check that src: local(), url(foo.ttf) is valid] + expected: FAIL + + [Check that src: local(12px monospace), url(foo.ttf) is valid] + expected: FAIL + + [Check that src: local("myfont") format(opentype), url(foo.ttf) is valid] + expected: FAIL + + [Check that src: url(not a valid url/bar.ttf), url(foo.ttf) is valid] + expected: FAIL + + [Check that src: url(foo.ttf) format(bad), url(foo.ttf) is valid] + expected: FAIL + + [Check that src: url(foo.ttf) tech(unknown), url(foo.ttf) is valid] + expected: FAIL + + [Check that src: url(foo.ttf), url(something.ttf) format(broken) is valid] + expected: FAIL + + [Check that src: /* an empty component */, url(foo.ttf) is valid] + expected: FAIL + + [Check that src: local(""), url(foo.ttf), unparseable-garbage, local("another font name") is valid] + expected: FAIL + + [Check that src: local(), local(initial) is invalid] + expected: FAIL + + [Check that src: local("textfont") format(opentype), local("emoji") tech(color-COLRv0) is invalid] + expected: FAIL + + [Check that src: local(), /*empty*/, url(should be quoted.ttf), junk is invalid] + expected: FAIL + + [Check that src: url(foo.ttf) format(unknown), url(bar.ttf) tech(broken) is invalid] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-local.html.ini b/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-local.html.ini index 3ae9067e630..aba920eefed 100644 --- a/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-local.html.ini +++ b/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-local.html.ini @@ -1,2 +1,54 @@ [font-face-src-local.html] - expected: ERROR + [Check that src: local(A) dummy() is invalid] + expected: FAIL + + [Check that src: dummy() local(A) is invalid] + expected: FAIL + + [Check that src: local( A ) is valid] + expected: FAIL + + [Check that src: local(A B) is valid] + expected: FAIL + + [Check that src: local(A B) is valid] + expected: FAIL + + [Check that src: local( A B ) is valid] + expected: FAIL + + [Check that src: local(default) is invalid] + expected: FAIL + + [Check that src: local(inherit) is invalid] + expected: FAIL + + [Check that src: local(revert) is invalid] + expected: FAIL + + [Check that src: local(unset) is invalid] + expected: FAIL + + [Check that src: local(default A) is valid] + expected: FAIL + + [Check that src: local(inherit A) is valid] + expected: FAIL + + [Check that src: local(revert A) is valid] + expected: FAIL + + [Check that src: local(unset A) is valid] + expected: FAIL + + [Check that src: local("default") is valid] + expected: FAIL + + [Check that src: local("inherit") is valid] + expected: FAIL + + [Check that src: local("revert") is valid] + expected: FAIL + + [Check that src: local("unset") is valid] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-tech.html.ini b/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-tech.html.ini index a900d2b5ba9..8f0bb9f3aab 100644 --- a/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-tech.html.ini +++ b/tests/wpt/metadata/css/css-fonts/parsing/font-face-src-tech.html.ini @@ -1,2 +1,111 @@ [font-face-src-tech.html] - expected: ERROR + [Check that src: url("foo.ttf") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech() is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(features-opentype) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(features-aat) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(color-COLRv0) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(color-COLRv1) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(color-sbix) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(color-CBDT) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(variations) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(palettes) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech("features-opentype") is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech("color-COLRv0") is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech("variations") is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(features-opentype, color-COLRv0, variations, palettes) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(features-opentype color-COLRv0 variations palettes) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(feature-opentype) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(feature-aat) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(feature-graphite) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(auto) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(default) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(inherit) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(initial) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(none) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(normal) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(xyzzy) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(opentype) tech(features-opentype) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(features-opentype) format(opentype) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(incremental), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(incremental, color-SVG, features-graphite, features-aat), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(color-SVG, features-graphite), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(color-SVG), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(features-graphite), url("bar.html") is valid] + expected: FAIL + + [Check that src: url("foo.ttf") dummy("opentype") tech(variations) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") dummy("opentype") dummy(variations) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(opentype) tech(features-opentype) dummy(something) is invalid] + expected: FAIL + + [Check that src: url("foo.ttf") format(dummy), url("foo.ttf") tech(variations) is valid] + expected: FAIL + + [Check that src: url("foo.ttf") tech(color), url("bar.html") is valid] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-text-decor/text-decoration-color-recalc-002.html.ini b/tests/wpt/metadata/css/css-text-decor/text-decoration-color-recalc-002.html.ini deleted file mode 100644 index af308b9f627..00000000000 --- a/tests/wpt/metadata/css/css-text-decor/text-decoration-color-recalc-002.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-decoration-color-recalc-002.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-text-decor/text-decoration-line-grammar-error-color-dynamic-001.optional.html.ini b/tests/wpt/metadata/css/css-text-decor/text-decoration-line-grammar-error-color-dynamic-001.optional.html.ini deleted file mode 100644 index 56844256a12..00000000000 --- a/tests/wpt/metadata/css/css-text-decor/text-decoration-line-grammar-error-color-dynamic-001.optional.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-decoration-line-grammar-error-color-dynamic-001.optional.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-text-decor/text-decoration-line-recalc.html.ini b/tests/wpt/metadata/css/css-text-decor/text-decoration-line-recalc.html.ini new file mode 100644 index 00000000000..987400524bd --- /dev/null +++ b/tests/wpt/metadata/css/css-text-decor/text-decoration-line-recalc.html.ini @@ -0,0 +1,2 @@ +[text-decoration-line-recalc.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-text-decor/text-decoration-line-spelling-error-color-dynamic-001.optional.html.ini b/tests/wpt/metadata/css/css-text-decor/text-decoration-line-spelling-error-color-dynamic-001.optional.html.ini deleted file mode 100644 index eeca8a65a16..00000000000 --- a/tests/wpt/metadata/css/css-text-decor/text-decoration-line-spelling-error-color-dynamic-001.optional.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-decoration-line-spelling-error-color-dynamic-001.optional.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-text/text-indent/percentage-value-intrinsic-size.html.ini b/tests/wpt/metadata/css/css-text/text-indent/percentage-value-intrinsic-size.html.ini deleted file mode 100644 index 7e9b2037766..00000000000 --- a/tests/wpt/metadata/css/css-text/text-indent/percentage-value-intrinsic-size.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[percentage-value-intrinsic-size.html] - expected: ERROR - [percentage-value-intrinsic-size] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-text/white-space/display-contents-remove-whitespace-change.html.ini b/tests/wpt/metadata/css/css-text/white-space/display-contents-remove-whitespace-change.html.ini deleted file mode 100644 index f30d2a7266c..00000000000 --- a/tests/wpt/metadata/css/css-text/white-space/display-contents-remove-whitespace-change.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[display-contents-remove-whitespace-change.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-text/white-space/text-wrap-balance-dynamic-001.html.ini b/tests/wpt/metadata/css/css-text/white-space/text-wrap-balance-dynamic-001.html.ini deleted file mode 100644 index 55286b7a73b..00000000000 --- a/tests/wpt/metadata/css/css-text/white-space/text-wrap-balance-dynamic-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-wrap-balance-dynamic-001.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-text/white-space/trailing-space-before-br-001.html.ini b/tests/wpt/metadata/css/css-text/white-space/trailing-space-before-br-001.html.ini index 0809c2d559a..d24d6f0fec5 100644 --- a/tests/wpt/metadata/css/css-text/white-space/trailing-space-before-br-001.html.ini +++ b/tests/wpt/metadata/css/css-text/white-space/trailing-space-before-br-001.html.ini @@ -1,5 +1,9 @@ [trailing-space-before-br-001.html] - expected: ERROR [CSS Text: A sequence of collapsible spaces at the end of a line is removed] expected: FAIL + [1111
] + expected: FAIL + + [1111
] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-text/white-space/white-space-empty-text-sibling.html.ini b/tests/wpt/metadata/css/css-text/white-space/white-space-empty-text-sibling.html.ini deleted file mode 100644 index 2800266d857..00000000000 --- a/tests/wpt/metadata/css/css-text/white-space/white-space-empty-text-sibling.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[white-space-empty-text-sibling.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/3d-rendering-context-behavior.html.ini b/tests/wpt/metadata/css/css-transforms/3d-rendering-context-behavior.html.ini index 96ae78354ea..8bc8338d202 100644 --- a/tests/wpt/metadata/css/css-transforms/3d-rendering-context-behavior.html.ini +++ b/tests/wpt/metadata/css/css-transforms/3d-rendering-context-behavior.html.ini @@ -1,13 +1,4 @@ [3d-rendering-context-behavior.html] - [Direct DOM parent is root of rendering context (normal flow)] - expected: FAIL - - [Direct DOM parent is root of rendering context (absolute)] - expected: FAIL - - [Direct DOM parent is root of rendering context (fixed)] - expected: FAIL - [Intermediate DOM nodes cause rendering context to end (normal flow)] expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/change-perspective-property.html.ini b/tests/wpt/metadata/css/css-transforms/change-perspective-property.html.ini deleted file mode 100644 index 5e51e2b14d1..00000000000 --- a/tests/wpt/metadata/css/css-transforms/change-perspective-property.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[change-perspective-property.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/change-scale-wide-range.html.ini b/tests/wpt/metadata/css/css-transforms/change-scale-wide-range.html.ini deleted file mode 100644 index 48a4ed0c771..00000000000 --- a/tests/wpt/metadata/css/css-transforms/change-scale-wide-range.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[change-scale-wide-range.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/change-transform-origin-property.html.ini b/tests/wpt/metadata/css/css-transforms/change-transform-origin-property.html.ini deleted file mode 100644 index 9fbd488decc..00000000000 --- a/tests/wpt/metadata/css/css-transforms/change-transform-origin-property.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[change-transform-origin-property.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/dynamic-fixed-pos-cb-change.html.ini b/tests/wpt/metadata/css/css-transforms/dynamic-fixed-pos-cb-change.html.ini deleted file mode 100644 index 63a28dba4cf..00000000000 --- a/tests/wpt/metadata/css/css-transforms/dynamic-fixed-pos-cb-change.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[dynamic-fixed-pos-cb-change.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/individual-transform/change-rotate-property.html.ini b/tests/wpt/metadata/css/css-transforms/individual-transform/change-rotate-property.html.ini deleted file mode 100644 index b9c482eef63..00000000000 --- a/tests/wpt/metadata/css/css-transforms/individual-transform/change-rotate-property.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[change-rotate-property.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/individual-transform/change-scale-property.html.ini b/tests/wpt/metadata/css/css-transforms/individual-transform/change-scale-property.html.ini deleted file mode 100644 index 78bda8b5caa..00000000000 --- a/tests/wpt/metadata/css/css-transforms/individual-transform/change-scale-property.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[change-scale-property.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/individual-transform/change-translate-property.html.ini b/tests/wpt/metadata/css/css-transforms/individual-transform/change-translate-property.html.ini index 1fff7849a71..f0c9923d7ec 100644 --- a/tests/wpt/metadata/css/css-transforms/individual-transform/change-translate-property.html.ini +++ b/tests/wpt/metadata/css/css-transforms/individual-transform/change-translate-property.html.ini @@ -1,2 +1,2 @@ [change-translate-property.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/paint-order-with-transform-change.html.ini b/tests/wpt/metadata/css/css-transforms/paint-order-with-transform-change.html.ini deleted file mode 100644 index 5f765b6bc21..00000000000 --- a/tests/wpt/metadata/css/css-transforms/paint-order-with-transform-change.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[paint-order-with-transform-change.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/preserve-3d-flat-grouping-properties.html.ini b/tests/wpt/metadata/css/css-transforms/preserve-3d-flat-grouping-properties.html.ini index 9a64545af67..ccb021392e0 100644 --- a/tests/wpt/metadata/css/css-transforms/preserve-3d-flat-grouping-properties.html.ini +++ b/tests/wpt/metadata/css/css-transforms/preserve-3d-flat-grouping-properties.html.ini @@ -1,2 +1,24 @@ [preserve-3d-flat-grouping-properties.html] - expected: ERROR + [Preserve-3d element flattened due to opacity] + expected: FAIL + + [Preserve-3d element flattened due to overflow clip] + expected: FAIL + + [Preserve-3d element flattened due to filter] + expected: FAIL + + [Preserve-3d element flattened due to backdrop-filter] + expected: FAIL + + [Preserve-3d element flattened due to clip CSS] + expected: FAIL + + [Preserve-3d element flattened due to clip-path] + expected: FAIL + + [Preserve-3d element flattened due to isolation] + expected: FAIL + + [Preserve-3d element flattened due to mask] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/size-change-under-backface-visibility-hidden.html.ini b/tests/wpt/metadata/css/css-transforms/size-change-under-backface-visibility-hidden.html.ini deleted file mode 100644 index 743ae46524d..00000000000 --- a/tests/wpt/metadata/css/css-transforms/size-change-under-backface-visibility-hidden.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[size-change-under-backface-visibility-hidden.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-001.html.ini b/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-001.html.ini deleted file mode 100644 index 2e8dcfc89a8..00000000000 --- a/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[subpixel-transform-changes-001.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-002.html.ini b/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-002.html.ini deleted file mode 100644 index 13987e51a4f..00000000000 --- a/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-002.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[subpixel-transform-changes-002.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-003.html.ini b/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-003.html.ini deleted file mode 100644 index f9bfdc9711e..00000000000 --- a/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-003.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[subpixel-transform-changes-003.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-004.html.ini b/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-004.html.ini deleted file mode 100644 index e169c08be32..00000000000 --- a/tests/wpt/metadata/css/css-transforms/subpixel-transform-changes-004.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[subpixel-transform-changes-004.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/transforms-support-calc.html.ini b/tests/wpt/metadata/css/css-transforms/transforms-support-calc.html.ini index cec2ec7073d..cf5eda765b2 100644 --- a/tests/wpt/metadata/css/css-transforms/transforms-support-calc.html.ini +++ b/tests/wpt/metadata/css/css-transforms/transforms-support-calc.html.ini @@ -1,16 +1,4 @@ [transforms-support-calc.html] - [translate supports calc] - expected: FAIL - - [rotate supports calc] - expected: FAIL - - [scale supports calc] - expected: FAIL - - [perspective supports calc] - expected: FAIL - [perspective-origin supports calc] expected: FAIL @@ -19,4 +7,3 @@ [transform-origin supports calc] expected: FAIL - diff --git a/tests/wpt/metadata/css/css-transitions/inherit-height-transition.html.ini b/tests/wpt/metadata/css/css-transitions/inherit-height-transition.html.ini deleted file mode 100644 index 95f199e425c..00000000000 --- a/tests/wpt/metadata/css/css-transitions/inherit-height-transition.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[inherit-height-transition.html] - [Transitioned height, explicitly inherited down two DOM levels, should inherit correctly] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-transitions/transition-base-response-001.html.ini b/tests/wpt/metadata/css/css-transitions/transition-base-response-001.html.ini deleted file mode 100644 index 6b0040fb974..00000000000 --- a/tests/wpt/metadata/css/css-transitions/transition-base-response-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[transition-base-response-001.html] - expected: ERROR diff --git a/tests/wpt/metadata/css/css-transitions/transition-base-response-002.html.ini b/tests/wpt/metadata/css/css-transitions/transition-base-response-002.html.ini deleted file mode 100644 index 102b770e503..00000000000 --- a/tests/wpt/metadata/css/css-transitions/transition-base-response-002.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[transition-base-response-002.html] - [Transitioning font-size on root affects rem units] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-transitions/transition-important.html.ini b/tests/wpt/metadata/css/css-transitions/transition-important.html.ini deleted file mode 100644 index 602bb94e9e1..00000000000 --- a/tests/wpt/metadata/css/css-transitions/transition-important.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[transition-important.html] - [!important should not override transition] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-transitions/transition-reparented.html.ini b/tests/wpt/metadata/css/css-transitions/transition-reparented.html.ini deleted file mode 100644 index b2d796167e0..00000000000 --- a/tests/wpt/metadata/css/css-transitions/transition-reparented.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[transition-reparented.html] - [When an element is reparented, any CSS Transition on it should be cancelled] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-ui/appearance-auto-non-html-namespace-001.html.ini b/tests/wpt/metadata/css/css-ui/appearance-auto-non-html-namespace-001.html.ini new file mode 100644 index 00000000000..623f6298b59 --- /dev/null +++ b/tests/wpt/metadata/css/css-ui/appearance-auto-non-html-namespace-001.html.ini @@ -0,0 +1,2 @@ +[appearance-auto-non-html-namespace-001.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-ui/historical/moz-user-modify-01.html.ini b/tests/wpt/metadata/css/css-ui/historical/moz-user-modify-01.html.ini deleted file mode 100644 index 4eabf2a5cb6..00000000000 --- a/tests/wpt/metadata/css/css-ui/historical/moz-user-modify-01.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[moz-user-modify-01.html] - [-moz-user-modify is not supported] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-ui/historical/user-modify-01.html.ini b/tests/wpt/metadata/css/css-ui/historical/user-modify-01.html.ini deleted file mode 100644 index f0cc807c112..00000000000 --- a/tests/wpt/metadata/css/css-ui/historical/user-modify-01.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[user-modify-01.html] - [user-modify is not supported] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-ui/historical/webkit-user-modify-01.html.ini b/tests/wpt/metadata/css/css-ui/historical/webkit-user-modify-01.html.ini deleted file mode 100644 index 7848c00a393..00000000000 --- a/tests/wpt/metadata/css/css-ui/historical/webkit-user-modify-01.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[webkit-user-modify-01.html] - [-webkit-user-modify is not supported] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-ui/inheritance.html.ini b/tests/wpt/metadata/css/css-ui/inheritance.html.ini index 2acff700c53..9b75e407ec7 100644 --- a/tests/wpt/metadata/css/css-ui/inheritance.html.ini +++ b/tests/wpt/metadata/css/css-ui/inheritance.html.ini @@ -1,5 +1,57 @@ [inheritance.html] - expected: ERROR [Inheritance of CSS Basic User Interface properties] expected: FAIL + [Property appearance has initial value none] + expected: FAIL + + [Property appearance does not inherit] + expected: FAIL + + [Property caret-color has initial value rgb(0, 255, 0)] + expected: FAIL + + [Property caret-color inherits] + expected: FAIL + + [Property caret-shape has initial value auto] + expected: FAIL + + [Property caret-shape inherits] + expected: FAIL + + [Property nav-down has initial value auto] + expected: FAIL + + [Property nav-down does not inherit] + expected: FAIL + + [Property nav-left has initial value auto] + expected: FAIL + + [Property nav-left does not inherit] + expected: FAIL + + [Property nav-right has initial value auto] + expected: FAIL + + [Property nav-right does not inherit] + expected: FAIL + + [Property nav-up has initial value auto] + expected: FAIL + + [Property nav-up does not inherit] + expected: FAIL + + [Property resize has initial value none] + expected: FAIL + + [Property resize does not inherit] + expected: FAIL + + [Property user-select has initial value auto] + expected: FAIL + + [Property user-select does not inherit] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-ui/parsing/outline-width-computed.html.ini b/tests/wpt/metadata/css/css-ui/parsing/outline-width-computed.html.ini index 83c3b7afbe3..d1f9bf5cdc9 100644 --- a/tests/wpt/metadata/css/css-ui/parsing/outline-width-computed.html.ini +++ b/tests/wpt/metadata/css/css-ui/parsing/outline-width-computed.html.ini @@ -1,4 +1,3 @@ [outline-width-computed.html] - expected: ERROR [Property outline-width value '2.5px'] expected: FAIL diff --git a/tests/wpt/metadata/css/css-ui/resize-change-margin.html.ini b/tests/wpt/metadata/css/css-ui/resize-change-margin.html.ini deleted file mode 100644 index 65dbf895460..00000000000 --- a/tests/wpt/metadata/css/css-ui/resize-change-margin.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[resize-change-margin.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-ui/text-overflow-change-color.html.ini b/tests/wpt/metadata/css/css-ui/text-overflow-change-color.html.ini deleted file mode 100644 index 5f89cf29316..00000000000 --- a/tests/wpt/metadata/css/css-ui/text-overflow-change-color.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-overflow-change-color.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-ui/text-overflow-ellipsis-width-001.html.ini b/tests/wpt/metadata/css/css-ui/text-overflow-ellipsis-width-001.html.ini deleted file mode 100644 index 64f9cfb890d..00000000000 --- a/tests/wpt/metadata/css/css-ui/text-overflow-ellipsis-width-001.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[text-overflow-ellipsis-width-001.html] - [Ellipsizing should not affect `offsetWidth` of inline boxes.] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-values/animations/line-height-lh-transition.html.ini b/tests/wpt/metadata/css/css-values/animations/line-height-lh-transition.html.ini deleted file mode 100644 index 05d3c78b460..00000000000 --- a/tests/wpt/metadata/css/css-values/animations/line-height-lh-transition.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[line-height-lh-transition.html] - [lh unit length should change with transitioning line-height] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-values/calc-nesting.html.ini b/tests/wpt/metadata/css/css-values/calc-nesting.html.ini deleted file mode 100644 index d2f1d249ed7..00000000000 --- a/tests/wpt/metadata/css/css-values/calc-nesting.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[calc-nesting.html] - [Nested calcs should work with layout] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-values/lh-unit-003.html.ini b/tests/wpt/metadata/css/css-values/lh-unit-003.html.ini index 3f0d37518f1..706c88f2f98 100644 --- a/tests/wpt/metadata/css/css-values/lh-unit-003.html.ini +++ b/tests/wpt/metadata/css/css-values/lh-unit-003.html.ini @@ -1,4 +1,6 @@ [lh-unit-003.html] - expected: ERROR [Line-height and lh before @font-face loads] expected: FAIL + + [Line-height and lh after @font-face loaded] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-values/update-subpixel-rem-unit.html.ini b/tests/wpt/metadata/css/css-values/update-subpixel-rem-unit.html.ini deleted file mode 100644 index 948ce05488b..00000000000 --- a/tests/wpt/metadata/css/css-values/update-subpixel-rem-unit.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[update-subpixel-rem-unit.html] - [Check that a 0.1px change in root font-size affect rem units.] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-values/viewport-units-compute.html.ini b/tests/wpt/metadata/css/css-values/viewport-units-compute.html.ini index 3adee544e3e..06a82c1aaba 100644 --- a/tests/wpt/metadata/css/css-values/viewport-units-compute.html.ini +++ b/tests/wpt/metadata/css/css-values/viewport-units-compute.html.ini @@ -1,2 +1,90 @@ [viewport-units-compute.html] - expected: ERROR + [100vi computes to 200px] + expected: FAIL + + [100svw computes to 200px] + expected: FAIL + + [100svi computes to 200px] + expected: FAIL + + [100svmax computes to 200px] + expected: FAIL + + [100lvw computes to 200px] + expected: FAIL + + [100lvi computes to 200px] + expected: FAIL + + [100lvmax computes to 200px] + expected: FAIL + + [100dvw computes to 200px] + expected: FAIL + + [100dvi computes to 200px] + expected: FAIL + + [100dvmax computes to 200px] + expected: FAIL + + [100vb computes to 100px] + expected: FAIL + + [100svh computes to 100px] + expected: FAIL + + [100svb computes to 100px] + expected: FAIL + + [100svmin computes to 100px] + expected: FAIL + + [100lvh computes to 100px] + expected: FAIL + + [100lvb computes to 100px] + expected: FAIL + + [100lvmin computes to 100px] + expected: FAIL + + [100dvh computes to 100px] + expected: FAIL + + [100dvb computes to 100px] + expected: FAIL + + [100dvmin computes to 100px] + expected: FAIL + + [1dvw computes to 2px] + expected: FAIL + + [10dvw computes to 20px] + expected: FAIL + + [1dvh computes to 1px] + expected: FAIL + + [10dvh computes to 10px] + expected: FAIL + + [calc(1dvw + 1dvw) computes to 4px] + expected: FAIL + + [calc(1dvw + 1dvh) computes to 3px] + expected: FAIL + + [calc(1dvw + 100px) computes to 102px] + expected: FAIL + + [max(1svw, 1svh) computes to 2px] + expected: FAIL + + [min(1lvw, 1lvh) computes to 1px] + expected: FAIL + + [calc(1dvw + 10%) computes to 12px] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-values/viewport-units-keyframes.html.ini b/tests/wpt/metadata/css/css-values/viewport-units-keyframes.html.ini index 9d0a2c91cf8..804ae41be0b 100644 --- a/tests/wpt/metadata/css/css-values/viewport-units-keyframes.html.ini +++ b/tests/wpt/metadata/css/css-values/viewport-units-keyframes.html.ini @@ -1,2 +1,60 @@ [viewport-units-keyframes.html] - expected: ERROR + [Interpolation from 0px to 100vi is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100svw is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100svi is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100svmax is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100lvw is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100lvi is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100lvmax is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100dvw is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100dvi is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100dvmax is 100px at 50%] + expected: FAIL + + [Interpolation from 0px to 100vb is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100svh is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100svb is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100svmin is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100lvh is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100lvb is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100lvmin is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100dvh is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100dvb is 50px at 50%] + expected: FAIL + + [Interpolation from 0px to 100dvmin is 50px at 50%] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-values/viewport-units-media-queries.html.ini b/tests/wpt/metadata/css/css-values/viewport-units-media-queries.html.ini index f0cc77e6372..3ab74d58d8e 100644 --- a/tests/wpt/metadata/css/css-values/viewport-units-media-queries.html.ini +++ b/tests/wpt/metadata/css/css-values/viewport-units-media-queries.html.ini @@ -1,2 +1,66 @@ [viewport-units-media-queries.html] - expected: ERROR + [@media(width:100vi) applies] + expected: FAIL + + [@media(width:100svw) applies] + expected: FAIL + + [@media(width:100svi) applies] + expected: FAIL + + [@media(width:100svmax) applies] + expected: FAIL + + [@media(width:100lvw) applies] + expected: FAIL + + [@media(width:100lvi) applies] + expected: FAIL + + [@media(width:100lvmax) applies] + expected: FAIL + + [@media(width:100dvw) applies] + expected: FAIL + + [@media(width:100dvi) applies] + expected: FAIL + + [@media(width:100dvmax) applies] + expected: FAIL + + [@media(height:100vh) applies] + expected: FAIL + + [@media(height:100vb) applies] + expected: FAIL + + [@media(height:100vmin) applies] + expected: FAIL + + [@media(height:100svh) applies] + expected: FAIL + + [@media(height:100svb) applies] + expected: FAIL + + [@media(height:100svmin) applies] + expected: FAIL + + [@media(height:100lvh) applies] + expected: FAIL + + [@media(height:100lvb) applies] + expected: FAIL + + [@media(height:100lvmin) applies] + expected: FAIL + + [@media(height:100dvh) applies] + expected: FAIL + + [@media(height:100dvb) applies] + expected: FAIL + + [@media(height:100dvmin) applies] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-values/viewport-units-modify.html.ini b/tests/wpt/metadata/css/css-values/viewport-units-modify.html.ini deleted file mode 100644 index 1a8248cd94b..00000000000 --- a/tests/wpt/metadata/css/css-values/viewport-units-modify.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[viewport-units-modify.html] - [Crash when going from non-viewport to viewport units] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-values/viewport-units-writing-mode.html.ini b/tests/wpt/metadata/css/css-values/viewport-units-writing-mode.html.ini index 25b5a143709..98e9eebad3a 100644 --- a/tests/wpt/metadata/css/css-values/viewport-units-writing-mode.html.ini +++ b/tests/wpt/metadata/css/css-values/viewport-units-writing-mode.html.ini @@ -1,2 +1,24 @@ [viewport-units-writing-mode.html] - expected: ERROR + [100vi computes to 100px with vertical writing-mode] + expected: FAIL + + [100svi computes to 100px with vertical writing-mode] + expected: FAIL + + [100lvi computes to 100px with vertical writing-mode] + expected: FAIL + + [100dvi computes to 100px with vertical writing-mode] + expected: FAIL + + [100vb computes to 200px with vertical writing-mode] + expected: FAIL + + [100svb computes to 200px with vertical writing-mode] + expected: FAIL + + [100lvb computes to 200px with vertical writing-mode] + expected: FAIL + + [100dvb computes to 200px with vertical writing-mode] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-variables/css-variable-change-style-001.html.ini b/tests/wpt/metadata/css/css-variables/css-variable-change-style-001.html.ini deleted file mode 100644 index 443089ea5e2..00000000000 --- a/tests/wpt/metadata/css/css-variables/css-variable-change-style-001.html.ini +++ /dev/null @@ -1,28 +0,0 @@ -[css-variable-change-style-001.html] - [Test changing 'color' value to become a css variable] - expected: FAIL - - [Test declaration changes on 'color' as variable] - expected: FAIL - - [Avoid masking differences on 'color' due to declaration changes] - expected: FAIL - - [Test declaration changes on 'white-space' as variable] - expected: FAIL - - [Test declaration changes on 'background-color' as variable] - expected: FAIL - - [Test changing 'white-space' value to become a css variable] - expected: FAIL - - [Test changing 'background-color' value to become a css variable] - expected: FAIL - - [Avoid masking differences on 'background-color' due to declaration changes] - expected: FAIL - - [Avoid masking differences on 'white-space' due to declaration changes] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-variables/css-variable-change-style-002.html.ini b/tests/wpt/metadata/css/css-variables/css-variable-change-style-002.html.ini deleted file mode 100644 index 5781474a926..00000000000 --- a/tests/wpt/metadata/css/css-variables/css-variable-change-style-002.html.ini +++ /dev/null @@ -1,10 +0,0 @@ -[css-variable-change-style-002.html] - [Declaration changes on 'color' propagate to all variable references] - expected: FAIL - - [Declaration changes on 'background-color' propagate to all variable references] - expected: FAIL - - [Declaration changes on 'white-space' propagate to all variable references] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-variables/variable-cycles.html.ini b/tests/wpt/metadata/css/css-variables/variable-cycles.html.ini deleted file mode 100644 index 0cfacb1028b..00000000000 --- a/tests/wpt/metadata/css/css-variables/variable-cycles.html.ini +++ /dev/null @@ -1,33 +0,0 @@ -[variable-cycles.html] - [Self-cycle] - expected: FAIL - - [Simple a/b cycle] - expected: FAIL - - [Three-var cycle] - expected: FAIL - - [Cycle that starts in the middle of a chain] - expected: FAIL - - [Cycle with extra edge] - expected: FAIL - - [Cycle with extra edge (2)] - expected: FAIL - - [Cycle with extra edge (3)] - expected: FAIL - - [Cycle with secondary cycle] - expected: FAIL - - [Cycle with overlapping secondary cycle] - expected: FAIL - - [Cycle with deeper secondary cycle] - expected: FAIL - - [Cycle via fallback] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-variables/variables-substitute-guaranteed-invalid.html.ini b/tests/wpt/metadata/css/css-variables/variables-substitute-guaranteed-invalid.html.ini index bb401d84139..aa840ce33fb 100644 --- a/tests/wpt/metadata/css/css-variables/variables-substitute-guaranteed-invalid.html.ini +++ b/tests/wpt/metadata/css/css-variables/variables-substitute-guaranteed-invalid.html.ini @@ -1,19 +1,6 @@ [variables-substitute-guaranteed-invalid.html] - [Custom properties in a cycle are guaranteed-invalid] - expected: FAIL - - [A custom property referencing a cycle is treated as unset] - expected: FAIL - - [A custom property referencing a non-existent variable is treated as unset] - expected: FAIL - - [Custom properties in a cycle become guaranteed-invalid] - expected: FAIL - [A custom property referencing a cycle becomes guaranteed-invalid] expected: FAIL [A custom property referencing a non-existent variable becomes guaranteed-invalid] expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/HTMLImageElement-x-and-y-ignore-transforms.html.ini b/tests/wpt/metadata/css/cssom-view/HTMLImageElement-x-and-y-ignore-transforms.html.ini deleted file mode 100644 index a2796f56cbd..00000000000 --- a/tests/wpt/metadata/css/cssom-view/HTMLImageElement-x-and-y-ignore-transforms.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[HTMLImageElement-x-and-y-ignore-transforms.html] - [HTMLImageElement's 'x' and 'y' property values ignore transforms] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/background-change-during-smooth-scroll.html.ini b/tests/wpt/metadata/css/cssom-view/background-change-during-smooth-scroll.html.ini index b2e32b4e2dd..ea00ae5f7e3 100644 --- a/tests/wpt/metadata/css/cssom-view/background-change-during-smooth-scroll.html.ini +++ b/tests/wpt/metadata/css/cssom-view/background-change-during-smooth-scroll.html.ini @@ -1,5 +1,4 @@ [background-change-during-smooth-scroll.html] - expected: ERROR + expected: TIMEOUT [background change during smooth scroll] expected: NOTRUN - diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-simple.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-simple.html.ini index e5aa4da361a..8ee043a8df4 100644 --- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-simple.html.ini +++ b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-simple.html.ini @@ -1,19 +1,3 @@ [elementsFromPoint-simple.html] - [elementsFromPoint for each corner of a simple div] - expected: FAIL - [elementsFromPoint for each corner of a div that has a pseudo-element] expected: FAIL - - [elementsFromPoint for each corner of a div that is between another div and its pseudo-element] - expected: FAIL - - [elementsFromPoint for each corner of a div that has a margin] - expected: FAIL - - [elementsFromPoint for each corner of a div with pointer-events:none] - expected: FAIL - - [elementsFromPoint for each corner of a div with a 3d transform] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-table.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-table.html.ini index c5205b9a4e1..58c506c526e 100644 --- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-table.html.ini +++ b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-table.html.ini @@ -1,8 +1,9 @@ [elementsFromPoint-table.html] - expected: ERROR [elementsFromPoint for points inside table cells] expected: FAIL - [elementsFromPoint for points between table cells] + [elementsFromPoint for points inside cells in a right-to-left table] expected: FAIL + [elementsFromPoint for points inside cells in a flipped (writing-mode:vertical-lr) table] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/pt-to-px-width.html.ini b/tests/wpt/metadata/css/cssom-view/pt-to-px-width.html.ini deleted file mode 100644 index 51da590088f..00000000000 --- a/tests/wpt/metadata/css/cssom-view/pt-to-px-width.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pt-to-px-width.html] - [10pt converted to offset/client/scroll width] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/scroll-back-to-initial-position.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-back-to-initial-position.html.ini deleted file mode 100644 index 144fa4020bc..00000000000 --- a/tests/wpt/metadata/css/cssom-view/scroll-back-to-initial-position.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[scroll-back-to-initial-position.html] - [Element should scroll back to initial position with smooth behavior] - expected: FAIL - - [Element should scroll back to initial position with auto behavior] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-default-css.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-default-css.html.ini index d7c4db59af4..6885818c71a 100644 --- a/tests/wpt/metadata/css/cssom-view/scroll-behavior-default-css.html.ini +++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-default-css.html.ini @@ -1,5 +1,9 @@ [scroll-behavior-default-css.html] - expected: ERROR [Testing default value of scroll-behavior] expected: FAIL + [Instant scrolling of an element with default scroll-behavior] + expected: FAIL + + [Smooth scrolling of an element with default scroll-behavior] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-element.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-element.html.ini index 8b4fc5d7182..5d579f4716f 100644 --- a/tests/wpt/metadata/css/cssom-view/scroll-behavior-element.html.ini +++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-element.html.ini @@ -1,5 +1,114 @@ [scroll-behavior-element.html] - expected: ERROR [Testing scrollOptions' behavior for Element.scroll* and scroll-behavior on an element] expected: FAIL + [Element with auto scroll-behavior ; scroll() with default behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scroll() with auto behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scroll() with instant behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scroll() with smooth behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scroll() with default behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scroll() with auto behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scroll() with instant behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scroll() with smooth behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollTo() with default behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollTo() with auto behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollTo() with instant behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollTo() with smooth behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollTo() with default behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollTo() with auto behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollTo() with instant behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollTo() with smooth behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollBy() with default behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollBy() with auto behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollBy() with instant behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollBy() with smooth behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollBy() with default behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollBy() with auto behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollBy() with instant behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollBy() with smooth behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollIntoView() with default behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollIntoView() with auto behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollIntoView() with instant behavior] + expected: FAIL + + [Element with auto scroll-behavior ; scrollIntoView() with smooth behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollIntoView() with default behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollIntoView() with auto behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollIntoView() with instant behavior] + expected: FAIL + + [Element with smooth scroll-behavior ; scrollIntoView() with smooth behavior] + expected: FAIL + + [Set scrollLeft to element with auto scroll-behavior] + expected: FAIL + + [Set scrollLeft to element with smooth scroll-behavior] + expected: FAIL + + [Set scrollTop to element with auto scroll-behavior] + expected: FAIL + + [Set scrollTop to element with smooth scroll-behavior] + expected: FAIL + + [Aborting an ongoing smooth scrolling on an element with another smooth scrolling] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-main-frame-root.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-main-frame-root.html.ini index 3b5eabacdb3..782ade6c1b0 100644 --- a/tests/wpt/metadata/css/cssom-view/scroll-behavior-main-frame-root.html.ini +++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-main-frame-root.html.ini @@ -1,4 +1,114 @@ [scroll-behavior-main-frame-root.html] - [Page loaded] + [Main frame with auto scroll-behavior ; scroll() with default behavior] expected: FAIL + [Main frame with auto scroll-behavior ; scroll() with auto behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scroll() with instant behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scroll() with smooth behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scroll() with default behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scroll() with auto behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scroll() with instant behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scroll() with smooth behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollTo() with default behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollTo() with auto behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollTo() with instant behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollTo() with smooth behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollTo() with default behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollTo() with auto behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollTo() with instant behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollTo() with smooth behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollBy() with default behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollBy() with auto behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollBy() with instant behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollBy() with smooth behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollBy() with default behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollBy() with auto behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollBy() with instant behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollBy() with smooth behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollIntoView() with default behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollIntoView() with auto behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollIntoView() with instant behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollIntoView() with smooth behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollIntoView() with default behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollIntoView() with auto behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollIntoView() with instant behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollIntoView() with smooth behavior] + expected: FAIL + + [Set scrollLeft to frame with auto scroll-behavior] + expected: FAIL + + [Set scrollLeft to frame with smooth scroll-behavior] + expected: FAIL + + [Set scrollTop to frame with auto scroll-behavior] + expected: FAIL + + [Set scrollTop to frame with smooth scroll-behavior] + expected: FAIL + + [Aborting an ongoing smooth scrolling on the main frame with another smooth scrolling] + expected: FAIL + + [Aborting an ongoing smooth scrolling on the main frame with an instant scrolling] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-main-frame-window.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-main-frame-window.html.ini index eff693d13c7..d6929eec58d 100644 --- a/tests/wpt/metadata/css/cssom-view/scroll-behavior-main-frame-window.html.ini +++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-main-frame-window.html.ini @@ -1,4 +1,78 @@ [scroll-behavior-main-frame-window.html] - [Page loaded] + [Main frame with auto scroll-behavior ; scroll() with default behavior] expected: FAIL + [Main frame with auto scroll-behavior ; scroll() with auto behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scroll() with instant behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scroll() with smooth behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scroll() with default behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scroll() with auto behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scroll() with instant behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scroll() with smooth behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollTo() with default behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollTo() with auto behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollTo() with instant behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollTo() with smooth behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollTo() with default behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollTo() with auto behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollTo() with instant behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollTo() with smooth behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollBy() with default behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollBy() with auto behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollBy() with instant behavior] + expected: FAIL + + [Main frame with auto scroll-behavior ; scrollBy() with smooth behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollBy() with default behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollBy() with auto behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollBy() with instant behavior] + expected: FAIL + + [Main frame with smooth scroll-behavior ; scrollBy() with smooth behavior] + expected: FAIL + + [Aborting an ongoing smooth scrolling on the main frame with another smooth scrolling] + expected: FAIL + + [Aborting an ongoing smooth scrolling on the main frame with an instant scrolling] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini deleted file mode 100644 index 878ef5f68f8..00000000000 --- a/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[scroll-behavior-smooth-navigation.html] - expected: ERROR diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-subframe-root.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-subframe-root.html.ini index 3cc6a9cebd6..86d0de5045f 100644 --- a/tests/wpt/metadata/css/cssom-view/scroll-behavior-subframe-root.html.ini +++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-subframe-root.html.ini @@ -1,5 +1,114 @@ [scroll-behavior-subframe-root.html] - expected: ERROR - [iframe loaded] - expected: NOTRUN + [Subframe with auto scroll-behavior ; scroll() with default behavior] + expected: FAIL + [Subframe with auto scroll-behavior ; scroll() with auto behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scroll() with instant behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scroll() with smooth behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scroll() with default behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scroll() with auto behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scroll() with instant behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scroll() with smooth behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollTo() with default behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollTo() with auto behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollTo() with instant behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollTo() with smooth behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollTo() with default behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollTo() with auto behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollTo() with instant behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollTo() with smooth behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollBy() with default behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollBy() with auto behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollBy() with instant behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollBy() with smooth behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollBy() with default behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollBy() with auto behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollBy() with instant behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollBy() with smooth behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollIntoView() with default behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollIntoView() with auto behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollIntoView() with instant behavior] + expected: FAIL + + [Subframe with auto scroll-behavior ; scrollIntoView() with smooth behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollIntoView() with default behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollIntoView() with auto behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollIntoView() with instant behavior] + expected: FAIL + + [Subframe with smooth scroll-behavior ; scrollIntoView() with smooth behavior] + expected: FAIL + + [Subframe setting scrollLeft with auto scroll-behavior] + expected: FAIL + + [Subframe setting scrollLeft with smooth scroll-behavior] + expected: FAIL + + [Subframe setting scrollTop with auto scroll-behavior] + expected: FAIL + + [Subframe setting scrollTop with smooth scroll-behavior] + expected: FAIL + + [Aborting an ongoing smooth scrolling on a subframe with another smooth scrolling] + expected: FAIL + + [Aborting an ongoing smooth scrolling on a subframe with an instant scrolling] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom/CSSStyleSheet-modify-after-removal.html.ini b/tests/wpt/metadata/css/cssom/CSSStyleSheet-modify-after-removal.html.ini index dd01fab5f42..9e173013bcb 100644 --- a/tests/wpt/metadata/css/cssom/CSSStyleSheet-modify-after-removal.html.ini +++ b/tests/wpt/metadata/css/cssom/CSSStyleSheet-modify-after-removal.html.ini @@ -1,7 +1,3 @@ [CSSStyleSheet-modify-after-removal.html] - [Modify sheet from removed iframe] - expected: FAIL - [Modify constructed sheet from removed iframe] expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom/at-namespace.html.ini b/tests/wpt/metadata/css/cssom/at-namespace.html.ini deleted file mode 100644 index aa7d7d8d2b8..00000000000 --- a/tests/wpt/metadata/css/cssom/at-namespace.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[at-namespace.html] - [CSS Test: @namespace in CSSOM is not severely broken] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom/computed-style-002.html.ini b/tests/wpt/metadata/css/cssom/computed-style-002.html.ini deleted file mode 100644 index 4c77eab4ebb..00000000000 --- a/tests/wpt/metadata/css/cssom/computed-style-002.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[computed-style-002.html] - [Check that a percent width in an iframe is resolved against iframe width for getComputedStyle.] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom/computed-style-003.html.ini b/tests/wpt/metadata/css/cssom/computed-style-003.html.ini index 31e762a1b14..67491c15881 100644 --- a/tests/wpt/metadata/css/cssom/computed-style-003.html.ini +++ b/tests/wpt/metadata/css/cssom/computed-style-003.html.ini @@ -1,5 +1,6 @@ [computed-style-003.html] - expected: ERROR [CSS Test: getComputedStyle - resolved width in iframe dynamic display] expected: FAIL + [Check that a percent width in an iframe is the resolved width when the iframe is displayed.] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom/computed-style-004.html.ini b/tests/wpt/metadata/css/cssom/computed-style-004.html.ini index 4fd7fd29e54..88e9cf45440 100644 --- a/tests/wpt/metadata/css/cssom/computed-style-004.html.ini +++ b/tests/wpt/metadata/css/cssom/computed-style-004.html.ini @@ -1,5 +1,6 @@ [computed-style-004.html] - expected: ERROR [CSS Test: getComputedStyle - resolved width in nested iframes dynamic width] expected: FAIL + [Check that the resolved width of the inner div is affected by changing the width of outer iframe.] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom/font-variant-shorthand-serialization.html.ini b/tests/wpt/metadata/css/cssom/font-variant-shorthand-serialization.html.ini index 8d61b688935..c57b2ea605e 100644 --- a/tests/wpt/metadata/css/cssom/font-variant-shorthand-serialization.html.ini +++ b/tests/wpt/metadata/css/cssom/font-variant-shorthand-serialization.html.ini @@ -1,22 +1,15 @@ [font-variant-shorthand-serialization.html] - expected: ERROR - [font-variant: normal serialization] - expected: FAIL - [font-variant: none serialization] expected: FAIL [font-variant-ligatures: none serialization with non-default value for another longhand] expected: FAIL - [font-variant: normal with non-default longhands] - expected: NOTRUN - [CSS-wide keyword in one longhand] - expected: NOTRUN + expected: FAIL [CSS-wide keyword in shorthand] - expected: NOTRUN + expected: FAIL [font: menu serialization] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-001.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-001.html.ini index 66f3aeee8ae..7e1de882820 100644 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-001.html.ini +++ b/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-001.html.ini @@ -1,7 +1,3 @@ [getComputedStyle-display-none-001.html] - [getComputedStyle gets invalidated in display: none subtrees due to inherited changes to an ancestor] - expected: FAIL - [getComputedStyle gets invalidated in display: none subtrees due to inherited changes to an ancestor shadow host] expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-002.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-002.html.ini deleted file mode 100644 index 1a062cb51cd..00000000000 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-002.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[getComputedStyle-display-none-002.html] - [getComputedStyle gets invalidated in display: none subtrees due to rule matching changes] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-003.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-003.html.ini deleted file mode 100644 index 3e83ad11327..00000000000 --- a/tests/wpt/metadata/css/cssom/getComputedStyle-display-none-003.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[getComputedStyle-display-none-003.html] - [getComputedStyle gets invalidated in display: none subtrees due to attribute mutations] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom/preferred-stylesheet-reversed-order.html.ini b/tests/wpt/metadata/css/cssom/preferred-stylesheet-reversed-order.html.ini deleted file mode 100644 index 49369172fe9..00000000000 --- a/tests/wpt/metadata/css/cssom/preferred-stylesheet-reversed-order.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[preferred-stylesheet-reversed-order.html] - [Preferred stylesheet where insertion order is tree order] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/attribute-selectors/style-attribute-selector.html.ini b/tests/wpt/metadata/css/selectors/attribute-selectors/style-attribute-selector.html.ini deleted file mode 100644 index 1fcadf7682c..00000000000 --- a/tests/wpt/metadata/css/selectors/attribute-selectors/style-attribute-selector.html.ini +++ /dev/null @@ -1,34 +0,0 @@ -[style-attribute-selector.html] - [Match style attribute with no value] - expected: FAIL - - [Dynamically remove style with Element.style] - expected: FAIL - - [Match style attribute with empty value] - expected: FAIL - - [Dynamically change style with Element.style] - expected: FAIL - - [Dynamically change style with Element.style.property] - expected: FAIL - - [Match style attribute with background value] - expected: FAIL - - [Initially no style attribute to match] - expected: FAIL - - [Dynamically remove style with Element.style.removeProperty] - expected: FAIL - - [Dynamically change style with Element.setAttribute] - expected: FAIL - - [Dynamically remove style with Element.style.property] - expected: FAIL - - [Dynamically remove style with Element.removeAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/dir-selector-auto.html.ini b/tests/wpt/metadata/css/selectors/dir-selector-auto.html.ini index 559a57045fb..edd171ba352 100644 --- a/tests/wpt/metadata/css/selectors/dir-selector-auto.html.ini +++ b/tests/wpt/metadata/css/selectors/dir-selector-auto.html.ini @@ -1,2 +1,66 @@ [dir-selector-auto.html] - expected: ERROR + [Initial directionality of element div1 is ltr] + expected: FAIL + + [Initial directionality of element div1_1 is ltr] + expected: FAIL + + [Initial directionality of element div2 is rtl] + expected: FAIL + + [Initial directionality of element div2_1 is rtl] + expected: FAIL + + [Initial directionality of element div3 is ltr] + expected: FAIL + + [Initial directionality of element div3_1 is rtl] + expected: FAIL + + [Initial directionality of element div3_2 is ltr] + expected: FAIL + + [Initial directionality of element div4 is ltr] + expected: FAIL + + [Initial directionality of element div4_1 is ltr] + expected: FAIL + + [Initial directionality of element div4_1_1 is ltr] + expected: FAIL + + [Updated directionality of element div1 is rtl] + expected: FAIL + + [Updated directionality of element div1_1 is rtl] + expected: FAIL + + [Updated directionality of element div1 is ltr] + expected: FAIL + + [Updated directionality of element div1_1 is ltr] + expected: FAIL + + [Reupdated directionality of element div1 is ltr] + expected: FAIL + + [Reupdated directionality of element div1_1 is ltr] + expected: FAIL + + [Updated directionality of element div2 is ltr] + expected: FAIL + + [Updated directionality of element div3 is rtl] + expected: FAIL + + [Updated directionality of element div3 is ltr] + expected: FAIL + + [Updated directionality of element div4 is rtl] + expected: FAIL + + [Updated directionality of element div4_1 is rtl] + expected: FAIL + + [Updated directionality of element div4_1_1 is rtl] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/focus-visible-script-focus-001.html.ini b/tests/wpt/metadata/css/selectors/focus-visible-script-focus-001.html.ini index 690b38b26ae..e997b9b4c86 100644 --- a/tests/wpt/metadata/css/selectors/focus-visible-script-focus-001.html.ini +++ b/tests/wpt/metadata/css/selectors/focus-visible-script-focus-001.html.ini @@ -1,5 +1,4 @@ [focus-visible-script-focus-001.html] - expected: ERROR [":focus-visible" should be a valid selector] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/has-argument-with-explicit-scope.html.ini b/tests/wpt/metadata/css/selectors/has-argument-with-explicit-scope.html.ini index d194a085f7f..16368e935db 100644 --- a/tests/wpt/metadata/css/selectors/has-argument-with-explicit-scope.html.ini +++ b/tests/wpt/metadata/css/selectors/has-argument-with-explicit-scope.html.ini @@ -1,2 +1,39 @@ [has-argument-with-explicit-scope.html] - expected: ERROR + [:has(:scope) matches expected elements on scope1] + expected: FAIL + + [:has(:scope .c) matches expected elements on scope1] + expected: FAIL + + [:has(.a :scope) matches expected elements on scope1] + expected: FAIL + + [.a:has(:scope) .c matches expected elements on scope1] + expected: FAIL + + [.a:has(:scope) .c and :is(.a :scope .c) returns same elements on scope1] + expected: FAIL + + [.a:has(:scope) .c matches expected elements on scope2] + expected: FAIL + + [.a:has(:scope) .c and :is(.a :scope .c) returns same elements on scope2] + expected: FAIL + + [.c:has(:is(:scope .d)) matches expected elements on scope1] + expected: FAIL + + [.c:has(:is(:scope .d)) and :scope .c:has(.d) returns same elements on scope1] + expected: FAIL + + [.c:has(:is(:scope .d)) and .c:has(.d) returns same elements on scope1] + expected: FAIL + + [.c:has(:is(:scope .d)) matches expected elements on scope2] + expected: FAIL + + [.c:has(:is(:scope .d)) and :scope .c:has(.d) returns same elements on scope2] + expected: FAIL + + [.c:has(:is(:scope .d)) and .c:has(.d) returns same elements on scope2] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/has-basic.html.ini b/tests/wpt/metadata/css/selectors/has-basic.html.ini index ad3ee6266c7..29c8b54b88e 100644 --- a/tests/wpt/metadata/css/selectors/has-basic.html.ini +++ b/tests/wpt/metadata/css/selectors/has-basic.html.ini @@ -1,4 +1,54 @@ [has-basic.html] - expected: ERROR [:has(#a) matches expected elements] expected: FAIL + + [:has(.ancestor) matches expected elements] + expected: FAIL + + [:has(.target) matches expected elements] + expected: FAIL + + [:has(.descendant) matches expected elements] + expected: FAIL + + [.parent:has(.target) matches expected elements] + expected: FAIL + + [:has(.sibling ~ .target) matches expected elements] + expected: FAIL + + [.parent:has(.sibling ~ .target) matches expected elements] + expected: FAIL + + [:has(:is(.target ~ .sibling .descendant)) matches expected elements] + expected: FAIL + + [.parent:has(:is(.target ~ .sibling .descendant)) matches expected elements] + expected: FAIL + + [.sibling:has(.descendant) ~ .target matches expected elements] + expected: FAIL + + [:has(> .parent) matches expected elements] + expected: FAIL + + [:has(> .target) matches expected elements] + expected: FAIL + + [:has(> .parent, > .target) matches expected elements] + expected: FAIL + + [:has(+ #h) matches expected elements] + expected: FAIL + + [.parent:has(~ #h) matches expected elements] + expected: FAIL + + [.sibling:has(.descendant) matches expected element] + expected: FAIL + + [closest(.ancestor:has(.descendant)) returns expected element] + expected: FAIL + + [:has(.target ~ .sibling .descendant) matches expectedly] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/has-relative-argument.html.ini b/tests/wpt/metadata/css/selectors/has-relative-argument.html.ini index dcf90481787..c15ad8ae060 100644 --- a/tests/wpt/metadata/css/selectors/has-relative-argument.html.ini +++ b/tests/wpt/metadata/css/selectors/has-relative-argument.html.ini @@ -1,2 +1,105 @@ [has-relative-argument.html] - expected: ERROR + [.x:has(.a) matches expected elements] + expected: FAIL + + [.x:has(.a > .b) matches expected elements] + expected: FAIL + + [.x:has(.a .b) matches expected elements] + expected: FAIL + + [.x:has(.a + .b) matches expected elements] + expected: FAIL + + [.x:has(.a ~ .b) matches expected elements] + expected: FAIL + + [.x:has(> .a) matches expected elements] + expected: FAIL + + [.x:has(> .a > .b) matches expected elements] + expected: FAIL + + [.x:has(> .a .b) matches expected elements] + expected: FAIL + + [.x:has(> .a + .b) matches expected elements] + expected: FAIL + + [.x:has(> .a ~ .b) matches expected elements] + expected: FAIL + + [.x:has(+ .a) matches expected elements] + expected: FAIL + + [.x:has(+ .a > .b) matches expected elements] + expected: FAIL + + [.x:has(+ .a .b) matches expected elements] + expected: FAIL + + [.x:has(+ .a + .b) matches expected elements] + expected: FAIL + + [.x:has(+ .a ~ .b) matches expected elements] + expected: FAIL + + [.x:has(~ .a) matches expected elements] + expected: FAIL + + [.x:has(~ .a > .b) matches expected elements] + expected: FAIL + + [.x:has(~ .a .b) matches expected elements] + expected: FAIL + + [.x:has(~ .a + .b) matches expected elements] + expected: FAIL + + [.x:has(~ .a + .b > .c) matches expected elements] + expected: FAIL + + [.x:has(~ .a + .b .c) matches expected elements] + expected: FAIL + + [.x:has(.d .e) matches expected elements] + expected: FAIL + + [.x:has(.d .e) .f matches expected elements] + expected: FAIL + + [.x:has(> .d) matches expected elements] + expected: FAIL + + [.x:has(> .d) .f matches expected elements] + expected: FAIL + + [.x:has(~ .d ~ .e) matches expected elements] + expected: FAIL + + [.x:has(~ .d ~ .e) ~ .f matches expected elements] + expected: FAIL + + [.x:has(+ .d ~ .e) matches expected elements] + expected: FAIL + + [.x:has(+ .d ~ .e) ~ .f matches expected elements] + expected: FAIL + + [.y:has(> .g .h) matches expected elements] + expected: FAIL + + [.y:has(.g .h) matches expected elements] + expected: FAIL + + [.y:has(> .g .h) .i matches expected elements] + expected: FAIL + + [.y:has(.g .h) .i matches expected elements] + expected: FAIL + + [.d .x:has(.e) matches expected elements] + expected: FAIL + + [.d ~ .x:has(~ .e) matches expected elements] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/has-specificity.html.ini b/tests/wpt/metadata/css/selectors/has-specificity.html.ini index 890b698b1b3..513a62ca017 100644 --- a/tests/wpt/metadata/css/selectors/has-specificity.html.ini +++ b/tests/wpt/metadata/css/selectors/has-specificity.html.ini @@ -17,8 +17,5 @@ [:has(span, li, p) wins over :has(span, lo, p)] expected: FAIL - [latter .baz wins over :has(.foo)] - expected: FAIL - [latter :has(.foo) wins over .baz] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/i18n/lang-pseudo-class-disconnected.html.ini b/tests/wpt/metadata/css/selectors/i18n/lang-pseudo-class-disconnected.html.ini deleted file mode 100644 index b6f3dbe7731..00000000000 --- a/tests/wpt/metadata/css/selectors/i18n/lang-pseudo-class-disconnected.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[lang-pseudo-class-disconnected.html] - [:lang pseudo class should work in a disconnected subtree] - expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/attribute-or-elemental-selectors-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/attribute-or-elemental-selectors-in-has.html.ini index 1f864ab76bf..a192998bc8f 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/attribute-or-elemental-selectors-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/attribute-or-elemental-selectors-in-has.html.ini @@ -1,2 +1,39 @@ [attribute-or-elemental-selectors-in-has.html] - expected: ERROR + [add .child to #div_child: div#div_subject.color] + expected: FAIL + + [add .descendant to #div_child: div#div_subject.color] + expected: FAIL + + [add .descendant to #div_grandchild: div#div_subject.color] + expected: FAIL + + [set descendant to #div_grandchild[attrname\]: div#div_subject.color] + expected: FAIL + + [change #div_grandchild to #div_descendant: div#div_subject.color] + expected: FAIL + + [add descendant to #div_subject: div#div_subject.color] + expected: FAIL + + [add "div > descendant" to #div_subject: div#div_subject.color] + expected: FAIL + + [add div.child to #div_subject: div#div_subject.color] + expected: FAIL + + [add "div > div.descendant" to #div_subject: div#div_subject.color] + expected: FAIL + + [add div#div_descendant to #div_subject: div#div_subject.color] + expected: FAIL + + [add "div#div_descendant" to #div_subject: div#div_subject.color] + expected: FAIL + + [add div[attrname\] to #div_subject: div#div_subject.color] + expected: FAIL + + [add "div > div[attrname\]" to #div_subject: div#div_subject.color] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/attribute.html.ini b/tests/wpt/metadata/css/selectors/invalidation/attribute.html.ini deleted file mode 100644 index 10cbfce96cf..00000000000 --- a/tests/wpt/metadata/css/selectors/invalidation/attribute.html.ini +++ /dev/null @@ -1,19 +0,0 @@ -[attribute.html] - [.class selector is effective] - expected: FAIL - - [[att\] selector is effective] - expected: FAIL - - [[att|=val\] selector is effective] - expected: FAIL - - [[att=val\] selector is effective] - expected: FAIL - - [[att~=val\] selector is effective] - expected: FAIL - - [#id selector is effective] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/invalidation/child-indexed-pseudo-classes-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/child-indexed-pseudo-classes-in-has.html.ini index 285388ec4ff..4ff336cd404 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/child-indexed-pseudo-classes-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/child-indexed-pseudo-classes-in-has.html.ini @@ -1,19 +1,81 @@ [child-indexed-pseudo-classes-in-has.html] - expected: ERROR - [Initial colors: #only_child] + [Prepend #div1.green: #only_child] expected: FAIL - [Initial colors: #first_child] + [Prepend #div1.green: #first_child] expected: FAIL - [Initial colors: #last_child] + [Prepend #div1.green: #last_child] expected: FAIL - [Initial colors: #nth_child_3n_1] + [Prepend #div1.green: #nth_child_3n_1] expected: FAIL - [Initial colors: #nth_child_3n_2] + [Prepend #div2.yellow: #first_child] expected: FAIL - [Initial colors: #nth_child_3n] + [Prepend #div2.yellow: #last_child] + expected: FAIL + + [Prepend #div2.yellow: #nth_child_3n_1] + expected: FAIL + + [Prepend #div2.yellow: #nth_child_3n_2] + expected: FAIL + + [Prepend #div3.orange: #first_child] + expected: FAIL + + [Prepend #div3.orange: #last_child] + expected: FAIL + + [Prepend #div3.orange: #nth_child_3n_1] + expected: FAIL + + [Prepend #div3.orange: #nth_child_3n_2] + expected: FAIL + + [Prepend #div3.orange: #nth_child_3n] + expected: FAIL + + [Prepend #div4: #last_child] + expected: FAIL + + [Prepend #div4: #nth_child_3n_1] + expected: FAIL + + [Prepend #div4: #nth_child_3n_2] + expected: FAIL + + [Prepend #div4: #nth_child_3n] + expected: FAIL + + [Prepend #div5: #last_child] + expected: FAIL + + [Prepend #div5: #nth_child_3n_1] + expected: FAIL + + [Prepend #div5: #nth_child_3n_2] + expected: FAIL + + [Prepend #div5: #nth_child_3n] + expected: FAIL + + [Remove #div1: #last_child] + expected: FAIL + + [Remove #div1: #nth_child_3n_1] + expected: FAIL + + [Remove #div1: #nth_child_3n] + expected: FAIL + + [Remove #div2: #last_child] + expected: FAIL + + [Remove #div2: #nth_child_3n] + expected: FAIL + + [Remove #div4: #only_child] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/class-id-attr.html.ini b/tests/wpt/metadata/css/selectors/invalidation/class-id-attr.html.ini deleted file mode 100644 index 1a48863a258..00000000000 --- a/tests/wpt/metadata/css/selectors/invalidation/class-id-attr.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[class-id-attr.html] - expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/defined.html.ini b/tests/wpt/metadata/css/selectors/invalidation/defined.html.ini deleted file mode 100644 index da18184b91f..00000000000 --- a/tests/wpt/metadata/css/selectors/invalidation/defined.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[defined.html] - [:defined selector is effective] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/invalidation/dir-pseudo-class-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/dir-pseudo-class-in-has.html.ini index 3e4772dfde2..94a862a94eb 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/dir-pseudo-class-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/dir-pseudo-class-in-has.html.ini @@ -1,2 +1,2 @@ [dir-pseudo-class-in-has.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/empty-pseudo-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/empty-pseudo-in-has.html.ini index 635f2e4f227..f98c5d0c507 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/empty-pseudo-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/empty-pseudo-in-has.html.ini @@ -1,4 +1,6 @@ [empty-pseudo-in-has.html] - expected: ERROR - [Empty #subject] + [Insert div#child to #subject] + expected: FAIL + + [Insert div to div.#child] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-complexity.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-complexity.html.ini index e3fef98b2e6..76890edbf53 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-complexity.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-complexity.html.ini @@ -1,4 +1,4 @@ [has-complexity.html] - expected: ERROR + expected: TIMEOUT [Before appending 25000 elements] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-in-adjacent-position.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-in-adjacent-position.html.ini index a67c925655c..4b8cf7c695f 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-in-adjacent-position.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-in-adjacent-position.html.ini @@ -1,4 +1,306 @@ [has-in-adjacent-position.html] - expected: ERROR - [Initial color] + [add .test to previous_sibling_child] + expected: FAIL + + [add .test to previous_sibling_descendant] + expected: FAIL + + [add .test to subject] + expected: FAIL + + [add .test to next_sibling] + expected: FAIL + + [add .test to next_sibling_child] + expected: FAIL + + [add .test to next_sibling_descendant] + expected: FAIL + + [insert element div.test before previous_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted before previous_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again before previous_sibling_child] + expected: FAIL + + [insert element div[test_attr\] before previous_sibling_child] + expected: FAIL + + [insert element div.test before previous_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted before previous_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again before previous_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] before previous_sibling_descendant] + expected: FAIL + + [insert element div.test before next_sibling] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling] + expected: FAIL + + [insert element div[test_attr\] before next_sibling] + expected: FAIL + + [insert element div.test before next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling_child] + expected: FAIL + + [insert element div[test_attr\] before next_sibling_child] + expected: FAIL + + [insert element div.test before next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] before next_sibling_descendant] + expected: FAIL + + [insert element div.test after previous_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted after previous_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again after previous_sibling_child] + expected: FAIL + + [insert element div[test_attr\] after previous_sibling_child] + expected: FAIL + + [insert element div.test after previous_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted after previous_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again after previous_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] after previous_sibling_descendant] + expected: FAIL + + [insert element div.test after subject] + expected: FAIL + + [add the class 'test' again to the element inserted after subject] + expected: FAIL + + [add the class 'test' to the element inserted again after subject] + expected: FAIL + + [insert element div[test_attr\] after subject] + expected: FAIL + + [insert element div.test after next_sibling] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling] + expected: FAIL + + [insert element div[test_attr\] after next_sibling] + expected: FAIL + + [insert element div.test after next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling_child] + expected: FAIL + + [insert element div[test_attr\] after next_sibling_child] + expected: FAIL + + [insert element div.test after next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] after next_sibling_descendant] + expected: FAIL + + [insert tree div>div.test before previous_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before previous_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before previous_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] before previous_sibling_child] + expected: FAIL + + [insert tree div>div.test before previous_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before previous_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before previous_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] before previous_sibling_descendant] + expected: FAIL + + [insert tree div>div.test before subject] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject] + expected: FAIL + + [insert element div>div[test_attr\] before subject] + expected: FAIL + + [insert tree div>div.test before next_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling] + expected: FAIL + + [insert tree div>div.test before next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling_child] + expected: FAIL + + [insert tree div>div.test before next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling_descendant] + expected: FAIL + + [insert tree div>div.test after previous_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after previous_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after previous_sibling] + expected: FAIL + + [insert element div>div[test_attr\] after previous_sibling] + expected: FAIL + + [insert tree div>div.test after previous_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after previous_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after previous_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] after previous_sibling_child] + expected: FAIL + + [insert tree div>div.test after previous_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after previous_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after previous_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] after previous_sibling_descendant] + expected: FAIL + + [insert tree div>div.test after subject] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject] + expected: FAIL + + [insert element div>div[test_attr\] after subject] + expected: FAIL + + [insert tree div>div.test after next_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling] + expected: FAIL + + [insert tree div>div.test after next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling_child] + expected: FAIL + + [insert tree div>div.test after next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling_descendant] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-in-ancestor-position.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-in-ancestor-position.html.ini index 4432b92f9e7..3182454b803 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-in-ancestor-position.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-in-ancestor-position.html.ini @@ -1,4 +1,381 @@ [has-in-ancestor-position.html] - expected: ERROR - [Initial color] + [add .test to subject_parent] + expected: FAIL + + [add .test to subject] + expected: FAIL + + [add .test to subject_child] + expected: FAIL + + [add .test to subject_descendant] + expected: FAIL + + [add .test to next_sibling] + expected: FAIL + + [add .test to next_sibling_child] + expected: FAIL + + [add .test to next_sibling_descendant] + expected: FAIL + + [insert element div.test before subject_parent] + expected: FAIL + + [add the class 'test' again to the element inserted before subject_parent] + expected: FAIL + + [add the class 'test' to the element inserted again before subject_parent] + expected: FAIL + + [insert element div[test_attr\] before subject_parent] + expected: FAIL + + [insert element div.test before subject] + expected: FAIL + + [add the class 'test' again to the element inserted before subject] + expected: FAIL + + [add the class 'test' to the element inserted again before subject] + expected: FAIL + + [insert element div[test_attr\] before subject] + expected: FAIL + + [insert element div.test before subject_child] + expected: FAIL + + [add the class 'test' again to the element inserted before subject_child] + expected: FAIL + + [add the class 'test' to the element inserted again before subject_child] + expected: FAIL + + [insert element div[test_attr\] before subject_child] + expected: FAIL + + [insert element div.test before subject_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted before subject_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again before subject_descendant] + expected: FAIL + + [insert element div[test_attr\] before subject_descendant] + expected: FAIL + + [insert element div.test before next_sibling] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling] + expected: FAIL + + [insert element div[test_attr\] before next_sibling] + expected: FAIL + + [insert element div.test before next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling_child] + expected: FAIL + + [insert element div[test_attr\] before next_sibling_child] + expected: FAIL + + [insert element div.test before next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] before next_sibling_descendant] + expected: FAIL + + [insert element div.test after subject_ancestor] + expected: FAIL + + [add the class 'test' again to the element inserted after subject_ancestor] + expected: FAIL + + [add the class 'test' to the element inserted again after subject_ancestor] + expected: FAIL + + [insert element div[test_attr\] after subject_ancestor] + expected: FAIL + + [insert element div.test after subject_parent] + expected: FAIL + + [add the class 'test' again to the element inserted after subject_parent] + expected: FAIL + + [add the class 'test' to the element inserted again after subject_parent] + expected: FAIL + + [insert element div[test_attr\] after subject_parent] + expected: FAIL + + [insert element div.test after subject] + expected: FAIL + + [add the class 'test' again to the element inserted after subject] + expected: FAIL + + [add the class 'test' to the element inserted again after subject] + expected: FAIL + + [insert element div[test_attr\] after subject] + expected: FAIL + + [insert element div.test after subject_child] + expected: FAIL + + [add the class 'test' again to the element inserted after subject_child] + expected: FAIL + + [add the class 'test' to the element inserted again after subject_child] + expected: FAIL + + [insert element div[test_attr\] after subject_child] + expected: FAIL + + [insert element div.test after subject_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted after subject_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again after subject_descendant] + expected: FAIL + + [insert element div[test_attr\] after subject_descendant] + expected: FAIL + + [insert element div.test after next_sibling] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling] + expected: FAIL + + [insert element div[test_attr\] after next_sibling] + expected: FAIL + + [insert element div.test after next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling_child] + expected: FAIL + + [insert element div[test_attr\] after next_sibling_child] + expected: FAIL + + [insert element div.test after next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] after next_sibling_descendant] + expected: FAIL + + [insert tree div>div.test before subject_parent] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject_parent] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject_parent] + expected: FAIL + + [insert element div>div[test_attr\] before subject_parent] + expected: FAIL + + [insert tree div>div.test before subject] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject] + expected: FAIL + + [insert element div>div[test_attr\] before subject] + expected: FAIL + + [insert tree div>div.test before subject_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject_child] + expected: FAIL + + [insert element div>div[test_attr\] before subject_child] + expected: FAIL + + [insert tree div>div.test before subject_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject_descendant] + expected: FAIL + + [insert element div>div[test_attr\] before subject_descendant] + expected: FAIL + + [insert tree div>div.test before next_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling] + expected: FAIL + + [insert tree div>div.test before next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling_child] + expected: FAIL + + [insert tree div>div.test before next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling_descendant] + expected: FAIL + + [insert tree div>div.test after subject_ancestor] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject_ancestor] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject_ancestor] + expected: FAIL + + [insert element div>div[test_attr\] after subject_ancestor] + expected: FAIL + + [insert tree div>div.test after subject_parent] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject_parent] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject_parent] + expected: FAIL + + [insert element div>div[test_attr\] after subject_parent] + expected: FAIL + + [insert tree div>div.test after subject] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject] + expected: FAIL + + [insert element div>div[test_attr\] after subject] + expected: FAIL + + [insert tree div>div.test after subject_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject_child] + expected: FAIL + + [insert element div>div[test_attr\] after subject_child] + expected: FAIL + + [insert tree div>div.test after subject_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject_descendant] + expected: FAIL + + [insert element div>div[test_attr\] after subject_descendant] + expected: FAIL + + [insert tree div>div.test after next_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling] + expected: FAIL + + [insert tree div>div.test after next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling_child] + expected: FAIL + + [insert tree div>div.test after next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling_descendant] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-in-parent-position.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-in-parent-position.html.ini index f4767d2d713..b7352f619aa 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-in-parent-position.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-in-parent-position.html.ini @@ -1,4 +1,177 @@ [has-in-parent-position.html] - expected: ERROR - [Initial color] + [add .test to subject] + expected: FAIL + + [add .test to subject_child] + expected: FAIL + + [add .test to subject_descendant] + expected: FAIL + + [insert element div.test before subject] + expected: FAIL + + [add the class 'test' again to the element inserted before subject] + expected: FAIL + + [add the class 'test' to the element inserted again before subject] + expected: FAIL + + [insert element div[test_attr\] before subject] + expected: FAIL + + [insert element div.test before subject_child] + expected: FAIL + + [add the class 'test' again to the element inserted before subject_child] + expected: FAIL + + [add the class 'test' to the element inserted again before subject_child] + expected: FAIL + + [insert element div[test_attr\] before subject_child] + expected: FAIL + + [insert element div.test before subject_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted before subject_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again before subject_descendant] + expected: FAIL + + [insert element div[test_attr\] before subject_descendant] + expected: FAIL + + [insert element div.test after subject_parent] + expected: FAIL + + [add the class 'test' again to the element inserted after subject_parent] + expected: FAIL + + [add the class 'test' to the element inserted again after subject_parent] + expected: FAIL + + [insert element div[test_attr\] after subject_parent] + expected: FAIL + + [insert element div.test after subject] + expected: FAIL + + [add the class 'test' again to the element inserted after subject] + expected: FAIL + + [add the class 'test' to the element inserted again after subject] + expected: FAIL + + [insert element div[test_attr\] after subject] + expected: FAIL + + [insert element div.test after subject_child] + expected: FAIL + + [add the class 'test' again to the element inserted after subject_child] + expected: FAIL + + [add the class 'test' to the element inserted again after subject_child] + expected: FAIL + + [insert element div[test_attr\] after subject_child] + expected: FAIL + + [insert element div.test after subject_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted after subject_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again after subject_descendant] + expected: FAIL + + [insert element div[test_attr\] after subject_descendant] + expected: FAIL + + [insert tree div>div.test before subject] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject] + expected: FAIL + + [insert element div>div[test_attr\] before subject] + expected: FAIL + + [insert tree div>div.test before subject_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject_child] + expected: FAIL + + [insert element div>div[test_attr\] before subject_child] + expected: FAIL + + [insert tree div>div.test before subject_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject_descendant] + expected: FAIL + + [insert element div>div[test_attr\] before subject_descendant] + expected: FAIL + + [insert tree div>div.test after subject_parent] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject_parent] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject_parent] + expected: FAIL + + [insert element div>div[test_attr\] after subject_parent] + expected: FAIL + + [insert tree div>div.test after subject] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject] + expected: FAIL + + [insert element div>div[test_attr\] after subject] + expected: FAIL + + [insert tree div>div.test after subject_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject_child] + expected: FAIL + + [insert element div>div[test_attr\] after subject_child] + expected: FAIL + + [insert tree div>div.test after subject_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject_descendant] + expected: FAIL + + [insert element div>div[test_attr\] after subject_descendant] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-in-sibling-position.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-in-sibling-position.html.ini index ca628c97fe4..3622ed74603 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-in-sibling-position.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-in-sibling-position.html.ini @@ -1,4 +1,342 @@ [has-in-sibling-position.html] - expected: ERROR - [Initial color] + [add .test to previous_sibling_child] + expected: FAIL + + [add .test to previous_sibling_descendant] + expected: FAIL + + [add .test to subject] + expected: FAIL + + [add .test to next_sibling] + expected: FAIL + + [add .test to next_sibling_child] + expected: FAIL + + [add .test to next_sibling_descendant] + expected: FAIL + + [insert element div.test before previous_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted before previous_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again before previous_sibling_child] + expected: FAIL + + [insert element div[test_attr\] before previous_sibling_child] + expected: FAIL + + [insert element div.test before previous_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted before previous_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again before previous_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] before previous_sibling_descendant] + expected: FAIL + + [insert element div.test before subject] + expected: FAIL + + [add the class 'test' again to the element inserted before subject] + expected: FAIL + + [add the class 'test' to the element inserted again before subject] + expected: FAIL + + [insert element div[test_attr\] before subject] + expected: FAIL + + [insert element div.test before next_sibling] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling] + expected: FAIL + + [insert element div[test_attr\] before next_sibling] + expected: FAIL + + [insert element div.test before next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling_child] + expected: FAIL + + [insert element div[test_attr\] before next_sibling_child] + expected: FAIL + + [insert element div.test before next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted before next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again before next_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] before next_sibling_descendant] + expected: FAIL + + [insert element div.test after previous_sibling] + expected: FAIL + + [add the class 'test' again to the element inserted after previous_sibling] + expected: FAIL + + [add the class 'test' to the element inserted again after previous_sibling] + expected: FAIL + + [insert element div[test_attr\] after previous_sibling] + expected: FAIL + + [insert element div.test after previous_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted after previous_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again after previous_sibling_child] + expected: FAIL + + [insert element div[test_attr\] after previous_sibling_child] + expected: FAIL + + [insert element div.test after previous_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted after previous_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again after previous_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] after previous_sibling_descendant] + expected: FAIL + + [insert element div.test after subject] + expected: FAIL + + [add the class 'test' again to the element inserted after subject] + expected: FAIL + + [add the class 'test' to the element inserted again after subject] + expected: FAIL + + [insert element div[test_attr\] after subject] + expected: FAIL + + [insert element div.test after next_sibling] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling] + expected: FAIL + + [insert element div[test_attr\] after next_sibling] + expected: FAIL + + [insert element div.test after next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling_child] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling_child] + expected: FAIL + + [insert element div[test_attr\] after next_sibling_child] + expected: FAIL + + [insert element div.test after next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element inserted after next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element inserted again after next_sibling_descendant] + expected: FAIL + + [insert element div[test_attr\] after next_sibling_descendant] + expected: FAIL + + [insert tree div>div.test before previous_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before previous_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before previous_sibling] + expected: FAIL + + [insert element div>div[test_attr\] before previous_sibling] + expected: FAIL + + [insert tree div>div.test before previous_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before previous_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before previous_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] before previous_sibling_child] + expected: FAIL + + [insert tree div>div.test before previous_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before previous_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before previous_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] before previous_sibling_descendant] + expected: FAIL + + [insert tree div>div.test before subject] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before subject] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before subject] + expected: FAIL + + [insert element div>div[test_attr\] before subject] + expected: FAIL + + [insert tree div>div.test before next_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling] + expected: FAIL + + [insert tree div>div.test before next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling_child] + expected: FAIL + + [insert tree div>div.test before next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted before next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again before next_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] before next_sibling_descendant] + expected: FAIL + + [insert tree div>div.test after previous_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after previous_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after previous_sibling] + expected: FAIL + + [insert element div>div[test_attr\] after previous_sibling] + expected: FAIL + + [insert tree div>div.test after previous_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after previous_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after previous_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] after previous_sibling_child] + expected: FAIL + + [insert tree div>div.test after previous_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after previous_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after previous_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] after previous_sibling_descendant] + expected: FAIL + + [insert tree div>div.test after subject] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after subject] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after subject] + expected: FAIL + + [insert element div>div[test_attr\] after subject] + expected: FAIL + + [insert tree div>div.test after next_sibling] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling] + expected: FAIL + + [insert tree div>div.test after next_sibling_child] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling_child] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling_child] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling_child] + expected: FAIL + + [insert tree div>div.test after next_sibling_descendant] + expected: FAIL + + [add the class 'test' again to the element in the tree inserted after next_sibling_descendant] + expected: FAIL + + [add the class 'test' to the element in the tree inserted again after next_sibling_descendant] + expected: FAIL + + [insert element div>div[test_attr\] after next_sibling_descendant] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-invalidation-after-removing-non-first-element.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-invalidation-after-removing-non-first-element.html.ini index 9967405d400..03921051e78 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-invalidation-after-removing-non-first-element.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-invalidation-after-removing-non-first-element.html.ini @@ -1,2 +1,3 @@ [has-invalidation-after-removing-non-first-element.html] - expected: ERROR + [initial_color: div#subject.color] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-invalidation-for-wiping-an-element.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-invalidation-for-wiping-an-element.html.ini index e5dac71de8e..45884afd2a6 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-invalidation-for-wiping-an-element.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-invalidation-for-wiping-an-element.html.ini @@ -1,2 +1,6 @@ [has-invalidation-for-wiping-an-element.html] - expected: ERROR + [color after inserting text and div > .descendant: div#subject.color] + expected: FAIL + + [color after inserting text and #child > .descendant: div#subject.color] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-sibling.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-sibling.html.ini index 17ee98adef4..debf654a0f8 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-sibling.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-sibling.html.ini @@ -1,4 +1,105 @@ [has-sibling.html] - expected: ERROR - [initial_color] + [add .test to first_sibling] + expected: FAIL + + [add .test to second_sibling] + expected: FAIL + + [add .test to third_sibling] + expected: FAIL + + [add .test to first_sibling_child] + expected: FAIL + + [add .test to first_sibling_descendant] + expected: FAIL + + [add .test to third_sibling_child] + expected: FAIL + + [add .test to third_sibling_descendant] + expected: FAIL + + [insert element div.test before first_sibling] + expected: FAIL + + [insert element div.test before second_sibling] + expected: FAIL + + [insert element div.test before third_sibling] + expected: FAIL + + [insert element div.test before first_sibling_child] + expected: FAIL + + [insert element div.test before first_sibling_descendant] + expected: FAIL + + [insert element div.test before third_sibling_child] + expected: FAIL + + [insert element div.test before third_sibling_descendant] + expected: FAIL + + [insert element div.test after first_sibling] + expected: FAIL + + [insert element div.test after second_sibling] + expected: FAIL + + [insert element div.test after third_sibling] + expected: FAIL + + [insert element div.test after first_sibling_child] + expected: FAIL + + [insert element div.test after first_sibling_descendant] + expected: FAIL + + [insert element div.test after third_sibling_child] + expected: FAIL + + [insert element div.test after third_sibling_descendant] + expected: FAIL + + [insert tree div>div.test before first_sibling] + expected: FAIL + + [insert tree div>div.test before second_sibling] + expected: FAIL + + [insert tree div>div.test before third_sibling] + expected: FAIL + + [insert tree div>div.test before first_sibling_child] + expected: FAIL + + [insert tree div>div.test before first_sibling_descendant] + expected: FAIL + + [insert tree div>div.test before third_sibling_child] + expected: FAIL + + [insert tree div>div.test before third_sibling_descendant] + expected: FAIL + + [insert tree div>div.test after first_sibling] + expected: FAIL + + [insert tree div>div.test after second_sibling] + expected: FAIL + + [insert tree div>div.test after third_sibling] + expected: FAIL + + [insert tree div>div.test after first_sibling_child] + expected: FAIL + + [insert tree div>div.test after first_sibling_descendant] + expected: FAIL + + [insert tree div>div.test after third_sibling_child] + expected: FAIL + + [insert tree div>div.test after third_sibling_descendant] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-with-not.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-with-not.html.ini index 5be88b882c6..cb3ceafbd17 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-with-not.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-with-not.html.ini @@ -1,4 +1,30 @@ [has-with-not.html] - expected: ERROR - [Initial color] + [remove .test to subject_child] + expected: FAIL + + [remove .test to subject_descendant] + expected: FAIL + + [insert element div before subject_child] + expected: FAIL + + [insert element div before subject_descendant] + expected: FAIL + + [insert element div after subject_child] + expected: FAIL + + [insert element div after subject_descendant] + expected: FAIL + + [insert tree div>div before subject_child] + expected: FAIL + + [insert tree div>div before subject_descendant] + expected: FAIL + + [insert tree div.test after subject_child] + expected: FAIL + + [insert tree div.test after subject_descendant] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/has-with-pseudo-class.html.ini b/tests/wpt/metadata/css/selectors/invalidation/has-with-pseudo-class.html.ini index 0e6be03068e..5ff2a1dd64f 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/has-with-pseudo-class.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/has-with-pseudo-class.html.ini @@ -1,2 +1,10 @@ [has-with-pseudo-class.html] expected: ERROR + [Before set checked on checkbox, testing subject] + expected: FAIL + + [Set checked on checkbox, testing subject] + expected: FAIL + + [Unset checked on checkbox, testing subject] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/input-pseudo-classes-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/input-pseudo-classes-in-has.html.ini index bf3da3b2871..b0a26dc9513 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/input-pseudo-classes-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/input-pseudo-classes-in-has.html.ini @@ -1,28 +1,27 @@ [input-pseudo-classes-in-has.html] - expected: ERROR [:checked & :indeterminate invalidation on ] expected: FAIL [:indeterminate invalidation on ] - expected: NOTRUN + expected: FAIL [:disabled invalidation] - expected: NOTRUN + expected: FAIL [:read-only invalidation] - expected: NOTRUN + expected: FAIL [:valid invalidation] - expected: NOTRUN + expected: FAIL [:default invalidation with input[type=radio\]] - expected: NOTRUN + expected: FAIL [:required invalidation] - expected: NOTRUN + expected: FAIL [:out-of-range invalidation] - expected: NOTRUN + expected: FAIL [:placeholder-shown invalidation] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/is-pseudo-containing-complex-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/is-pseudo-containing-complex-in-has.html.ini index cd64a69752c..25b95075f5b 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/is-pseudo-containing-complex-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/is-pseudo-containing-complex-in-has.html.ini @@ -1,2 +1,1008 @@ [is-pseudo-containing-complex-in-has.html] - expected: ERROR + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #has_scope.classList.add('red') : check matches (false)] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #parent.classList.add('a_has_scope') : check matches (true)] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #parent.classList.add('a_has_scope') : check #has_scope color] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #parent.classList.remove('a_has_scope') : check matches (false)] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #has_scope.classList.add('a_has_scope') : check matches (true)] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #has_scope.classList.add('a_has_scope') : check #has_scope color] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #has_scope.classList.remove('a_has_scope') : check matches (false)] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #child.classList.add('a_has_scope') : check matches (true)] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #child.classList.add('a_has_scope') : check #has_scope color] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #child.classList.remove('a_has_scope') : check matches (false)] + expected: FAIL + + [[ .red:has(#descendant:is(.a_has_scope .b)) \] #has_scope.classList.remove('red') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #has_scope.classList.add('orangered') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #parent.classList.add('a_descendant') : check matches (true)] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #parent.classList.add('a_descendant') : check #descendant color] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #parent.classList.remove('a_descendant') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #has_scope.classList.add('a_descendant') : check matches (true)] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #has_scope.classList.add('a_descendant') : check #descendant color] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #has_scope.classList.remove('a_descendant') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #child.classList.add('a_descendant') : check matches (true)] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #child.classList.add('a_descendant') : check #descendant color] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #child.classList.remove('a_descendant') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:is(.a_descendant .b)) #descendant \] #has_scope.classList.remove('orangered') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.add('darkred') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #parent.classList.add('a_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #parent.classList.add('a_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #parent.classList.remove('a_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.add('a_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.add('a_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.remove('a_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #child.classList.add('a_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #child.classList.add('a_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #child.classList.remove('a_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.remove('darkred') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('pink') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #parent.classList.add('a_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #parent.classList.add('a_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #parent.classList.remove('a_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('a_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('a_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('a_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #child.classList.add('a_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #child.classList.add('a_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #child.classList.remove('a_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('pink') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #has_scope.classList.add('green') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #parent_previous.classList.add('c_has_scope') : check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #parent_previous.classList.add('c_has_scope') : check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #parent_previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #parent_previous.classList.remove('c_has_scope') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #parent_previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #previous.classList.add('c_has_scope') : check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #previous.classList.add('c_has_scope') : check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #previous.classList.remove('c_has_scope') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #child_previous.classList.add('c_has_scope') : check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #child_previous.classList.add('c_has_scope') : check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #child_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #child_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #child_previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #child_previous.classList.remove('c_has_scope') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #child_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #child_previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #child_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) \] #has_scope.classList.remove('green') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #has_scope.classList.add('lightgreen') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #parent_previous.classList.add('c_descendant') : check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #parent_previous.classList.add('c_descendant') : check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #parent_previous) : (removal) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #parent_previous.classList.remove('c_descendant') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #parent_previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #previous.classList.add('c_descendant') : check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #previous.classList.add('c_descendant') : check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #previous) : (removal) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #previous.classList.remove('c_descendant') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #child_previous.classList.add('c_descendant') : check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #child_previous.classList.add('c_descendant') : check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #child_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #child_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #child_previous) : (removal) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #child_previous.classList.remove('c_descendant') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #child_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #child_previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #child_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant \] #has_scope.classList.remove('lightgreen') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #has_scope.classList.add('darkgreen') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #parent_previous.classList.add('c_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #parent_previous.classList.add('c_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #parent_previous.classList.remove('c_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #parent_previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #previous.classList.add('c_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #previous.classList.add('c_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #previous.classList.remove('c_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #child_previous.classList.add('c_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #child_previous.classList.add('c_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #child_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #child_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #child_previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #child_previous.classList.remove('c_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #child_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #child_previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #child_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #has_scope.classList.remove('darkgreen') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('yellowgreen') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.add('c_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.add('c_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.remove('c_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #parent_previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #previous.classList.add('c_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #previous.classList.add('c_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #previous.classList.remove('c_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #child_previous.classList.add('c_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #child_previous.classList.add('c_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #child_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #child_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #child_previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #child_previous.classList.remove('c_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #child_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #child_previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #child_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('yellowgreen') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #has_scope.classList.add('blue') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #previous.classList.add('f_has_scope') : check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #previous.classList.add('f_has_scope') : check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .invalid before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .invalid before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .invalid before #previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #previous.classList.remove('f_has_scope') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #has_scope.classList.add('f_has_scope') : check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #has_scope.classList.add('f_has_scope') : check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #has_scope.classList.remove('f_has_scope') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #direct_next.classList.add('f_has_scope') : check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #direct_next.classList.add('f_has_scope') : check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .invalid before #direct_next) : (insertion) check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .invalid before #direct_next) : (removal) check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .invalid before #direct_next) : (removal) check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #direct_next.classList.remove('f_has_scope') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #direct_next) : (insertion) check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #direct_next) : (insertion) check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #direct_next) : (removal) check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) \] #has_scope.classList.remove('blue') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.add('skyblue') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #previous.classList.add('f_descendant') : check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #previous.classList.add('f_descendant') : check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .invalid before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .invalid before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .invalid before #previous) : (removal) check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #previous.classList.remove('f_descendant') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.add('f_descendant') : check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.add('f_descendant') : check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.remove('f_descendant') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #direct_next.classList.add('f_descendant') : check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #direct_next.classList.add('f_descendant') : check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .invalid before #direct_next) : (insertion) check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .invalid before #direct_next) : (removal) check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .invalid before #direct_next) : (removal) check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #direct_next.classList.remove('f_descendant') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #direct_next) : (insertion) check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #direct_next) : (insertion) check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #direct_next) : (removal) check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.remove('skyblue') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.add('lightblue') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #previous.classList.add('f_indirect_next') : check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #previous.classList.add('f_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #previous.classList.remove('f_indirect_next') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.add('f_indirect_next') : check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.add('f_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.remove('f_indirect_next') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #direct_next.classList.add('f_indirect_next') : check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #direct_next.classList.add('f_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #direct_next) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #direct_next) : (removal) check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #direct_next) : (removal) check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #direct_next.classList.remove('f_indirect_next') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #direct_next) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #direct_next) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #direct_next) : (removal) check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.remove('lightblue') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('darkblue') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #previous.classList.add('f_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #previous.classList.add('f_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #previous.classList.remove('f_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('f_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('f_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('f_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #direct_next.classList.add('f_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #direct_next.classList.add('f_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #direct_next) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #direct_next) : (removal) check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #direct_next) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #direct_next.classList.remove('f_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #direct_next) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #direct_next) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #direct_next) : (removal) check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('darkblue') : check matches (false)] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) \] #has_scope.classList.add('yellow') : check matches (false)] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) \] #parent.classList.add('h_has_scope') : check matches (true)] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) \] #parent.classList.add('h_has_scope') : check #has_scope color] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) \] #parent.classList.remove('h_has_scope') : check matches (false)] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) \] #has_scope.classList.remove('yellow') : check matches (false)] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant \] #has_scope.classList.add('ivory') : check matches (false)] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant \] #parent.classList.add('h_descendant') : check matches (true)] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant \] #parent.classList.add('h_descendant') : check #descendant color] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant \] #parent.classList.remove('h_descendant') : check matches (false)] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant \] #has_scope.classList.remove('ivory') : check matches (false)] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next \] #has_scope.classList.add('greenyellow') : check matches (false)] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next \] #parent.classList.add('h_indirect_next') : check matches (true)] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next \] #parent.classList.add('h_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next \] #parent.classList.remove('h_indirect_next') : check matches (false)] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next \] #has_scope.classList.remove('greenyellow') : check matches (false)] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('khaki') : check matches (false)] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #parent.classList.add('h_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #parent.classList.add('h_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #parent.classList.remove('h_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('khaki') : check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] #has_scope.classList.add('purple') : check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] #parent_previous.classList.add('j_has_scope') : check matches (true)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] #parent_previous.classList.add('j_has_scope') : check #has_scope color] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] insert/remove .invalid before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] insert/remove .invalid before #parent_previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] #parent_previous.classList.remove('j_has_scope') : check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] insert/remove .j_has_scope before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] insert/remove .j_has_scope before #parent_previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] insert/remove .j_has_scope before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) \] #has_scope.classList.remove('purple') : check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] #has_scope.classList.add('violet') : check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] #parent_previous.classList.add('j_descendant') : check matches (true)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] #parent_previous.classList.add('j_descendant') : check #descendant color] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .invalid before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .invalid before #parent_previous) : (removal) check #descendant color] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] #parent_previous.classList.remove('j_descendant') : check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .j_descendant before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .j_descendant before #parent_previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .j_descendant before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant \] #has_scope.classList.remove('violet') : check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #has_scope.classList.add('orchid') : check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #parent_previous.classList.add('j_indirect_next') : check matches (true)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #parent_previous.classList.add('j_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #parent_previous.classList.remove('j_indirect_next') : check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .j_indirect_next before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .j_indirect_next before #parent_previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .j_indirect_next before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #has_scope.classList.remove('orchid') : check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('plum') : check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.add('j_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.add('j_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.remove('j_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .j_indirect_next_child before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .j_indirect_next_child before #parent_previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .j_indirect_next_child before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('plum') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #has_scope.classList.add('orange') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #parent.classList.add('m') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #parent.classList.add('m') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #parent.classList.remove('m') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #parent.classList.add('n') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #parent.classList.add('n') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #parent.classList.remove('n') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #has_scope.classList.add('m') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #has_scope.classList.add('m') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #has_scope.classList.remove('m') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #has_scope.classList.add('n') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #has_scope.classList.add('n') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #has_scope.classList.remove('n') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #child.classList.add('m') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #child.classList.add('m') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #child.classList.remove('m') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #child.classList.add('n') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #child.classList.add('n') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #child.classList.remove('n') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:is(:is(.m, .n) .o)) \] #has_scope.classList.remove('orange') : check matches (false)] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/is.html.ini b/tests/wpt/metadata/css/selectors/invalidation/is.html.ini index 6afc2497a09..39f96467488 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/is.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/is.html.ini @@ -1,19 +1,15 @@ [is.html] + [Invalidate :is() for simple selector arguments.] + expected: FAIL + [Invalidate :is() for compound selector arguments.] expected: FAIL - [Preconditions.] - expected: FAIL - - [Test specificity of :is().] - expected: FAIL - [Invalidate :is() for complex selector arguments.] expected: FAIL - [Invalidate :is() for simple selector arguments.] - expected: FAIL - [Invalidate nested :is().] expected: FAIL + [Test specificity of :is().] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/lang-pseudo-class-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/lang-pseudo-class-in-has.html.ini index 53bda84c4d0..a4e075f95e7 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/lang-pseudo-class-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/lang-pseudo-class-in-has.html.ini @@ -1,2 +1,2 @@ [lang-pseudo-class-in-has.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html.ini index 6687d7a0f14..468b68e88d1 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html.ini @@ -1,6 +1,7 @@ [media-loading-pseudo-classes-in-has.html] + expected: TIMEOUT [Test :has(:stalled) invalidation] - expected: FAIL + expected: TIMEOUT [Test :has(:buffering) invalidation] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/metadata/css/selectors/invalidation/not-002.html.ini b/tests/wpt/metadata/css/selectors/invalidation/not-002.html.ini index 9eaa0b2b190..27743b4fdfd 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/not-002.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/not-002.html.ini @@ -1,19 +1,3 @@ [not-002.html] - [Invalidate :not() for simple selector arguments.] - expected: FAIL - - [Invalidate :not() for compound selector arguments.] - expected: FAIL - - [Test specificity of :not().] - expected: FAIL - - [Preconditions.] - expected: FAIL - - [Invalidate :not() for complex selector arguments.] - expected: FAIL - [Invalidate nested :is() inside :not().] expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/invalidation/not-pseudo-containing-complex-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/not-pseudo-containing-complex-in-has.html.ini index c585ab8c220..135f52c47a1 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/not-pseudo-containing-complex-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/not-pseudo-containing-complex-in-has.html.ini @@ -1,2 +1,1035 @@ [not-pseudo-containing-complex-in-has.html] - expected: ERROR + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #has_scope.classList.add('red') : check matches (true)] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #has_scope.classList.add('red') : check #has_scope color] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #parent.classList.add('a_has_scope') : check matches (false)] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #parent.classList.remove('a_has_scope') : check matches (true)] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #parent.classList.remove('a_has_scope') : check #has_scope color] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #has_scope.classList.add('a_has_scope') : check matches (false)] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #has_scope.classList.remove('a_has_scope') : check matches (true)] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #has_scope.classList.remove('a_has_scope') : check #has_scope color] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #child.classList.add('a_has_scope') : check matches (false)] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #child.classList.remove('a_has_scope') : check matches (true)] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #child.classList.remove('a_has_scope') : check #has_scope color] + expected: FAIL + + [[ .red:has(#descendant:not(.a_has_scope .b)) \] #has_scope.classList.remove('red') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #has_scope.classList.add('orangered') : check matches (true)] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #has_scope.classList.add('orangered') : check #descendant color] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #parent.classList.add('a_descendant') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #parent.classList.remove('a_descendant') : check matches (true)] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #parent.classList.remove('a_descendant') : check #descendant color] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #has_scope.classList.add('a_descendant') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #has_scope.classList.remove('a_descendant') : check matches (true)] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #has_scope.classList.remove('a_descendant') : check #descendant color] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #child.classList.add('a_descendant') : check matches (false)] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #child.classList.remove('a_descendant') : check matches (true)] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #child.classList.remove('a_descendant') : check #descendant color] + expected: FAIL + + [[ .orangered:has(#descendant:not(.a_descendant .b)) #descendant \] #has_scope.classList.remove('orangered') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.add('darkred') : check matches (true)] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.add('darkred') : check #indirect_next color] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #parent.classList.add('a_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #parent.classList.remove('a_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #parent.classList.remove('a_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.add('a_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.remove('a_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.remove('a_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #child.classList.add('a_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #child.classList.remove('a_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #child.classList.remove('a_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next \] #has_scope.classList.remove('darkred') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('pink') : check matches (true)] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('pink') : check #indirect_next_child color] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #parent.classList.add('a_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #parent.classList.remove('a_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #parent.classList.remove('a_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('a_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('a_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('a_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #child.classList.add('a_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #child.classList.remove('a_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #child.classList.remove('a_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('pink') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #has_scope.classList.add('green') : check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #has_scope.classList.add('green') : check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #parent_previous.classList.add('c_has_scope') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #parent_previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #parent_previous.classList.remove('c_has_scope') : check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #parent_previous.classList.remove('c_has_scope') : check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #parent_previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #previous.classList.add('c_has_scope') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #previous.classList.remove('c_has_scope') : check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #previous.classList.remove('c_has_scope') : check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #child_previous.classList.add('c_has_scope') : check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #child_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #child_previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .invalid before #child_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #child_previous.classList.remove('c_has_scope') : check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #child_previous.classList.remove('c_has_scope') : check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #child_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #child_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] insert/remove .c_has_scope before #child_previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) \] #has_scope.classList.remove('green') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #has_scope.classList.add('lightgreen') : check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #has_scope.classList.add('lightgreen') : check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #parent_previous.classList.add('c_descendant') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #parent_previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #parent_previous.classList.remove('c_descendant') : check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #parent_previous.classList.remove('c_descendant') : check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #parent_previous) : (removal) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #previous.classList.add('c_descendant') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #previous.classList.remove('c_descendant') : check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #previous.classList.remove('c_descendant') : check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #previous) : (removal) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #child_previous.classList.add('c_descendant') : check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #child_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #child_previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .invalid before #child_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #child_previous.classList.remove('c_descendant') : check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #child_previous.classList.remove('c_descendant') : check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #child_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #child_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] insert/remove .c_descendant before #child_previous) : (removal) check #descendant color] + expected: FAIL + + [[ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant \] #has_scope.classList.remove('lightgreen') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #has_scope.classList.add('darkgreen') : check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #has_scope.classList.add('darkgreen') : check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #parent_previous.classList.add('c_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #parent_previous.classList.remove('c_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #parent_previous.classList.remove('c_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #parent_previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #previous.classList.add('c_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #previous.classList.remove('c_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #previous.classList.remove('c_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #child_previous.classList.add('c_indirect_next') : check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #child_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #child_previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .invalid before #child_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #child_previous.classList.remove('c_indirect_next') : check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #child_previous.classList.remove('c_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #child_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #child_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] insert/remove .c_indirect_next before #child_previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next \] #has_scope.classList.remove('darkgreen') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('yellowgreen') : check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('yellowgreen') : check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.add('c_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.remove('c_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #parent_previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #previous.classList.add('c_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #previous.classList.remove('c_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #child_previous.classList.add('c_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #child_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #child_previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #child_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #child_previous.classList.remove('c_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #child_previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #child_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #child_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] insert/remove .c_indirect_next_child before #child_previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('yellowgreen') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #has_scope.classList.add('blue') : check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #has_scope.classList.add('blue') : check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #previous.classList.add('f_has_scope') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #previous.classList.remove('f_has_scope') : check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #previous.classList.remove('f_has_scope') : check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #has_scope.classList.add('f_has_scope') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #has_scope.classList.remove('f_has_scope') : check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #has_scope.classList.remove('f_has_scope') : check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #direct_next.classList.add('f_has_scope') : check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #direct_next.classList.remove('f_has_scope') : check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #direct_next.classList.remove('f_has_scope') : check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #direct_next) : (insertion) check matches (false)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #direct_next) : (removal) check matches (true)] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] insert/remove .f_has_scope before #direct_next) : (removal) check #has_scope color] + expected: FAIL + + [[ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) \] #has_scope.classList.remove('blue') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.add('skyblue') : check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.add('skyblue') : check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #previous.classList.add('f_descendant') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #previous.classList.remove('f_descendant') : check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #previous.classList.remove('f_descendant') : check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #previous) : (removal) check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.add('f_descendant') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.remove('f_descendant') : check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.remove('f_descendant') : check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #direct_next.classList.add('f_descendant') : check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #direct_next.classList.remove('f_descendant') : check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #direct_next.classList.remove('f_descendant') : check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #direct_next) : (insertion) check matches (false)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #direct_next) : (removal) check matches (true)] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] insert/remove .f_descendant before #direct_next) : (removal) check #descendant color] + expected: FAIL + + [[ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant \] #has_scope.classList.remove('skyblue') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.add('lightblue') : check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.add('lightblue') : check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #previous.classList.add('f_indirect_next') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #previous.classList.remove('f_indirect_next') : check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #previous.classList.remove('f_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.add('f_indirect_next') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.remove('f_indirect_next') : check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.remove('f_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #direct_next.classList.add('f_indirect_next') : check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #direct_next) : (insertion) check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #direct_next) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .invalid before #direct_next) : (removal) check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #direct_next.classList.remove('f_indirect_next') : check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #direct_next.classList.remove('f_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #direct_next) : (insertion) check matches (false)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #direct_next) : (removal) check matches (true)] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] insert/remove .f_indirect_next before #direct_next) : (removal) check #indirect_next color] + expected: FAIL + + [[ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next \] #has_scope.classList.remove('lightblue') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('darkblue') : check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('darkblue') : check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #previous.classList.add('f_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #previous) : (removal) check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #previous.classList.remove('f_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #previous.classList.remove('f_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #previous) : (removal) check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('f_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('f_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('f_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #direct_next.classList.add('f_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #direct_next) : (insertion) check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #direct_next) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #direct_next) : (removal) check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #direct_next.classList.remove('f_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #direct_next.classList.remove('f_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #direct_next) : (insertion) check matches (false)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #direct_next) : (removal) check matches (true)] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] insert/remove .f_indirect_next_child before #direct_next) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('darkblue') : check matches (false)] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) \] #has_scope.classList.add('yellow') : check matches (true)] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) \] #has_scope.classList.add('yellow') : check #has_scope color] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) \] #parent.classList.add('h_has_scope') : check matches (false)] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) \] #parent.classList.remove('h_has_scope') : check matches (true)] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) \] #parent.classList.remove('h_has_scope') : check #has_scope color] + expected: FAIL + + [[ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) \] #has_scope.classList.remove('yellow') : check matches (false)] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant \] #has_scope.classList.add('ivory') : check matches (true)] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant \] #has_scope.classList.add('ivory') : check #descendant color] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant \] #parent.classList.add('h_descendant') : check matches (false)] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant \] #parent.classList.remove('h_descendant') : check matches (true)] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant \] #parent.classList.remove('h_descendant') : check #descendant color] + expected: FAIL + + [[ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant \] #has_scope.classList.remove('ivory') : check matches (false)] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next \] #has_scope.classList.add('greenyellow') : check matches (true)] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next \] #has_scope.classList.add('greenyellow') : check #indirect_next color] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next \] #parent.classList.add('h_indirect_next') : check matches (false)] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next \] #parent.classList.remove('h_indirect_next') : check matches (true)] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next \] #parent.classList.remove('h_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next \] #has_scope.classList.remove('greenyellow') : check matches (false)] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('khaki') : check matches (true)] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('khaki') : check #indirect_next_child color] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #parent.classList.add('h_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #parent.classList.remove('h_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #parent.classList.remove('h_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('khaki') : check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] #has_scope.classList.add('purple') : check matches (true)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] #has_scope.classList.add('purple') : check #has_scope color] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] #parent_previous.classList.add('j_has_scope') : check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] insert/remove .invalid before #parent_previous) : (insertion) check #has_scope color] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] insert/remove .invalid before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] #parent_previous.classList.remove('j_has_scope') : check matches (true)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] #parent_previous.classList.remove('j_has_scope') : check #has_scope color] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] insert/remove .j_has_scope before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] insert/remove .j_has_scope before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] insert/remove .j_has_scope before #parent_previous) : (removal) check #has_scope color] + expected: FAIL + + [[ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) \] #has_scope.classList.remove('purple') : check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] #has_scope.classList.add('violet') : check matches (true)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] #has_scope.classList.add('violet') : check #descendant color] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] #parent_previous.classList.add('j_descendant') : check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .invalid before #parent_previous) : (insertion) check #descendant color] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .invalid before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] #parent_previous.classList.remove('j_descendant') : check matches (true)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] #parent_previous.classList.remove('j_descendant') : check #descendant color] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .j_descendant before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .j_descendant before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] insert/remove .j_descendant before #parent_previous) : (removal) check #descendant color] + expected: FAIL + + [[ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant \] #has_scope.classList.remove('violet') : check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #has_scope.classList.add('orchid') : check matches (true)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #has_scope.classList.add('orchid') : check #indirect_next color] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #parent_previous.classList.add('j_indirect_next') : check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next color] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .invalid before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #parent_previous.classList.remove('j_indirect_next') : check matches (true)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #parent_previous.classList.remove('j_indirect_next') : check #indirect_next color] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .j_indirect_next before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .j_indirect_next before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] insert/remove .j_indirect_next before #parent_previous) : (removal) check #indirect_next color] + expected: FAIL + + [[ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next \] #has_scope.classList.remove('orchid') : check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('plum') : check matches (true)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.add('plum') : check #indirect_next_child color] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.add('j_indirect_next_child') : check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next_child color] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .invalid before #parent_previous) : (removal) check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.remove('j_indirect_next_child') : check matches (true)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #parent_previous.classList.remove('j_indirect_next_child') : check #indirect_next_child color] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .j_indirect_next_child before #parent_previous) : (insertion) check matches (false)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .j_indirect_next_child before #parent_previous) : (removal) check matches (true)] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] insert/remove .j_indirect_next_child before #parent_previous) : (removal) check #indirect_next_child color] + expected: FAIL + + [[ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child \] #has_scope.classList.remove('plum') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.add('orange') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.add('orange') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #parent.classList.add('m') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #parent.classList.add('n') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #parent.classList.add('n') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #parent.classList.remove('n') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #parent.classList.remove('m') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #parent.classList.remove('m') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.add('m') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.add('n') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.add('n') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.remove('n') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.remove('m') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.remove('m') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #child.classList.add('m') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #child.classList.add('n') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #child.classList.add('n') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #child.classList.remove('n') : check matches (false)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #child.classList.remove('m') : check matches (true)] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #child.classList.remove('m') : check #has_scope color] + expected: FAIL + + [[ .orange:has(#descendant:not(.m:not(.n) .o)) \] #has_scope.classList.remove('orange') : check matches (false)] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/invalidation/sheet-going-away-001.html.ini b/tests/wpt/metadata/css/selectors/invalidation/sheet-going-away-001.html.ini deleted file mode 100644 index 76b222d254c..00000000000 --- a/tests/wpt/metadata/css/selectors/invalidation/sheet-going-away-001.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[sheet-going-away-001.html] - [Style should be recomputed correctly when the stylesheet it depends on goes away] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/invalidation/sibling.html.ini b/tests/wpt/metadata/css/selectors/invalidation/sibling.html.ini deleted file mode 100644 index bfd4ae0af5d..00000000000 --- a/tests/wpt/metadata/css/selectors/invalidation/sibling.html.ini +++ /dev/null @@ -1,22 +0,0 @@ -[sibling.html] - [Adjacent class] - expected: FAIL - - [Sibling subtree through an indirect adjacent combinator] - expected: FAIL - - [Adjacent with universal selector] - expected: FAIL - - [Adjacent universal] - expected: FAIL - - [Sibling descendant through a universal selector] - expected: FAIL - - [Indirect adjacent with two adjacent selectors] - expected: FAIL - - [Indirect adjacent with universal selector] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/invalidation/typed-child-indexed-pseudo-classes-in-has.html.ini b/tests/wpt/metadata/css/selectors/invalidation/typed-child-indexed-pseudo-classes-in-has.html.ini index 124d66b6cef..65eb33e0dcb 100644 --- a/tests/wpt/metadata/css/selectors/invalidation/typed-child-indexed-pseudo-classes-in-has.html.ini +++ b/tests/wpt/metadata/css/selectors/invalidation/typed-child-indexed-pseudo-classes-in-has.html.ini @@ -1,19 +1,144 @@ [typed-child-indexed-pseudo-classes-in-has.html] - expected: ERROR - [Initial colors: #only_of_type] + [Prepend #div1.green: #only_of_type] expected: FAIL - [Initial colors: #first_of_type] + [Prepend #div1.green: #first_of_type] expected: FAIL - [Initial colors: #last_of_type] + [Prepend #div1.green: #last_of_type] expected: FAIL - [Initial colors: #nth_of_type_3n_1] + [Prepend #div1.green: #nth_of_type_3n_1] expected: FAIL - [Initial colors: #nth_of_type_3n_2] + [Prepend span (2): #only_of_type] expected: FAIL - [Initial colors: #nth_of_type_3n] + [Prepend span (2): #first_of_type] + expected: FAIL + + [Prepend span (2): #last_of_type] + expected: FAIL + + [Prepend span (2): #nth_of_type_3n_1] + expected: FAIL + + [Prepend #div2.yellow: #first_of_type] + expected: FAIL + + [Prepend #div2.yellow: #last_of_type] + expected: FAIL + + [Prepend #div2.yellow: #nth_of_type_3n_1] + expected: FAIL + + [Prepend #div2.yellow: #nth_of_type_3n_2] + expected: FAIL + + [Prepend span (3): #first_of_type] + expected: FAIL + + [Prepend span (3): #last_of_type] + expected: FAIL + + [Prepend span (3): #nth_of_type_3n_1] + expected: FAIL + + [Prepend span (3): #nth_of_type_3n_2] + expected: FAIL + + [Prepend #div3.orange: #first_of_type] + expected: FAIL + + [Prepend #div3.orange: #last_of_type] + expected: FAIL + + [Prepend #div3.orange: #nth_of_type_3n_1] + expected: FAIL + + [Prepend #div3.orange: #nth_of_type_3n_2] + expected: FAIL + + [Prepend #div3.orange: #nth_of_type_3n] + expected: FAIL + + [Prepend span (4): #first_of_type] + expected: FAIL + + [Prepend span (4): #last_of_type] + expected: FAIL + + [Prepend span (4): #nth_of_type_3n_1] + expected: FAIL + + [Prepend span (4): #nth_of_type_3n_2] + expected: FAIL + + [Prepend span (4): #nth_of_type_3n] + expected: FAIL + + [Prepend #div4: #last_of_type] + expected: FAIL + + [Prepend #div4: #nth_of_type_3n_1] + expected: FAIL + + [Prepend #div4: #nth_of_type_3n_2] + expected: FAIL + + [Prepend #div4: #nth_of_type_3n] + expected: FAIL + + [Prepend span (5): #last_of_type] + expected: FAIL + + [Prepend span (5): #nth_of_type_3n_1] + expected: FAIL + + [Prepend span (5): #nth_of_type_3n_2] + expected: FAIL + + [Prepend span (5): #nth_of_type_3n] + expected: FAIL + + [Prepend #div5: #last_of_type] + expected: FAIL + + [Prepend #div5: #nth_of_type_3n_1] + expected: FAIL + + [Prepend #div5: #nth_of_type_3n_2] + expected: FAIL + + [Prepend #div5: #nth_of_type_3n] + expected: FAIL + + [Prepend span (6): #last_of_type] + expected: FAIL + + [Prepend span (6): #nth_of_type_3n_1] + expected: FAIL + + [Prepend span (6): #nth_of_type_3n_2] + expected: FAIL + + [Prepend span (6): #nth_of_type_3n] + expected: FAIL + + [Remove #div1: #last_of_type] + expected: FAIL + + [Remove #div1: #nth_of_type_3n_1] + expected: FAIL + + [Remove #div1: #nth_of_type_3n] + expected: FAIL + + [Remove #div2: #last_of_type] + expected: FAIL + + [Remove #div2: #nth_of_type_3n] + expected: FAIL + + [Remove #div4: #only_of_type] expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/is-where-basic.html.ini b/tests/wpt/metadata/css/selectors/is-where-basic.html.ini index 4591e9d6ee4..0ff9dc76ce8 100644 --- a/tests/wpt/metadata/css/selectors/is-where-basic.html.ini +++ b/tests/wpt/metadata/css/selectors/is-where-basic.html.ini @@ -1,5 +1,45 @@ [is-where-basic.html] - expected: ERROR [:is() matches expected elements] expected: FAIL + [:is(#a) matches expected elements] + expected: FAIL + + [:is(#a, #f) matches expected elements] + expected: FAIL + + [:is(#a, #c) :where(#a #d, #c #f) matches expected elements] + expected: FAIL + + [#c > :is(#c > #f) matches expected elements] + expected: FAIL + + [#c > :is(#b > #f) matches expected elements] + expected: FAIL + + [#a div:is(#d) matches expected elements] + expected: FAIL + + [:is(div) > div matches expected elements] + expected: FAIL + + [:is(*) > div matches expected elements] + expected: FAIL + + [:is(*) div matches expected elements] + expected: FAIL + + [div > :where(#e, #f) matches expected elements] + expected: FAIL + + [div > :where(*) matches expected elements] + expected: FAIL + + [:is(*) > :where(*) matches expected elements] + expected: FAIL + + [:is(#a + #b) + :is(#c) matches expected elements] + expected: FAIL + + [:is(#a, #b) + div matches expected elements] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/is-where-not.html.ini b/tests/wpt/metadata/css/selectors/is-where-not.html.ini index aa03f8b97cd..97a2fd2f3be 100644 --- a/tests/wpt/metadata/css/selectors/is-where-not.html.ini +++ b/tests/wpt/metadata/css/selectors/is-where-not.html.ini @@ -1,2 +1,54 @@ [is-where-not.html] - expected: ERROR + [:not(:is(#a)) matches expected elements] + expected: FAIL + + [:not(:where(#b)) matches expected elements] + expected: FAIL + + [:not(:where(:root #c)) matches expected elements] + expected: FAIL + + [:not(:is(#a, #b)) matches expected elements] + expected: FAIL + + [:not(:is(#b div)) matches expected elements] + expected: FAIL + + [:not(:is(#a div, div + div)) matches expected elements] + expected: FAIL + + [:not(:is(span)) matches expected elements] + expected: FAIL + + [:not(:is(div)) matches expected elements] + expected: FAIL + + [:not(:is(*|div)) matches expected elements] + expected: FAIL + + [:not(:is(*|*)) matches expected elements] + expected: FAIL + + [:not(:is(*)) matches expected elements] + expected: FAIL + + [:not(:is(svg|div)) matches expected elements] + expected: FAIL + + [:not(:is(:not(div))) matches expected elements] + expected: FAIL + + [:not(:is(span, b, i)) matches expected elements] + expected: FAIL + + [:not(:is(span, b, i, div)) matches expected elements] + expected: FAIL + + [:not(:is(#b ~ div div, * + #c)) matches expected elements] + expected: FAIL + + [:not(:is(div > :not(#e))) matches expected elements] + expected: FAIL + + [:not(:is(div > :not(:where(#e, #f)))) matches expected elements] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/missing-right-token.html.ini b/tests/wpt/metadata/css/selectors/missing-right-token.html.ini deleted file mode 100644 index 881385ab4a0..00000000000 --- a/tests/wpt/metadata/css/selectors/missing-right-token.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[missing-right-token.html] - [attribute selectors with missing right tokens succeed] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/not-complex.html.ini b/tests/wpt/metadata/css/selectors/not-complex.html.ini deleted file mode 100644 index 3ada8da5b89..00000000000 --- a/tests/wpt/metadata/css/selectors/not-complex.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[not-complex.html] - expected: ERROR diff --git a/tests/wpt/metadata/css/selectors/not-specificity.html.ini b/tests/wpt/metadata/css/selectors/not-specificity.html.ini deleted file mode 100644 index f4dad41b375..00000000000 --- a/tests/wpt/metadata/css/selectors/not-specificity.html.ini +++ /dev/null @@ -1,25 +0,0 @@ -[not-specificity.html] - [:not(span, :not(:not(.a#foo)), p) wins over :not(span, #foo, p)] - expected: FAIL - - [:not(div#foo) wins over :not(#foo)] - expected: FAIL - - [:not(span, li, p) wins over :not(span, lo, p)] - expected: FAIL - - [:not(#foo) wins over :not(.foo)] - expected: FAIL - - [:not(span + span) wins over :not(span)] - expected: FAIL - - [:not(.bar, #foo) has same specificity as :not(#foo, .bar)] - expected: FAIL - - [:not(.bar, #foo) wins over :not(.foo, .bar)] - expected: FAIL - - [:not(span, #foo, p) wins over :not(span, :where(.a#foo), p)] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/nth-of-type-namespace.html.ini b/tests/wpt/metadata/css/selectors/nth-of-type-namespace.html.ini deleted file mode 100644 index 41609fb11fc..00000000000 --- a/tests/wpt/metadata/css/selectors/nth-of-type-namespace.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[nth-of-type-namespace.html] - expected: ERROR diff --git a/tests/wpt/metadata/css/selectors/selectors-case-sensitive-001.html.ini b/tests/wpt/metadata/css/selectors/selectors-case-sensitive-001.html.ini deleted file mode 100644 index 809a1d9ef46..00000000000 --- a/tests/wpt/metadata/css/selectors/selectors-case-sensitive-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[selectors-case-sensitive-001.html] - expected: ERROR - [Test element names are case-insensitive only in ASCII range] - expected: FAIL - diff --git a/tests/wpt/metadata/css/selectors/visited-inheritance.html.ini b/tests/wpt/metadata/css/selectors/visited-inheritance.html.ini deleted file mode 100644 index db2bd591042..00000000000 --- a/tests/wpt/metadata/css/selectors/visited-inheritance.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[visited-inheritance.html] - expected: FAIL diff --git a/tests/wpt/metadata/custom-elements/CustomElementRegistry-constructor-and-callbacks-are-held-strongly.html.ini b/tests/wpt/metadata/custom-elements/CustomElementRegistry-constructor-and-callbacks-are-held-strongly.html.ini deleted file mode 100644 index 42d3c4a7535..00000000000 --- a/tests/wpt/metadata/custom-elements/CustomElementRegistry-constructor-and-callbacks-are-held-strongly.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[CustomElementRegistry-constructor-and-callbacks-are-held-strongly.html] - [connectedCallback] - expected: FAIL - - [attributeChangedCallback] - expected: FAIL - - [disconnectedCallback] - expected: FAIL - - [adoptedCallback] - expected: FAIL diff --git a/tests/wpt/metadata/dom/events/EventListener-handleEvent-cross-realm.html.ini b/tests/wpt/metadata/dom/events/EventListener-handleEvent-cross-realm.html.ini index 3f4a6c57d3b..78a283ddb63 100644 --- a/tests/wpt/metadata/dom/events/EventListener-handleEvent-cross-realm.html.ini +++ b/tests/wpt/metadata/dom/events/EventListener-handleEvent-cross-realm.html.ini @@ -4,12 +4,3 @@ [EventListener is cross-realm plain object with non-callable 'handleEvent' property] expected: FAIL - - [EventListener is cross-realm plain object with revoked Proxy as 'handleEvent' property] - expected: FAIL - - [EventListener is cross-realm non-callable revoked Proxy] - expected: FAIL - - [EventListener is cross-realm callable revoked Proxy] - expected: FAIL diff --git a/tests/wpt/metadata/dom/events/event-global-is-still-set-when-coercing-beforeunload-result.html.ini b/tests/wpt/metadata/dom/events/event-global-is-still-set-when-coercing-beforeunload-result.html.ini deleted file mode 100644 index 48b966cdc23..00000000000 --- a/tests/wpt/metadata/dom/events/event-global-is-still-set-when-coercing-beforeunload-result.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[event-global-is-still-set-when-coercing-beforeunload-result.html] - [window.event is still set when 'beforeunload' result is coerced to string] - expected: FAIL diff --git a/tests/wpt/metadata/dom/nodes/remove-and-adopt-thcrash.html.ini b/tests/wpt/metadata/dom/nodes/remove-and-adopt-thcrash.html.ini deleted file mode 100644 index 74a0199ef5c..00000000000 --- a/tests/wpt/metadata/dom/nodes/remove-and-adopt-thcrash.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[remove-and-adopt-thcrash.html] - [Check that removing a node and then adopting its parent into a different window/document doesn't crash.] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/traversal/TreeWalker-acceptNode-filter-cross-realm.html.ini b/tests/wpt/metadata/dom/traversal/TreeWalker-acceptNode-filter-cross-realm.html.ini index 12902cd2912..6c9803c29c1 100644 --- a/tests/wpt/metadata/dom/traversal/TreeWalker-acceptNode-filter-cross-realm.html.ini +++ b/tests/wpt/metadata/dom/traversal/TreeWalker-acceptNode-filter-cross-realm.html.ini @@ -4,12 +4,3 @@ [NodeFilter is cross-realm plain object with non-callable 'acceptNode' property] expected: FAIL - - [NodeFilter is cross-realm plain object with revoked Proxy as 'acceptNode' property] - expected: FAIL - - [NodeFilter is cross-realm non-callable revoked Proxy] - expected: FAIL - - [NodeFilter is cross-realm callable revoked Proxy] - expected: FAIL diff --git a/tests/wpt/metadata/fetch/stale-while-revalidate/stale-image.html.ini b/tests/wpt/metadata/fetch/stale-while-revalidate/stale-image.html.ini index 86b30d7f0dd..e95e391fd91 100644 --- a/tests/wpt/metadata/fetch/stale-while-revalidate/stale-image.html.ini +++ b/tests/wpt/metadata/fetch/stale-while-revalidate/stale-image.html.ini @@ -1,4 +1,4 @@ [stale-image.html] + expected: TIMEOUT [Cache returns stale resource] - expected: FAIL - + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/history-traversal-navigate-parent-while-child-loading.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/history-traversal-navigate-parent-while-child-loading.html.ini deleted file mode 100644 index a04d59899db..00000000000 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/history-traversal-navigate-parent-while-child-loading.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[history-traversal-navigate-parent-while-child-loading.html] - [pushState() in parent while child is doing initial navigation, then go back] - expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/history-traversal-navigates-multiple-frames.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/history-traversal-navigates-multiple-frames.html.ini index d8bec72308d..6ac54926dad 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/history-traversal-navigates-multiple-frames.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/history-traversal-navigates-multiple-frames.html.ini @@ -1,3 +1,4 @@ [history-traversal-navigates-multiple-frames.html] + expected: TIMEOUT [A history traversal should be able to navigate a parent and child simultaneously] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/history_back_cross_realm_method.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/history_back_cross_realm_method.html.ini deleted file mode 100644 index d8db442fa5f..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/history_back_cross_realm_method.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[history_back_cross_realm_method.html] - [history.back() uses this's associated document's browsing context to determine if navigation is allowed] - expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/history_forward_cross_realm_method.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/history_forward_cross_realm_method.html.ini deleted file mode 100644 index 9f3058078ea..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/history_forward_cross_realm_method.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[history_forward_cross_realm_method.html] - [history.forward() uses this's associated document's browsing context to determine if navigation is allowed] - expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/history_go_cross_realm_method.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/history_go_cross_realm_method.html.ini deleted file mode 100644 index e5412ef71c4..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/history_go_cross_realm_method.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[history_go_cross_realm_method.html] - [history.go() uses this's associated document's browsing context to determine if navigation is allowed] - expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/cross-global-npo.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/cross-global-npo.html.ini deleted file mode 100644 index 986671d6ab3..00000000000 --- a/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/cross-global-npo.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[cross-global-npo.html] - [Named access across globals] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini index 4b1075dca87..2536fff59d2 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini @@ -1,7 +1,5 @@ [named-objects.html] type: testharness - [Check if the first nested browsing context is returned by window['c'\]] - expected: FAIL [Check if window['a'\] contains all a, applet, area, embed, form, img, and object elements, and their order] expected: FAIL @@ -9,15 +7,5 @@ [Check if window['fs'\] return the frameset element with name='fs'] expected: FAIL - [Check if window['b'\] returns the elements with the id='b'] - expected: FAIL - - [Check if window['d'\] returns the element with id='d'] - expected: FAIL - [Check if window['a'\] contains all applet, embed, form, img, and object elements, and their order] expected: FAIL - - [Check if window['a'\] contains all embed, form, img, and object elements, and their order] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/navigated-named-objects.window.js.ini b/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/navigated-named-objects.window.js.ini index 6665eaa484e..77e9b1da6bc 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/navigated-named-objects.window.js.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/navigated-named-objects.window.js.ini @@ -1,37 +1,9 @@ [navigated-named-objects.window.html] - [Window's associated Document object is used for finding named objects (