diff options
92 files changed, 447 insertions, 624 deletions
diff --git a/Cargo.lock b/Cargo.lock index b628ab3bfe3..8bedbdda50c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1070,7 +1070,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -2025,7 +2025,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2599,7 +2599,7 @@ dependencies = [ "gobject-sys", "libc", "system-deps", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4051,7 +4051,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi 0.5.0", "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4313,7 +4313,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -6308,7 +6308,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6653,7 +6653,7 @@ dependencies = [ [[package]] name = "selectors" version = "0.28.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "bitflags 2.9.1", "cssparser", @@ -6948,7 +6948,7 @@ dependencies = [ [[package]] name = "servo_arc" version = "0.4.1" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "serde", "stable_deref_trait", @@ -7409,7 +7409,7 @@ dependencies = [ [[package]] name = "stylo" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "app_units", "arrayvec", @@ -7467,7 +7467,7 @@ dependencies = [ [[package]] name = "stylo_atoms" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "string_cache", "string_cache_codegen", @@ -7476,12 +7476,12 @@ dependencies = [ [[package]] name = "stylo_config" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" [[package]] name = "stylo_derive" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "darling", "proc-macro2", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "stylo_dom" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "bitflags 2.9.1", "stylo_malloc_size_of", @@ -7502,7 +7502,7 @@ dependencies = [ [[package]] name = "stylo_malloc_size_of" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "app_units", "cssparser", @@ -7519,12 +7519,12 @@ dependencies = [ [[package]] name = "stylo_static_prefs" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" [[package]] name = "stylo_traits" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "app_units", "bitflags 2.9.1", @@ -7698,7 +7698,7 @@ dependencies = [ "getrandom 0.2.16", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -7933,7 +7933,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "to_shmem" version = "0.2.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "cssparser", "servo_arc", @@ -7946,7 +7946,7 @@ dependencies = [ [[package]] name = "to_shmem_derive" version = "0.1.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "darling", "proc-macro2", @@ -8745,9 +8745,9 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9c5f0bc545ea3b20b423e33b9b457764de0b3730cd957f6c6aa6c301785f6e" +checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" dependencies = [ "phf", "phf_codegen", @@ -9132,7 +9132,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 5b4d244e746..82f55589686 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -4702,25 +4702,38 @@ where WebDriverCommandMsg::CloseWebView(webview_id) => { self.handle_close_top_level_browsing_context(webview_id); }, - WebDriverCommandMsg::NewWebView(webview_id, sender, load_sender) => { - let (chan, port) = match ipc::channel() { + WebDriverCommandMsg::NewWebView( + originating_webview_id, + response_sender, + load_status_sender, + ) => { + let (embedder_sender, receiver) = match ipc::channel() { Ok(result) => result, Err(error) => return warn!("Failed to create channel: {error:?}"), }; - self.embedder_proxy - .send(EmbedderMsg::AllowOpeningWebView(webview_id, chan)); - let (webview_id, viewport_details) = match port.recv() { - Ok(Some((webview_id, viewport_details))) => (webview_id, viewport_details), + self.embedder_proxy.send(EmbedderMsg::AllowOpeningWebView( + originating_webview_id, + embedder_sender, + )); + let (new_webview_id, viewport_details) = match receiver.recv() { + Ok(Some((new_webview_id, viewport_details))) => { + (new_webview_id, viewport_details) + }, Ok(None) => return warn!("Embedder refused to allow opening webview"), Err(error) => return warn!("Failed to receive webview id: {error:?}"), }; self.handle_new_top_level_browsing_context( ServoUrl::parse_with_base(None, "about:blank").expect("Infallible parse"), - webview_id, + new_webview_id, viewport_details, - Some(load_sender), + Some(load_status_sender), ); - let _ = sender.send(webview_id); + if let Err(error) = response_sender.send(new_webview_id) { + error!( + "WebDriverCommandMsg::NewWebView: IPC error when sending new_webview_id \ + to webdriver server: {error}" + ); + } }, WebDriverCommandMsg::FocusWebView(webview_id) => { self.handle_focus_web_view(webview_id); diff --git a/components/net/tests/fetch.rs b/components/net/tests/fetch.rs index e8c5077f12a..0deceab3055 100644 --- a/components/net/tests/fetch.rs +++ b/components/net/tests/fetch.rs @@ -225,7 +225,7 @@ fn test_fetch_blob() { #[test] fn test_file() { - let path = Path::new("../../resources/ahem.css") + let path = Path::new("../../components/net/tests/test.css") .canonicalize() .unwrap(); let url = ServoUrl::from_file_path(path.clone()).unwrap(); diff --git a/components/net/tests/test.css b/components/net/tests/test.css new file mode 100644 index 00000000000..f7fa63bbaa7 --- /dev/null +++ b/components/net/tests/test.css @@ -0,0 +1,3 @@ +html { + color: red; +} diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 961fb92121d..1fe51407638 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -861,8 +861,14 @@ pub(crate) fn get_attr_for_layout<'dom>( pub(crate) trait LayoutElementHelpers<'dom> { fn attrs(self) -> &'dom [LayoutDom<'dom, Attr>]; - fn has_class_for_layout(self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool; + fn has_class_or_part_for_layout( + self, + name: &AtomIdent, + attr_name: &LocalName, + case_sensitivity: CaseSensitivity, + ) -> bool; fn get_classes_for_layout(self) -> Option<&'dom [Atom]>; + fn get_parts_for_layout(self) -> Option<&'dom [Atom]>; fn synthesize_presentational_hints_for_legacy_attributes<V>(self, hints: &mut V) where @@ -905,8 +911,13 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { } #[inline] - fn has_class_for_layout(self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool { - get_attr_for_layout(self, &ns!(), &local_name!("class")).is_some_and(|attr| { + fn has_class_or_part_for_layout( + self, + name: &AtomIdent, + attr_name: &LocalName, + case_sensitivity: CaseSensitivity, + ) -> bool { + get_attr_for_layout(self, &ns!(), attr_name).is_some_and(|attr| { attr.to_tokens() .unwrap() .iter() @@ -920,6 +931,11 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { .map(|attr| attr.to_tokens().unwrap()) } + fn get_parts_for_layout(self) -> Option<&'dom [Atom]> { + get_attr_for_layout(self, &ns!(), &local_name!("part")) + .map(|attr| attr.to_tokens().unwrap()) + } + fn synthesize_presentational_hints_for_legacy_attributes<V>(self, hints: &mut V) where V: Push<ApplicableDeclarationBlock>, @@ -1995,6 +2011,16 @@ impl Element { }) } + pub(crate) fn is_part(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool { + self.get_attribute(&ns!(), &LocalName::from("part")) + .is_some_and(|attr| { + attr.value() + .as_tokens() + .iter() + .any(|atom| case_sensitivity.eq_atom(name, atom)) + }) + } + pub(crate) fn set_atomic_attribute( &self, local_name: &LocalName, @@ -4051,6 +4077,13 @@ impl ElementMethods<crate::DomTypeHolder> for Element { rooted!(in(*cx) let slottable = Slottable(Dom::from_ref(self.upcast::<Node>()))); slottable.find_a_slot(true) } + + /// <https://drafts.csswg.org/css-shadow-parts/#dom-element-part> + fn Part(&self) -> DomRoot<DOMTokenList> { + self.ensure_rare_data() + .part + .or_init(|| DOMTokenList::new(self, &local_name!("part"), None, CanGc::note())) + } } impl VirtualMethods for Element { @@ -4190,7 +4223,9 @@ impl VirtualMethods for Element { match *name { local_name!("id") => AttrValue::from_atomic(value.into()), local_name!("name") => AttrValue::from_atomic(value.into()), - local_name!("class") => AttrValue::from_serialized_tokenlist(value.into()), + local_name!("class") | local_name!("part") => { + AttrValue::from_serialized_tokenlist(value.into()) + }, _ => self .super_type() .unwrap() @@ -4564,8 +4599,8 @@ impl SelectorsElement for SelectorWrapper<'_> { .is_some_and(|atom| case_sensitivity.eq_atom(id, atom)) } - fn is_part(&self, _name: &AtomIdent) -> bool { - false + fn is_part(&self, name: &AtomIdent) -> bool { + Element::is_part(self, name, CaseSensitivity::CaseSensitive) } fn imported_part(&self, _: &AtomIdent) -> Option<AtomIdent> { diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index f41370386e9..f47a40d3cdb 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -437,7 +437,7 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement { document.request_focus(None, FocusInitiator::Local, can_gc); } - // https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent + /// <https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent> fn GetOffsetParent(&self, can_gc: CanGc) -> Option<DomRoot<Element>> { if self.is::<HTMLBodyElement>() || self.is::<HTMLHtmlElement>() { return None; diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index bf36242572f..6d4a0d2529e 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1583,6 +1583,7 @@ pub(crate) unsafe fn from_untrusted_node_address(candidate: UntrustedNodeAddress pub(crate) trait LayoutNodeHelpers<'dom> { fn type_id_for_layout(self) -> NodeTypeId; + fn parent_node_ref(self) -> Option<LayoutDom<'dom, Node>>; fn composed_parent_node_ref(self) -> Option<LayoutDom<'dom, Node>>; fn first_child_ref(self) -> Option<LayoutDom<'dom, Node>>; fn last_child_ref(self) -> Option<LayoutDom<'dom, Node>>; @@ -1645,7 +1646,7 @@ pub(crate) trait LayoutNodeHelpers<'dom> { impl<'dom> LayoutDom<'dom, Node> { #[inline] #[allow(unsafe_code)] - fn parent_node_ref(self) -> Option<LayoutDom<'dom, Node>> { + pub(crate) fn parent_node_ref(self) -> Option<LayoutDom<'dom, Node>> { unsafe { self.unsafe_get().parent_node.get_inner_as_layout() } } } @@ -1662,6 +1663,12 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { } #[inline] + #[allow(unsafe_code)] + fn parent_node_ref(self) -> Option<LayoutDom<'dom, Node>> { + unsafe { self.unsafe_get().parent_node.get_inner_as_layout() } + } + + #[inline] fn composed_parent_node_ref(self) -> Option<LayoutDom<'dom, Node>> { let parent = self.parent_node_ref(); if let Some(parent) = parent { diff --git a/components/script/dom/raredata.rs b/components/script/dom/raredata.rs index 0c048956217..2c303d6874f 100644 --- a/components/script/dom/raredata.rs +++ b/components/script/dom/raredata.rs @@ -11,6 +11,7 @@ use crate::dom::bindings::root::{Dom, MutNullableDom}; use crate::dom::customelementregistry::{ CustomElementDefinition, CustomElementReaction, CustomElementState, }; +use crate::dom::domtokenlist::DOMTokenList; use crate::dom::elementinternals::ElementInternals; use crate::dom::htmlslotelement::SlottableData; use crate::dom::intersectionobserver::IntersectionObserverRegistration; @@ -76,4 +77,10 @@ pub(crate) struct ElementRareData { /// > which is initialized to an empty list. This list holds IntersectionObserverRegistration records, which have: pub(crate) registered_intersection_observers: Vec<IntersectionObserverRegistration>, pub(crate) cryptographic_nonce: String, + + /// <https://drafts.csswg.org/css-shadow-parts/#element-forwarded-part-name-list> + pub(crate) forwarded_part_names: Vec<(String, String)>, + + /// <https://drafts.csswg.org/css-shadow-parts/#dom-element-part> + pub(crate) part: MutNullableDom<DOMTokenList>, } diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index a8decee24ed..648146ac2e9 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -466,26 +466,40 @@ impl WindowProxy { features: DOMString, can_gc: CanGc, ) -> Fallible<Option<DomRoot<WindowProxy>>> { - // Step 4. + // Step 5. If target is the empty string, then set target to "_blank". let non_empty_target = match target.as_ref() { "" => DOMString::from("_blank"), _ => target, }; - // Step 5 + // Step 6. Let tokenizedFeatures be the result of tokenizing features. let tokenized_features = tokenize_open_features(features); - // Step 7-9 + // Step 7 - 8. + // If tokenizedFeatures["noreferrer"] exists, then set noreferrer to + // the result of parsing tokenizedFeatures["noreferrer"] as a boolean feature. let noreferrer = parse_open_feature_boolean(&tokenized_features, "noreferrer"); + + // Step 9. Let noopener be the result of getting noopener for window + // open with sourceDocument, tokenizedFeatures, and urlRecord. let noopener = if noreferrer { true } else { parse_open_feature_boolean(&tokenized_features, "noopener") }; - // Step 10, 11 + // (TODO) Step 10. Remove tokenizedFeatures["noopener"] and tokenizedFeatures["noreferrer"]. + + // (TODO) Step 11. Let referrerPolicy be the empty string. + // (TODO) Step 12. If noreferrer is true, then set referrerPolicy to "no-referrer". + + // Step 13 - 14 + // Let targetNavigable and windowType be the result of applying the rules for + // choosing a navigable given target, sourceDocument's node navigable, and noopener. + // If targetNavigable is null, then return null. let (chosen, new) = match self.choose_browsing_context(non_empty_target, noopener) { (Some(chosen), new) => (chosen, new), (None, _) => return Ok(None), }; - // TODO Step 12, set up browsing context features. + // TODO Step 15.2, Set up browsing context features for targetNavigable's + // active browsing context given tokenizedFeatures. let target_document = match chosen.document() { Some(target_document) => target_document, None => return Ok(None), @@ -496,7 +510,7 @@ impl WindowProxy { false }; let target_window = target_document.window(); - // Step 13, and 14.4, will have happened elsewhere, + // Step 15.3 and 15.4 will have happened elsewhere, // since we've created a new browsing context and loaded it with about:blank. if !url.is_empty() { let existing_document = self @@ -504,18 +518,18 @@ impl WindowProxy { .get() .and_then(ScriptThread::find_document) .unwrap(); - // Step 14.1 let url = match existing_document.url().join(&url) { Ok(url) => url, Err(_) => return Err(Error::Syntax), }; - // Step 14.3 let referrer = if noreferrer { Referrer::NoReferrer } else { target_window.as_global_scope().get_referrer() }; - // Step 14.5 + // Step 15.5 Otherwise, navigate targetNavigable to urlRecord using sourceDocument, + // with referrerPolicy set to referrerPolicy and exceptionsEnabled set to true. + // FIXME: referrerPolicy may not be used properly here. exceptionsEnabled not used. let referrer_policy = target_document.get_referrer_policy(); let pipeline_id = target_window.pipeline_id(); let secure = target_window.as_global_scope().is_secure_context(); @@ -534,14 +548,13 @@ impl WindowProxy { } else { NavigationHistoryBehavior::Push }; - target_window.load_url(history_handling, false, load_data, can_gc); } + // Step 17 (Dis-owning has been done in create_auxiliary_browsing_context). if noopener { - // Step 15 (Dis-owning has been done in create_auxiliary_browsing_context). return Ok(None); } - // Step 17. + // Step 18 Ok(target_document.browsing_context()) } diff --git a/components/script/layout_dom/element.rs b/components/script/layout_dom/element.rs index 9b50c9f3a2b..fd34d591f0c 100644 --- a/components/script/layout_dom/element.rs +++ b/components/script/layout_dom/element.rs @@ -216,11 +216,15 @@ impl<'dom> style::dom::TElement for ServoLayoutElement<'dom> { } fn has_part_attr(&self) -> bool { - false + self.element + .get_attr_for_layout(&ns!(), &local_name!("part")) + .is_some() } fn exports_any_part(&self) -> bool { - false + self.element + .get_attr_for_layout(&ns!(), &local_name!("exportparts")) + .is_some() } fn style_attribute(&self) -> Option<ArcBorrow<StyleLocked<PropertyDeclarationBlock>>> { @@ -292,6 +296,17 @@ impl<'dom> style::dom::TElement for ServoLayoutElement<'dom> { } } + fn each_part<F>(&self, mut callback: F) + where + F: FnMut(&AtomIdent), + { + if let Some(parts) = self.element.get_parts_for_layout() { + for part in parts { + callback(AtomIdent::cast(part)) + } + } + } + fn has_dirty_descendants(&self) -> bool { unsafe { self.as_node() @@ -728,8 +743,12 @@ impl<'dom> ::selectors::Element for ServoLayoutElement<'dom> { } #[inline] - fn is_part(&self, _name: &AtomIdent) -> bool { - false + fn is_part(&self, name: &AtomIdent) -> bool { + self.element.has_class_or_part_for_layout( + name, + &local_name!("part"), + CaseSensitivity::CaseSensitive, + ) } fn imported_part(&self, _: &AtomIdent) -> Option<AtomIdent> { @@ -738,7 +757,8 @@ impl<'dom> ::selectors::Element for ServoLayoutElement<'dom> { #[inline] fn has_class(&self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool { - self.element.has_class_for_layout(name, case_sensitivity) + self.element + .has_class_or_part_for_layout(name, &local_name!("class"), case_sensitivity) } fn is_html_slot_element(&self) -> bool { diff --git a/components/script/layout_dom/node.rs b/components/script/layout_dom/node.rs index dfb921b1ded..85b75f0b15f 100644 --- a/components/script/layout_dom/node.rs +++ b/components/script/layout_dom/node.rs @@ -119,9 +119,7 @@ impl<'dom> style::dom::TNode for ServoLayoutNode<'dom> { type ConcreteShadowRoot = ServoShadowRoot<'dom>; fn parent_node(&self) -> Option<Self> { - self.node - .composed_parent_node_ref() - .map(Self::from_layout_js) + self.node.parent_node_ref().map(Self::from_layout_js) } fn first_child(&self) -> Option<Self> { @@ -302,8 +300,8 @@ impl<'dom> ThreadSafeLayoutNode<'dom> for ServoThreadSafeLayoutNode<'dom> { } fn parent_style(&self) -> Arc<ComputedValues> { - let parent = self.node.parent_node().unwrap().as_element().unwrap(); - let parent_data = parent.borrow_data().unwrap(); + let parent_element = self.node.traversal_parent().unwrap(); + let parent_data = parent_element.borrow_data().unwrap(); parent_data.styles.primary().clone() } diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 322839aa078..1bde6f314f2 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -9,9 +9,7 @@ use std::ptr::NonNull; use base::id::{BrowsingContextId, PipelineId}; use cookie::Cookie; -use embedder_traits::{ - WebDriverCookieError, WebDriverFrameId, WebDriverJSError, WebDriverJSResult, WebDriverJSValue, -}; +use embedder_traits::{WebDriverFrameId, WebDriverJSError, WebDriverJSResult, WebDriverJSValue}; use euclid::default::{Point2D, Rect, Size2D}; use hyper_serde::Serde; use ipc_channel::ipc::{self, IpcSender}; @@ -81,6 +79,8 @@ fn find_node_by_unique_id( match documents.find_document(pipeline) { Some(doc) => find_node_by_unique_id_in_document(&doc, node_id), None => { + // FIXME: This is unreacheable!! Because we already early return in Constellation + // To be Fixed soon if ScriptThread::has_node_id(pipeline, &node_id) { Err(ErrorStatus::StaleElementReference) } else { @@ -994,7 +994,7 @@ pub(crate) fn handle_get_page_source( pub(crate) fn handle_get_cookies( documents: &DocumentCollection, pipeline: PipelineId, - reply: IpcSender<Vec<Serde<Cookie<'static>>>>, + reply: IpcSender<Result<Vec<Serde<Cookie<'static>>>, ErrorStatus>>, ) { reply .send( @@ -1008,9 +1008,9 @@ pub(crate) fn handle_get_cookies( .as_global_scope() .resource_threads() .send(GetCookiesDataForUrl(url, sender, NonHTTP)); - receiver.recv().unwrap() + Ok(receiver.recv().unwrap()) }, - None => Vec::new(), + None => Ok(Vec::new()), }, ) .unwrap(); @@ -1021,7 +1021,7 @@ pub(crate) fn handle_get_cookie( documents: &DocumentCollection, pipeline: PipelineId, name: String, - reply: IpcSender<Vec<Serde<Cookie<'static>>>>, + reply: IpcSender<Result<Vec<Serde<Cookie<'static>>>, ErrorStatus>>, ) { reply .send( @@ -1036,12 +1036,12 @@ pub(crate) fn handle_get_cookie( .resource_threads() .send(GetCookiesDataForUrl(url, sender, NonHTTP)); let cookies = receiver.recv().unwrap(); - cookies + Ok(cookies .into_iter() .filter(|cookie| cookie.name() == &*name) - .collect() + .collect()) }, - None => Vec::new(), + None => Ok(Vec::new()), }, ) .unwrap(); @@ -1052,15 +1052,13 @@ pub(crate) fn handle_add_cookie( documents: &DocumentCollection, pipeline: PipelineId, cookie: Cookie<'static>, - reply: IpcSender<Result<(), WebDriverCookieError>>, + reply: IpcSender<Result<(), ErrorStatus>>, ) { // TODO: Return a different error if the pipeline doesn't exist let document = match documents.find_document(pipeline) { Some(document) => document, None => { - return reply - .send(Err(WebDriverCookieError::UnableToSetCookie)) - .unwrap(); + return reply.send(Err(ErrorStatus::UnableToSetCookie)).unwrap(); }, }; let url = document.url(); @@ -1073,7 +1071,7 @@ pub(crate) fn handle_add_cookie( let domain = cookie.domain().map(ToOwned::to_owned); reply .send(match (document.is_cookie_averse(), domain) { - (true, _) => Err(WebDriverCookieError::InvalidDomain), + (true, _) => Err(ErrorStatus::InvalidCookieDomain), (false, Some(ref domain)) if url.host_str().map(|x| x == domain).unwrap_or(false) => { let _ = document .window() @@ -1090,7 +1088,7 @@ pub(crate) fn handle_add_cookie( .send(SetCookieForUrl(url, Serde(cookie), method)); Ok(()) }, - (_, _) => Err(WebDriverCookieError::UnableToSetCookie), + (_, _) => Err(ErrorStatus::UnableToSetCookie), }) .unwrap(); } diff --git a/components/script_bindings/webidls/Element.webidl b/components/script_bindings/webidls/Element.webidl index 4545b18d058..e0073f856ca 100644 --- a/components/script_bindings/webidls/Element.webidl +++ b/components/script_bindings/webidls/Element.webidl @@ -144,3 +144,8 @@ Element includes NonDocumentTypeChildNode; Element includes ParentNode; Element includes ActivatableElement; Element includes ARIAMixin; + +// https://drafts.csswg.org/css-shadow-parts/#idl +partial interface Element { + [SameObject, PutForwards=value] readonly attribute DOMTokenList part; +}; diff --git a/components/shared/embedder/webdriver.rs b/components/shared/embedder/webdriver.rs index d28bb6fc6c3..4f58c10fb6f 100644 --- a/components/shared/embedder/webdriver.rs +++ b/components/shared/embedder/webdriver.rs @@ -94,7 +94,7 @@ pub enum WebDriverScriptCommand { serialize_with = "::hyper_serde::serialize" )] Cookie<'static>, - IpcSender<Result<(), WebDriverCookieError>>, + IpcSender<Result<(), ErrorStatus>>, ), DeleteCookies(IpcSender<Result<(), ErrorStatus>>), DeleteCookie(String, IpcSender<Result<(), ErrorStatus>>), @@ -134,8 +134,11 @@ pub enum WebDriverScriptCommand { ElementClick(String, IpcSender<Result<Option<String>, ErrorStatus>>), GetActiveElement(IpcSender<Option<String>>), GetComputedRole(String, IpcSender<Result<Option<String>, ErrorStatus>>), - GetCookie(String, IpcSender<Vec<Serde<Cookie<'static>>>>), - GetCookies(IpcSender<Vec<Serde<Cookie<'static>>>>), + GetCookie( + String, + IpcSender<Result<Vec<Serde<Cookie<'static>>>, ErrorStatus>>, + ), + GetCookies(IpcSender<Result<Vec<Serde<Cookie<'static>>>, ErrorStatus>>), GetElementAttribute( String, String, @@ -165,12 +168,6 @@ pub enum WebDriverScriptCommand { WillSendKeys(String, String, bool, IpcSender<Result<bool, ErrorStatus>>), } -#[derive(Debug, Deserialize, Serialize)] -pub enum WebDriverCookieError { - InvalidDomain, - UnableToSetCookie, -} - #[derive(Clone, Debug, Deserialize, Serialize)] pub enum WebDriverJSValue { Undefined, diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 5d5159f7232..f2638764df6 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -24,9 +24,9 @@ use constellation_traits::{EmbedderToConstellationMessage, TraversalDirection}; use cookie::{CookieBuilder, Expiration}; use crossbeam_channel::{Receiver, Sender, after, select, unbounded}; use embedder_traits::{ - MouseButton, WebDriverCommandMsg, WebDriverCommandResponse, WebDriverCookieError, - WebDriverFrameId, WebDriverJSError, WebDriverJSResult, WebDriverJSValue, WebDriverLoadStatus, - WebDriverMessageId, WebDriverScriptCommand, + MouseButton, WebDriverCommandMsg, WebDriverCommandResponse, WebDriverFrameId, WebDriverJSError, + WebDriverJSResult, WebDriverJSValue, WebDriverLoadStatus, WebDriverMessageId, + WebDriverScriptCommand, }; use euclid::{Rect, Size2D}; use http::method::Method; @@ -949,6 +949,7 @@ impl Handler { ))) } + /// <https://w3c.github.io/webdriver/#new-window> fn handle_new_window( &mut self, _parameters: &NewWindowParameters, @@ -956,11 +957,16 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let session = self.session().unwrap(); + // Step 2. (TODO) If session's current top-level browsing context is no longer open, + // return error with error code no such window. + let cmd_msg = WebDriverCommandMsg::NewWebView( session.webview_id, sender, self.load_status_sender.clone(), ); + // Step 5. Create a new top-level browsing context by running the window open steps. + // This MUST be done without invoking the focusing steps. self.constellation_chan .send(EmbedderToConstellationMessage::WebDriverCommand(cmd_msg)) .unwrap(); @@ -968,8 +974,6 @@ impl Handler { let mut handle = self.session.as_ref().unwrap().id.to_string(); if let Ok(new_webview_id) = receiver.recv() { let session = self.session_mut().unwrap(); - session.webview_id = new_webview_id; - session.browsing_context_id = BrowsingContextId::from(new_webview_id); let new_handle = Uuid::new_v4().to_string(); handle = new_handle.clone(); session.window_handles.insert(new_webview_id, new_handle); @@ -1365,7 +1369,10 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetCookies(sender); self.browsing_context_script_command(cmd)?; - let cookies = wait_for_script_response(receiver)?; + let cookies = match wait_for_script_response(receiver)? { + Ok(cookies) => cookies, + Err(error) => return Err(WebDriverError::new(error, "")), + }; let response = cookies .into_iter() .map(|cookie| cookie_msg_to_cookie(cookie.into_inner())) @@ -1377,7 +1384,10 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetCookie(name, sender); self.browsing_context_script_command(cmd)?; - let cookies = wait_for_script_response(receiver)?; + let cookies = match wait_for_script_response(receiver)? { + Ok(cookies) => cookies, + Err(error) => return Err(WebDriverError::new(error, "")), + }; let Some(response) = cookies .into_iter() .map(|cookie| cookie_msg_to_cookie(cookie.into_inner())) @@ -1410,16 +1420,7 @@ impl Handler { self.browsing_context_script_command(cmd)?; match wait_for_script_response(receiver)? { Ok(_) => Ok(WebDriverResponse::Void), - Err(response) => match response { - WebDriverCookieError::InvalidDomain => Err(WebDriverError::new( - ErrorStatus::InvalidCookieDomain, - "Invalid cookie domain", - )), - WebDriverCookieError::UnableToSetCookie => Err(WebDriverError::new( - ErrorStatus::UnableToSetCookie, - "Unable to set cookie", - )), - }, + Err(error) => Err(WebDriverError::new(error, "")), } } diff --git a/ports/servoshell/desktop/app_state.rs b/ports/servoshell/desktop/app_state.rs index 464e344424a..4740cfc35ca 100644 --- a/ports/servoshell/desktop/app_state.rs +++ b/ports/servoshell/desktop/app_state.rs @@ -12,7 +12,7 @@ use image::{DynamicImage, ImageFormat}; use keyboard_types::{Key, KeyboardEvent, Modifiers, ShortcutMatcher}; use log::{error, info}; use servo::base::id::WebViewId; -use servo::config::pref; +use servo::config::{opts, pref}; use servo::ipc_channel::ipc::IpcSender; use servo::webrender_api::ScrollLocation; use servo::webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize}; @@ -477,9 +477,13 @@ impl WebViewDelegate for RunningAppState { .build(); webview.notify_theme_change(self.inner().window.theme()); - webview.focus(); - webview.raise_to_top(true); - + // When WebDriver is enabled, do not focus and raise the WebView to the top, + // as that is what the specification expects. Otherwise, we would like `window.open()` + // to create a new foreground tab + if opts::get().webdriver_port.is_some() { + webview.focus(); + webview.raise_to_top(true); + } self.add(webview.clone()); Some(webview) } diff --git a/python/wpt/run.py b/python/wpt/run.py index 4d221f816e3..d44d24f5882 100644 --- a/python/wpt/run.py +++ b/python/wpt/run.py @@ -66,7 +66,7 @@ def run_tests(default_binary_path: str, **kwargs): # chunks and leads to more consistent timing on GitHub Actions. set_if_none(kwargs, "chunk_type", "id_hash") - kwargs["user_stylesheets"].append(os.path.join(SERVO_ROOT, "resources", "ahem.css")) + kwargs["user_stylesheets"].append(os.path.join(SERVO_ROOT, "tests", "wpt", "tests", "fonts", "ahem.css")) set_if_none(kwargs, "binary", default_binary_path) set_if_none(kwargs, "webdriver_binary", default_binary_path) diff --git a/resources/ahem.css b/resources/ahem.css deleted file mode 100644 index 4c7e979e64c..00000000000 --- a/resources/ahem.css +++ /dev/null @@ -1,4 +0,0 @@ -@font-face { - font-family: Ahem; - src: url(ahem/AHEM____.TTF); -} diff --git a/resources/ahem/AHEM____.TTF b/resources/ahem/AHEM____.TTF Binary files differdeleted file mode 100644 index ac81cb03165..00000000000 --- a/resources/ahem/AHEM____.TTF +++ /dev/null diff --git a/resources/ahem/Ahem.ps b/resources/ahem/Ahem.ps deleted file mode 100644 index 8bd54c6b64f..00000000000 --- a/resources/ahem/Ahem.ps +++ /dev/null @@ -1 +0,0 @@ -%!PS-AdobeFont-1.0: Ahem 001.000
%%CreationDate: 24.5.99 at 19:57
%%VMusage: 1024 22706
% Generated by Fontographer 4.1.5
% Most characters are the em square, except &EAcute and "p", which show ascent/descent from the baseline. Useful for testing composition systems. Produced by Todd Fahrner for the CSS Samurai's browser testing.
% ADL: 800 200 0
%%EndComments
FontDirectory/Ahem known{/Ahem findfont dup/UniqueID known{dup
/UniqueID get 4790119 eq exch/FontType get 1 eq and}{pop false}ifelse
{save true}{false}ifelse}{false}ifelse
20 dict begin
/FontInfo 16 dict dup begin
/version (001.000) readonly def
/FullName (Ahem) readonly def
/FamilyName (Ahem) readonly def
/Weight (Medium) readonly def
/ItalicAngle 0 def
/isFixedPitch true def
/UnderlinePosition -133 def
/UnderlineThickness 20 def
/Notice (Most characters are the em square, except &EAcute and "p", which show ascent/descent from the baseline. Useful for testing composition systems. Produced by Todd Fahrner for the CSS Samurai's browser testing.) readonly def
/em 1000 def
/ascent 800 def
/descent 200 def
end readonly def
/FontName /Ahem def
/Encoding 256 array
dup 0/.notdef put
dup 1/.notdef put
dup 2/.notdef put
dup 3/.notdef put
dup 4/.notdef put
dup 5/.notdef put
dup 6/.notdef put
dup 7/.notdef put
dup 8/.notdef put
dup 9/.notdef put
dup 10/.notdef put
dup 11/.notdef put
dup 12/.notdef put
dup 13/.notdef put
dup 14/.notdef put
dup 15/.notdef put
dup 16/.notdef put
dup 17/.notdef put
dup 18/.notdef put
dup 19/.notdef put
dup 20/.notdef put
dup 21/.notdef put
dup 22/.notdef put
dup 23/.notdef put
dup 24/.notdef put
dup 25/.notdef put
dup 26/.notdef put
dup 27/.notdef put
dup 28/.notdef put
dup 29/.notdef put
dup 30/.notdef put
dup 31/.notdef put
dup 32/space put
dup 33/exclam put
dup 34/quotedbl put
dup 35/numbersign put
dup 36/dollar put
dup 37/percent put
dup 38/ampersand put
dup 39/quoteright put
dup 40/parenleft put
dup 41/parenright put
dup 42/asterisk put
dup 43/plus put
dup 44/comma put
dup 45/minus put
dup 46/period put
dup 47/slash put
dup 48/zero put
dup 49/one put
dup 50/two put
dup 51/three put
dup 52/four put
dup 53/five put
dup 54/six put
dup 55/seven put
dup 56/eight put
dup 57/nine put
dup 58/colon put
dup 59/semicolon put
dup 60/less put
dup 61/equal put
dup 62/greater put
dup 63/question put
dup 64/at put
dup 65/A put
dup 66/B put
dup 67/C put
dup 68/D put
dup 69/E put
dup 70/F put
dup 71/G put
dup 72/H put
dup 73/I put
dup 74/J put
dup 75/K put
dup 76/L put
dup 77/M put
dup 78/N put
dup 79/O put
dup 80/P put
dup 81/Q put
dup 82/R put
dup 83/S put
dup 84/T put
dup 85/U put
dup 86/V put
dup 87/W put
dup 88/X put
dup 89/Y put
dup 90/Z put
dup 91/bracketleft put
dup 92/backslash put
dup 93/bracketright put
dup 94/asciicircum put
dup 95/underscore put
dup 96/quoteleft put
dup 97/a put
dup 98/b put
dup 99/c put
dup 100/d put
dup 101/e put
dup 102/f put
dup 103/g put
dup 104/h put
dup 105/i put
dup 106/j put
dup 107/k put
dup 108/l put
dup 109/m put
dup 110/n put
dup 111/o put
dup 112/p put
dup 113/q put
dup 114/r put
dup 115/s put
dup 116/t put
dup 117/u put
dup 118/v put
dup 119/w put
dup 120/x put
dup 121/y put
dup 122/z put
dup 123/braceleft put
dup 124/bar put
dup 125/braceright put
dup 126/asciitilde put
dup 127/.notdef put
dup 128/.notdef put
dup 129/.notdef put
dup 130/.notdef put
dup 131/.notdef put
dup 132/.notdef put
dup 133/.notdef put
dup 134/.notdef put
dup 135/.notdef put
dup 136/.notdef put
dup 137/.notdef put
dup 138/.notdef put
dup 139/.notdef put
dup 140/.notdef put
dup 141/.notdef put
dup 142/.notdef put
dup 143/.notdef put
dup 144/dotlessi put
dup 145/grave put
dup 146/acute put
dup 147/circumflex put
dup 148/tilde put
dup 149/macron put
dup 150/breve put
dup 151/dotaccent put
dup 152/dieresis put
dup 153/.notdef put
dup 154/ring put
dup 155/cedilla put
dup 156/.notdef put
dup 157/hungarumlaut put
dup 158/ogonek put
dup 159/caron put
dup 160/nbspace put
dup 161/exclamdown put
dup 162/cent put
dup 163/sterling put
dup 164/currency put
dup 165/yen put
dup 166/brokenbar put
dup 167/section put
dup 168/dieresis put
dup 169/copyright put
dup 170/ordfeminine put
dup 171/guillemotleft put
dup 172/logicalnot put
dup 173/hyphen put
dup 174/registered put
dup 175/macron put
dup 176/degree put
dup 177/plusminus put
dup 178/twosuperior put
dup 179/threesuperior put
dup 180/acute put
dup 181/mu put
dup 182/paragraph put
dup 183/periodcentered put
dup 184/cedilla put
dup 185/onesuperior put
dup 186/ordmasculine put
dup 187/guillemotright put
dup 188/onequarter put
dup 189/onehalf put
dup 190/threequarters put
dup 191/questiondown put
dup 192/Agrave put
dup 193/Aacute put
dup 194/Acircumflex put
dup 195/Atilde put
dup 196/Adieresis put
dup 197/Aring put
dup 198/AE put
dup 199/Ccedilla put
dup 200/Egrave put
dup 201/Eacute put
dup 202/Ecircumflex put
dup 203/Edieresis put
dup 204/Igrave put
dup 205/Iacute put
dup 206/Icircumflex put
dup 207/Idieresis put
dup 208/Eth put
dup 209/Ntilde put
dup 210/Ograve put
dup 211/Oacute put
dup 212/Ocircumflex put
dup 213/Otilde put
dup 214/Odieresis put
dup 215/multiply put
dup 216/Oslash put
dup 217/Ugrave put
dup 218/Uacute put
dup 219/Ucircumflex put
dup 220/Udieresis put
dup 221/Yacute put
dup 222/Thorn put
dup 223/germandbls put
dup 224/agrave put
dup 225/aacute put
dup 226/acircumflex put
dup 227/atilde put
dup 228/adieresis put
dup 229/aring put
dup 230/ae put
dup 231/ccedilla put
dup 232/egrave put
dup 233/eacute put
dup 234/ecircumflex put
dup 235/edieresis put
dup 236/igrave put
dup 237/iacute put
dup 238/icircumflex put
dup 239/idieresis put
dup 240/eth put
dup 241/ntilde put
dup 242/ograve put
dup 243/oacute put
dup 244/ocircumflex put
dup 245/otilde put
dup 246/odieresis put
dup 247/divide put
dup 248/oslash put
dup 249/ugrave put
dup 250/uacute put
dup 251/ucircumflex put
dup 252/udieresis put
dup 253/yacute put
dup 254/thorn put
dup 255/ydieresis put
readonly def
/PaintType 0 def
/FontType 1 def
/StrokeWidth 0 def
/FontMatrix[0.001 0 0 0.001 0 0]readonly def
/UniqueID 4790119 def
/FontBBox{0 -200 1000 800}readonly def
currentdict end
currentfile eexec
D8061D93A8246509E76A3EC656E953B7C22E43117F5A3D5F277C16E04EEF1E062177EBA1C7CD44CC
08EC69212435871DAE39145F9F511D31325A34487F72B91B61DF205DADD53B3626BEAC69A3EBD7A7
D1DCF6BB839B313143D219124CF63C16290FAF4759F32E6BC73D55DE9F71047CE1AB2D992BBA9040
CFB7C803C372371CF5D6EE966F903DE04BD5203314DA296E16E25A00333AE4BAE32D333A421DA78C
8EEC9DFC38A8CD91D7B463EFABEB7BB632B23B9FBF511C9076A64C977809E52EF5C6AFFB7BD57F5A
2CFCCA063E226D1F69EE6D82099789C7AACDCA9774086760D9125C5DC0B3C6B4CB02AAA3C691B600
2C10B806D9D9760F7796E080A92DCD951675EA909D77269CB6BFD767EB97F27AF43A993080DAE5AD
01E3FCCC2A5C687554002CE66DCFEC4EACF2C69215AF98E1851DAFE7244BDC6F3A0775F484A11634
2224EDD6565FEFC196EFB202AC2988599B989F7DBE219C075F90D6019F29683CCD25B4D4D31A54BA
E067CFE982A0A9C417FF87E4F8A40D0719DFE7A6220FA99D238FA32F856A4492D316CD1A578A79A4
F7D8005977CD1AB08EC17FD09C12EEB7BC57BD9D575D59D88B530A501FED9A1C18DD5B7F5BD8892E
8B77F6A795596DC0E0B4EAFFCFE7A9B1092B13852758C5C51466408C91B1C654EBE24659DA18A126
FF7B60295F9FC18B784438EC28144BCFCA3E58845CF1ABFF1CAEC75FA16F61B3469D5B3645638C07
46830E03A395C974274D8AC421C6B23C02C62E0295DFD74F50D045CE9A7EDD7C5A8115D28F2E9CA8
57701F425416D5EFA91396AD179718BB3F1350667055D1AE055659C758D420EFD0ADE14BA051D59D
108817CB54CA11DEBDA46F42435905809C6907AD86956D2DBA1926BED10755F4BCCC541787211E76
2BCD336A0C89B15162EE1BBDB4B93197D3E03DB4E1FB112D1C70FDF8099E3359DF117C2324B78F6C
945657533CCFF91712846718B1DF57D11E70EF1363BEAE4B01A2B6FF7C86B46C33D503219296AC8E
4B40E7988921D551F26223A25F51DDF434C42B99FDCCA388A9DC7C6FB0CB7B2589B756F38F83DF58
77217EE630C757DB7AF2007469A2D2E75DD95A6BE1F9F052A044D1A495934A3FE1229866AE35FB23
9CB735AAEA7C85501757C29D5A2DFB09569298E8E6A1BC9862C5958BB47E0C48E778BEDFFCF0F01D
401948B2CCE02D91A6975192CC8B4DE1F572A48B0B7E0B339EFDEFB7D24AA203D946F8D39D85C49E
510E8B863C2DBD046241446CD25EC35313EC5862E521B1F99A48AD1C3827AB3B8E4DA99CD6DB7AA4
A62B4EBEDFB6B965F64FF019BFEA94CCDF71BC33805047C371F2CA5813321639E9B26A5E1E46F46B
3CFE4374596CDEB791C2EC09D44A9ED140328B3B593316460EDD6E28F857D58A90E4D5B371DE8A30
C056FD3D4549C493A407456063CC74C4CEB661E9F18C4C22C7F0FB927CDD322A8672F3B0851B5AF1
6BBD8B6FDDD89A7D093B91A9481777FC9E00100F0C91C3F2955BD20E98974631E7D158AB9416A8F6
0CFEB787E532FF18CFCED64330B5ED66612C3E0AEC74D2066DDCC1C44CCDE1C72FCACFAC986EAE7C
5D65D6EF1CE27B143E7BE6267E29774D2670EF831CB9AD882BF4A4A5222DF9D853177E3732E65A28
0982816E4DEFC64DBA6A47D0344FCAF42322FC171AA713F263F58D4C8561D6D2D18807B012409528
374E9D58ACBAEF664B35942ABEBE0FE54A0207E9A6B977EB9335F6A455168320FFFBD0BCCFBB7628
66A6538221B324EFC98AB255F2A4A313E0D4E15892764B701D849F6E69726817EB2A26851DF3E524
6CCD30F71C80111ED88F5205D8C85828F69F969929413F81CE3785CA74497292538AC422FFAFB350
8B3EAA0E6E786F0F632BE36FF5F4264C923704CFC4A7A60E217807ADD069CD4D999CA03F0D839598
7ABED83E733E06DEDC4E8D03F409DEF33D70CB0E87396DA1ADE83E493C9302DA46977BE70B2AE397
3B0F9E1A0B2DE9F6D3492602E8BD259F74CB63E3991BB7F1950BABD83D787E154AF4EF004A4846B0
7ABC732FC32B889292851E809504382756C114C922BF7FAE42E2576D535DAABA7DAE820ADD0AE2E9
6F19E5C09CACACD5BAC4E795B526A7509C8AFBA7319E397F04FAC95863FFEDF45F0352A0C614F7B0
34E6E7F3AA0ED5FB4CD2BE21FC13908F0BBA29756E3622ED010C459015B4A0F897003EC8E616DBA6
DD8B5A8FE036EF78602EF1EDEE711190E11B6DA4B8277175B3A07E68B7C157C5DDB8DA54771E69C1
CC44CCD5C7B8F02074227F0EF3F4AA1671482691CC82D17BBC8D2266392B1548D1DD2D82C88935CA
45416A4F02E658A7AA6C3B3BE050D815795B1695BFEA08383481D90A6AF44576A7DDBA153162C5CB
3565642FD4BC52935AD67E8801495FC610DF826CEF773FF710EF72C446A39B0DD7CC2A2BAB6D715A
1F9EF13F054BBCD5616464E9A3231396DE8EE7F4201E52EF3ED113F6B7874CCB8010C8DA7A792111
FE52D5EE94C76544D0D29C0463392A94F557652FF6E10468948AE9201AE92FDDE8D6378240E04477
909C3B696FFEC95EBE7A60543525763E8C70B86634DB4491543675B9A722F35546BF91263D8FBF23
CB6515BC721B672DB7AD41A0151F15B4D97B0E3314012613DD2B2B7171BC6FD94FE29A7C4D44E657
9E659A33793D397C80576B0131E884A65E9740FC1966AB125BA8436919A61E46BD7E24F7DB75D206
E0E27F866F9412266643786B7BB1C27E4F136243B0E8F905B1877F598C537E0DF68DD19A4E5C908C
732F4E8782E6D65A2A0130407DAEDCEFB4E981F7140B94473B93EC11FE144823E3FB4F040DB22BFB
B01DE4FFCDA710E9F35D018285DA47B80DCEC844C7A43BDE81F9E7ADA697E11115524AEBCA48BE4B
6B351002757A1E2AB5AB573A18C82D8587FC576165A9D9E5610FAC401336DE657A7EA101FF8BBC16
D446C49CAAFE1EFC665247E63B297AA52D666CB9F08A0235A0726C4B2F9F66DE61FB48A5C8BE0DB5
998997B3B68F9D689ADBED55F803AE0086E73EDFF6FF74471B78D16FA63498EC5103F3401AB38AC8
7C3976133C405A6EC17C53E12E2411ECD5C129D5C53F93BB51095423486F3947E4CC90DCD653775F
3714068D53AC4BB6CEEDAC6314696F0199CBDAEF5ECBDE598A9AF75F4F965FA527D2D90A8C7562A4
1F0433A954E3CD4CBCE2F0CD26D04072B69DE1B59716A566E61354129957FF5A8A4BCB51C3FE1A9C
AE4510D2C6CCEAF776974D0201E8ED5E2CBDDACCD8F9674C7EE4DF64A1A37075D0393498CC6BD09C
5A0929B34A6F6C2FDC001F936EDE2654ECDA6AFA436368A90F0EB70954607AF1C8BBBFF9AD2D494D
8F5DD0F34DA08B0BA7354800EC1069155DD87A4F37943D9106FB69CB5812ED3FA513159E6AA47631
DD63BF72CF07D3A718DD6AB95ED187D919ED3F173A464CBCF3A1CAE65266F18642F3845F9244DFEC
A59033BCE4636824920FE36650BA71F9FD960625237B74903178320C8B999478A25E04A8CAD4D3EC
B54C1826CBDD5643594EE55F07F0EEDE18A6E392C5B989B5465FCD1A86DD4477DA4AEF6FDA8CD363
A808D23EBCB36A2EF281226FD0BCB0A0EF24C71ED24266E40397D1A5863C547124DA6BF596E30011
6005FA21FD0F0976F119ADDB8E95B5380CB51B4E5E219C2CB4769E90FABE6853425AF11E4A7F29E9
00085B8AEC2489F07B588C4D6DD29BBB06F2ACFC467CE5CD3F0AAF7A215C20370310F01E4B5B10F3
D4570C7A6FC9C4AA074A874DCD04EBD53D03E511B2FAE76B34AC5EEF7D5B50E055A49AB6461FFC42
541C2948E304A29C3C08798DFC13AB5F7DB95A0F51D91B66F4182E7858BBE86E5D19B2F303B04327
16BAD69E1B817E78B646E581E2A52FA25CBB43D5ABFAE2E41ABCFED31A0EBC548EDBCA39B4200DF6
05366409ED0E42468692C3C1126231E739AA88C6BD16A56C62249AEBE02F0F79541F64920AE4C942
95179A6F272AB83AFC011F11A109E472093B1101FEF61B04BB8D11535BFE994858B19961B10F4D5E
6228952D697A676A0712A70678D288F3E0E17E756AABB8173C6C0D19113CFC4151FEC2E7737E70F5
5B1D002AC76CBAB18CC55655BC4C759A4E54BF7F33558F31AF8148814F27E24877F40A4A34F3911F
F3A15F7D07231165E325D62ECB26B7F229C5637303A451F211BAE81FC87AFDD529FD05360B98EBE1
05D72BF444BDDF7A80F0C7A3212F36E7CD6F61947E3EBFD84B4A39F85C103CDA29A2D96EA56D29E1
FB798710DE64912DFDA45AE9F2B7E4316B8B7D1DE4D575EE8E36BEAFA3EA431BB9E917E249E78F07
CD9E8A0B95E6F4148D7366211A3CB79C461929C3538C2E54DD869A082C9E50A2617930896AAE8E33
A93B8D7E725E2F6C0C865D97D20C50E3806F08C598D9D976879A8B12EC441ACF4386929CEA07FB85
16F0EA4225EF4C42F88280F7D15A7CF54815B69BB2331AE602188FCD9E80E1B257DAF548E863FA71
91A1E4EA15FC354CA3C9A8EA0CED31FDC4834C2711BAE745E6FDFD4C54A373DDC146658D2D086969
5B0E91ECD20D4062872BC14F0526DCEE3F250FE4E615252E522276383B382E66B0D3932D07A47C23
BAB39DE68EC3541F85227000D886EB7191F0350361ADF6CFDBCFF657BDCD9EE53DA9F64BD7823A4E
C4FAF24A28316B2DAA1421931DCE2821DA9EEA6E0CCBA7A397D0FB6C2277CFBF70CEDB2B41A36F12
2E7191B29AFE79C5239EE03D3A0D125649B4E09E91614CD92C7F1F5C086E9F3794638F5E10178364
9AB4F5020CF2C1B585AACD1FD102F28B65352A28F82386FB0A8B8F6508DE129DE32748A371C6EA0C
0D35B4B2ADBCF08D34BD4B48025905402400482269DA9006F052726187572556E7D3C60F9F4B8624
D1B5812A10DD644672685711C8ACAD1E1C004DB5A428EC03DCA2692056D64116228D486B8AD66465
70E75CAB6C93109A00458E532DE15111541769C9932EC672E43743EB22383F590F63660FA53483CF
BF17086A0331B306F412738455B49C46B3D822E1294D0C62C5F805CE02A82F21CC36E8C7EA737C02
6A2F559F7375946E89AA02EF96A5102A7822F3609FC75B0CD60579D39564EE3082874A1E7F472C88
EC830F31E281DC618D39B3F9895FB3BAC49F8F5C0D5D6DA3EBA76567CBD09884869321514D62B70B
24BD92DC1A0F9E1D24B885E6E6EDF7DCF81E9FEAC4CAEA37C7B6505B2DA2A07490DCC3175943D516
E2533BCBD31810EE81971E311D5695A3E5AFE15E34DA11DEB353D4DFCB5CE2D8FE88D812CC5FE232
099F9F147CC87C47E017FD43C6C4B4657AAF946D4625B1ABAB856F0BE4D22BE1356A8AE9F74A3223
3D173D16ECA86557B1DF2F48120CD16D028C9D403DDD94C00245BB774F35C0A33317B641B5AC6BAC
BE1437BC11FE074BD53174CBB706F2227FADD928405955A40D32A3318CE3FDACB621FE8B2866C709
9F8863D5A712A71FF67E8A6001C388A3B0F5B4FD3A05088B84AC5FFDD155407F683B088D18394289
0D2493F608D12CBDEE6C5A4072A96B50DE71BAF53AD388AB4CC3342F8E733F2208B7E29E0B70C509
8FD25B4409EED781EC50B6EBD34E8C63D04CF2740EA628E3EF9A4462F338839A5EA90428E57E4836
4DFBD5EB4D980771B3C358D6274E83289ACCF4DF02DB5B476BC64F2E4A0D37B7FC7816FD3E742F74
84A693CEDC427708851C18A8BB18C0357A21A84E24B14F0B81D435CEE7644B62211F7943BB45540C
2C286FF0E7A869C7448C2F2A051695C98B73012C300BFC0E0B49B73AE834956D88934570EA804A80
5DD54487945D2638887F77181115C14E4D95BF6C4D55F913026B26DDC62DD6BD3CA6383B535D7EA5
CCA880A363A787920555ABB2EF8618FBC13EAF12E90A36A68156BC2D880D296ECF645A3E2D88AD20
C22A7F2B621652870F4AAE48ADC6465F55AA8C65E4474875BAB83252E0060FA6CDA59951B70ECAB4
ACD16C97E3E0CF54B566481871747832D607BA6E16852BD760D55D4D10AD2C58CD2FF25B162B78CB
B971DB3477F8D2ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB27460B
26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246D2A2BD7BA3351FBCFB
D2E512A576B0A065241AC9C40151C4DA7D06C581077ACB4C3A7AFEC15FB5F5B78DC78535B79568D2
60A99B0A0835EB2906B749EBB364850D5B24F98839DDAC5A19FE5AC3CFDA91186287F22088018BA0
6C35F680553D7E5F3360CB9539931ADCCA910DA7AF02473957F1EC9D9492C429270D8B99E0029708
26FB1CB733512C696D3BD442C84E0759460AD00B03D5056C55CB597DAECBF98B422C75CDA119B062
FF5FA251B1E31AAE5E2A1DC63241CEA9236733789F2E9AFA3AE6326D8713BC7B35C5FECEE088DBCD
225A91BD5F851D954C8FA91DD27611532070464DF076DED556A3546C08B4E2082B6286A60F4390A5
F797427792D1AAEE2BA3941F6FE39589BBBDB00AD959F06D85077311D1CE96C271A8A52FFDC6521D
3D87B7EBD39B0A0481FB90B65DB562ECB94217E830A39E1251CC8AAFFCA7D65BF373C9D72870109C
862745D0DAB7B9A4A8BE2145B89893DFA9DF3A29EE82160CCEF63759C9D4043A92E7C5F9E1D3107B
F32910E9DBBF9FD4D4C949A96B72C420C1075FA2E6E376FA49ADD0866F0E0BFDAEE810F0807C1819
3CE19E7E81DF48E421D816B657F6D263B0DCA0EECB983DE88F0F7275F849B32579E6B4D47854B026
122CB9433E9E94C994BBF3649601CF9835FE5F56F090390AC8212A9AE61FC08CF436D9DF101EF1B0
BF8DE6E72877121AF321919AF90F53BBA4541541D222E7B40EB5ADB9CA202079471F3DC8FC2B3E83
C91C77F0628CEBD06F41CB5F0D45E872038EF0B996138A32E9CCD746D91FA08D6DDA83B8BB22AE58
172566FDC0B23642DCB3125846504DD6CD8A6D9C718005D8EA88C68160DC9F84406CBB5B6E8477FA
BF1D7F6CBD9A4DEB2CB2D4FD8E47939D31D3F4F229FBD32A61AD4EA360BDFC1D65C2874C8F3B48D7
0ED7F7605B44662C9AF75815F647BA5C9801A3D4F633DF5ED8B5727F59A37D24D6D57768F81B8DD9
7143A39240C4BF37D374059C9594B7681A590E001D7ADFBCBF7B6CFF419171F8659A36DA28BD125D
F1BE74AE67F2220F7B45AAA13F97D9BE9C1AB7DE04F2190C12BDD1A38289E36C5F811CD34AC2CD79
CE11A39C46C3D79D073C9E132546BAFCA615C18212488E556EDA969688FAE7D5DEB7B7C4CED3965F
449C59DC99F30110B9922D17258D0A749790B59432A81DF94080613D0C867BEFFDC9FAAD481021DB
2A41963C1E6741D39DFC6EAE2888D3E3C10DD03549F15CA0E196C496CD7C54A982938D076BAC29C3
532A909B1C1B4DA819695EA5A60BC00B27924E5F7B738AEE0B00005046555AC34B5793CED3419F1F
0DD0CB2AFB9F9687BFBBF19C2F048EE1B69D060E07192D8A30EA81E7C18808123A9535044B0F9B97
53848A56ACF74CA8422A86E0C520C5F08DAD0D798727020D92EAD72E617436CCF46F850C459565BE
DD2113730BCCC47957D6FE94A957D7CE041DD22F49499747F69EDE674DB15062551AD073E955404F
BBB0F80FA5BDBCEA635B2B437DE0AAD6422ABE3C354E312C27E9136EAADBD9C922BAFB6AB6DF5021
CAB56CE07FC11AFC3C620148B7BECF50F62CFDC605D893931538814A1EEEF75E7A4FF61C34A90101
49B7C93E442678CD841073516A4E2AE298E9B33CCADE663E51ADED4EDDFA8E12139EEA5481973B46
B818753D52DA6399970B71FDC6F7918E4E4A3628B083EC9922433AD99E26D0238B1CF66402E5222F
E0C25E5EBFC3F839885BCF2D16542F8F109503311C6CE80B29B7B7036A1F15FEC4761F1F66E05578
75412FC707E3F73E916229F8D0B6BEF0CF3ADF6C8544A006F23A9CAB785453A0C5308BB4A3F1A722
9427BEF3FD3AF4F72B0EA6AC62DD8D27F0F0F6D1F8DE6B9FE613473C8F9341DD441E1EE757CAE9E3
F5823F4317A0A332B7D3C122F34B681A46AC7B6EE2CFCFCE337297C02D8A2AC1C164C45C06D24E3F
0E34A366537875CB47BA9C1FEF822BFD0026688EF18C3C2533D08BD09BED88EF3D291A87539BD5A8
F50E7E5350662E053FD5FB6424960774C09A511DDE7CAC206EC3863D61D9DDD8460A0D1A7041F6A7
D7D269ACE95122FD5B6F78CFFE75D4E27AC30C49902E17D8EBAE8B4371C5A6D658106476F57BC410
EC523A9DFC321E3DAAD06C86B08CDAA8FC513CCA1F348E1F7891A31729106A133592FC49D6AE8F48
2BCB87F815EEF89C900250BEE5E7440315F05F1EAB1A243A1DC9747D9BCCB11AC97E0427B8AE0D85
2DD07A29E60CD758497FAA49641C1C87F2EEAB75701601520AB7377B5832B4CDF730F533833FEA23
810215F5CED3A3D2DDD5C6E09D2C1372F9C9C398C9BF53BE17C6D8C6391AD9DB00551A88335B4F17
C90B1F93A895BEB5BB38161E2C999A3550968D0E825112F1E5BC2CA8205214005D234415C1BE18D9
A901DC3D7DD23970B9248C0E1B3883394BA9DCAACAA839C97044B7E190EFE457360AEA940D61091B
4EB2000717FCC5768F664D536B7BFBD867BEB880FA518197F7A936D1249688BBC313197AFC5D4273
198690C3C5C5827A77DB5F3315DF7C66D0B7770996BFDEDB5A5F81BC20AF0CACA5C50906D8C55A6E
42E49BEE7AD5DD407E9C256F2151A3335FD102FD970D9A7D4F756A4EF161A7C773AAB8FFB63AF09C
DAA402066DFBC7B2EEA032893655EE59F3F6D54B8ECC37EAF5F5628B2FBF6182F15746A8DE9A9D47
D5CC6ED05C84F533BE40C0ADCB09448C46594147CF55DC14178B605C8F3CEAF1849192A3C660FE9C
DE62ED49152A88334556AA31CD9F60F07609B046A0A9FA87D823BF3FAE666EA92F348B27F474253D
EA96BC7158BDE6F2E8617CE71AA69DDB99797D1DAEFE81D4A54E790A30E595E284D2D0F29562CD6A
F153137676F08CB29324548D00E64398E9E4FB1C78FD6E6843964C45B67D81BA1B062D99517A34B9
C312D71B7BDD2D77E7E68BC335C60DCCA6895F94C422BDCBA910713AD0D9BD81E288062838B8B711
0D09A4C687EE8BC43CEC6D9306820B778462B8F647E0BD1AC38DC8AC5A902CCFF4D3CA00BD3CB326
F2C84BBDE72230590E59239EBAC07FCEAC808E59F77C805578CC2CB7904EA17BDEFFA7646ECD183C
A3DC1DFBF93258267984AE381DF783E203DD8890F0736359945C3D50511A8E7AAF8819B6E3FC71D8
22EDE5718E461C799090D3116747CC20F277326B30714B8CB788A16AA1092BD9AC23D98C3AE27DE1
3485005AC9DF490B93F245D6F8EF2E67619A29C031FCEF50D800CF6683311ACBBF85A98794C77D7B
EB073A19CD5512AE5A9147EF976A36EB965083FA48F8C9DE860174818477434A83AC97F9999F9BD5
E406A1E76EDFE1D316E31888E881712368C4C3CB639A115A3E6335F784B4F0C9204C1BBE064B60E2
3740DED48204079B15CE80F557CEA83F345B6DBC9A414A86ACD235A936D9142E5C2C824EBACBA4B3
3C349B0E04B8E16AE78B66697546429E3C9D1705D4DBFD121278C63B27D3A184A1AC2DBDEB1BE412
379EB99069D11CF102F6CA69A7E441357B284227F9AAD645C853BAF627A884DC1271B8F0F2D28BEC
608141CE484F0A88979A0CEC71083937F1E25E0EF7E5E94F3A774166FCA492A88A2B46F118248958
2D16AAD1A157764FF931F3402AE542EE641E70ED5E19C429A11F8D1E108E044E07A7CDFD52260483
8D080EE2710434587789A34EABEB855074472CAA0F594A9E30AD9C3755C16C7ADA4A3B7BBDE3AEAB
FDC2C2192DEC91C0143050139721801BF72EDBE78B1A684D2FCECEBF8813A74F872F1852DE29C81C
797A817A3E6073109E07791C7B9F3196FD1546BDFA34136CF67E8278A9C09DC9D149C9718AC0E6B6
CCF0CD1B446DA82241BCB48C13E74D96DC8723A4F4A883850F8D76042685B034B0AF478E02E0191E
A2820F327E0113BF8FADA1D29811D25FDB47268EBC8961EDD0B47F2EF2DD9941094C637EB8849568
A01616B9FF922914F4BAB5C3798DA5A78D775C8946BE0CD34957E4F972F56B5579A0062E5F0A3A74
4C4254413D07A630CA51E638DF1DDFD6E7376C959EB1924A11FCC8EF791B0EFAB668DAA528E848B3
57CE43E8B86D0A34E01531CEAD72030D133696210E0C1282485F6F2391E61904EFD996D5722482AC
3FD20D6D945ABCEA1D28DE683511B17E9E573A54E9C0DCBB0E9D18F33C9E4ADBDA524104D732D8E9
CB84194BBF2F93B5F3D16D54F449A85B3B6E3536567E3E57E5E49125ED39E2ED0E2C0AD0A08AF241
07A4829408553D6F4FD08C5DA2B785CA5A7ABAE7B9508DABEBE81A0BCEC9CDAA8AAB9CB711CFA6C1
6E71F2612D0818D8357C52C12A573B66985D052106264EFB96BD93258CA086BF48D85CFBE3C3C248
F6BFD839C2ADE5442F285A80DD29148A9808E5B733EA1F5F4CE4FB2A3C6FCC58E8D268E49178BA49
5B8BE7F3DF4775A03BD0F6B28F730CF146A819032769618AB056DBE2BF3D6DE5F44226F2F3BE95E6
945214804C0D11857CF8C31578A1364884C16A9B676D86167921059BDA50AB8C10455C3B8997D483
C4B8599690337AC7A7AD63FFF3EF5D1B67F2B8B2128C57C9AFB8D3C753F02CAC83AFF82490C8411A
0E8131F154B394C625A251D688F88E396969E576751C580CA70046408B47E5139E5C4D0FDCFBEAFC
B4B63428792EE7E318DD8366BB1E3A563795924F4A10CC8E8B85971BD412DC12708FF1215F715A15
99CCEC8FF74EEBA34FAC6AC730E790E3497A4B6794F8BDC5D3D6A0AF819B950A42C5B4B53BEC8579
57DAD79BDD3265CDA3DB3BDB57EEF6F7427DB559037ABF79FB5048CFE699EBCC7AD54DEF337D6D15
736C32D89FB4ABBD44CAD6BFABD26972ED888D4080F2CE1D1DD81DB9131A70CD085874AEDD920DAB
D2DF39B7B8301872B0224668C9B83CF3DD5322A0939C8E539A10DC92F7673FF3D6624C03202A1874
2DF7CBED2139833020144F52C4B9C6D9C00EE01279F12B117A516A5F63E8A487E7104DD22C51A9AD
4F84C57F6C60E5FD249565021E0C734B1F6C1F5E002BDB3CB52D0994C556A90E109F1B9CD9220AE3
67C119C0B517195F7A34C34CC896C1B86E6323DA27AAB83EFB09D1D0899BAAB39332B22E48C1131C
A1FFB8D94C0D3C5EF81DA9B1C4551F226F816716245DF35A660889F70D21EE09E2525EF2ECAAC681
C5F5D07692B6D933A4E74DFD6A01D285ED8DE7C0C8C43013D0C1D21F727F7E5FD957D84796162362
84A48C12B02AB8B7350EC721A7D44014DDE0F04CB516FC22AD865A7552D978FF883AB31A2E6E8465
D5DFD66F27EF29AB94C9A2D2C0ECD6510E234A4657BD6EE58D8F01A97541336E4E8B364C698B3FE4
0CF6CB375DF221D5EF1757E32744FAA0AE3498DEDF616715962099B1C3AA561287838D21538CF002
6846FA72D86C33244B839EC63D791B8AE88C9C86062FE84C902957300E4ED9FC8DFCC6E26F522D99
AA4CEDC233A5FD75B6C1A17F2213A09272594B6A52A2BE5475ABBB8E23092196A8400335ACE63551
78EE28CAAA34706303A33A1E220AA648F41C822025E2779A861A45ACF5E99A0A6C846AE1328D2C68
5D920FD29A2D41F10E49DD3B4371DE9FFD25C55B33A1071262A79A91127E6BA40CA6D2667102AE82
8223BB5A9324894FC335FDE30D9E820FF8550209F6F0F4224CE7133C5289C02CD70BECDC3B1E2F1A
C874B90BC518A180A1ED8CFB094DE78DBEE77B42BADFAE49D3FF1EBE7E0BB148C673D92AE5CE56F7
A5E6FB6AD3AE98F776735CE3A9668FA34EF42FDEA2B615705CE6C3090E9BCB4A690C88BA66C12DF6
51AD065B12C36D5AEA5C774A7E53A88F1822B2BD430C961406585BD2A5165A9BD39E2C717033681E
CACEC13133D94E2E89217E6C301EED2519B4932AAE8858DC1CF465DA315154A017C6AA27327AF497
D4FEF99E564AD49931A9E57F53FAD918974F0E8E87BC72064046C819F2371BDA383603D6B371AB6D
51F7BCEBD832255BF977837E8766D3D9ED92EA70764C53B89E260ADC415E05919D4EFEA0B7826827
6FA3A5844EB0A66DD261EADA4FC3836355249BE8D506839364B8A2CB7895CE8228853BC2715F8FD0
6AA5691D7ABE5E4E2E6BEB4EB1DA247F9D2C3D88C2300F2316C63DAB9C1223B1481B5C94D3A38C91
DAB2928D3BFD3480CE6202CD3E13C8879F1C67EF0A89E7135A4103DC6C58CF60AE60058EB29D6DD3
2EA7367624815A222BE9F05DB8D2451D110DAF352E995105F24D0E56BC168BC543EF7335CA8D4EBC
5B4FE119ADEA3E342E7BA4F23ED196BAC8215CEB10B4F1F7C93AF4CFC6B88E4753C61ED5F3CA7397
CA89AA133EAB2A287608D2FE33CBFBEAE29B1691BC35F7E72AB6D958F06AA3023C633D983F97B08A
846A0D99D66742891D2AA152ADF0A4BF996E22ABCD6E532BA9DA53970887A282D4EA7A7E15ACA15F
5EE3A88A99D7E4D069DF9EA55D340AE7622D764D2F50B3917956DCBA97580F7DDF7BBC45356145CE
EBB27FEC5A3F9AA5455F899C3797412659DF45AF87D26A57923AB3BD1975A570E7FEACEBDA3A5099
4A4ECE85EFA2CB883F8ABA5E60F74F5E022385C756D639A135923EA9EB09D8A136442071F8BD01B1
E5B88E0622D53DA2FB6C1054A45B40BEDDC805BB825DA4345EB2AA7709AF2AD49806F044C0A20CCC
DB71283BE79DF6C4104BB4599BFC9EDF219F1399FE804B12F010D893F404CB8EFD903F35B37FD80B
97251C59C73CFB89634B3EAED136986F9D946B719EB04B5396F4AE9C135382005745BFED67DA33F1
DD507DF06AF64C84305A99B731FD68879EE148D4C8B1DC43178EB4BFFCACEB0A6CB0E1959775191E
3AF0459A4FE0AD307ADE17A9E930916E9D579E379C037D575ECF7E0305B73EA2250B13C94D18045D
2A4C04664C5FA789C7A0098F165EB3286CFC8B882B39999178F7C74F6E45F8F7F2CBDED4EA9BB535
B3BA4F3C72006BB9CCD2F2EA58DC820E723E1987E86DC3C483A7EBD4ED4EECE791877102EB3A9035
93BD5DA3A3466B9C9E3E069B85A473E41549E763740FEAE5BC4314A601BA9CD7318ABCB3078DC2F8
EBCAC29DB2984B08EB561D37B767BF10442EB93F2038D91F46E953FE8D265EE8DB4D388EAAAAEF68
62FC9DC0620A21400182B5072990C9B9819EE14C2F9B8999A8771959C2DD3AAC2F3CA5EAA5DCACD8
2A33AE51C470CCCB2DDCAF24338AEAD5F7CA866388BF1FC62D6E7A6D96510C761B7EB58ACAE7DA61
18154AD5F2DE54C6775A4D8DD95A00368DDD71C5FE0F33DF6D52B6A2F163473278D2E1F1CE71E355
2D73D1BB2D9AE9EFDDE947598569A1079656C1C7CECB6706DE4EF3F442852DC2D97A2895396A8791
D80E45E8DE2D52BB8B7D88D2C3F49FDD03BD83C000E762E0DAAC0AF2608F30917EEDE517CD595008
0076EB009F602C51B3D8A794B3DFA38BB416B91E6A111A0852322C4FBD25DAD95ED33C3F996F67FD
71C4DDAD6C6112F66E587AE642E8EFFFB0DF0D1D23AA307D3129F67C16B5A17569FCDE2620F70AD4
DF94B1438B4BAFD1B311F995DB04FCAF4C721CBED94FF66B1DBD900BC4F4160AD1CF55D6C5F74019
02F32D62078B05975AA71C4FDEDF656966A0C1DF25FC4DF61E218D9A1BDF55B6BCB09771F6C8C6F1
64E7D06C06C094F99CB068ED782DDF291A8F236E6EB50B3117D3BDEC32E981CB5DDA0D72BA79FB72
EA3D88A87AC94687376AC4604D4C1473BC05BF263ADAD77F3EAD8186D66DA6298784228ADAD52B5D
3F4CD38CEC4E8D7B61F73DED591783618B005DB67171B151786B2C8B7208CB5FCB46471F766E6026
C8B7FDA28D251F399FF004ACB1AC2E5BFCE34DB39CE6C265E30AF64122392E77222A438A79B6F828
A83240961C9C9129C0A1F43FD3F0A27FA203321F7864291BDEB55E1991826F012E46945164388A6A
60A67823515F068605F3C660C0B46B0948A85A87CD0108DEC3E57D9209C1DF188A79985A8151F0D2
D39922A41B214D58C2B63778C412DAF06C35165B6B3769B5F33C7588955AF608F05768B61887585B
DA3A49E430181F789ADECB4E90ACC7188CE7932FB61EFA6CC6B5CC3F40802E0D33930A3CDCE226ED
6B91CE3D7BA1AB7A10FA0A346A8AC94834A5120C5B3C6EA481A8A462B499731BE63503DFB76C79B7
CDE10E9DE33504C778C96B3FF0D6FEDD3E893181DC73DE591FAD7F27493993D0673EDE1924C3DB66
DDB780AD7CD9A12CAADBB8B8DB2CEF92AF4C081219B9504CA74EEA27ACE7D345C52FBBE33503D596
87B0FCB863EFD3D7D777251E96B3173BD7C9B01951052F7946561D5412432E63FCBC74D664B1CD13
DD66E1573148FCCC155038272E053E2ABCA08FF984939BBFE02F052CEC6F6C4CAA6E9DCC3F281DD3
F7BEB819C3C122E7ED00BCA391E2C44E2CDF855D8E8A1E7E738A64212864F29F9FE5046BD8617A83
A1AD080801F9BD1419A7CA274C0B8C8C138B0D7AA71F63DD3A1B0E29EF16BD5F8C5CC636E1E2F69D
A1CABD42C65B2D849851713A356F28D00B908B5DB61AABB08180ACEBEB679FC7E2D4049AA4309BC6
E5725A0D9A8E74C3E607C1EE5C34C2AB3D1610B8B49928D6926C530CE4700C7C50E8DF0E3EE1B04F
FE6E0413EC2A31DA32F18600B9BB455B6A722E410DD8023FFF9FEB30A06098F4761F4506F076F988
B8C5A1FF827C5E7E95DC19AA5D4BE4A1724BECAB3222173D03560B9771DF7D3B208050EEA13DDF80
14378432FE0430F8FB7EB6ACE1EA82F2317AFCE8D2B45A65B7784C9E13F1193B6346F6A352E228C8
8A4D55D31695CAE971BDA2FBCC17960991B8E60947AC99CF2FABCB79A48E16283B2BA2164A930740
A9D18F0009AFF67DD34167BD41196B3D5DAFC9E1049CCA6FB774209DEA7E2C42F6E65A188D24896F
3653891ABBAB78FD1C23817CF3C5D8E3AB5F64D379282D2BC351525E9C76B76567E08A01F1E16255
0378016066F6BDDCB6D9E5F7D08AB20939EFAD81CF5E364A70D65EFB67B9E571880C3FE2835A747B
A63C62FC210735A2A3083FB9DE151D2E6E679B91C71D1DC6314D6CF5FB5E28ACA83FFF557700CA6F
21393495BF37F483773475E4A01D4A13CEA3AB3F3A48B732A0EDAD00D357E6FB319F9856E3C60D8B
5D12CD73DD6E781198F4E90AAC81D3EB4F81631C6CE5C0C15C10D3EF2646CFE66DCE4D96E9BF865B
757E8BF6166116AAC9CBD2F3740A4BB774C56929682454B42D94AB588F7F08C947B05160C69AC734
6850D92EA778FC283C8E426C20B5298872676067E9514628EAB2945EEAAD7B0B14B5897AC72E85E0
79D14BEEECF991C3B5520425DFECEECE27074E88764123B44DF55D6B0AC4B5907BD06A1597042E38
1620C3FC4FC060055F44CC990CB0CE4FA3413E25EE2946B320822602693D0A84A903219CD5BD4D80
A9E39FC7E3A3E005836161BF14BCDF1CA8CA53ADAA0EFC8EA9099B09F52B3E41D35D45ADFDB07A49
D728FECD98878114E540AB9EF742CD5C9D460457ECE43DDFE1A5D86E4D18B23CA9321641E132C15A
CFDB4160FFCD520F73B4953548FE979B1816EA0898FD5CB960B64F2D3825E62D5756E612E21DF873
1DFB0247E1EFD2703734B09BEFF822DCAA6D0E05A56A2460D8E6B77BD6318B449EB09EDD7377266A
E07FE52A9A487A419ABFCC76A68316E08B80BA83B34E9E47DBDF4579BC64EC21360EEFBDE14694B7
17F729A6BD42BE390CCE525A5DA99E98F34D9A7F3BFE9575E801925764EE7B1DBE3026EADB091F1D
55D7FC7150F6F9C7A0B018C60B24CB616A38179D8F87EE7AD45CB396BE8E80C28FC165D71C386E45
81BE50C467EA1A136F5524161D35B177A4B87ECD98738704C1AAF35511E2774A5CA6F552ECE4F1FF
B439E130E4888A970846B49C6DB033B426D4B8546C4B8EA3E664C7AFC6E957BD57B0A2DFA3F14A23
930FD17F2B8203D0ADEA1882229024764251D4E74709C7397AB4223D8EF5323C09861455D36F55C7
69048ACC0295ACC374B65000F7DFC1EC3A22F390A5FFFE871760BF89F37AA22397BF0675D630D2CB
E1BDC2A0897534E5E223916C2A6E9D012E93955D70597A9CD89187AFB4018A89F828F4491BE959F0
A387773E61B44748CC18377772089F99D3DFF8D8C7B2E82C34F4B9ADF5092E4197C86EAF396CAA00
F8CD06FF2C1B1B46955F30A6898F7AAC6AB3BA2657C41F972C7A23F76EF0382A4817F362364489B8
B009BB7147C7A1B44216B09C2731873F15E5AF07B2F0B9F35BC176ADFA37A0D668CD51175AF4CAB0
4D8F2E8E3B758C89A80A372DE05C0C4BCBEAD27FDD7A4AD65D4404D1D70607833057E12C1A7B57D5
8791F7022F156B273E41BFED870F73A6DA20ADA11055A0F1C7F0C7FD04D5E3A9FBBF578356598546
DC94211B501E13B5E8E3E6C2A7E8EFA083EFA69C4720AA78874BA25FA1DC6EC16BE1F98BBD6D9C7A
B9BCD387E18182A48EE6A355B7063CABED163499F433089FCA5B23C80049C32CBE669C518850144A
3A22DEE14676208C871E163013D00F8181CBEAC592FD328194C24E1C8897E43B92080C2F0EF20896
CD42CE9C7E7F7BE4C3F10797924923A5BFC901238A7370B623561C831153E1B0D99E8B7B0880BCC0
98403F8AD1D28D02A1D56B587570B761B21BCD31138BA52D5C2BD8C44E60CBE9C4CF29AEAF10A7E1
3AF3443CF7E59C5B2211C348DF9300240B7DFD026C86C6FF0DC13CE702A16FF580EAAE28ABEFDB6D
74857E0DAD7A133BE197E1DF368C83336739E180F62583D737B4FA1A7768E8A939C1B8B87A6EFDD8
CC7A7ABD2FD67D407DFE11AEE68C2A018ECB13A7962647AA73FABE65C263B99F4F64F8E783008F63
F08E60214FB8E87BB9F070BA1D525963212C969EE445489D5BE6A84F891DF035685B577250A04E2A
072910D98A4D0DA55EC11BCD68D6DC9FC9406AED3F29654A281320B832E55C4CE18148567C89DF73
3618F030784B8E33E279693662471ECDAE924EBD4C70E0A195E291C6326878F8F9D456E911F9097A
DBB6F65F063A1013A93E5F03A40DDB2B1A8F5653F4B9CE8D97DE9697950A61E7FFD9C1BE4BF0A4A9
B0D23033DECEF861F8105E0BC940D1AC0241431FFF30301EEC0AA5A92B1884D57784D65FF566DA67
F63E22F63CAD3B3C79AB163E06D3815C5B0FB77190A9AFDA28F20AAA7B27211687AA70DD145D991A
DEC5806C72CBC11842E71520FD506131FC2B1171707FE37B0088CF0741BBE9B1DA3C20B483C1EABC
6B8D001FE905EC49C083E743C80EB61F1C07D2EC900D29F555D1746C72E4FEE31B8C9BA2FF5AD86A
CA7C99AF7166E10BA511EFB374E6B4B6CC60A1BC411A0F0A99A235717311F9B5F13DA039CC809CE6
7A0DCE7E6789DC3855612B87A45A22ECDBB3D27A50D273A79DC536885497F45162EBDF611B28F08E
5E87F4DB33A4AF35EF1ABF036D0F20408C40C97BC7CD0C1BD67C63C8B579472C31DCAF6EFB3340C5
84EA880860E8270D0C9DE4EDC9A5ECAD002F8FC89AE35B5B1BAF0EE2622812722171C7EBE7456430
333B2BC721AC050608A248B749FA14425AE342A372ECEDC8D8575885FD9F8A01A1AC49600DF359CB
447240CE2BE67E2A87F8C667714CA293C73C32FBD81C68ED378098B4AA2F25F6833BDA37378122E2
B42B0D71455A107A5A8E1ECA62F90B344A721829ACABD7508CCAF5A5E4FD21FB7835904436332C34
B0C76E8D5AF8FD17DC4905B9240FF0A8463F382A4F994B983EF7181B2194C408BD78420EC166036E
85834828815B1F0E2B86054302022A579B326835E5C3A5E6004B65913AD3C850087768B98967CAED
1AE2D57ED0F571401B49454CBD6E0C0A56184AB53AF115E8E9EAE3DFA21C043ECB858DFC4719711E
F0276CBAC01060B468313C1F47A5F6D19827F0B2BC270A507053D3F1E7CC5103D851F31132BA7673
C00D8442B969991CBF2170867ED3CBE7DB83FB54280BE9A7F6409442E25F19450AD71303D9DF6C5B
87D94BB1BE7164B4304B6A4D5199B9C66CAF82F77D9EDB6AD9F9EDF53FE4771C77B9E2D0F66A9DF2
907EE8AB0B99A3C84E2A54695E31FD722CF866D92776EBE025A7E782316F31249CCC8ADAE49CAB8E
5EE47174BDBC51912526F12591BA50A9EFE34A811B4B742534DAF509037EE1120C9D34A5A10C3C50
86A7A7FD6725D41949A0CD6B09F315C84888653589B5D037EBB4A7994E2167A8A8C5A83EBBC7B2D7
3885E9CA771D458BE380A9A9C577675473E73AA1B8EC7B403B15487ACBE732E3473F0C657E7667FA
378E596CB60376BD4674F6F434BC0F1D74C53F16DD262F75E1126F0E9DC72AAF172D45927CAFFB78
19AAE5591F8499ACE69C55E540880472AD52E410F7EBACBFC5A425782BA6EFA0314AE9DB2A701D83
B6718CC8A193A881750E5D19764B41EA7F65D5407F8EDB7A0CE18FFBAE859D6A06E03CE95799427E
E6CFB40946DC4D91F16308DEEACACB1DEB688ACB8C9B066031D439DF464683C26AA72903F65043C8
24043F42269743B48B9F0FF7F1A03490D0488727A1E0AE777362336E91E07724491857EADF75C77E
5A0E9EB475858069D091ED36624675F318016EE24B2FC58CFE1CDF3B0E48CBAF0570A86919ACF9E6
0348717CEC01D9B06B133785964D25FB84F480F44F37DCC14C4410079F996845C3A6C3F687685831
31DACF9D31CD567909108660E25B31C8A54A7BFF987D8877E27EA80D450A582BD6E14C36D146036C
AE2203C923E77C45721931AD20FBB70DA40C424A81C3DF7D7F72906DEC2DCDCC6F48FB94F0B5F50F
1D5EE35258BF057E914F05880F75616D57CF722825988D1DF1029F6829A754629A104141E58AD0CF
2E80C798544F816622D5ECBF98F4FA691FADD53EA9A1C0F888C3E9F56B3AC3AD7FA5DF806B70BC93
104A950594E0C93596577111F806ACF86300CB419EA2AF287B0D8429E8860232129E66055C1494F8
4A33D24E85AFF56A6E0A8ABDA05ACCD8E7EFD2269107B96CC1E541288FFD0844265EC9C7973483AA
5CEE5E273EC905AF86F4E006C676DE7D5052F66602568FFD3C7EC31C796F7B8DC857F21132A5FFD2
C2056BC52DF2C6A05966ACED0E5EDCEF502FCB79DCA3BC0C2D7C08A256611E44F5F5D923FF120A35
9A8E378A68DB20FFDC4B04FD8C5EE9D70020F5409CDE41FBD28B8231FAFA932DB9B7851F2C981BD7
41048D58FB311CB5D5CA58E91D688AA7F96C11D341BD1CC285A4864C8B852945C0E7446658B9A168
89B0D2DBCAA9C3E19EBB69AA9E4461D92BB34BB7C108C054099BEFF7278C55738751A291D20F2285
A3A2B2CB9D395A945FD3ADC1C0A005EF6369B0375B93BA4F30A4C77CC425B31B7AB2192E69EF4C1B
13C6CEEA5E26E68D5507A0A163B2E3D45F1FEE90E6C242EA7A9954B723B68C424F6BF647727E8028
6BBFE003D0C422A4F6823ECB5825192AB1EBB2B1B16A5A786AA7C62CD02624B0CB9C0566627D001A
8B9DEAD47294AC97B0D75AB890A18F87663FA32553444411D96EF29C86E6FCA8636C3CEA00037A74
59D83A715275B77E3FFAAFFAC8F5AC1BA2ECB925B1F81725663DE85830A52E7E465485E22F4189B8
635D6C4B484684C938AA352FA813E2F00E5733DCB2E6F6CB03EA98E5AE658FD2725713F7FF9B0CEE
EC80D6D1FCED6A4047CCD98DC0C56BC9B64061FB458D2742FBFB46A3FC883D173AD767E7F5C91A90
F1611088DB87C6FC6FADDA141D8D598060EE144D0EC5BDF3B18FAA97919737270BDED59CFD1547F8
047D075F7CE8CBF1FB63E95AB4D34EE34C7001522D5FFED2F9BFF121035158DC4D011A3C32700D28
364526B06FC48FDE1E1DCE77BC120E93C85EB0C8B6589D1AA97338DA39D4CBB0C2CDEEBEA86EF069
367C53E571075D67E01B5BEE2CA83F27D341DB417A207A9DA8452E2D74B6B27909E976A96C7EF316
50CE7570532C3A9E502ED3812146ABFA12754D7E1871CCB59154254C9FF34AE07EC5033CAA68FB5F
0F64D7013B1976A373DDFC406420012E61F76D62F34D2FEF08751F54E8A2321D38BBF32CDBCBB619
A47EC4A4EBB92CDA9417B695131C99A895FDC7242CF93B29A12E6862871E1D07F6023574810627F5
655F14CB55F4062456C6DAC6FA4121E0C87E30FC0FEFD09F113B42C94AC0045BB6729AA4685D3C31
0CB92A3B8DA8229DE0CE4D1D39F575147FDF2238D243E15CD1BBA7AC2BB3744B95B103E3DA2C9EE5
2B053C200501C8D933CDDA4495CEA2C6C5731AEC14BD1E8CA27DFF3CC1A04C2FE936B16516673279
5E5EAB231CBE020039A5DBC94A198925001A338C2AEBE26C4C3C0242A2697865381775368D34D0E5
6225CDB95A62674D7027AD9C2786FD637D5762C378F2FBE5B44B2A93A4B047FA8D8E2FC020E24258
F3CB93ADCAFBF884C0B17847D7ED45C0EE756E9550CCCB65044572CB04E5C96833DBAEC0C71E8AF1
67A773389CEB9AD55C63A37D5B02986AD6574AB96EEAADAEA4BB069ED66C9421C3CD52514DA8636C
98306CE6B5DA2442304EF186C2C4AF16172AEDA79D25698D3FF457BCB8A8B4F532F4C7DBA8AC6702
9BED6D804755729F68AAD5D4C780FFE432E9038CEFC5FFA9D0B92C2E911AC259D52858ECE3B98CEB
7CB39386272DBCF4020C86E355465EE1A0C956ABD520D144444313C3DA655AFEC31B127788A52B11
9A6CF230880D2D0F9FAF9438F2B2C297913D1E65DA4DD056B72CD1EB5E299F13DA6EC29E90C18D4C
226284369D975011E08DE090DB02C940394C7FA2A9185B5DA872D3237C1042E7B1419F320FE0B2FA
D7BE54B21572211A860F0D83FACD214E045FAB5666686561507BB894197D8B9263F2C903D9DC7D12
F396482ED4AB4B8CF2BB5BAA3ABF991984D66650F0921FE26D4F3A278BC2AF17F1270267AD340D0D
B44E5B9492E0EC851E85178BEC1BE3EF265ADD71F89B44EBFB7AED2689875AF8D23AE2AB4074BD82
D02BBFACD555F78842D55654AF77B736E42527A8B87E92FE141D4B8AC9F86CDEE43CD8F458755629
7C386745A45D25F9C235436ED1A3F518CB3CB060F9E25F3053A46101F8A47E8E56D12F3BE60C9B24
D6E8CD106B21B918FADA3351072D466A4C611A3A22062654200FB562F8F226541624DD047EE2216E
15A23BD056931A7DBF1AB4837040695F92BE2828ED16E2E3151E8548B007B92040F2CE3E375C5258
881DE796857CB4F8B045E1B9C4BF7E592654E3D52947E66208F3C1068AB8EC1A5EFA08BA5A3DDA75
AF95CF256C26C247EA42E788438AD2F6C21AB08F36B65592E73C60C28C1A2B606DA7247BC9955727
9F7CCC3159BE92D298AE0F2B62F934D3B57BA952B7C9BAD9DC78448A5959694BEBD4FB9635A0F5DD
49A72C12150E2A83763F545B2613BD56E836BD1F0135FFB953160A24095C31EF7F7E5539C3CE9C32
43E0EF46776D83F450ABD074A6BE926A774681D2D7D70982E6198080B8CF113890403AACA80585C3
1050B9FAFE8339AE404F1FCED604E1B884A634C508E1C50B7C64FB3055043F5A3B336F0E0F9471F8
624113A49D197BB3D0D0643D73B9A93AAD1AEF9D6440D1D960537917952F85E063C38212D0C212F1
10CDDE659EDD02D9F0D62057FCF8F65798EC6EE9866ABDC74DA9CA98B909802F38AD7B2C5EB5F682
769D4E3715BDB46DDEF744CE75FE0D38D04EFFF7CF64DCB552F474C8D6861AC30D8269BCAC58B843
15214A035146AFCDD689B69E2529B632B097E4DC6E36C585A8C228C687A6CF9E69DBB752ABAE8E8A
6F880EFB2BA3DE28B126C0357E6ADF9BB92353CA98B1DC5EFF9B136BDDDF4D442435339DA03C979C
BA3DA87F14ACF3EA05C07793424C0586B56CB44581C6E969BFDD32862C11C5B561EDBE135A9A5939
EE591266B1A6FDBCA8147D4775F53B9B5016E00185608BB14637DE71B23B0A9D908E9594343C782B
CE1DE2409C3953CAD9129E8C250FF111B6C664D96820E059C67B1F37730F858AA9E40E33EC688D55
819B66A6443212175AE46C17FE2A2E1E5C800A803933BDB5577D749CE78590B7F133CBF5B33F61A9
9E478B00E679717299D3B4157E1383436A460A24390781CA9AF2D468CCD08BD6A0A1452AE459C1F5
A1DA700FB018BD928D57344BCBAD15A37F8AD3EC32A1F3A6F21CCE25D73D4E1F1DC93CAF76FDED7A
431B954C154A513B7982A7F72D03E24551E768545C81FF727D5EAB1E6F8B7F850BB96721151E88AE
CA305CD7576E47B0AA02E8058BF142C5F6C8D0F8A987070C98C7BB3EF7BF09EC255F6A959C04D04F
C456703E17961C88F5C22120C07868BE80D2EBC356B2653F2159675C2F8917AD7D9202FC65594728
374AA869A0B5EF2684D8DDCB8B8EF3B8FC8B04D31FD16C5132C174D9F23F72C3BF891960B1636150
1866C7F7C54B74A257579DCAB97B709D0D4A8B8FE99A1B7CCCF0899D09BECAD1C3B0ECCC8E9975EA
BDA1047ED99F3997467150A785B8ECF3B2C6D3FD1729F6AD8450DB4C4B6686B5F5A06C61CCCB0143
BF7C7836D79FBA68BEE6474240DF8675F8F2B780898236BBA20A63341ECC3B02D14F620B91641D58
93585DC32806A933F26F3B9840C95E637F0E233CEAFB31177EBE6BB9A3A0D82D46EF410560D6D10F
36FFACEAC9D735A80A06A5646698A4290D9EB02047996E741C212EC6FCEA3BF7502EE2F3E860BB7A
EAB485F1991FB28410DDD46A77A40178D8E0190ABD7817349A50A7EDFFB008742100E927445A4908
10E1FEE2869B4609838BBC219A3D6822C652C5A9F564C7AA7F3A3F934B2D4F0F06A54BF344BCA794
A4D3A2EF5B565D39D9241BC2A5EF7C96A11465166F480017DE4C884BABBCF33F072DCCAF833E0771
D105B449ED23DDC5D3C02DE2CBA45F8D22BA3E1B6842EEE791540BE727044CF7D99FADFEF45FE14C
74CEA615DFB5BB6F7B27A4A1EF8A1FFD4F838A8DE85D488F41E97B9ECE0EDF00604F922EE0EE4ADF
486CC0EAA2C3C60EC275F2792FEBAF4B6BC4FA59AC378212EFCB763CC794D2179FFD538A6C19F5F7
35084AE03A90AF00BE5821CFB9BF2C966B4AF8D66AEC8A58C1C683AD392F1DF20983D1210AB6BD73
9FF130869E652C09E9A61D8E892A86DE1B31BBB1B80239B6829368ED026C645F95FB953298411E84
003C85967FCC739651014E3AE23B578A64BF14F6AC87777A6719ACE6119D6393E8DC9B9C7AC424A7
857092DE86375831DC985ABA2133B44EAD072744924EA4A738DB94D432045A8035A9BE5F9DA3581B
E8D60FB428BFD91A4E145D11CC9E37B47179162B6721F02E943E3CC9CE5A14C89117F44E4113E47D
08A3D75BA6E33D52A7A479BB40A41DB53E3A9C6BE6298B2ACC8AA8A0CFC10954EDF1D3EA9EE3C5AC
8D8C4424603C5B41DB638FF08CD744DD8AF80D1D96587F12AAF4FECAE452DC350204E10740469ED1
ACA97C52C331A823C651E99021A7DCA218086B724D2B483F0484C158D238507834F478347418ED16
B42D30F04C3E1AB8E0C006E8943934B6AEDFA2A5B255F2B41F5EF8A1CA1FEA020A40A8A8AF420615
E2FC6237EDADAB7B8C8DEB09D78580B4C29782EF9551E55CD962FC17DC96FBA80DFE4AFB9806AD98
F06B021F84C35D19B5672E538EC00838588BE19932C79B79F630948E4A47D1C54025FA75AED05AFF
A16F675A7C089E7890618EBD3D0CEF29CCAB7F5BBBF5C6FCE56E64816ACA9895DC824E8BBE7A329C
DD7FF5925736B8FF8AEC4A56E6A980311F8F5A6B06520E74512270098436D99C5BD9C4BA2F81728B
1C82B52D9E9C33EFE65BDB233C6384471C0FAFAE94D7308B7EA591ECE5412151F0CA5C1F8214CA0E
FE6EC698D0AF6B64524C6FF9F3DF6B2AAFA270535F6484B743FF927C0284E56296C8BE8E77D566D2
EC6D45C933C5CE1128BDF66FFD0DA7864F1BB09F74604D2D27B4C7FB1DA5D28CEB0902A32C1EDDB3
6BEEA2D44FCBE59B0D0F3C37FFCBAC595D6110DA77605FF20042239CBC1B7B245CD25C99196105D9
9AB195319A9AE4287A0A46D32F8DFDFCABF792CE8105CF77F0AF50A011D7D58F17696FC68706B4C2
B9BF5AD816C492AE5248EB96622399A3AC9FE5FD926CAFE71279F7677820983BBDDF28625E4884A2
ECEEE746603B1E7E500239FEDC6A7DFAD82AE32A7A4A83046B3649EE86A77A39E5A165C28DA4FFBF
98652943738A6F3C4A83C092DC0A40B1065F429AA1B1C2B1A2DBD13F194ACC00D52E3D4C0A8C9CE9
C2EFDD9708F5CDA6334687D4E21DA5C5C734CE2574BF1E441D9BE03946EB7A35359AEDFCB84028D5
04D7393088C9A7DD1C0B185E72C51E7DD1BF6F7D074105C530963F3E463A98B2ED01DAFEC6AAE40E
E63CDF0CD8C180306692D12175F73D3175FADE69B4FA3B98D0A4358BEFDC972D8A26EBF8FEB0FC53
35FE9F528808E7ED2228172021278E0EB68ECEB7C3E6FDD42B27EFBC8D41530959317FF714928F77
FD36FB5723FC5F3890A8D91CF18BFA4073BE695FCCA6294F9B272E29352F72B9F420B881BE4543E0
C45650974079F8BD8D70A1CC24CE4112F201DCF2556325F5D62BE6606F72888937BB54BDBF744C25
E08CA867C757FB314E8D51DDFEA3905CA670E5F478F42033B569A754C686E3FE4F93FFB96BB1CB57
16334F15CBD2D37650D6C4BCB11DDC6BEBA5D33B862D2D9B7CDD4FA537F439DDCB13C966BF5CF6A9
395ED6E32DAD3F9BCEEABEFE91F4AB4F129982165F089F9D40159998F8D737641D6C32CE4DA1AE05
F0C1958EA4D2A9BDA6AA567BCC1F0DD5152624E66E4BE9F45791C0B1EC1E09EEADC0515E72E7C672
A63AB31E8B85EE2EA39B193618427C4134162604DBE8BE3BBA64B4F3A43FE6F56A08BDF26AD4C4B4
6BB12C4EDAE915E47C236364298A637ABCD18590C6EF2C096A2D3D53C48469D25B514A23A6568186
05E255F1B85F576638243CDB4FF8068DEBB912EF9674C80976DD3CD0C75CBB562BD3F3C6A31868F8
40CC9197E4FA01DF1A1422ED16B127A4059D2C63838BAAA0F7F620D89A4450916B2FA001FA4E9C77
3ECA2D2DE2775ECBC0CEBB9CA6903440EB1E4E83ECADC1B5EA255D953F91BC39846692CDCED695BE
F7EF5B838A34509B771F4C89CE01FD851E3CC0A02486FA574A1F09DB3DDEE582C27C5FB213ACBC35
C96CE631EC7FDCACE158B5814FA74101EDE2FE917928532AF7476C41857D972CA11EFAFB7CB42AA8
5E957769A16C570CC97CBA01F71E574AFC75C94A99939BC8EB001760829467FB5227539FAC3226EF
68D8E7D91870787C47285A3F08F0386B132024F2008C9C081CD741D691D9E7EFAF47B2BD7D552426
5F40CC31ABE23DC2A26CA215CA49700432DEC497ABDE6EBD4066207033879642B6CA884DA74281EE
C3F8EB4F40C89998ED7D4659604E95ACAA0F182625139D9F9E4DFFD97C20C09D88927F524FDE1E3F
C8AC0B149F9C4F4AE3F82FCCD553608AB401DA54BCA3A7FE854B01E5C07A20FF9AD6C7C7E25C68E3
92E48C88B5AF930920CFB487092CEE4937BF5E76F99D49289252DA678433A6877B37856C4D3402A7
ECB7C4E6FA9E1595CA25F15279EF185864D44A0389B1FE69AF3C271688B0E2EAA7147B4C2B4A1206
7CA524E7BB570434E1D1F0A886A4A368B93220E33B9041B979000A2FCEDCC494C05A1EA3EA79331F
CF6567C41FD5BA08829F094B7F0A1149E5738219A8FEB3FF04FC4A7EE3A620040D436AF600AE157D
F48A246B76B05BF836F7BB2950BFEBB9B2B34E1FF7150BA77E48D45ABC18D074906D136D9AED3BCF
FE951A7F707E
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
cleartomark{restore}if
\ No newline at end of file diff --git a/resources/ahem/Ahem.sit b/resources/ahem/Ahem.sit Binary files differdeleted file mode 100644 index 34057623140..00000000000 --- a/resources/ahem/Ahem.sit +++ /dev/null diff --git a/resources/ahem/COPIED-FROM b/resources/ahem/COPIED-FROM deleted file mode 100644 index 45bac8b4984..00000000000 --- a/resources/ahem/COPIED-FROM +++ /dev/null @@ -1 +0,0 @@ -The files in this directory are copied from http://www.w3.org/Style/CSS/Test/Fonts/Ahem/ diff --git a/resources/ahem/COPYING b/resources/ahem/COPYING deleted file mode 100644 index 6327b904bed..00000000000 --- a/resources/ahem/COPYING +++ /dev/null @@ -1,36 +0,0 @@ -The Ahem font in this directory belongs to the public domain. In -jurisdictions that do not recognize public domain ownership of these -files, the following Creative Commons Zero declaration applies: - -<http://labs.creativecommons.org/licenses/zero-waive/1.0/us/legalcode> - -which is quoted below: - - The person who has associated a work with this document (the "Work") - affirms that he or she (the "Affirmer") is the/an author or owner of - the Work. The Work may be any work of authorship, including a - database. - - The Affirmer hereby fully, permanently and irrevocably waives and - relinquishes all of her or his copyright and related or neighboring - legal rights in the Work available under any federal or state law, - treaty or contract, including but not limited to moral rights, - publicity and privacy rights, rights protecting against unfair - competition and any rights protecting the extraction, dissemination - and reuse of data, whether such rights are present or future, vested - or contingent (the "Waiver"). The Affirmer makes the Waiver for the - benefit of the public at large and to the detriment of the Affirmer's - heirs or successors. - - The Affirmer understands and intends that the Waiver has the effect - of eliminating and entirely removing from the Affirmer's control all - the copyright and related or neighboring legal rights previously held - by the Affirmer in the Work, to that extent making the Work freely - available to the public for any and all uses and purposes without - restriction of any kind, including commercial use and uses in media - and formats or by methods that have not yet been invented or - conceived. Should the Waiver for any reason be judged legally - ineffective in any jurisdiction, the Affirmer hereby grants a free, - full, permanent, irrevocable, nonexclusive and worldwide license for - all her or his copyright and related or neighboring legal rights in - the Work. diff --git a/resources/ahem/README b/resources/ahem/README deleted file mode 100644 index 7a4fcea05a1..00000000000 --- a/resources/ahem/README +++ /dev/null @@ -1,30 +0,0 @@ -The Ahem font was developed by Todd Fahrner to help test writers -develop predictable tests. The font's em square is exactly square. -Its ascent and descent is exactly the size of the em square. This -means that the font's extent is exactly the same as its line-height, -meaning that it can be exactly aligned with padding, borders, margins, -and so forth. - -The font's alphabetic baseline is 0.2em above its bottom, and 0.8em -below its top. The font has an x-height of 0.8em. - -The font has four glyphs: - - 'X' U+0058 A square exactly 1em in height and width. - - 'p' U+0070 A rectangle exactly 0.2em high, 1em wide, and aligned so - that its top is flush with the baseline. - - 'É' U+00C9 A rectangle exactly 0.8em high, 1em wide, and aligned so - that its bottom is flush with the baseline. - - ' ' U+0020 A transparent space exactly 1em high and wide. - -Most other US-ASCII characters in the font have the same glyph as X. - -The Ahem font belongs to the public domain as described in COPYING. - -Acknowledgements: The font was originally created by Todd Fahrner in -the late 90s, and was updated by Paul Nelson in the mid 2000s. The -changes were the introduction of x-height information to the OS/2 -table and the addition of the space and non-breaking space glyphs. diff --git a/tests/wpt/include.ini b/tests/wpt/include.ini index 2f7cfcbab3f..34b46888286 100644 --- a/tests/wpt/include.ini +++ b/tests/wpt/include.ini @@ -216,6 +216,8 @@ skip: true skip: true [srcdoc.meta] skip: true +[reporting] + skip: false [resize-observer] skip: false [resource-timing] diff --git a/tests/wpt/meta/css/css-align/blocks/align-content-block-002.html.ini b/tests/wpt/meta/css/css-align/blocks/align-content-block-002.html.ini index 4bdb2e838cf..20f2aa68cb1 100644 --- a/tests/wpt/meta/css/css-align/blocks/align-content-block-002.html.ini +++ b/tests/wpt/meta/css/css-align/blocks/align-content-block-002.html.ini @@ -28,4 +28,3 @@ [.test 16: space-around] expected: FAIL -
\ No newline at end of file diff --git a/tests/wpt/meta/css/css-pseudo/parsing/highlight-pseudos.html.ini b/tests/wpt/meta/css/css-pseudo/parsing/highlight-pseudos.html.ini index 4777bdd940b..df99ba6dd73 100644 --- a/tests/wpt/meta/css/css-pseudo/parsing/highlight-pseudos.html.ini +++ b/tests/wpt/meta/css/css-pseudo/parsing/highlight-pseudos.html.ini @@ -1,7 +1,4 @@ [highlight-pseudos.html] - ["::part(my-part)::selection" should be a valid selector] - expected: FAIL - ["::target-text" should be a valid selector] expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/all-hosts.html.ini b/tests/wpt/meta/css/css-shadow-parts/all-hosts.html.ini deleted file mode 100644 index 8fce3b78803..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/all-hosts.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[all-hosts.html] - [::part with host selector styles in first host] - expected: FAIL - - [::part with host selector styles in second host] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/animation-part.html.ini b/tests/wpt/meta/css/css-shadow-parts/animation-part.html.ini index 5609256d589..7d3d4520485 100644 --- a/tests/wpt/meta/css/css-shadow-parts/animation-part.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/animation-part.html.ini @@ -1,2 +1,2 @@ [animation-part.html] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-shadow-parts/complex-matching.html.ini b/tests/wpt/meta/css/css-shadow-parts/complex-matching.html.ini deleted file mode 100644 index 6c473570671..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/complex-matching.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[complex-matching.html] - [Complex selector for host works] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/grouping-with-checked.html.ini b/tests/wpt/meta/css/css-shadow-parts/grouping-with-checked.html.ini index f39eba9208a..d7f1d73d98d 100644 --- a/tests/wpt/meta/css/css-shadow-parts/grouping-with-checked.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/grouping-with-checked.html.ini @@ -1,12 +1,3 @@ [grouping-with-checked.html] [Styles applied to ::part(...)] expected: FAIL - - [Styles applied to ::part(...):checked] - expected: FAIL - - [Styles applied via grouped selector including matched ::part(...):checked] - expected: FAIL - - [Styles applied via grouped selector including unmatched ::part(...):checked] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/grouping-with-disabled.html.ini b/tests/wpt/meta/css/css-shadow-parts/grouping-with-disabled.html.ini deleted file mode 100644 index 3d6b92b5b8e..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/grouping-with-disabled.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[grouping-with-disabled.html] - [Styles applied to ::part(...)] - expected: FAIL - - [Styles applied to ::part(...):disabled] - expected: FAIL - - [Styles applied via grouped selector including matched ::part(...):disabled] - expected: FAIL - - [Styles applied via grouped selector including unmatched ::part(...):disabled] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/host-part-001.html.ini b/tests/wpt/meta/css/css-shadow-parts/host-part-001.html.ini deleted file mode 100644 index d52687ff32f..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/host-part-001.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[host-part-001.html] - [:host::part works] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/host-part-002.html.ini b/tests/wpt/meta/css/css-shadow-parts/host-part-002.html.ini deleted file mode 100644 index ad2c732963f..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/host-part-002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[host-part-002.html] - [:host::part has correct cascading behavior] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/host-part-nesting.html.ini b/tests/wpt/meta/css/css-shadow-parts/host-part-nesting.html.ini deleted file mode 100644 index aacd37b4934..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/host-part-nesting.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[host-part-nesting.html] - [:host::part works in nesting] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/idlharness.html.ini b/tests/wpt/meta/css/css-shadow-parts/idlharness.html.ini deleted file mode 100644 index cc4dd4679ca..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/idlharness.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[idlharness.html] - [Element interface: attribute part] - expected: FAIL - - [Element interface: element must inherit property "part" with the proper type] - expected: FAIL - - [Element interface: htmlElement must inherit property "part" with the proper type] - expected: FAIL - - [Element interface: svgElement must inherit property "part" with the proper type] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/inner-host.html.ini b/tests/wpt/meta/css/css-shadow-parts/inner-host.html.ini deleted file mode 100644 index 5c34edcb01f..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/inner-host.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inner-host.html] - [Part in outer host is styled by document style sheet] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini b/tests/wpt/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini index 1a36ec9273d..675aa8dff70 100644 --- a/tests/wpt/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini @@ -1,16 +1,7 @@ [interaction-with-pseudo-elements.html] - [::before in selected host is styled] - expected: FAIL - - [::after in selected host is styled] - expected: FAIL - [::placeholder in selected host is styled] expected: FAIL - [::selection in selected host is styled] - expected: FAIL - [::first-line in selected host is styled] expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini b/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini deleted file mode 100644 index c086b128d2e..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[invalidation-change-part-name-idl-domtokenlist.html] - [Part in selected host changed color via part IDL DOMTokenList attribute.] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini b/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini deleted file mode 100644 index 2269f6e697a..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[invalidation-change-part-name-idl-setter.html] - [Part in selected host changed color via part IDL attribute setter.] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini b/tests/wpt/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini deleted file mode 100644 index 772668059f2..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[invalidation-complex-selector.html] - [Part in selected host changed color] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/multiple-parts.html.ini b/tests/wpt/meta/css/css-shadow-parts/multiple-parts.html.ini deleted file mode 100644 index fc47c2d1237..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/multiple-parts.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[multiple-parts.html] - [Double-part in selected host is styled] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/part-name-idl.html.ini b/tests/wpt/meta/css/css-shadow-parts/part-name-idl.html.ini deleted file mode 100644 index 27699f0b592..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/part-name-idl.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[part-name-idl.html] - [Access to .part returns an empty DOMTokenList.] - expected: FAIL - - [Multiple names give a DOMTokenList with multiple entries.] - expected: FAIL - - [DOMTokenList created by access is persisted.] - expected: FAIL - - [Changes in DOMTokenList are refected in attribute.] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/part-nested-pseudo.html.ini b/tests/wpt/meta/css/css-shadow-parts/part-nested-pseudo.html.ini deleted file mode 100644 index 1cc6eac641c..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/part-nested-pseudo.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[part-nested-pseudo.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini b/tests/wpt/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini index d37678023dd..d8bc08b193e 100644 --- a/tests/wpt/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini @@ -1,82 +1,28 @@ [pseudo-classes-after-part.html] - ["::part(mypart):active" should be a valid selector] - expected: FAIL - ["::part(mypart):active-view-transition" should be a valid selector] expected: FAIL ["::part(mypart):active-view-transition-type(mytype)" should be a valid selector] expected: FAIL - ["::part(mypart):any-link" should be a valid selector] - expected: FAIL - - ["::part(mypart):autofill" should be a valid selector] - expected: FAIL - - ["::part(mypart):checked" should be a valid selector] - expected: FAIL - - ["::part(mypart):default" should be a valid selector] - expected: FAIL - - ["::part(mypart):defined" should be a valid selector] - expected: FAIL - ["::part(mypart):dir(ltr)" should be a valid selector] expected: FAIL - ["::part(mypart):disabled" should be a valid selector] - expected: FAIL - - ["::part(mypart):enabled" should be a valid selector] - expected: FAIL - - ["::part(mypart):focus" should be a valid selector] - expected: FAIL - - ["::part(mypart):focus-visible" should be a valid selector] - expected: FAIL - - ["::part(mypart):focus-within" should be a valid selector] - expected: FAIL - - ["::part(mypart):fullscreen" should be a valid selector] - expected: FAIL - ["::part(mypart):future" should be a valid selector] expected: FAIL - ["::part(mypart):hover" should be a valid selector] - expected: FAIL - - ["::part(mypart):indeterminate" should be a valid selector] - expected: FAIL - ["::part(mypart):in-range" should be a valid selector] expected: FAIL - ["::part(mypart):invalid" should be a valid selector] - expected: FAIL - ["::part(mypart):lang(en)" should be a valid selector] expected: FAIL - ["::part(mypart):link" should be a valid selector] - expected: FAIL - ["::part(mypart):modal" should be a valid selector] expected: FAIL ["::part(mypart):open" should be a valid selector] expected: FAIL - ["::part(mypart):optional" should be a valid selector] - expected: FAIL - - ["::part(mypart):out-of-range" should be a valid selector] - expected: FAIL - ["::part(mypart):past" should be a valid selector] expected: FAIL @@ -86,56 +32,11 @@ ["::part(mypart):picture-in-picture" should be a valid selector] expected: FAIL - ["::part(mypart):placeholder-shown" should be a valid selector] - expected: FAIL - ["::part(mypart):playing" should be a valid selector] expected: FAIL - ["::part(mypart):popover-open" should be a valid selector] - expected: FAIL - - ["::part(mypart):read-only" should be a valid selector] - expected: FAIL - - ["::part(mypart):read-write" should be a valid selector] - expected: FAIL - - ["::part(mypart):required" should be a valid selector] - expected: FAIL - ["::part(mypart):state(mystate)" should be a valid selector] expected: FAIL - ["::part(mypart):target" should be a valid selector] - expected: FAIL - - ["::part(mypart):user-invalid" should be a valid selector] - expected: FAIL - - ["::part(mypart):user-valid" should be a valid selector] - expected: FAIL - - ["::part(mypart):valid" should be a valid selector] - expected: FAIL - - ["::part(mypart):visited" should be a valid selector] - expected: FAIL - ["::part(mypart):xr-overlay" should be a valid selector] expected: FAIL - - ["::part(mypart):not(:hover)" should be a valid selector] - expected: FAIL - - ["::part(mypart):is(:hover)" should be a valid selector] - expected: FAIL - - ["::part(mypart):where(:hover)" should be a valid selector] - expected: FAIL - - ["::part(mypart):is(:first-child)" should be a valid selector] - expected: FAIL - - ["::part(mypart):where(:first-child)" should be a valid selector] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/pseudo-elements-after-part.html.ini b/tests/wpt/meta/css/css-shadow-parts/pseudo-elements-after-part.html.ini index 02f53015dc9..62fad3f5e1f 100644 --- a/tests/wpt/meta/css/css-shadow-parts/pseudo-elements-after-part.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/pseudo-elements-after-part.html.ini @@ -1,13 +1,4 @@ [pseudo-elements-after-part.html] - ["::part(mypart)::after" should be a valid selector] - expected: FAIL - - ["::part(mypart)::backdrop" should be a valid selector] - expected: FAIL - - ["::part(mypart)::before" should be a valid selector] - expected: FAIL - ["::part(mypart)::cue" should be a valid selector] expected: FAIL @@ -29,18 +20,12 @@ ["::part(mypart)::highlight(myhighlight)" should be a valid selector] expected: FAIL - ["::part(mypart)::marker" should be a valid selector] - expected: FAIL - ["::part(mypart)::placeholder" should be a valid selector] expected: FAIL ["::part(mypart)::search-text" should be a valid selector] expected: FAIL - ["::part(mypart)::selection" should be a valid selector] - expected: FAIL - ["::part(mypart)::spelling-error" should be a valid selector] expected: FAIL @@ -95,21 +80,12 @@ [computed style for ::part()::search-text] expected: FAIL - [computed style for ::part()::selection] - expected: FAIL - [computed style for ::part()::spelling-error] expected: FAIL [computed style for ::part()::target-text] expected: FAIL - [::part styles with ::part(mypart)::after {\n display: block;\n content: "";\n height: 77px;\n } and <div part='mypart'></div>] - expected: FAIL - - [::part styles with ::part(mypart)::before {\n display: block;\n content: "";\n height: 46px;\n } and <div part='mypart'></div>] - expected: FAIL - [::part styles with ::part(mypart)::details-content {\n height: 371px;\n } and <details part='mypart'><summary style="height:47px">summary</summary>details</details>] expected: FAIL @@ -121,6 +97,3 @@ [::part styles with ::part(mypart) {\n font: 20px/1 Ahem;\n }\n ::part(mypart)::first-line {\n font-size: 86px;\n } and <div part=mypart>X<br>X</div>] expected: FAIL - - [::part styles with ::part(mypart)::marker {\n font: 63px/1.0 Ahem;\n content: "X";\n } and <li style="list-style-position: inside" part="mypart"></li>] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/serialization.html.ini b/tests/wpt/meta/css/css-shadow-parts/serialization.html.ini deleted file mode 100644 index bf16109e185..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/serialization.html.ini +++ /dev/null @@ -1,9 +0,0 @@ -[serialization.html] - [Escape start parenthesis in ::part name.] - expected: FAIL - - [Escape start space in ::part name.] - expected: FAIL - - [Collapse spaces in ::part names list.] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/simple-inline.html.ini b/tests/wpt/meta/css/css-shadow-parts/simple-inline.html.ini deleted file mode 100644 index 4121d642be0..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/simple-inline.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[simple-inline.html] - [Part in selected host is styled] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/simple.html.ini b/tests/wpt/meta/css/css-shadow-parts/simple.html.ini deleted file mode 100644 index 9c3278c9e3a..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/simple.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[simple.html] - [Part in selected host is styled] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/style-sharing.html.ini b/tests/wpt/meta/css/css-shadow-parts/style-sharing.html.ini deleted file mode 100644 index 1bb66f211bf..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/style-sharing.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[style-sharing.html] - [Part in selected host does not incorrectly share style with non-part] - expected: FAIL diff --git a/tests/wpt/meta/css/selectors/invalidation/part-pseudo.html.ini b/tests/wpt/meta/css/selectors/invalidation/part-pseudo.html.ini deleted file mode 100644 index 10f1aa0b918..00000000000 --- a/tests/wpt/meta/css/selectors/invalidation/part-pseudo.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[part-pseudo.html] - expected: FAIL diff --git a/tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini deleted file mode 100644 index c698a273547..00000000000 --- a/tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[parse-is-where.html] - ["::part(foo):is(:hover)" should be a valid selector] - expected: FAIL - - ["::part(foo):where(:hover)" should be a valid selector] - expected: FAIL - - ["::part(foo):is([attr='value'\])" should be a valid selector] - expected: FAIL - - ["::part(foo):where([attr='value'\])" should be a valid selector] - expected: FAIL diff --git a/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini index 8a0356d9826..d0caf3e03d8 100644 --- a/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini +++ b/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini @@ -1,37 +1,4 @@ [parse-part.html] - ["::part(--foo)" should be a valid selector] - expected: FAIL - - ["::part(bar)" should be a valid selector] - expected: FAIL - - ["::part(--)" should be a valid selector] - expected: FAIL - - ["::part(--0)" should be a valid selector] - expected: FAIL - - ["::part(foo bar)" should be a valid selector] - expected: FAIL - - ["::part(-foo bar)" should be a valid selector] - expected: FAIL - - ["::part(foo):focus" should be a valid selector] - expected: FAIL - - ["::part(foo):hover" should be a valid selector] - expected: FAIL - - ["::part(foo):focus-within" should be a valid selector] - expected: FAIL - - ["::part(foo)::before" should be a valid selector] - expected: FAIL - - ["::part(foo)::after" should be a valid selector] - expected: FAIL - ["::part(foo)::placeholder" should be a valid selector] expected: FAIL @@ -44,12 +11,6 @@ ["::part(foo)::file-selector-button" should be a valid selector] expected: FAIL - ["::part(foo):is(:focus)" should be a valid selector] - expected: FAIL - - [":lang(en)::part(foo)" should be a valid selector] - expected: FAIL - [":dir(ltr)::part(foo)" should be a valid selector] expected: FAIL @@ -58,21 +19,3 @@ ["::part(foo):dir(ltr)" should be a valid selector] expected: FAIL - - ["::part(foo):is(ul)" should be a valid selector] - expected: FAIL - - ["::part(foo):is(nav ul)" should be a valid selector] - expected: FAIL - - ["::part(foo):where(ul)" should be a valid selector] - expected: FAIL - - ["::part(foo):where(nav ul)" should be a valid selector] - expected: FAIL - - ["::part(foo):disabled" should be a valid selector] - expected: FAIL - - ["::part(foo):checked" should be a valid selector] - expected: FAIL diff --git a/tests/wpt/meta/reporting/cross-origin-report-no-credentials.https.sub.html.ini b/tests/wpt/meta/reporting/cross-origin-report-no-credentials.https.sub.html.ini new file mode 100644 index 00000000000..e83aa84d6b1 --- /dev/null +++ b/tests/wpt/meta/reporting/cross-origin-report-no-credentials.https.sub.html.ini @@ -0,0 +1,3 @@ +[cross-origin-report-no-credentials.https.sub.html] + [Reporting endpoints did not receive credentials.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/cross-origin-reports-isolated.https.sub.html.ini b/tests/wpt/meta/reporting/cross-origin-reports-isolated.https.sub.html.ini new file mode 100644 index 00000000000..9d96ad354c4 --- /dev/null +++ b/tests/wpt/meta/reporting/cross-origin-reports-isolated.https.sub.html.ini @@ -0,0 +1,3 @@ +[cross-origin-reports-isolated.https.sub.html] + [Reports were sent in two requests.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/cross-origin-same-site-credentials.https.sub.html.ini b/tests/wpt/meta/reporting/cross-origin-same-site-credentials.https.sub.html.ini new file mode 100644 index 00000000000..1d2d2079b07 --- /dev/null +++ b/tests/wpt/meta/reporting/cross-origin-same-site-credentials.https.sub.html.ini @@ -0,0 +1,3 @@ +[cross-origin-same-site-credentials.https.sub.html] + [Reporting endpoints received credentials.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/document-reporting-bypass-report-to.https.sub.html.ini b/tests/wpt/meta/reporting/document-reporting-bypass-report-to.https.sub.html.ini new file mode 100644 index 00000000000..26668188a63 --- /dev/null +++ b/tests/wpt/meta/reporting/document-reporting-bypass-report-to.https.sub.html.ini @@ -0,0 +1,6 @@ +[document-reporting-bypass-report-to.https.sub.html] + [document policy violation observed] + expected: FAIL + + [Only the Reporting-Endpoints configured endpoint received reports.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/document-reporting-destroy-after-document-close.https.sub.html.ini b/tests/wpt/meta/reporting/document-reporting-destroy-after-document-close.https.sub.html.ini new file mode 100644 index 00000000000..b31627a692e --- /dev/null +++ b/tests/wpt/meta/reporting/document-reporting-destroy-after-document-close.https.sub.html.ini @@ -0,0 +1,3 @@ +[document-reporting-destroy-after-document-close.https.sub.html] + [No more reports received after navigation to same document without endpoint header] + expected: FAIL diff --git a/tests/wpt/meta/reporting/document-reporting-named-endpoints.https.sub.html.ini b/tests/wpt/meta/reporting/document-reporting-named-endpoints.https.sub.html.ini new file mode 100644 index 00000000000..599ece01563 --- /dev/null +++ b/tests/wpt/meta/reporting/document-reporting-named-endpoints.https.sub.html.ini @@ -0,0 +1,9 @@ +[document-reporting-named-endpoints.https.sub.html] + [csp violation report observed] + expected: FAIL + + [document policy violation observed] + expected: FAIL + + [Reporting endpoints received reports.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/document-reporting-not-batch-different-document.https.html.ini b/tests/wpt/meta/reporting/document-reporting-not-batch-different-document.https.html.ini new file mode 100644 index 00000000000..1d7a5ff6462 --- /dev/null +++ b/tests/wpt/meta/reporting/document-reporting-not-batch-different-document.https.html.ini @@ -0,0 +1,3 @@ +[document-reporting-not-batch-different-document.https.html] + [Reports are not batched for same url in different document.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/document-reporting-override-endpoint.https.sub.html.ini b/tests/wpt/meta/reporting/document-reporting-override-endpoint.https.sub.html.ini new file mode 100644 index 00000000000..8f28f3de76e --- /dev/null +++ b/tests/wpt/meta/reporting/document-reporting-override-endpoint.https.sub.html.ini @@ -0,0 +1,6 @@ +[document-reporting-override-endpoint.https.sub.html] + [document policy violation observed] + expected: FAIL + + [Only the second reporting endpoint received reports.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/idlharness.any.js.ini b/tests/wpt/meta/reporting/idlharness.any.js.ini new file mode 100644 index 00000000000..5a55d02e27f --- /dev/null +++ b/tests/wpt/meta/reporting/idlharness.any.js.ini @@ -0,0 +1,158 @@ +[idlharness.any.html] + [ReportBody interface: existence and properties of interface object] + expected: FAIL + + [ReportBody interface object length] + expected: FAIL + + [ReportBody interface object name] + expected: FAIL + + [ReportBody interface: existence and properties of interface prototype object] + expected: FAIL + + [ReportBody interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ReportBody interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ReportBody interface: operation toJSON()] + expected: FAIL + + [Report interface: existence and properties of interface object] + expected: FAIL + + [Report interface object length] + expected: FAIL + + [Report interface object name] + expected: FAIL + + [Report interface: existence and properties of interface prototype object] + expected: FAIL + + [Report interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [Report interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [Report interface: operation toJSON()] + expected: FAIL + + [Report interface: attribute type] + expected: FAIL + + [Report interface: attribute url] + expected: FAIL + + [Report interface: attribute body] + expected: FAIL + + [ReportingObserver interface: existence and properties of interface object] + expected: FAIL + + [ReportingObserver interface object length] + expected: FAIL + + [ReportingObserver interface object name] + expected: FAIL + + [ReportingObserver interface: existence and properties of interface prototype object] + expected: FAIL + + [ReportingObserver interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ReportingObserver interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ReportingObserver interface: operation observe()] + expected: FAIL + + [ReportingObserver interface: operation disconnect()] + expected: FAIL + + [ReportingObserver interface: operation takeRecords()] + expected: FAIL + + +[idlharness.any.worker.html] + [ReportBody interface: existence and properties of interface object] + expected: FAIL + + [ReportBody interface object length] + expected: FAIL + + [ReportBody interface object name] + expected: FAIL + + [ReportBody interface: existence and properties of interface prototype object] + expected: FAIL + + [ReportBody interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ReportBody interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ReportBody interface: operation toJSON()] + expected: FAIL + + [Report interface: existence and properties of interface object] + expected: FAIL + + [Report interface object length] + expected: FAIL + + [Report interface object name] + expected: FAIL + + [Report interface: existence and properties of interface prototype object] + expected: FAIL + + [Report interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [Report interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [Report interface: operation toJSON()] + expected: FAIL + + [Report interface: attribute type] + expected: FAIL + + [Report interface: attribute url] + expected: FAIL + + [Report interface: attribute body] + expected: FAIL + + [ReportingObserver interface: existence and properties of interface object] + expected: FAIL + + [ReportingObserver interface object length] + expected: FAIL + + [ReportingObserver interface object name] + expected: FAIL + + [ReportingObserver interface: existence and properties of interface prototype object] + expected: FAIL + + [ReportingObserver interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ReportingObserver interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ReportingObserver interface: operation observe()] + expected: FAIL + + [ReportingObserver interface: operation disconnect()] + expected: FAIL + + [ReportingObserver interface: operation takeRecords()] + expected: FAIL diff --git a/tests/wpt/meta/reporting/reporting-isolated-across-navigations.https.sub.html.ini b/tests/wpt/meta/reporting/reporting-isolated-across-navigations.https.sub.html.ini new file mode 100644 index 00000000000..f9ca747ab03 --- /dev/null +++ b/tests/wpt/meta/reporting/reporting-isolated-across-navigations.https.sub.html.ini @@ -0,0 +1,3 @@ +[reporting-isolated-across-navigations.https.sub.html] + [Reports should be sent to the correct endpoints] + expected: FAIL diff --git a/tests/wpt/meta/reporting/same-origin-cross-site-credentials.https.sub.html.ini b/tests/wpt/meta/reporting/same-origin-cross-site-credentials.https.sub.html.ini new file mode 100644 index 00000000000..7312d2c733e --- /dev/null +++ b/tests/wpt/meta/reporting/same-origin-cross-site-credentials.https.sub.html.ini @@ -0,0 +1,3 @@ +[same-origin-cross-site-credentials.https.sub.html] + [Reporting endpoints received credentials.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/same-origin-report-credentials.https.sub.html.ini b/tests/wpt/meta/reporting/same-origin-report-credentials.https.sub.html.ini new file mode 100644 index 00000000000..9c536def669 --- /dev/null +++ b/tests/wpt/meta/reporting/same-origin-report-credentials.https.sub.html.ini @@ -0,0 +1,3 @@ +[same-origin-report-credentials.https.sub.html] + [Reporting endpoints received credentials.] + expected: FAIL diff --git a/tests/wpt/meta/reporting/same-origin-same-site-credentials.https.sub.html.ini b/tests/wpt/meta/reporting/same-origin-same-site-credentials.https.sub.html.ini new file mode 100644 index 00000000000..d054359ab5b --- /dev/null +++ b/tests/wpt/meta/reporting/same-origin-same-site-credentials.https.sub.html.ini @@ -0,0 +1,3 @@ +[same-origin-same-site-credentials.https.sub.html] + [Reporting endpoints received credentials.] + expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/offsetParent-across-shadow-boundaries.html.ini b/tests/wpt/meta/shadow-dom/offsetParent-across-shadow-boundaries.html.ini new file mode 100644 index 00000000000..29a0011fff4 --- /dev/null +++ b/tests/wpt/meta/shadow-dom/offsetParent-across-shadow-boundaries.html.ini @@ -0,0 +1,6 @@ +[offsetParent-across-shadow-boundaries.html] + [offsetParent must find the first offset parent which is a shadow-including ancestor of the context object even some shadow tree of open mode did not have any offset parent] + expected: FAIL + + [offsetParent must find the first offset parent which is a shadow-including ancestor of the context object even some shadow tree of closed mode did not have any offset parent] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini index 7405df1cdfb..2ed5e00cc3f 100644 --- a/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini @@ -4,6 +4,3 @@ [test_no_such_element_with_shadow_root] expected: FAIL - - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini deleted file mode 100644 index 32fd2854998..00000000000 --- a/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini +++ /dev/null @@ -1,9 +0,0 @@ -[shadow_dom.py] - [test_shadow_element_click[host_element\]] - expected: FAIL - - [test_nested_shadow_element_click[outer_element\]] - expected: FAIL - - [test_nested_shadow_element_click[inner_element\]] - expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini index 9510b686ea1..921b8c5cb5d 100644 --- a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini @@ -5,9 +5,6 @@ [test_iframe_is_interactable] expected: FAIL - [test_readonly_element] - expected: FAIL - [test_not_a_focusable_element] expected: FAIL @@ -22,3 +19,9 @@ [test_disabled] expected: FAIL + + [test_transparent_element] + expected: FAIL + + [test_readonly_element] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini index 9dca7adc465..85afe070906 100644 --- a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini @@ -5,5 +5,5 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] + [test_surrogates] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini index 64a0652b75b..85a7daf2244 100644 --- a/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini @@ -1,7 +1,6 @@ [find.py] - expected: TIMEOUT [test_no_browsing_context] - expected: ERROR + expected: FAIL [test_no_such_element_with_shadow_root] expected: FAIL @@ -15,33 +14,12 @@ [test_no_such_element_with_unknown_selector[existent-inside-shadow-root\]] expected: FAIL - [test_no_such_element_with_startnode_from_other_window_handle] - expected: FAIL - [test_no_such_element_with_startnode_from_other_frame] expected: FAIL - [test_stale_element_reference[top_context\]] - expected: FAIL - - [test_stale_element_reference[child_context\]] - expected: FAIL - [test_find_element[xpath-//a\]] expected: FAIL - [test_xhtml_namespace[css selector-#linkText\]] - expected: FAIL - - [test_xhtml_namespace[link text-full link text\]] - expected: FAIL - - [test_xhtml_namespace[partial link text-link text\]] - expected: FAIL - - [test_xhtml_namespace[tag name-a\]] - expected: FAIL - [test_xhtml_namespace[xpath-//*[name()='a'\]\]] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini index 44749396246..c023dd2d5c5 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini @@ -5,8 +5,5 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - [test_computed_roles[<article>foo</article>-article-article\]] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini index c5bc0a36f6d..c7642bd8ee1 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini @@ -5,9 +5,6 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - [test_boolean_attribute[audio-attrs0\]] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini index 0af7750e50e..c1af0175608 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini @@ -4,6 +4,3 @@ [test_no_such_element_with_shadow_root] expected: FAIL - - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini index 991123b881c..3a1948de96e 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini @@ -5,8 +5,5 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - [test_web_reference[shadowRoot-ShadowRoot\]] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini index 10339e7291b..3a58f29d7bd 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini @@ -5,8 +5,5 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - [test_basic] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini index 1b3957f08c8..bb9de0071f4 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini @@ -1,33 +1,3 @@ [get.py] - [test_no_top_browsing_context] - expected: FAIL - [test_no_browsing_context] expected: FAIL - - [test_no_such_element_with_invalid_value] - expected: FAIL - - [test_no_such_element_from_other_window_handle[open\]] - expected: FAIL - - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - - [test_no_such_element_from_other_frame[open\]] - expected: FAIL - - [test_no_such_element_from_other_frame[closed\]] - expected: FAIL - - [test_stale_element_reference[top_context\]] - expected: FAIL - - [test_stale_element_reference[child_context\]] - expected: FAIL - - [test_get_shadow_root] - expected: FAIL - - [test_no_shadow_root] - expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini index 879854dfc56..8fb651289ad 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini @@ -5,8 +5,5 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - [test_get_element_tag_name] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini index 66e31b2d5a7..b4016ed5298 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini @@ -5,9 +5,6 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - [test_transform_capitalize[space\]] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini index 9f75dbb4f9e..a287655de66 100644 --- a/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini @@ -5,9 +5,6 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - [test_stale_element_reference[child_context\]] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini index 2c5777abee2..07512c40b00 100644 --- a/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini @@ -5,8 +5,5 @@ [test_no_such_element_with_shadow_root] expected: FAIL - [test_no_such_element_from_other_window_handle[closed\]] - expected: FAIL - [test_stale_element_reference[child_context\]] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini index 7288018eebf..374e04d8c54 100644 --- a/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini @@ -1,6 +1,3 @@ [new.py] [test_no_top_browsing_context] expected: FAIL - - [test_no_browsing_context] - expected: ERROR diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini index db51a3496ae..935bc48d1e9 100644 --- a/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini @@ -1,9 +1,3 @@ [new_tab.py] - [test_keeps_current_window_handle] - expected: FAIL - - [test_opens_about_blank_in_new_tab] - expected: FAIL - [test_initial_selection_for_contenteditable] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini index 5ea6fe581f7..c29bde84dc1 100644 --- a/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini @@ -2,11 +2,5 @@ [test_payload] expected: FAIL - [test_keeps_current_window_handle] - expected: FAIL - - [test_opens_about_blank_in_new_window] - expected: FAIL - [test_initial_selection_for_contenteditable] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini index 42ceab66336..0a9efbca289 100644 --- a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini @@ -9,19 +9,16 @@ expected: FAIL [test_backspace_erases_keys] - expected: ERROR + expected: FAIL [test_element_in_shadow_tree[outer-open\]] - expected: ERROR + expected: FAIL [test_element_in_shadow_tree[outer-closed\]] - expected: ERROR + expected: FAIL [test_element_in_shadow_tree[inner-open\]] - expected: ERROR + expected: FAIL [test_element_in_shadow_tree[inner-closed\]] - expected: ERROR - - [test_element_not_focused] - expected: ERROR + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini index 8102334d66b..4018e8e3e5b 100644 --- a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini @@ -1,10 +1,4 @@ [pointer_origin.py] - [test_viewport_inside] - expected: FAIL - - [test_pointer_inside] - expected: FAIL - [test_element_center_point] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini index 66625728565..b26241b424d 100644 --- a/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini @@ -13,6 +13,3 @@ [test_no_browsing_context_when_already_top_level] expected: FAIL - - [test_frame_id_shadow_root] - expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini index aef7c9d5ddc..f2fac7a7fa1 100644 --- a/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini @@ -4,6 +4,3 @@ [test_no_browsing_context] expected: FAIL - - [test_format_and_dimensions] - expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index cce286bb674..72c56c27fda 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -8608,7 +8608,7 @@ ], "css": { "ahem.css": [ - "51eede74aaa0b43f2c9235019bc73a508b1f14e4", + "a7db592e0df53e0b70f66ca7b31a7734db18887e", [] ] }, @@ -10654,7 +10654,7 @@ [] ], "no_mime_type.py": [ - "860005a42c237735287031133786352d7c732402", + "980eeee18f993f20a9df033f337a52ec93155ec4", [] ], "origin_helpers.js": [ diff --git a/tests/wpt/mozilla/tests/css/css/ahem.css b/tests/wpt/mozilla/tests/css/css/ahem.css index 51eede74aaa..a7db592e0df 100644 --- a/tests/wpt/mozilla/tests/css/css/ahem.css +++ b/tests/wpt/mozilla/tests/css/css/ahem.css @@ -1,3 +1,9 @@ +@font-face { + font-family: 'ahem'; + src: local('Ahem'), + url('/fonts/Ahem.ttf'); +} + body { font-family: 'ahem'; font-size: 100px; diff --git a/tests/wpt/mozilla/tests/mozilla/resources/no_mime_type.py b/tests/wpt/mozilla/tests/mozilla/resources/no_mime_type.py index 860005a42c2..980eeee18f9 100644 --- a/tests/wpt/mozilla/tests/mozilla/resources/no_mime_type.py +++ b/tests/wpt/mozilla/tests/mozilla/resources/no_mime_type.py @@ -7,5 +7,5 @@ def main(request, response): headers = [] if b'Content-Type' in request.GET: headers += [(b'Content-Type', request.GET[b'Content-Type'])] - with open('./resources/ahem/AHEM____.TTF', 'rb') as f: + with open('./tests/wpt/tests/fonts/Ahem.ttf', 'rb') as f: return 200, headers, f.read() |