From e7dd2819793ff4429e8f748ccf71843eabea8b3a Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 13 Aug 2014 12:20:07 +0200 Subject: [PATCH] Implement WorkerGlobalScope.location. --- .../dom/webidls/URLUtilsReadOnly.webidl | 23 +++++++ .../dom/webidls/WorkerGlobalScope.webidl | 2 +- .../script/dom/webidls/WorkerLocation.webidl | 9 +++ .../script/dom/workerglobalscope.rs | 11 ++++ src/components/script/dom/workerlocation.rs | 64 +++++++++++++++++++ src/components/script/script.rs | 1 + src/test/content/test_interfaces.html | 1 + .../metadata/workers/WorkerLocation.htm.ini | 3 +- .../workers/WorkerLocation_hash.htm.ini | 6 -- .../WorkerLocation_hash_encoding.htm.ini | 6 -- .../WorkerLocation_hash_nonexist.htm.ini | 6 -- .../workers/WorkerLocation_host.htm.ini | 6 -- .../workers/WorkerLocation_hostname.htm.ini | 6 -- .../workers/WorkerLocation_href.htm.ini | 6 -- .../workers/WorkerLocation_port.htm.ini | 3 +- .../workers/WorkerLocation_protocol.htm.ini | 6 -- .../workers/WorkerLocation_search.htm.ini | 6 -- .../WorkerLocation_search_empty.htm.ini | 6 -- .../WorkerLocation_search_fragment.htm.ini | 6 -- .../WorkerLocation_search_nonexist.htm.ini | 6 -- .../location/members.html.ini | 6 -- .../location/returns-same-object.html.ini | 6 -- .../location/setting-members.html.ini | 3 +- .../location/worker-separate-file.html.ini | 3 +- .../semantics/multiple-workers/003.html.ini | 6 -- 25 files changed, 114 insertions(+), 93 deletions(-) create mode 100644 src/components/script/dom/webidls/URLUtilsReadOnly.webidl create mode 100644 src/components/script/dom/webidls/WorkerLocation.webidl create mode 100644 src/components/script/dom/workerlocation.rs delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_hash.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_hash_encoding.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_hash_nonexist.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_host.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_hostname.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_href.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_protocol.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_search.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_search_empty.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_search_fragment.htm.ini delete mode 100644 src/test/wpt/metadata/workers/WorkerLocation_search_nonexist.htm.ini delete mode 100644 src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/members.html.ini delete mode 100644 src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html.ini delete mode 100644 src/test/wpt/metadata/workers/semantics/multiple-workers/003.html.ini diff --git a/src/components/script/dom/webidls/URLUtilsReadOnly.webidl b/src/components/script/dom/webidls/URLUtilsReadOnly.webidl new file mode 100644 index 00000000000..8518019a6c1 --- /dev/null +++ b/src/components/script/dom/webidls/URLUtilsReadOnly.webidl @@ -0,0 +1,23 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// http://url.spec.whatwg.org/#urlutilsreadonly +[NoInterfaceObject/*, + Exposed=(Window,Worker)*/] +interface URLUtilsReadOnly { + //stringifier readonly attribute ScalarValueString href; + readonly attribute DOMString href; + //readonly attribute ScalarValueString origin; + + //readonly attribute ScalarValueString protocol; + //readonly attribute ScalarValueString host; + //readonly attribute ScalarValueString hostname; + //readonly attribute ScalarValueString port; + //readonly attribute ScalarValueString pathname; + //readonly attribute ScalarValueString search; + readonly attribute DOMString search; + //readonly attribute ScalarValueString hash; + readonly attribute DOMString hash; +}; diff --git a/src/components/script/dom/webidls/WorkerGlobalScope.webidl b/src/components/script/dom/webidls/WorkerGlobalScope.webidl index 59319410f4d..52aaed9e203 100644 --- a/src/components/script/dom/webidls/WorkerGlobalScope.webidl +++ b/src/components/script/dom/webidls/WorkerGlobalScope.webidl @@ -6,7 +6,7 @@ //[Exposed=Worker] interface WorkerGlobalScope : EventTarget { readonly attribute WorkerGlobalScope self; - //readonly attribute WorkerLocation location; + readonly attribute WorkerLocation location; //void close(); // attribute OnErrorEventHandler onerror; diff --git a/src/components/script/dom/webidls/WorkerLocation.webidl b/src/components/script/dom/webidls/WorkerLocation.webidl new file mode 100644 index 00000000000..04d4c8e5cc7 --- /dev/null +++ b/src/components/script/dom/webidls/WorkerLocation.webidl @@ -0,0 +1,9 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// http://www.whatwg.org/html/#worker-locations +//[Exposed=Worker] +interface WorkerLocation { }; +WorkerLocation implements URLUtilsReadOnly; diff --git a/src/components/script/dom/workerglobalscope.rs b/src/components/script/dom/workerglobalscope.rs index a4271d52033..e6adc3182d5 100644 --- a/src/components/script/dom/workerglobalscope.rs +++ b/src/components/script/dom/workerglobalscope.rs @@ -9,6 +9,7 @@ use dom::bindings::js::{JS, JSRef, Temporary, OptionalSettable}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::console::Console; use dom::eventtarget::{EventTarget, WorkerGlobalScopeTypeId}; +use dom::workerlocation::WorkerLocation; use dom::workernavigator::WorkerNavigator; use script_task::ScriptChan; @@ -33,6 +34,7 @@ pub struct WorkerGlobalScope { js_context: Untraceable>, resource_task: Untraceable, script_chan: ScriptChan, + location: Cell>>, navigator: Cell>>, console: Cell>>, } @@ -49,6 +51,7 @@ impl WorkerGlobalScope { js_context: Untraceable::new(cx), resource_task: Untraceable::new(resource_task), script_chan: script_chan, + location: Cell::new(None), navigator: Cell::new(None), console: Cell::new(None), } @@ -76,6 +79,14 @@ impl<'a> WorkerGlobalScopeMethods for JSRef<'a, WorkerGlobalScope> { Temporary::from_rooted(self) } + fn Location(&self) -> Temporary { + if self.location.get().is_none() { + let location = WorkerLocation::new(self, self.worker_url.clone()); + self.location.assign(Some(location)); + } + Temporary::new(self.location.get().get_ref().clone()) + } + fn Navigator(&self) -> Temporary { if self.navigator.get().is_none() { let navigator = WorkerNavigator::new(self); diff --git a/src/components/script/dom/workerlocation.rs b/src/components/script/dom/workerlocation.rs new file mode 100644 index 00000000000..0d32c211554 --- /dev/null +++ b/src/components/script/dom/workerlocation.rs @@ -0,0 +1,64 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::codegen::Bindings::WorkerLocationBinding; +use dom::bindings::codegen::Bindings::WorkerLocationBinding::WorkerLocationMethods; +use dom::bindings::js::{JSRef, Temporary}; +use dom::bindings::global::Worker; +use dom::bindings::trace::Untraceable; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; +use dom::workerglobalscope::WorkerGlobalScope; + +use servo_util::str::DOMString; + +use url::Url; + +#[deriving(Encodable)] +pub struct WorkerLocation { + reflector_: Reflector, + url: Untraceable, +} + +impl WorkerLocation { + pub fn new_inherited(url: Url) -> WorkerLocation { + WorkerLocation { + reflector_: Reflector::new(), + url: Untraceable::new(url), + } + } + + pub fn new(global: &JSRef, url: Url) -> Temporary { + reflect_dom_object(box WorkerLocation::new_inherited(url), + &Worker(*global), + WorkerLocationBinding::Wrap) + } +} + +impl<'a> WorkerLocationMethods for JSRef<'a, WorkerLocation> { + fn Href(&self) -> DOMString { + self.url.serialize() + } + + fn Search(&self) -> DOMString { + match self.url.query { + None => "".to_string(), + Some(ref query) if query.as_slice() == "" => "".to_string(), + Some(ref query) => "?".to_string().append(query.as_slice()) + } + } + + fn Hash(&self) -> DOMString { + match self.url.fragment { + None => "".to_string(), + Some(ref hash) if hash.as_slice() == "" => "".to_string(), + Some(ref hash) => "#".to_string().append(hash.as_slice()) + } + } +} + +impl Reflectable for WorkerLocation { + fn reflector<'a>(&'a self) -> &'a Reflector { + &self.reflector_ + } +} diff --git a/src/components/script/script.rs b/src/components/script/script.rs index 8dd5e23c1c1..513286fae8e 100644 --- a/src/components/script/script.rs +++ b/src/components/script/script.rs @@ -191,6 +191,7 @@ pub mod dom { pub mod window; pub mod worker; pub mod workerglobalscope; + pub mod workerlocation; pub mod workernavigator; pub mod xmlhttprequest; pub mod xmlhttprequesteventtarget; diff --git a/src/test/content/test_interfaces.html b/src/test/content/test_interfaces.html index aece7a09c25..54306780e3e 100644 --- a/src/test/content/test_interfaces.html +++ b/src/test/content/test_interfaces.html @@ -163,6 +163,7 @@ var interfaceNamesInGlobalScope = [ "Window", "Worker", "WorkerGlobalScope", // #2823 + "WorkerLocation", // #2823 "WorkerNavigator", // #2823 "XMLHttpRequest", "XMLHttpRequestUpload", diff --git a/src/test/wpt/metadata/workers/WorkerLocation.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation.htm.ini index 1636037672b..d4bc1772ab4 100644 --- a/src/test/wpt/metadata/workers/WorkerLocation.htm.ini +++ b/src/test/wpt/metadata/workers/WorkerLocation.htm.ini @@ -1,6 +1,5 @@ [WorkerLocation.htm] type: testharness - expected: TIMEOUT [Test Description: A WorkerLocation object represents an absolute URL set at its creation.] - expected: NOTRUN + expected: FAIL diff --git a/src/test/wpt/metadata/workers/WorkerLocation_hash.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_hash.htm.ini deleted file mode 100644 index fb89cd39ee3..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_hash.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_hash.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation.hash returns the current fragment identifier in the underlying URL.] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_hash_encoding.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_hash_encoding.htm.ini deleted file mode 100644 index d0ae6fa46a7..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_hash_encoding.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_hash_encoding.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation.hash returns \'#question%3f\' from input \'http://example.com/carrot#question%3f\'] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_hash_nonexist.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_hash_nonexist.htm.ini deleted file mode 100644 index 5de7743d8bb..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_hash_nonexist.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_hash_nonexist.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation hash attribute returns an empty string when there is no <query> component in input URL.] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_host.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_host.htm.ini deleted file mode 100644 index 5c17782e794..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_host.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_host.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation host attribute returns the current host and port (if it\'s not the default port) in the underlying URL. The port part, if omitted, will be assumed to be the current scheme\'s default port.] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_hostname.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_hostname.htm.ini deleted file mode 100644 index 510d1e7495c..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_hostname.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_hostname.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation hostname attribute returns the current host in the underlying URL.] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_href.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_href.htm.ini deleted file mode 100644 index 860a8467348..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_href.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_href.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation href attribute must return the absolute URL that the WorkerLocation object represents.] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_port.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_port.htm.ini index 132fd9c8d51..2d1761a7516 100644 --- a/src/test/wpt/metadata/workers/WorkerLocation_port.htm.ini +++ b/src/test/wpt/metadata/workers/WorkerLocation_port.htm.ini @@ -1,6 +1,5 @@ [WorkerLocation_port.htm] type: testharness - expected: TIMEOUT [Test Description: WorkerLocation port attribute returns the current port in the underlying URL.] - expected: NOTRUN + expected: FAIL diff --git a/src/test/wpt/metadata/workers/WorkerLocation_protocol.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_protocol.htm.ini deleted file mode 100644 index d2adee4689b..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_protocol.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_protocol.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation protocol attribute returns the current scheme of the underlying URL.] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_search.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_search.htm.ini deleted file mode 100644 index 118dd4e8a4b..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_search.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_search.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation search attribute returns the current query component in the underlying URL.] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_search_empty.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_search_empty.htm.ini deleted file mode 100644 index 5f1a5032229..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_search_empty.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_search_empty.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation.search Getter Condition: input is a hierarchical URL, and contained a <query> component (possibly an empty one).] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_search_fragment.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_search_fragment.htm.ini deleted file mode 100644 index ccabbaa35fe..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_search_fragment.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_search_fragment.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation.search - The (empty) <fragment> component is not part of the <query> component for input URL \'http://example.com/?test#\'] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/WorkerLocation_search_nonexist.htm.ini b/src/test/wpt/metadata/workers/WorkerLocation_search_nonexist.htm.ini deleted file mode 100644 index a8a73e601d6..00000000000 --- a/src/test/wpt/metadata/workers/WorkerLocation_search_nonexist.htm.ini +++ /dev/null @@ -1,6 +0,0 @@ -[WorkerLocation_search_nonexist.htm] - type: testharness - expected: TIMEOUT - [Test Description: WorkerLocation.search returns an empty string when there is no <query> component in input URL.] - expected: NOTRUN - diff --git a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/members.html.ini b/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/members.html.ini deleted file mode 100644 index a73306f4a1c..00000000000 --- a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/members.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[members.html] - type: testharness - expected: TIMEOUT - [members of WorkerLocation] - expected: TIMEOUT - diff --git a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html.ini b/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html.ini deleted file mode 100644 index 9a139176294..00000000000 --- a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[returns-same-object.html] - type: testharness - expected: TIMEOUT - [location === location] - expected: TIMEOUT - diff --git a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/setting-members.html.ini b/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/setting-members.html.ini index 5d1504fcc35..9ee10df13e6 100644 --- a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/setting-members.html.ini +++ b/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/setting-members.html.ini @@ -1,6 +1,5 @@ [setting-members.html] type: testharness - expected: TIMEOUT [setting members of WorkerLocation] - expected: TIMEOUT + expected: FAIL diff --git a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/worker-separate-file.html.ini b/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/worker-separate-file.html.ini index e74ade853ad..e1a42889a54 100644 --- a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/worker-separate-file.html.ini +++ b/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/location/worker-separate-file.html.ini @@ -1,6 +1,5 @@ [worker-separate-file.html] type: testharness - expected: TIMEOUT [location with a worker in separate file] - expected: TIMEOUT + expected: FAIL diff --git a/src/test/wpt/metadata/workers/semantics/multiple-workers/003.html.ini b/src/test/wpt/metadata/workers/semantics/multiple-workers/003.html.ini deleted file mode 100644 index 67834a830d0..00000000000 --- a/src/test/wpt/metadata/workers/semantics/multiple-workers/003.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[003.html] - type: testharness - expected: TIMEOUT - [creating 3 nested dedicated workers] - expected: TIMEOUT -