From 5ab3641a8e436aa5615d273fff0b4ad8d6775bd1 Mon Sep 17 00:00:00 2001 From: shanehandley Date: Sun, 16 Feb 2025 20:54:31 +1100 Subject: [PATCH] script: implement HTMLHyperlinkElementUtils for HTMLAreaElement (#35482) This makes some common functionality in HTMLAreaElement and HTMLAnchorElement shared code. Signed-off-by: Shane Handley --- components/script/dom/htmlanchorelement.rs | 461 ++--------- components/script/dom/htmlareaelement.rs | 124 ++- .../script/dom/htmlhyperlinkelementutils.rs | 493 ++++++++++++ components/script/dom/mod.rs | 1 + .../script_bindings/codegen/Bindings.conf | 2 +- .../webidls/HTMLAreaElement.webidl | 2 +- ...spatch-single-activation-behavior.html.ini | 3 - .../meta/html/dom/idlharness.https.html.ini | 69 -- .../dynamic-urls.sub.html.ini | 3 - .../historical.sub.xhtml.ini | 3 - .../area-stringifier.html.ini | 24 - ...n-parsable-url-getter-setter.window.js.ini | 57 -- ...paque-path-url-getter-setter.window.js.ini | 57 -- ...on-special-url-getter-setter.window.js.ini | 45 -- tests/wpt/meta/url/toascii.window.js.ini | 522 ------------ .../meta/url/url-setters-a-area.window.js.ini | 759 ------------------ 16 files changed, 701 insertions(+), 1924 deletions(-) create mode 100644 components/script/dom/htmlhyperlinkelementutils.rs delete mode 100644 tests/wpt/meta/html/semantics/embedded-content/the-area-element/area-stringifier.html.ini delete mode 100644 tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-parsable-url-getter-setter.window.js.ini delete mode 100644 tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-special-opaque-path-url-getter-setter.window.js.ini delete mode 100644 tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-special-url-getter-setter.window.js.ini diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index af019fb88c5..a5e9fb10947 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -6,7 +6,7 @@ use std::cell::Cell; use std::default::Default; use dom_struct::dom_struct; -use html5ever::{local_name, namespace_url, ns, LocalName, Prefix}; +use html5ever::{local_name, LocalName, Prefix}; use js::rust::HandleObject; use num_traits::ToPrimitive; use servo_atoms::Atom; @@ -28,10 +28,10 @@ use crate::dom::element::{reflect_referrer_policy_attribute, AttributeMutation, use crate::dom::event::Event; use crate::dom::eventtarget::EventTarget; use crate::dom::htmlelement::HTMLElement; +use crate::dom::htmlhyperlinkelementutils::{HyperlinkElement, HyperlinkElementTraits}; use crate::dom::htmlimageelement::HTMLImageElement; use crate::dom::mouseevent::MouseEvent; -use crate::dom::node::{BindContext, Node, NodeTraits}; -use crate::dom::urlhelper::UrlHelper; +use crate::dom::node::{BindContext, Node}; use crate::dom::virtualmethods::VirtualMethods; use crate::links::{follow_hyperlink, LinkRelations}; use crate::script_runtime::CanGc; @@ -40,7 +40,6 @@ use crate::script_runtime::CanGc; pub(crate) struct HTMLAnchorElement { htmlelement: HTMLElement, rel_list: MutNullableDom, - #[no_trace] relations: Cell, #[no_trace] @@ -78,48 +77,11 @@ impl HTMLAnchorElement { can_gc, ) } +} - /// - fn set_url(&self) { - // Step 1. Set this element's url to null. - *self.url.borrow_mut() = None; - - // Step 2. If this element's href content attribute is absent, then return. - let attribute = self - .upcast::() - .get_attribute(&ns!(), &local_name!("href")); - - let Some(attribute) = attribute else { - return; - }; - - // Step 3. Let url be the result of encoding-parsing a URL given this element's - // href content attribute's value, relative to this element's node document. - let document = self.owner_document(); - let url = document.encoding_parse_a_url(&attribute.value()); - - // Step 4. If url is not failure, then set this element's url to url. - if let Ok(url) = url { - *self.url.borrow_mut() = Some(url); - } - } - - // https://html.spec.whatwg.org/multipage/#reinitialise-url - fn reinitialize_url(&self) { - // Step 1. - match *self.url.borrow() { - Some(ref url) if url.scheme() == "blob" && url.cannot_be_a_base() => return, - _ => (), - } - - // Step 2. - self.set_url(); - } - - // https://html.spec.whatwg.org/multipage/#update-href - fn update_href(&self, url: DOMString, can_gc: CanGc) { - self.upcast::() - .set_string_attribute(&local_name!("href"), url, can_gc); +impl HyperlinkElement for HTMLAnchorElement { + fn get_url(&self) -> &DomRefCell> { + &self.url } } @@ -225,362 +187,109 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // https://html.spec.whatwg.org/multipage/#attr-hyperlink-target make_setter!(SetTarget, "target"); - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-hash - fn Hash(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 3. - None => USVString(String::new()), - Some(ref url) => { - // Steps 3-4. - UrlHelper::Hash(url) - }, - } - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-hash - fn SetHash(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - // Step 2. - let url = match self.url.borrow_mut().as_mut() { - // Step 3. - Some(ref url) if url.scheme() == "javascript" => return, - None => return, - // Steps 4-5. - Some(url) => { - UrlHelper::SetHash(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 6. - self.update_href(url, can_gc); - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-host - fn Host(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 3. - None => USVString(String::new()), - Some(ref url) => { - if url.host().is_none() { - USVString(String::new()) - } else { - // Steps 4-5. - UrlHelper::Host(url) - } - }, - } - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-host - fn SetHost(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - // Step 2. - let url = match self.url.borrow_mut().as_mut() { - // Step 3. - Some(ref url) if url.cannot_be_a_base() => return, - None => return, - // Step 4. - Some(url) => { - UrlHelper::SetHost(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 5. - self.update_href(url, can_gc); - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-hostname - fn Hostname(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 3. - None => USVString(String::new()), - Some(ref url) => { - // Step 4. - UrlHelper::Hostname(url) - }, - } - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-hostname - fn SetHostname(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - // Step 2. - let url = match self.url.borrow_mut().as_mut() { - // Step 3. - Some(ref url) if url.cannot_be_a_base() => return, - None => return, - // Step 4. - Some(url) => { - UrlHelper::SetHostname(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 5. - self.update_href(url, can_gc); - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-href + /// fn Href(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - USVString(match *self.url.borrow() { - None => { - match self - .upcast::() - .get_attribute(&ns!(), &local_name!("href")) - { - // Step 3. - None => String::new(), - // Step 4. - Some(attribute) => (**attribute.value()).to_owned(), - } - }, - // Step 5. - Some(ref url) => url.as_str().to_owned(), - }) + self.get_href() } - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-href + /// fn SetHref(&self, value: USVString, can_gc: CanGc) { - self.upcast::().set_string_attribute( - &local_name!("href"), - DOMString::from_string(value.0), - can_gc, - ); - self.set_url(); + self.set_href(value, can_gc); } - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-origin + /// fn Origin(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - USVString(match *self.url.borrow() { - None => { - // Step 2. - "".to_owned() - }, - Some(ref url) => { - // Step 3. - url.origin().ascii_serialization() - }, - }) + self.get_origin() } - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-password - fn Password(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 3. - None => USVString(String::new()), - // Steps 3-4. - Some(ref url) => UrlHelper::Password(url), - } - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-password - fn SetPassword(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - // Step 2. - let url = match self.url.borrow_mut().as_mut() { - // Step 3. - Some(ref url) if url.host().is_none() || url.cannot_be_a_base() => return, - None => return, - // Step 4. - Some(url) => { - UrlHelper::SetPassword(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 5. - self.update_href(url, can_gc); - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-pathname - fn Pathname(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 3. - None => USVString(String::new()), - // Steps 4-5. - Some(ref url) => UrlHelper::Pathname(url), - } - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-pathname - fn SetPathname(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - // Step 2. - let url = match self.url.borrow_mut().as_mut() { - // Step 3. - Some(ref url) if url.cannot_be_a_base() => return, - None => return, - // Step 5. - Some(url) => { - UrlHelper::SetPathname(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 6. - self.update_href(url, can_gc); - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-port - fn Port(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 3. - None => USVString(String::new()), - // Step 4. - Some(ref url) => UrlHelper::Port(url), - } - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-port - fn SetPort(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - // Step 3. - let url = match self.url.borrow_mut().as_mut() { - Some(ref url) - if url.host().is_none() || url.cannot_be_a_base() || url.scheme() == "file" => - { - return; - }, - None => return, - // Step 4. - Some(url) => { - UrlHelper::SetPort(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 5. - self.update_href(url, can_gc); - } - - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-protocol + /// fn Protocol(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 2. - None => USVString(":".to_owned()), - // Step 3. - Some(ref url) => UrlHelper::Protocol(url), - } + self.get_protocol() } - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-protocol + /// fn SetProtocol(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - let url = match self.url.borrow_mut().as_mut() { - // Step 2. - None => return, - // Step 3. - Some(url) => { - UrlHelper::SetProtocol(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 4. - self.update_href(url, can_gc); + self.set_protocol(value, can_gc); } - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-search + /// + fn Password(&self) -> USVString { + self.get_password() + } + + /// + fn SetPassword(&self, value: USVString, can_gc: CanGc) { + self.set_password(value, can_gc); + } + + /// + fn Hash(&self) -> USVString { + self.get_hash() + } + + /// + fn SetHash(&self, value: USVString, can_gc: CanGc) { + self.set_hash(value, can_gc); + } + + /// + fn Host(&self) -> USVString { + self.get_host() + } + + /// + fn SetHost(&self, value: USVString, can_gc: CanGc) { + self.set_host(value, can_gc); + } + + /// + fn Hostname(&self) -> USVString { + self.get_hostname() + } + + /// + fn SetHostname(&self, value: USVString, can_gc: CanGc) { + self.set_hostname(value, can_gc); + } + + /// + fn Port(&self) -> USVString { + self.get_port() + } + + /// + fn SetPort(&self, value: USVString, can_gc: CanGc) { + self.set_port(value, can_gc); + } + + /// + fn Pathname(&self) -> USVString { + self.get_pathname() + } + + /// + fn SetPathname(&self, value: USVString, can_gc: CanGc) { + self.set_pathname(value, can_gc); + } + + /// fn Search(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 2. - None => USVString(String::new()), - // Step 3. - Some(ref url) => UrlHelper::Search(url), - } + self.get_search() } - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-search + /// fn SetSearch(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - // Step 2. - let url = match self.url.borrow_mut().as_mut() { - // Step 3. - None => return, - // Steps 4-5. - // TODO add this element's node document character encoding as - // encoding override (as described in the spec) - Some(url) => { - UrlHelper::SetSearch(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 6. - self.update_href(url, can_gc); + self.set_search(value, can_gc); } - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-username + /// fn Username(&self) -> USVString { - // Step 1. - self.reinitialize_url(); - - match *self.url.borrow() { - // Step 2. - None => USVString(String::new()), - // Step 3. - Some(ref url) => UrlHelper::Username(url), - } + self.get_username() } - // https://html.spec.whatwg.org/multipage/#dom-hyperlink-username + /// fn SetUsername(&self, value: USVString, can_gc: CanGc) { - // Step 1. - self.reinitialize_url(); - - // Step 2. - let url = match self.url.borrow_mut().as_mut() { - // Step 3. - Some(ref url) if url.host().is_none() || url.cannot_be_a_base() => return, - None => return, - // Step 4. - Some(url) => { - UrlHelper::SetUsername(url, value); - DOMString::from(url.as_str()) - }, - }; - // Step 5. - self.update_href(url, can_gc); + self.set_username(value, can_gc); } // https://html.spec.whatwg.org/multipage/#dom-a-referrerpolicy diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index 145916281f6..342fee4d615 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -12,20 +12,23 @@ use euclid::default::Point2D; use html5ever::{local_name, LocalName, Prefix}; use js::rust::HandleObject; use servo_atoms::Atom; +use servo_url::ServoUrl; use style::attr::AttrValue; use crate::dom::activation::Activatable; use crate::dom::attr::Attr; +use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::HTMLAreaElementBinding::HTMLAreaElementMethods; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; -use crate::dom::bindings::str::DOMString; +use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::document::Document; use crate::dom::domtokenlist::DOMTokenList; use crate::dom::element::{reflect_referrer_policy_attribute, AttributeMutation, Element}; use crate::dom::event::Event; use crate::dom::eventtarget::EventTarget; use crate::dom::htmlelement::HTMLElement; +use crate::dom::htmlhyperlinkelementutils::{HyperlinkElement, HyperlinkElementTraits}; use crate::dom::node::{BindContext, Node}; use crate::dom::virtualmethods::VirtualMethods; use crate::links::{follow_hyperlink, LinkRelations}; @@ -107,7 +110,7 @@ impl Area { index += 1; } - // The input does not consist any valid charecters + // The input does not consist any valid characters if array.is_empty() { break; } @@ -240,9 +243,10 @@ impl Area { pub(crate) struct HTMLAreaElement { htmlelement: HTMLElement, rel_list: MutNullableDom, - #[no_trace] relations: Cell, + #[no_trace] + url: DomRefCell>, } impl HTMLAreaElement { @@ -255,6 +259,7 @@ impl HTMLAreaElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), rel_list: Default::default(), relations: Cell::new(LinkRelations::empty()), + url: DomRefCell::new(None), } } @@ -295,6 +300,12 @@ impl HTMLAreaElement { } } +impl HyperlinkElement for HTMLAreaElement { + fn get_url(&self) -> &DomRefCell> { + &self.url + } +} + impl VirtualMethods for HTMLAreaElement { fn super_type(&self) -> Option<&dyn VirtualMethods> { Some(self.upcast::() as &dyn VirtualMethods) @@ -348,7 +359,7 @@ impl HTMLAreaElementMethods for HTMLAreaElement { .set_tokenlist_attribute(&local_name!("rel"), rel, can_gc); } - // https://html.spec.whatwg.org/multipage/#dom-area-rellist + /// fn RelList(&self) -> DomRoot { self.rel_list.or_init(|| { DOMTokenList::new( @@ -370,6 +381,111 @@ impl HTMLAreaElementMethods for HTMLAreaElement { // https://html.spec.whatwg.org/multipage/#attr-iframe-referrerpolicy make_setter!(SetReferrerPolicy, "referrerpolicy"); + + /// + fn Href(&self) -> USVString { + self.get_href() + } + + /// + fn SetHref(&self, value: USVString, can_gc: CanGc) { + self.set_href(value, can_gc); + } + + /// + fn Origin(&self) -> USVString { + self.get_origin() + } + + /// + fn Protocol(&self) -> USVString { + self.get_protocol() + } + + /// + fn SetProtocol(&self, value: USVString, can_gc: CanGc) { + self.set_protocol(value, can_gc); + } + + /// + fn Password(&self) -> USVString { + self.get_password() + } + + /// + fn SetPassword(&self, value: USVString, can_gc: CanGc) { + self.set_password(value, can_gc); + } + + /// + fn Hash(&self) -> USVString { + self.get_hash() + } + + /// + fn SetHash(&self, value: USVString, can_gc: CanGc) { + self.set_hash(value, can_gc); + } + + /// + fn Host(&self) -> USVString { + self.get_host() + } + + /// + fn SetHost(&self, value: USVString, can_gc: CanGc) { + self.set_host(value, can_gc); + } + + /// + fn Hostname(&self) -> USVString { + self.get_hostname() + } + + /// + fn SetHostname(&self, value: USVString, can_gc: CanGc) { + self.set_hostname(value, can_gc); + } + + /// + fn Port(&self) -> USVString { + self.get_port() + } + + /// + fn SetPort(&self, value: USVString, can_gc: CanGc) { + self.set_port(value, can_gc); + } + + /// + fn Pathname(&self) -> USVString { + self.get_pathname() + } + + /// + fn SetPathname(&self, value: USVString, can_gc: CanGc) { + self.set_pathname(value, can_gc); + } + + /// + fn Search(&self) -> USVString { + self.get_search() + } + + /// + fn SetSearch(&self, value: USVString, can_gc: CanGc) { + self.set_search(value, can_gc); + } + + /// + fn Username(&self) -> USVString { + self.get_username() + } + + /// + fn SetUsername(&self, value: USVString, can_gc: CanGc) { + self.set_username(value, can_gc); + } } impl Activatable for HTMLAreaElement { diff --git a/components/script/dom/htmlhyperlinkelementutils.rs b/components/script/dom/htmlhyperlinkelementutils.rs new file mode 100644 index 00000000000..52b16f796e5 --- /dev/null +++ b/components/script/dom/htmlhyperlinkelementutils.rs @@ -0,0 +1,493 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use html5ever::{local_name, namespace_url, ns}; +use servo_url::ServoUrl; + +use crate::dom::bindings::cell::DomRefCell; +use crate::dom::bindings::conversions::DerivedFrom; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::str::{DOMString, USVString}; +use crate::dom::element::Element; +use crate::dom::node::NodeTraits; +use crate::dom::urlhelper::UrlHelper; +use crate::script_runtime::CanGc; + +pub(crate) trait HyperlinkElement { + fn get_url(&self) -> &DomRefCell>; +} + +/// +pub(crate) trait HyperlinkElementTraits { + fn get_hash(&self) -> USVString; + fn set_hash(&self, value: USVString, can_gc: CanGc); + fn get_host(&self) -> USVString; + fn set_host(&self, value: USVString, can_gc: CanGc); + fn get_hostname(&self) -> USVString; + fn set_hostname(&self, value: USVString, can_gc: CanGc); + fn get_href(&self) -> USVString; + fn set_href(&self, value: USVString, can_gc: CanGc); + fn get_origin(&self) -> USVString; + fn get_password(&self) -> USVString; + fn set_password(&self, value: USVString, can_gc: CanGc); + fn get_pathname(&self) -> USVString; + fn set_pathname(&self, value: USVString, can_gc: CanGc); + fn get_port(&self) -> USVString; + fn set_port(&self, value: USVString, can_gc: CanGc); + fn get_protocol(&self) -> USVString; + fn set_protocol(&self, value: USVString, can_gc: CanGc); + fn get_search(&self) -> USVString; + fn set_search(&self, value: USVString, can_gc: CanGc); + fn get_username(&self) -> USVString; + fn set_url(&self); + fn set_username(&self, value: USVString, can_gc: CanGc); + fn update_href(&self, url: DOMString, can_gc: CanGc); + fn reinitialize_url(&self); +} + +impl + Castable + NodeTraits> HyperlinkElementTraits + for T +{ + /// + fn get_hash(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + match *self.get_url().borrow() { + // Step 3. If url is null, or url's fragment is either null or the empty string, return + // the empty string. + None => USVString(String::new()), + Some(ref url) if url.fragment().is_none() || url.fragment() == Some("") => { + USVString(String::new()) + }, + Some(ref url) => { + // Step 4. Return "#", followed by url's fragment. + UrlHelper::Hash(url) + }, + } + } + + /// + fn set_hash(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + let url = match self.get_url().borrow_mut().as_mut() { + // Step 3. If url is null, then return. + None => return, + // Step 4. If the given value is the empty string, set url's fragment to null. + // Note this step is taken care of by UrlHelper::SetHash when the value is Some + // Steps 5. Otherwise: + Some(url) => { + // Step 5.1. Let input be the given value with a single leading "#" removed, if any. + // Step 5.2. Set url's fragment to the empty string. + // Note these steps are taken care of by UrlHelper::SetHash + UrlHelper::SetHash(url, value); + + // Step 5.4. Basic URL parse input, with url as url and fragment state as state + // override. + DOMString::from(url.as_str()) + }, + }; + + // Step 6. Update href. + self.update_href(url, can_gc); + } + + /// + fn get_host(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + match *self.get_url().borrow() { + // Step 3. If url or url's host is null, return the empty string. + None => USVString(String::new()), + Some(ref url) => { + if url.host().is_none() { + USVString(String::new()) + } else { + // Step 4. If url's port is null, return url's host, serialized. + // Step 5. Return url's host, serialized, followed by ":" and url's port, + // serialized. + UrlHelper::Host(url) + } + }, + } + } + + /// + fn set_host(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + let url = match self.get_url().borrow_mut().as_mut() { + // Step 3. If url or url's host is null, return the empty string. + Some(ref url) if url.cannot_be_a_base() => return, + None => return, + // Step 4. Basic URL parse the given value, with url as url and host state as state + // override. + Some(url) => { + UrlHelper::SetHost(url, value); + DOMString::from(url.as_str()) + }, + }; + + // Step 5. Update href. + self.update_href(url, can_gc); + } + + /// + fn get_hostname(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + match *self.get_url().borrow() { + // Step 3. If url or url's host is null, return the empty string. + None => USVString(String::new()), + Some(ref url) => { + // Step 4. Return url's host, serialized. + UrlHelper::Hostname(url) + }, + } + } + + /// + fn set_hostname(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + let url = match self.get_url().borrow_mut().as_mut() { + // Step 3. If url is null or url has an opaque path, then return. + None => return, + Some(ref url) if url.cannot_be_a_base() => return, + // Step 4. Basic URL parse the given value, with url as url and hostname state as state + // override. + Some(url) => { + UrlHelper::SetHostname(url, value); + DOMString::from(url.as_str()) + }, + }; + + // Step 5. Update href. + self.update_href(url, can_gc); + } + + /// + fn get_href(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + USVString(match *self.get_url().borrow() { + None => { + match self + .upcast::() + .get_attribute(&ns!(), &local_name!("href")) + { + // Step 3. If url is null and this has no href content attribute, return the + // empty string. + None => String::new(), + + // Step 4. Otherwise, if url is null, return this's href content attribute's value. + Some(attribute) => (**attribute.value()).to_owned(), + } + }, + // Step 5. Return url, serialized. + Some(ref url) => url.as_str().to_owned(), + }) + } + + /// ().set_string_attribute( + &local_name!("href"), + DOMString::from_string(value.0), + can_gc, + ); + + self.set_url(); + } + + /// + fn get_origin(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + USVString(match *self.get_url().borrow() { + // Step 2. If this's url is null, return the empty string. + None => "".to_owned(), + // Step 3. Return the serialization of this's url's origin. + Some(ref url) => url.origin().ascii_serialization(), + }) + } + + /// + fn get_password(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + match *self.get_url().borrow() { + // Step 3. If url is null, then return the empty string. + None => USVString(String::new()), + // Steps 4. Return url's password. + Some(ref url) => UrlHelper::Password(url), + } + } + + /// + fn set_password(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + let url = match self.get_url().borrow_mut().as_mut() { + // Step 3. If url is null or url cannot have a username/password/port, then return. + None => return, + Some(ref url) if url.host().is_none() || url.cannot_be_a_base() => return, + // Step 4. Set the password, given url and the given value. + Some(url) => { + UrlHelper::SetPassword(url, value); + DOMString::from(url.as_str()) + }, + }; + + // Step 5. Update href. + self.update_href(url, can_gc); + } + + /// + fn get_pathname(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + match *self.get_url().borrow() { + // Step 3. If url is null, then return the empty string. + None => USVString(String::new()), + // Steps 4. Return the result of URL path serializing url. + Some(ref url) => UrlHelper::Pathname(url), + } + } + + /// + fn set_pathname(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + let url = match self.get_url().borrow_mut().as_mut() { + // Step 3. If url is null or url has an opaque path, then return. + None => return, + Some(ref url) if url.cannot_be_a_base() => return, + // Step 4. Set url's path to the empty list. + // Step 5. Basic URL parse the given value, with url as url and path start state as state override. + Some(url) => { + UrlHelper::SetPathname(url, value); + DOMString::from(url.as_str()) + }, + }; + + // Step 6. Update href. + self.update_href(url, can_gc); + } + + /// + fn get_port(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + match *self.get_url().borrow() { + // Step 3. If url or url's port is null, return the empty string. + None => USVString(String::new()), + // Step 4. Return url's port, serialized. + Some(ref url) => UrlHelper::Port(url), + } + } + + /// + fn set_port(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + let url = match self.get_url().borrow_mut().as_mut() { + // Step 3. If url is null or url cannot have a username/password/port, then return. + None => return, + Some(ref url) + // https://url.spec.whatwg.org/#cannot-have-a-username-password-port + if url.host().is_none() || url.cannot_be_a_base() || url.scheme() == "file" => + { + return; + }, + // Step 4. If the given value is the empty string, then set url's port to null. + // Step 5. Otherwise, basic URL parse the given value, with url as url and port state as + // state override. + Some(url) => { + UrlHelper::SetPort(url, value); + DOMString::from(url.as_str()) + }, + }; + + // Step 6. Update href. + self.update_href(url, can_gc); + } + + /// + fn get_protocol(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + match *self.get_url().borrow() { + // Step 2. If this's url is null, return ":". + None => USVString(":".to_owned()), + // Step 3. Return this's url's scheme, followed by ":". + Some(ref url) => UrlHelper::Protocol(url), + } + } + + /// + fn set_protocol(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + let url = match self.get_url().borrow_mut().as_mut() { + // Step 2. If this's url is null, then return. + None => return, + // Step 3. Basic URL parse the given value, followed by ":", with this's url as url and + // scheme start state as state override. + Some(url) => { + UrlHelper::SetProtocol(url, value); + DOMString::from(url.as_str()) + }, + }; + + // Step 4. Update href. + self.update_href(url, can_gc); + } + + /// + fn get_search(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + match *self.get_url().borrow() { + // Step 3. If url is null, or url's query is either null or the empty string, return the + // empty string. + // Step 4. Return "?", followed by url's query. + // Note: This is handled in UrlHelper::Search + None => USVString(String::new()), + Some(ref url) => UrlHelper::Search(url), + } + } + + /// + fn set_search(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + let url = match self.get_url().borrow_mut().as_mut() { + // Step 3. If url is null, terminate these steps. + None => return, + // Step 4. If the given value is the empty string, set url's query to null. + // Step 5. Otherwise: + Some(url) => { + // Note: Inner steps are handled by UrlHelper::SetSearch + UrlHelper::SetSearch(url, value); + DOMString::from(url.as_str()) + }, + }; + + // Step 6. Update href. + self.update_href(url, can_gc); + } + + /// + fn get_username(&self) -> USVString { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + match *self.get_url().borrow() { + // Step 2. If this's url is null, return the empty string. + None => USVString(String::new()), + // Step 3. Return this's url's username. + Some(ref url) => UrlHelper::Username(url), + } + } + + /// + fn set_url(&self) { + // Step 1. Set this element's url to null. + *self.get_url().borrow_mut() = None; + + let attribute = self + .upcast::() + .get_attribute(&ns!(), &local_name!("href")); + + // Step 2. If this element's href content attribute is absent, then return. + let Some(attribute) = attribute else { + return; + }; + + let document = self.owner_document(); + + // Step 3. Let url be the result of encoding-parsing a URL given this element's href content + // attribute's value, relative to this element's node document. + let url = document.encoding_parse_a_url(&attribute.value()); + + // Step 4. If url is not failure, then set this element's url to url. + if let Ok(url) = url { + *self.get_url().borrow_mut() = Some(url); + } + } + + /// + fn set_username(&self, value: USVString, can_gc: CanGc) { + // Step 1. Reinitialize url. + self.reinitialize_url(); + + // Step 2. Let url be this's url. + let url = match self.get_url().borrow_mut().as_mut() { + // Step 3. If url is null or url cannot have a username/password/port, then return. + None => return, + Some(ref url) if url.host().is_none() || url.cannot_be_a_base() => return, + // Step 4. Set the username, given url and the given value. + Some(url) => { + UrlHelper::SetUsername(url, value); + DOMString::from(url.as_str()) + }, + }; + + // Step 5. Update href. + self.update_href(url, can_gc); + } + + /// + fn update_href(&self, url: DOMString, can_gc: CanGc) { + self.upcast::() + .set_string_attribute(&local_name!("href"), url, can_gc); + } + + /// + fn reinitialize_url(&self) { + // Step 1. If the element's url is non-null, its scheme is "blob", and it has an opaque + // path, then terminate these steps. + match *self.get_url().borrow() { + Some(ref url) if url.scheme() == "blob" && url.cannot_be_a_base() => return, + _ => (), + } + + // Step 2. Set the url. + self.set_url(); + } +} diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index ec5f9a8c9a6..0fd8c9c10ee 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -370,6 +370,7 @@ pub(crate) mod htmlheadelement; pub(crate) mod htmlheadingelement; pub(crate) mod htmlhrelement; pub(crate) mod htmlhtmlelement; +pub(crate) mod htmlhyperlinkelementutils; pub(crate) mod htmliframeelement; pub(crate) mod htmlimageelement; pub(crate) mod htmlinputelement; diff --git a/components/script_bindings/codegen/Bindings.conf b/components/script_bindings/codegen/Bindings.conf index df27a32a06c..d8c7f94917a 100644 --- a/components/script_bindings/codegen/Bindings.conf +++ b/components/script_bindings/codegen/Bindings.conf @@ -232,7 +232,7 @@ DOMInterfaces = { }, "HTMLAreaElement": { - "canGc": ["SetRel"] + "canGc": ['SetText', 'SetRel', 'SetHref', 'SetHash', 'SetHost', 'SetHostname', 'SetPassword', 'SetPathname', 'SetPort', 'SetProtocol', 'SetSearch', 'SetUsername'] }, "HTMLBodyElement": { diff --git a/components/script_bindings/webidls/HTMLAreaElement.webidl b/components/script_bindings/webidls/HTMLAreaElement.webidl index 222eef4962c..014fc38fb09 100644 --- a/components/script_bindings/webidls/HTMLAreaElement.webidl +++ b/components/script_bindings/webidls/HTMLAreaElement.webidl @@ -25,7 +25,7 @@ interface HTMLAreaElement : HTMLElement { [CEReactions] attribute DOMString referrerPolicy; // hreflang and type are not reflected }; -//HTMLAreaElement includes HTMLHyperlinkElementUtils; +HTMLAreaElement includes HTMLHyperlinkElementUtils; // https://html.spec.whatwg.org/multipage/#HTMLAreaElement-partial partial interface HTMLAreaElement { diff --git a/tests/wpt/meta/dom/events/Event-dispatch-single-activation-behavior.html.ini b/tests/wpt/meta/dom/events/Event-dispatch-single-activation-behavior.html.ini index 46310d80c45..9eb815a14a6 100644 --- a/tests/wpt/meta/dom/events/Event-dispatch-single-activation-behavior.html.ini +++ b/tests/wpt/meta/dom/events/Event-dispatch-single-activation-behavior.html.ini @@ -44,9 +44,6 @@ [When clicking child of parent
, only child should be activated.] expected: FAIL - [When clicking child of parent , only child should be activated.] - expected: FAIL - [When clicking child of parent
, only child should be activated.] expected: FAIL diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini index 12e5b049bd5..ed0914735ac 100644 --- a/tests/wpt/meta/html/dom/idlharness.https.html.ini +++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini @@ -6685,42 +6685,6 @@ [HTMLAreaElement interface: attribute noHref] expected: FAIL - [HTMLAreaElement interface: attribute href] - expected: FAIL - - [HTMLAreaElement interface: stringifier] - expected: FAIL - - [HTMLAreaElement interface: attribute origin] - expected: FAIL - - [HTMLAreaElement interface: attribute protocol] - expected: FAIL - - [HTMLAreaElement interface: attribute username] - expected: FAIL - - [HTMLAreaElement interface: attribute password] - expected: FAIL - - [HTMLAreaElement interface: attribute host] - expected: FAIL - - [HTMLAreaElement interface: attribute hostname] - expected: FAIL - - [HTMLAreaElement interface: attribute port] - expected: FAIL - - [HTMLAreaElement interface: attribute pathname] - expected: FAIL - - [HTMLAreaElement interface: attribute search] - expected: FAIL - - [HTMLAreaElement interface: attribute hash] - expected: FAIL - [HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type] expected: FAIL @@ -6739,39 +6703,6 @@ [HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type] expected: FAIL - [HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type] - expected: FAIL - - [HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type] - expected: FAIL - [HTMLTableElement interface: attribute align] expected: FAIL diff --git a/tests/wpt/meta/html/infrastructure/urls/dynamic-changes-to-base-urls/dynamic-urls.sub.html.ini b/tests/wpt/meta/html/infrastructure/urls/dynamic-changes-to-base-urls/dynamic-urls.sub.html.ini index 818c224095a..e649c8fe2f0 100644 --- a/tests/wpt/meta/html/infrastructure/urls/dynamic-changes-to-base-urls/dynamic-urls.sub.html.ini +++ b/tests/wpt/meta/html/infrastructure/urls/dynamic-changes-to-base-urls/dynamic-urls.sub.html.ini @@ -1,7 +1,4 @@ [dynamic-urls.sub.html] - [The 'href' attribute of the 'area' element] - expected: FAIL - [The 'cite' attribute of the 'ins' element] expected: FAIL diff --git a/tests/wpt/meta/html/infrastructure/urls/dynamic-changes-to-base-urls/historical.sub.xhtml.ini b/tests/wpt/meta/html/infrastructure/urls/dynamic-changes-to-base-urls/historical.sub.xhtml.ini index 93a7186792a..e2508bc182c 100644 --- a/tests/wpt/meta/html/infrastructure/urls/dynamic-changes-to-base-urls/historical.sub.xhtml.ini +++ b/tests/wpt/meta/html/infrastructure/urls/dynamic-changes-to-base-urls/historical.sub.xhtml.ini @@ -1,7 +1,4 @@ [historical.sub.xhtml] - [The 'href' attribute of the 'area' element] - expected: FAIL - [The 'cite' attribute of the 'ins' element] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-area-element/area-stringifier.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-area-element/area-stringifier.html.ini deleted file mode 100644 index 95f30e94254..00000000000 --- a/tests/wpt/meta/html/semantics/embedded-content/the-area-element/area-stringifier.html.ini +++ /dev/null @@ -1,24 +0,0 @@ -[area-stringifier.html] - [HTMLAreaElement stringifier 1] - expected: FAIL - - [HTMLAreaElement stringifier 2] - expected: FAIL - - [HTMLAreaElement stringifier 4] - expected: FAIL - - [HTMLAreaElement stringifier 5] - expected: FAIL - - [HTMLAreaElement stringifier 6] - expected: FAIL - - [HTMLAreaElement stringifier 7] - expected: FAIL - - [HTMLAreaElement stringifier 9] - expected: FAIL - - [HTMLAreaElement stringifier 10] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-parsable-url-getter-setter.window.js.ini b/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-parsable-url-getter-setter.window.js.ini deleted file mode 100644 index 277c41b3c2f..00000000000 --- a/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-parsable-url-getter-setter.window.js.ini +++ /dev/null @@ -1,57 +0,0 @@ -[non-parsable-url-getter-setter.window.html] - [.origin getter] - expected: FAIL - - [.protocol getter] - expected: FAIL - - [.protocol setter] - expected: FAIL - - [.username getter] - expected: FAIL - - [.username setter] - expected: FAIL - - [.password getter] - expected: FAIL - - [.password setter] - expected: FAIL - - [.host getter] - expected: FAIL - - [.host setter] - expected: FAIL - - [.hostname getter] - expected: FAIL - - [.hostname setter] - expected: FAIL - - [.port getter] - expected: FAIL - - [.port setter] - expected: FAIL - - [.pathname getter] - expected: FAIL - - [.pathname setter] - expected: FAIL - - [.search getter] - expected: FAIL - - [.search setter] - expected: FAIL - - [.hash getter] - expected: FAIL - - [.hash setter] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-special-opaque-path-url-getter-setter.window.js.ini b/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-special-opaque-path-url-getter-setter.window.js.ini deleted file mode 100644 index ef5a8c229f0..00000000000 --- a/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-special-opaque-path-url-getter-setter.window.js.ini +++ /dev/null @@ -1,57 +0,0 @@ -[non-special-opaque-path-url-getter-setter.window.html] - [.origin getter] - expected: FAIL - - [.protocol getter] - expected: FAIL - - [.protocol setter] - expected: FAIL - - [.username getter] - expected: FAIL - - [.username setter] - expected: FAIL - - [.password getter] - expected: FAIL - - [.password setter] - expected: FAIL - - [.host getter] - expected: FAIL - - [.host setter] - expected: FAIL - - [.hostname getter] - expected: FAIL - - [.hostname setter] - expected: FAIL - - [.port getter] - expected: FAIL - - [.port setter] - expected: FAIL - - [.pathname getter] - expected: FAIL - - [.pathname setter] - expected: FAIL - - [.search getter] - expected: FAIL - - [.search setter] - expected: FAIL - - [.hash getter] - expected: FAIL - - [.hash setter] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-special-url-getter-setter.window.js.ini b/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-special-url-getter-setter.window.js.ini deleted file mode 100644 index 4e3e534d35c..00000000000 --- a/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/non-special-url-getter-setter.window.js.ini +++ /dev/null @@ -1,45 +0,0 @@ -[non-special-url-getter-setter.window.html] - [.origin getter] - expected: FAIL - - [.protocol getter] - expected: FAIL - - [.protocol setter] - expected: FAIL - - [.username getter] - expected: FAIL - - [.password getter] - expected: FAIL - - [.host getter] - expected: FAIL - - [.host setter] - expected: FAIL - - [.hostname getter] - expected: FAIL - - [.port getter] - expected: FAIL - - [.pathname getter] - expected: FAIL - - [.pathname setter] - expected: FAIL - - [.search getter] - expected: FAIL - - [.search setter] - expected: FAIL - - [.hash getter] - expected: FAIL - - [.hash setter] - expected: FAIL diff --git a/tests/wpt/meta/url/toascii.window.js.ini b/tests/wpt/meta/url/toascii.window.js.ini index 177197f1620..e6de92556a3 100644 --- a/tests/wpt/meta/url/toascii.window.js.ini +++ b/tests/wpt/meta/url/toascii.window.js.ini @@ -11,39 +11,9 @@ [a%C2%ADb (using .hostname)] expected: FAIL - [a†-- (using .hostname)] - expected: FAIL - - [xn--a (using )] - expected: FAIL - - [a­b (using .host)] - expected: FAIL - - [�.com (using .host)] - expected: FAIL - - [x01234567890123456789012345678901234567890123456789012345678901† (using .hostname)] - expected: FAIL - [xn-- (using .hostname)] expected: FAIL - [�.com (using )] - expected: FAIL - - [نامه‌ای (using .hostname)] - expected: FAIL - - [x01234567890123456789012345678901234567890123456789012345678901† (using .host)] - expected: FAIL - - [xn--a-yoc (using )] - expected: FAIL - - [�.com (using .hostname)] - expected: FAIL - [%C2%AD (using )] expected: FAIL @@ -56,90 +26,36 @@ [x-.β (using .hostname)] expected: FAIL - [-† (using .hostname)] - expected: FAIL - [­ (using .hostname)] expected: FAIL - [xn--zn7c.com (using )] - expected: FAIL - [-x.β (using .host)] expected: FAIL - [ශ්‍රී (using .host)] - expected: FAIL - [-x.β (using .hostname)] expected: FAIL - [نامه‌ای (using .host)] - expected: FAIL - - [xn--zn7c.com (using .host)] - expected: FAIL - [xn--a.β (using .hostname)] expected: FAIL - [xn--a-yoc (using .hostname)] - expected: FAIL - - [xn--1ug.example (using .host)] - expected: FAIL - [­ (using )] expected: FAIL - [xn--zn7c.com (using .hostname)] - expected: FAIL - [­ (using .host)] expected: FAIL - [‍.example (using .host)] - expected: FAIL - - [xn--a-yoc (using .host)] - expected: FAIL - [01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.β (using .hostname)] expected: FAIL - [xn--a (using .host)] - expected: FAIL - - [‍.example (using )] - expected: FAIL - [xn-- (using )] expected: FAIL - [ශ්‍රී (using .hostname)] - expected: FAIL - - [xn--1ug.example (using )] - expected: FAIL - - [xn--a (using .hostname)] - expected: FAIL - [x-.β (using .host)] expected: FAIL - [يa (using )] - expected: FAIL - [xn--a.xn--nxa (using )] expected: FAIL - [a­b (using .hostname)] - expected: FAIL - - [a†-- (using .host)] - expected: FAIL - [xn--a.xn--nxa (using .hostname)] expected: FAIL @@ -152,12 +68,6 @@ [xn--a.β (using .host)] expected: FAIL - [يa (using .host)] - expected: FAIL - - [-† (using .host)] - expected: FAIL - [x01234567890123456789012345678901234567890123456789012345678901x.β (using .host)] expected: FAIL @@ -170,446 +80,14 @@ [xn-- (using .host)] expected: FAIL - [يa (using .hostname)] - expected: FAIL - - [‍.example (using .hostname)] - expected: FAIL - [xn--a.β (using )] expected: FAIL [%C2%AD (using .host)] expected: FAIL - [xn--1ug.example (using .hostname)] - expected: FAIL - [%C2%AD (using .hostname)] expected: FAIL [xn--nxa.β (using .host)] expected: FAIL - - [-x.ß (using .host)] - expected: FAIL - - [-x.ß (using .hostname)] - expected: FAIL - - [x-.ß (using .host)] - expected: FAIL - - [x-.ß (using .hostname)] - expected: FAIL - - [x..ß (using .host)] - expected: FAIL - - [x..ß (using .hostname)] - expected: FAIL - - [xn--a.xn--zca (using )] - expected: FAIL - - [xn--a.xn--zca (using .host)] - expected: FAIL - - [xn--a.xn--zca (using .hostname)] - expected: FAIL - - [xn--a.ß (using )] - expected: FAIL - - [xn--a.ß (using .host)] - expected: FAIL - - [xn--a.ß (using .hostname)] - expected: FAIL - - [xn--tešla (using )] - expected: FAIL - - [xn--tešla (using .host)] - expected: FAIL - - [xn--tešla (using .hostname)] - expected: FAIL - - [xn--zca.ß (using .host)] - expected: FAIL - - [xn--zca.ß (using .hostname)] - expected: FAIL - - [ab--c.ß (using .host)] - expected: FAIL - - [ab--c.ß (using .hostname)] - expected: FAIL - - [x01234567890123456789012345678901234567890123456789012345678901x.ß (using .host)] - expected: FAIL - - [x01234567890123456789012345678901234567890123456789012345678901x.ß (using .hostname)] - expected: FAIL - - [01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.ß (using .host)] - expected: FAIL - - [01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.ß (using .hostname)] - expected: FAIL - - [xn--ls8h= (using )] - expected: FAIL - - [xn--ls8h= (using .host)] - expected: FAIL - - [xn--ls8h= (using .hostname)] - expected: FAIL - - [≠ (using .host)] - expected: FAIL - - [≠ (using .hostname)] - expected: FAIL - - [≮ (using .host)] - expected: FAIL - - [≮ (using .hostname)] - expected: FAIL - - [≯ (using .host)] - expected: FAIL - - [≯ (using .hostname)] - expected: FAIL - - [≠ (using .host)] - expected: FAIL - - [≠ (using .hostname)] - expected: FAIL - - [≮ (using .host)] - expected: FAIL - - [≮ (using .hostname)] - expected: FAIL - - [≯ (using .host)] - expected: FAIL - - [≯ (using .hostname)] - expected: FAIL - - [=­̸ (using .host)] - expected: FAIL - - [=­̸ (using .hostname)] - expected: FAIL - - [<­̸ (using .host)] - expected: FAIL - - [<­̸ (using .hostname)] - expected: FAIL - - [>­̸ (using .host)] - expected: FAIL - - [>­̸ (using .hostname)] - expected: FAIL - - [faß.de (using .host)] - expected: FAIL - - [faß.de (using .hostname)] - expected: FAIL - - [βόλος.com (using .host)] - expected: FAIL - - [βόλος.com (using .hostname)] - expected: FAIL - - [ශ්‍රී.com (using .host)] - expected: FAIL - - [ශ්‍රී.com (using .hostname)] - expected: FAIL - - [نامه‌ای.com (using .host)] - expected: FAIL - - [نامه‌ای.com (using .hostname)] - expected: FAIL - - [www.looĸout.net (using .host)] - expected: FAIL - - [www.looĸout.net (using .hostname)] - expected: FAIL - - [ᗯᗯᗯ.lookout.net (using .host)] - expected: FAIL - - [ᗯᗯᗯ.lookout.net (using .hostname)] - expected: FAIL - - [www.lookout.сом (using .host)] - expected: FAIL - - [www.lookout.сом (using .hostname)] - expected: FAIL - - [www‥lookout.net (using )] - expected: FAIL - - [www‥lookout.net (using .host)] - expected: FAIL - - [www‥lookout.net (using .hostname)] - expected: FAIL - - [www.lookout‧net (using .host)] - expected: FAIL - - [www.lookout‧net (using .hostname)] - expected: FAIL - - [www.lookout.net⩴80 (using )] - expected: FAIL - - [www.lookout.net⩴80 (using .host)] - expected: FAIL - - [www.lookout.net⩴80 (using .hostname)] - expected: FAIL - - [www .lookout.net (using )] - expected: FAIL - - [www .lookout.net (using .host)] - expected: FAIL - - [www .lookout.net (using .hostname)] - expected: FAIL - - [ lookout.net (using )] - expected: FAIL - - [ lookout.net (using .host)] - expected: FAIL - - [ lookout.net (using .hostname)] - expected: FAIL - - [\x1flookout.net (using )] - expected: FAIL - - [\x1flookout.net (using .host)] - expected: FAIL - - [\x1flookout.net (using .hostname)] - expected: FAIL - - [look۝out.net (using )] - expected: FAIL - - [look۝out.net (using .host)] - expected: FAIL - - [look۝out.net (using .hostname)] - expected: FAIL - - [look᠎out.net (using )] - expected: FAIL - - [look᠎out.net (using .host)] - expected: FAIL - - [look᠎out.net (using .hostname)] - expected: FAIL - - [look⁠out.net (using .host)] - expected: FAIL - - [look⁠out.net (using .hostname)] - expected: FAIL - - [lookout.net (using .host)] - expected: FAIL - - [lookout.net (using .hostname)] - expected: FAIL - - [look🿾out.net (using )] - expected: FAIL - - [look🿾out.net (using .host)] - expected: FAIL - - [look🿾out.net (using .hostname)] - expected: FAIL - - [lookout.net (using )] - expected: FAIL - - [lookout.net (using .host)] - expected: FAIL - - [lookout.net (using .hostname)] - expected: FAIL - - [look⿰out.net (using )] - expected: FAIL - - [look⿰out.net (using .host)] - expected: FAIL - - [look⿰out.net (using .hostname)] - expected: FAIL - - [looḱout.net (using .host)] - expected: FAIL - - [looḱout.net (using .hostname)] - expected: FAIL - - [look‮out.net (using )] - expected: FAIL - - [look‮out.net (using .host)] - expected: FAIL - - [look‮out.net (using .hostname)] - expected: FAIL - - [lookout.net (using )] - expected: FAIL - - [lookout.net (using .host)] - expected: FAIL - - [lookout.net (using .hostname)] - expected: FAIL - - [look󠀁out.net (using )] - expected: FAIL - - [look󠀁out.net (using .host)] - expected: FAIL - - [look󠀁out.net (using .hostname)] - expected: FAIL - - [look󠀠out.net (using )] - expected: FAIL - - [look󠀠out.net (using .host)] - expected: FAIL - - [look󠀠out.net (using .hostname)] - expected: FAIL - - [look־out.net (using )] - expected: FAIL - - [look־out.net (using .host)] - expected: FAIL - - [look־out.net (using .hostname)] - expected: FAIL - - [Bücher.de (using .host)] - expected: FAIL - - [Bücher.de (using .hostname)] - expected: FAIL - - [♥.net (using .host)] - expected: FAIL - - [♥.net (using .hostname)] - expected: FAIL - - [͸.net (using )] - expected: FAIL - - [͸.net (using .host)] - expected: FAIL - - [͸.net (using .hostname)] - expected: FAIL - - [Ӏ.com (using )] - expected: FAIL - - [Ӏ.com (using .host)] - expected: FAIL - - [Ӏ.com (using .hostname)] - expected: FAIL - - [㛼.com (using .host)] - expected: FAIL - - [㛼.com (using .hostname)] - expected: FAIL - - [Ↄ.com (using )] - expected: FAIL - - [Ↄ.com (using .host)] - expected: FAIL - - [Ↄ.com (using .hostname)] - expected: FAIL - - [look͏out.net (using .host)] - expected: FAIL - - [look͏out.net (using .hostname)] - expected: FAIL - - [gOoGle.com (using .host)] - expected: FAIL - - [gOoGle.com (using .hostname)] - expected: FAIL - - [ড়.com (using .host)] - expected: FAIL - - [ড়.com (using .hostname)] - expected: FAIL - - [ẞ.com (using .host)] - expected: FAIL - - [ẞ.com (using .hostname)] - expected: FAIL - - [ẞ.foo.com (using .host)] - expected: FAIL - - [ẞ.foo.com (using .hostname)] - expected: FAIL - - [xn--0.com (using )] - expected: FAIL - - [xn--0.com (using .host)] - expected: FAIL - - [xn--0.com (using .hostname)] - expected: FAIL - - [foò.bar.com (using .host)] - expected: FAIL - - [foò.bar.com (using .hostname)] - expected: FAIL diff --git a/tests/wpt/meta/url/url-setters-a-area.window.js.ini b/tests/wpt/meta/url/url-setters-a-area.window.js.ini index 4c4a6aa9e27..3a57ed13e2d 100644 --- a/tests/wpt/meta/url/url-setters-a-area.window.js.ini +++ b/tests/wpt/meta/url/url-setters-a-area.window.js.ini @@ -1,101 +1,11 @@ [url-setters-a-area.window.html?include=javascript] - [: Setting .protocol = 'defuse'] - expected: FAIL - - [: Setting .username = 'wario'] - expected: FAIL - - [: Setting .username = 'wario'] - expected: FAIL - - [: Setting .password = 'bowser'] - expected: FAIL - - [: Setting .port = '12'] - expected: FAIL - - [: Setting .hash = 'castle'] - expected: FAIL - - [: Setting .hash = 'castle'] - expected: FAIL - [url-setters-a-area.window.html?include=mailto] - [: Setting .protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must.] - expected: FAIL - - [: Setting .username = 'me' Cannot-be-a-base means no username] - expected: FAIL - - [: Setting .password = 'secret' Cannot-be-a-base means no password] - expected: FAIL - - [: Setting .host = 'example.com' Cannot-be-a-base means no host] - expected: FAIL - - [: Setting .hostname = 'example.com' Cannot-be-a-base means no host] - expected: FAIL - [: Setting .pathname = '/foo' Cannot-be-a-base don’t have a path] expected: FAIL - [: Setting .pathname = '/foo' Opaque paths cannot be set] - expected: FAIL - [url-setters-a-area.window.html?include=file] - [: Setting .protocol = 'http' Can’t switch from file URL with no host] - expected: FAIL - - [: Setting .protocol = 'https'] - expected: FAIL - - [: Setting .protocol = 'wss'] - expected: FAIL - - [: Setting .protocol = 's'] - expected: FAIL - - [: Setting .username = 'me' No host means no username] - expected: FAIL - - [: Setting .username = 'test'] - expected: FAIL - - [: Setting .password = 'secret' No host means no password] - expected: FAIL - - [: Setting .password = 'test'] - expected: FAIL - - [: Setting .host = 'x:123'] - expected: FAIL - - [: Setting .host = 'loc%41lhost'] - expected: FAIL - - [: Setting .host = ''] - expected: FAIL - - [: Setting .hostname = 'x:123'] - expected: FAIL - - [: Setting .hostname = 'loc%41lhost'] - expected: FAIL - - [: Setting .hostname = ''] - expected: FAIL - - [: Setting .port = '12'] - expected: FAIL - - [: Setting .port = '12'] - expected: FAIL - - [: Setting .pathname = '' Special URLs cannot have their paths erased] - expected: FAIL - [: Setting .pathname = '\\\\' File URLs and (back)slashes] expected: FAIL @@ -114,320 +24,8 @@ [: Setting .pathname = '//monkey/..//' File URLs and (back)slashes] expected: FAIL - [: Setting .href = 'http://0300.168.0xF0'] - expected: FAIL - [url-setters-a-area.window.html?exclude=(file|javascript|mailto)] - [: Setting .protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.] - expected: FAIL - - [: Setting .protocol = 'b'] - expected: FAIL - - [: Setting .protocol = 'B' Upper-case ASCII is lower-cased] - expected: FAIL - - [: Setting .protocol = 'é' Non-ASCII is rejected] - expected: FAIL - - [: Setting .protocol = '0b' No leading digit] - expected: FAIL - - [: Setting .protocol = '+b' No leading punctuation] - expected: FAIL - - [: Setting .protocol = 'bC0+-.'] - expected: FAIL - - [: Setting .protocol = 'b,c' Only some punctuation is acceptable] - expected: FAIL - - [: Setting .protocol = 'bé' Non-ASCII is rejected] - expected: FAIL - - [: Setting .protocol = 'file' Can’t switch from URL containing username/password/port to file] - expected: FAIL - - [: Setting .protocol = 'file'] - expected: FAIL - - [: Setting .protocol = 'file'] - expected: FAIL - - [: Setting .protocol = 'b' Can’t switch from special scheme to non-special] - expected: FAIL - - [: Setting .protocol = 's'] - expected: FAIL - - [: Setting .protocol = 'test'] - expected: FAIL - - [: Setting .protocol = 'http' Can’t switch from non-special scheme to special] - expected: FAIL - - [: Setting .protocol = 'https'] - expected: FAIL - - [: Setting .protocol = 'file'] - expected: FAIL - - [: Setting .protocol = 'file'] - expected: FAIL - - [: Setting .protocol = 'https'] - expected: FAIL - - [: Setting .protocol = 'https:foo : bar' Stuff after the first ':' is ignored] - expected: FAIL - - [: Setting Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored] - expected: FAIL - - [: Setting .protocol = 'https' Port is set to null if it is the default for new scheme.] - expected: FAIL - - [: Setting .username = 'me' No host means no username] - expected: FAIL - - [: Setting .username = 'me'] - expected: FAIL - - [: Setting .username = 'me'] - expected: FAIL - - [: Setting .username = ''] - expected: FAIL - - [: Setting .username = ''] - expected: FAIL - - [: Setting .username = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set.] - expected: FAIL - - [: Setting .username = '%c3%89té' Bytes already percent-encoded are left as-is.] - expected: FAIL - - [: Setting .username = 'x'] - expected: FAIL - - [: Setting .password = 'secret' No host means no password] - expected: FAIL - - [: Setting .password = 'secret'] - expected: FAIL - - [: Setting .password = 'secret'] - expected: FAIL - - [: Setting .password = ''] - expected: FAIL - - [: Setting .password = ''] - expected: FAIL - - [: Setting .password = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set.] - expected: FAIL - - [: Setting .password = '%c3%89té' Bytes already percent-encoded are left as-is.] - expected: FAIL - - [: Setting .password = 'x'] - expected: FAIL - - [: Setting .host = '\x00' Non-special scheme] - expected: FAIL - - [: Setting .host = '\t'] - expected: FAIL - - [: Setting .host = '\n'] - expected: FAIL - - [: Setting .host = '\r'] - expected: FAIL - - [: Setting .host = ' '] - expected: FAIL - - [: Setting .host = '#'] - expected: FAIL - - [: Setting .host = '/'] - expected: FAIL - - [: Setting .host = '?'] - expected: FAIL - - [: Setting .host = '@'] - expected: FAIL - - [: Setting .host = 'ß'] - expected: FAIL - - [: Setting .host = 'ß' IDNA Nontransitional_Processing] - expected: FAIL - - [: Setting .host = 'example.net' Cannot-be-a-base means no host] - expected: FAIL - - [: Setting .host = 'example.com:8080'] - expected: FAIL - - [: Setting .host = 'example.com' Port number is unchanged if not specified in the new value] - expected: FAIL - - [: Setting .host = 'example.com:' Port number is unchanged if not specified] - expected: FAIL - - [: Setting .host = '' The empty host is not valid for special schemes] - expected: FAIL - - [: Setting .host = '' The empty host is OK for non-special schemes] - expected: FAIL - - [: Setting .host = 'example.net' Path-only URLs can gain a host] - expected: FAIL - - [: Setting .host = '0x7F000001:8080' IPv4 address syntax is normalized] - expected: FAIL - - [: Setting .host = '[::0:01\]:2' IPv6 address syntax is normalized] - expected: FAIL - - [: Setting .host = '[2001:db8::2\]:4002' IPv6 literal address with port, crbug.com/1012416] - expected: FAIL - - [: Setting .host = 'example.com:80' Default port number is removed] - expected: FAIL - - [: Setting .host = 'example.com:443' Default port number is removed] - expected: FAIL - - [: Setting .host = 'example.com:80' Default port number is only removed for the relevant scheme] - expected: FAIL - - [: Setting .host = 'example.com:80' Port number is removed if new port is scheme default and existing URL has a non-default port] - expected: FAIL - - [: Setting .host = 'example.com/stuff' Stuff after a / delimiter is ignored] - expected: FAIL - - [: Setting .host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored] - expected: FAIL - - [: Setting .host = 'example.com?stuff' Stuff after a ? delimiter is ignored] - expected: FAIL - - [: Setting .host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored] - expected: FAIL - - [: Setting .host = 'example.com#stuff' Stuff after a # delimiter is ignored] - expected: FAIL - - [: Setting .host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored] - expected: FAIL - - [: Setting .host = 'example.com\\stuff' Stuff after a \\ delimiter is ignored for special schemes] - expected: FAIL - - [: Setting .host = 'example.com:8080\\stuff' Stuff after a \\ delimiter is ignored for special schemes] - expected: FAIL - - [: Setting .host = 'example.com\\stuff' \\ is not a delimiter for non-special schemes, but still forbidden in hosts] - expected: FAIL - - [: Setting .host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error] - expected: FAIL - - [: Setting .host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error] - expected: FAIL - - [: Setting .host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error] - expected: FAIL - - [: Setting .host = 'example.com:65535' Port numbers are 16 bit integers] - expected: FAIL - - [: Setting .host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.] - expected: FAIL - - [: Setting .host = '[google.com\]' Broken IPv6] - expected: FAIL - - [: Setting .host = '[::1.2.3.4x\]'] - expected: FAIL - - [: Setting .host = '[::1.2.3.\]'] - expected: FAIL - - [: Setting .host = '[::1.2.\]'] - expected: FAIL - - [: Setting .host = '[::1.\]'] - expected: FAIL - - [: Setting .host = ''] - expected: FAIL - - [: Setting .host = ''] - expected: FAIL - - [: Setting .host = '///bad.com' Leading / is not stripped] - expected: FAIL - - [: Setting .host = '///bad.com' Leading / is not stripped] - expected: FAIL - - [: Setting .hostname = '\x00' Non-special scheme] - expected: FAIL - - [: Setting .hostname = '\t'] - expected: FAIL - - [: Setting .hostname = '\n'] - expected: FAIL - - [: Setting .hostname = '\r'] - expected: FAIL - - [: Setting .hostname = ' '] - expected: FAIL - - [: Setting .hostname = '#'] - expected: FAIL - - [: Setting .hostname = '/'] - expected: FAIL - - [: Setting .hostname = '?'] - expected: FAIL - - [: Setting .hostname = '@'] - expected: FAIL - - [: Setting .hostname = 'example.net' Cannot-be-a-base means no host] - expected: FAIL - - [: Setting .hostname = 'example.com'] - expected: FAIL - - [: Setting .hostname = '' The empty host is not valid for special schemes] - expected: FAIL - - [: Setting .hostname = '' The empty host is OK for non-special schemes] - expected: FAIL - - [: Setting .hostname = 'example.net' Path-only URLs can gain a host] - expected: FAIL - - [: Setting .hostname = '0x7F000001' IPv4 address syntax is normalized] - expected: FAIL - - [: Setting .hostname = '[::0:01\]' IPv6 address syntax is normalized] - expected: FAIL - [: Setting .hostname = 'example.com:8080' : delimiter invalidates entire value] expected: FAIL @@ -440,365 +38,8 @@ [: Setting .hostname = 'example.com:' : delimiter invalidates entire value] expected: FAIL - [: Setting .hostname = 'example.com/stuff' Stuff after a / delimiter is ignored] - expected: FAIL - - [: Setting .hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored] - expected: FAIL - - [: Setting .hostname = 'example.com#stuff' Stuff after a # delimiter is ignored] - expected: FAIL - - [: Setting .hostname = 'example.com\\stuff' Stuff after a \\ delimiter is ignored for special schemes] - expected: FAIL - - [: Setting .hostname = 'example.com\\stuff' \\ is not a delimiter for non-special schemes, but still forbidden in hosts] - expected: FAIL - - [: Setting .hostname = '[google.com\]' Broken IPv6] - expected: FAIL - - [: Setting .hostname = '[::1.2.3.4x\]'] - expected: FAIL - - [: Setting .hostname = '[::1.2.3.\]'] - expected: FAIL - - [: Setting .hostname = '[::1.2.\]'] - expected: FAIL - - [: Setting .hostname = '[::1.\]'] - expected: FAIL - - [: Setting .hostname = ''] - expected: FAIL - - [: Setting .hostname = ''] - expected: FAIL - - [: Setting .hostname = 'h' Drop /. from path] - expected: FAIL - - [: Setting .hostname = ''] - expected: FAIL - - [: Setting .hostname = '///bad.com' Leading / is not stripped] - expected: FAIL - - [: Setting .hostname = '///bad.com' Leading / is not stripped] - expected: FAIL - - [: Setting .port = '8080'] - expected: FAIL - - [: Setting .port = '' Port number is removed if empty is the new value] - expected: FAIL - - [: Setting .port = '80' Default port number is removed] - expected: FAIL - - [: Setting .port = '443' Default port number is removed] - expected: FAIL - - [: Setting .port = '80' Default port number is only removed for the relevant scheme] - expected: FAIL - - [: Setting .port = '8080/stuff' Stuff after a / delimiter is ignored] - expected: FAIL - - [: Setting .port = '8080?stuff' Stuff after a ? delimiter is ignored] - expected: FAIL - - [: Setting .port = '8080#stuff' Stuff after a # delimiter is ignored] - expected: FAIL - - [: Setting .port = '8080\\stuff' Stuff after a \\ delimiter is ignored for special schemes] - expected: FAIL - - [: Setting .port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error] - expected: FAIL - - [: Setting .port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error] - expected: FAIL - - [: Setting .port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error] - expected: FAIL - - [: Setting .port = '65535' Port numbers are 16 bit integers] - expected: FAIL - - [: Setting .port = '65536' Port numbers are 16 bit integers, overflowing is an error] - expected: FAIL - - [: Setting .port = '65536' Port numbers are 16 bit integers, overflowing is an error] - expected: FAIL - - [: Setting .port = '12'] - expected: FAIL - - [: Setting .port = '12'] - expected: FAIL - - [: Setting .port = '12'] - expected: FAIL - - [: Setting .pathname = '' Non-special URLs can have their paths erased] - expected: FAIL - [: Setting .pathname = '' Non-special URLs with an empty host can have their paths erased] expected: FAIL [: Setting .pathname = '' Non-special URLs with an empty host can have their paths erased] expected: FAIL - - [: Setting .pathname = '' Path-only URLs cannot have their paths erased] - expected: FAIL - - [: Setting .pathname = 'test' Path-only URLs always have an initial slash] - expected: FAIL - - [: Setting .pathname = '/var/log/../run/bar.socket'] - expected: FAIL - - [: Setting .pathname = 'home'] - expected: FAIL - - [: Setting .pathname = '../home'] - expected: FAIL - - [: Setting .pathname = '\\a\\%2E\\b\\%2e.\\c' \\ is a segment delimiter for 'special' URLs] - expected: FAIL - - [: Setting .pathname = '\\a\\%2E\\b\\%2e.\\c' \\ is *not* a segment delimiter for non-'special' URLs] - expected: FAIL - - [: Setting .pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.] - expected: FAIL - - [: Setting .pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, including %2E outside dotted segments.] - expected: FAIL - - [: Setting .pathname = '?' ? needs to be encoded] - expected: FAIL - - [: Setting .pathname = '#' # needs to be encoded] - expected: FAIL - - [: Setting .pathname = '?' ? needs to be encoded, non-special scheme] - expected: FAIL - - [: Setting .pathname = '#' # needs to be encoded, non-special scheme] - expected: FAIL - - [: Setting .pathname = '/?é' ? doesn't mess up encoding] - expected: FAIL - - [: Setting .pathname = '/#é' # doesn't mess up encoding] - expected: FAIL - - [: Setting .pathname = '/.//p' Serialize /. in path] - expected: FAIL - - [: Setting .pathname = '/..//p'] - expected: FAIL - - [: Setting .pathname = '//p'] - expected: FAIL - - [: Setting .pathname = 'p' Drop /. from path] - expected: FAIL - - [: Setting .search = 'lang=fr'] - expected: FAIL - - [: Setting .search = 'lang=fr'] - expected: FAIL - - [: Setting .search = '?lang=fr'] - expected: FAIL - - [: Setting .search = '??lang=fr'] - expected: FAIL - - [: Setting .search = '?'] - expected: FAIL - - [: Setting .search = ''] - expected: FAIL - - [: Setting .search = ''] - expected: FAIL - - [: Setting .search = ''] - expected: FAIL - - [: Setting .search = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed.] - expected: FAIL - - [: Setting .search = '%c3%89té' Bytes already percent-encoded are left as-is] - expected: FAIL - - [: Setting .hash = 'main'] - expected: FAIL - - [: Setting .hash = 'main'] - expected: FAIL - - [: Setting .hash = '##nav'] - expected: FAIL - - [: Setting .hash = '#main'] - expected: FAIL - - [: Setting .hash = '#'] - expected: FAIL - - [: Setting .hash = ''] - expected: FAIL - - [: Setting .hash = '#foo bar'] - expected: FAIL - - [: Setting .hash = '#foo"bar'] - expected: FAIL - - [: Setting .hash = '#foo: Setting .hash = '#foo>bar'] - expected: FAIL - - [: Setting .hash = '#foo`bar'] - expected: FAIL - - [: Setting .hash = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' Simple percent-encoding; tabs and newlines are removed] - expected: FAIL - - [: Setting .hash = 'a\x00b' Percent-encode NULLs in fragment] - expected: FAIL - - [: Setting .hash = 'a\x00b' Percent-encode NULLs in fragment] - expected: FAIL - - [: Setting .hash = '%c3%89té' Bytes already percent-encoded are left as-is] - expected: FAIL - - [: Setting .pathname = 'new value'] - expected: FAIL - - [: Setting .pathname = 'new value'] - expected: FAIL - - [: Setting .pathname = 'space ' Non-special URLs with non-opaque paths percent-encode U+0020] - expected: FAIL - - [: Setting .pathname = 'space '] - expected: FAIL - - [: Setting .search = '' Drop trailing spaces from trailing opaque paths] - expected: FAIL - - [: Setting .search = ''] - expected: FAIL - - [: Setting .search = '' Do not drop trailing spaces from non-trailing opaque paths] - expected: FAIL - - [: Setting .search = ''] - expected: FAIL - - [: Setting .hash = '' Drop trailing spaces from trailing opaque paths] - expected: FAIL - - [: Setting .hash = ''] - expected: FAIL - - [: Setting .hash = '' Do not drop trailing spaces from non-trailing opaque paths] - expected: FAIL - - [: Setting .hash = ''] - expected: FAIL - - [: Setting .protocol = 'h\r\ntt\tps' Tab and newline are stripped] - expected: FAIL - - [: Setting .protocol = 'https\r'] - expected: FAIL - - [: Setting .protocol = 'https\x00' Non-tab/newline C0 controls result in no-op] - expected: FAIL - - [: Setting .protocol = 'https\x0c'] - expected: FAIL - - [: Setting .protocol = 'https\x0e'] - expected: FAIL - - [: Setting .protocol = 'https '] - expected: FAIL - - [: Setting .host = 'a%C2%ADb'] - expected: FAIL - - [: Setting .host = '­'] - expected: FAIL - - [: Setting .host = '%C2%AD'] - expected: FAIL - - [: Setting .host = 'xn--'] - expected: FAIL - - [: Setting .hostname = 'a%C2%ADb'] - expected: FAIL - - [: Setting .hostname = '­'] - expected: FAIL - - [: Setting .hostname = '%C2%AD'] - expected: FAIL - - [: Setting .hostname = 'xn--'] - expected: FAIL - - [: Setting .port = 'randomstring' Setting port to a string that doesn't parse as a number] - expected: FAIL - - [: Setting .port = '\t8080' Leading u0009 on special scheme] - expected: FAIL - - [: Setting .port = '\t8080' Leading u0009 on non-special scheme] - expected: FAIL - - [: Setting .port = '4wpt' Should use all ascii prefixed characters as port] - expected: FAIL - - [: Setting .pathname = ' ' Trailing space should be encoded] - expected: FAIL - - [: Setting .pathname = '\x00' Trailing C0 control should be encoded] - expected: FAIL - - [: Setting .search = ' ' Trailing space should be encoded] - expected: FAIL - - [: Setting .search = '\x00' Trailing C0 control should be encoded] - expected: FAIL - - [: Setting .hash = ' ' Trailing space should be encoded] - expected: FAIL - - [: Setting .hash = '\x00' Trailing C0 control should be encoded] - expected: FAIL - - [: Setting .host = 'example.com?stuff:8080' Stuff after a ? delimiter is ignored, trailing 'port'] - expected: FAIL - - [: Setting .host = 'example.com:invalid' Anything other than ASCII digit stops the port parser in a setter but is not an error] - expected: FAIL - - [: Setting .host = '[::1\]:invalid' Anything other than ASCII digit stops the port parser in a setter but is not an error] - expected: FAIL - - [: Setting .host = '[::1\]' IPv6 without port] - expected: FAIL