diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/location.rs | 5 | ||||
-rw-r--r-- | components/script/dom/url.rs | 5 | ||||
-rw-r--r-- | components/script/dom/urlhelper.rs | 30 | ||||
-rw-r--r-- | components/script/dom/webidls/Location.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/URL.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/websocket.rs | 5 |
6 files changed, 44 insertions, 5 deletions
diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs index 0457da58618..08e23b15920 100644 --- a/components/script/dom/location.rs +++ b/components/script/dom/location.rs @@ -81,6 +81,11 @@ impl LocationMethods for Location { self.set_url_component(value, UrlHelper::SetHost); } + // https://html.spec.whatwg.org/multipage/#dom-location-origin + fn Origin(&self) -> USVString { + UrlHelper::Origin(&self.get_url()) + } + // https://html.spec.whatwg.org/multipage/#dom-location-hostname fn Hostname(&self) -> USVString { UrlHelper::Hostname(&self.get_url()) diff --git a/components/script/dom/url.rs b/components/script/dom/url.rs index a0370d7f767..adc758a8f18 100644 --- a/components/script/dom/url.rs +++ b/components/script/dom/url.rs @@ -176,6 +176,11 @@ impl URLMethods for URL { UrlHelper::SetProtocol(&mut self.url.borrow_mut(), value); } + // https://url.spec.whatwg.org/#dom-url-origin + fn Origin(&self) -> USVString { + UrlHelper::Origin(&self.url.borrow()) + } + // https://url.spec.whatwg.org/#dom-url-search fn Search(&self) -> USVString { UrlHelper::Search(&self.url.borrow()) diff --git a/components/script/dom/urlhelper.rs b/components/script/dom/urlhelper.rs index d9e26e84263..580c541502d 100644 --- a/components/script/dom/urlhelper.rs +++ b/components/script/dom/urlhelper.rs @@ -6,7 +6,7 @@ use dom::bindings::str::USVString; use std::borrow::ToOwned; use std::fmt::Write; use url::urlutils::{UrlUtils, UrlUtilsWrapper}; -use url::{SchemeData, Url, UrlParser}; +use url::{Origin, SchemeData, Url, UrlParser}; #[derive(HeapSizeOf)] pub struct UrlHelper; @@ -43,6 +43,34 @@ impl UrlHelper { let _ = wrapper.set_host(&value.0); } + pub fn Origin(url: &Url) -> USVString { + USVString(match url.origin() { + Origin::UID(_) => { + // https://html.spec.whatwg.org/multipage/#unicode-serialisation-of-an-origin + // If the origin in question is not a scheme/host/port tuple, + // then return the literal string "null" and abort these steps. + "null".to_owned() + }, + Origin::Tuple(protocol, host, _) => { + let mut origin = + format!( + "{protocol}://{host}", + protocol = protocol, + host = host + ); + if let Some(port) = + // https://html.spec.whatwg.org/multipage/#unicode-serialisation-of-an-origin + // only append the port # to the serialized origin if the port is different from + // the default port for the protocol. If url.scheme_data.port is None, that + // indicates that the port is a default port + url.relative_scheme_data().and_then(|scheme| scheme.port) { + write!(origin, ":{}", port).unwrap(); + }; + origin + } + }) + } + pub fn Hostname(url: &Url) -> USVString { USVString(url.serialize_host().unwrap_or_else(|| "".to_owned())) } diff --git a/components/script/dom/webidls/Location.webidl b/components/script/dom/webidls/Location.webidl index 8af05fbd178..0593581d98c 100644 --- a/components/script/dom/webidls/Location.webidl +++ b/components/script/dom/webidls/Location.webidl @@ -6,7 +6,7 @@ // https://html.spec.whatwg.org/multipage/#location [Unforgeable] interface Location { /*stringifier*/ attribute USVString href; - // attribute USVString origin; + readonly attribute USVString origin; attribute USVString protocol; attribute USVString host; attribute USVString hostname; diff --git a/components/script/dom/webidls/URL.webidl b/components/script/dom/webidls/URL.webidl index 57ae34a3eba..8c5d6e1580e 100644 --- a/components/script/dom/webidls/URL.webidl +++ b/components/script/dom/webidls/URL.webidl @@ -11,7 +11,7 @@ interface URL { [SetterThrows] /*stringifier*/ attribute USVString href; - // readonly attribute USVString origin; + readonly attribute USVString origin; attribute USVString protocol; attribute USVString username; attribute USVString password; diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 36456cd02ff..d70b633f0d5 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -5,8 +5,10 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; +use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods; use dom::bindings::codegen::Bindings::WebSocketBinding; use dom::bindings::codegen::Bindings::WebSocketBinding::{BinaryType, WebSocketMethods}; +use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::UnionTypes::StringOrStringSequence::{self, eString, eStringSequence}; use dom::bindings::conversions::{ToJSValConvertible}; use dom::bindings::error::{Error, Fallible}; @@ -234,13 +236,12 @@ impl WebSocket { } // Step 6: Origin. + let origin = global.as_window().Location().Origin().0; // Step 7. let ws = WebSocket::new(global, resource_url.clone()); let address = Trusted::new(ws.r(), global.networking_thread_source()); - let origin = global.get_url().serialize(); - let connect_data = WebSocketConnectData { resource_url: resource_url.clone(), origin: origin, |