aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script/dom')
-rw-r--r--src/components/script/dom/webidls/WorkerGlobalScope.webidl3
-rw-r--r--src/components/script/dom/workerglobalscope.rs38
2 files changed, 38 insertions, 3 deletions
diff --git a/src/components/script/dom/webidls/WorkerGlobalScope.webidl b/src/components/script/dom/webidls/WorkerGlobalScope.webidl
index 52aaed9e203..9c50682b056 100644
--- a/src/components/script/dom/webidls/WorkerGlobalScope.webidl
+++ b/src/components/script/dom/webidls/WorkerGlobalScope.webidl
@@ -18,7 +18,8 @@ interface WorkerGlobalScope : EventTarget {
// http://www.whatwg.org/html/#WorkerGlobalScope-partial
//[Exposed=Worker]
partial interface WorkerGlobalScope { // not obsolete
- //void importScripts(DOMString... urls);
+ [Throws]
+ void importScripts(DOMString... urls);
readonly attribute WorkerNavigator navigator;
};
//WorkerGlobalScope implements WindowTimers;
diff --git a/src/components/script/dom/workerglobalscope.rs b/src/components/script/dom/workerglobalscope.rs
index e6adc3182d5..dcf205cf3a9 100644
--- a/src/components/script/dom/workerglobalscope.rs
+++ b/src/components/script/dom/workerglobalscope.rs
@@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods;
+use dom::bindings::error::{ErrorResult, Syntax, Network, FailureUnknown};
use dom::bindings::trace::Untraceable;
use dom::bindings::global;
use dom::bindings::js::{JS, JSRef, Temporary, OptionalSettable};
@@ -13,14 +14,15 @@ use dom::workerlocation::WorkerLocation;
use dom::workernavigator::WorkerNavigator;
use script_task::ScriptChan;
-use servo_net::resource_task::ResourceTask;
+use servo_net::resource_task::{ResourceTask, load_whole_resource};
+use servo_util::str::DOMString;
use js::jsapi::JSContext;
use js::rust::Cx;
use std::cell::Cell;
use std::rc::Rc;
-use url::Url;
+use url::{Url, UrlParser};
#[deriving(PartialEq,Encodable)]
pub enum WorkerGlobalScopeId {
@@ -87,6 +89,38 @@ impl<'a> WorkerGlobalScopeMethods for JSRef<'a, WorkerGlobalScope> {
Temporary::new(self.location.get().get_ref().clone())
}
+ fn ImportScripts(&self, url_strings: Vec<DOMString>) -> ErrorResult {
+ let mut urls = Vec::with_capacity(url_strings.len());
+ for url in url_strings.move_iter() {
+ let url = UrlParser::new().base_url(&*self.worker_url)
+ .parse(url.as_slice());
+ match url {
+ Ok(url) => urls.push(url),
+ Err(_) => return Err(Syntax),
+ };
+ }
+
+ for url in urls.move_iter() {
+ let (url, source) = match load_whole_resource(&*self.resource_task, url) {
+ Err(_) => return Err(Network),
+ Ok((metadata, bytes)) => {
+ (metadata.final_url, String::from_utf8(bytes).unwrap())
+ }
+ };
+
+ match self.js_context.evaluate_script(
+ self.reflector().get_jsobject(), source, url.serialize(), 1) {
+ Ok(_) => (),
+ Err(_) => {
+ println!("evaluate_script failed");
+ return Err(FailureUnknown);
+ }
+ }
+ }
+
+ Ok(())
+ }
+
fn Navigator(&self) -> Temporary<WorkerNavigator> {
if self.navigator.get().is_none() {
let navigator = WorkerNavigator::new(self);