diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-08-16 12:11:14 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-08-16 12:11:14 +0200 |
commit | ba592364b7655b66a4d384e8deabcde88755825f (patch) | |
tree | 3dfb401843050dcab8a9d1148289eb6ae67a1420 /src/components/script/dom/workerglobalscope.rs | |
parent | 061e7e16207f0ea5ee56846a047bad0b908aec8c (diff) | |
parent | aed642babee5d158d7b9c8e08d90340d68b7a726 (diff) | |
download | servo-ba592364b7655b66a4d384e8deabcde88755825f.tar.gz servo-ba592364b7655b66a4d384e8deabcde88755825f.zip |
Merge pull request #3094 from Ms2ger/importScripts
Implement WorkerGlobalScope.importScripts; r=Manishearth
Diffstat (limited to 'src/components/script/dom/workerglobalscope.rs')
-rw-r--r-- | src/components/script/dom/workerglobalscope.rs | 38 |
1 files changed, 36 insertions, 2 deletions
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); |