diff options
-rw-r--r-- | components/script/dom/bindings/global.rs | 40 | ||||
-rw-r--r-- | components/script/dom/filereader.rs | 4 | ||||
-rw-r--r-- | components/script/dom/htmlimageelement.rs | 4 | ||||
-rw-r--r-- | components/script/dom/htmllinkelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/htmlscriptelement.rs | 42 | ||||
-rw-r--r-- | components/script/dom/htmltextareaelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/storage.rs | 2 | ||||
-rw-r--r-- | components/script/dom/websocket.rs | 6 | ||||
-rw-r--r-- | components/script/dom/window.rs | 23 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 6 | ||||
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 6 |
11 files changed, 98 insertions, 39 deletions
diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index 6580b320a97..6f5bc6c58ef 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -155,9 +155,45 @@ impl<'a> GlobalRef<'a> { /// `ScriptChan` used to send messages to the event loop of this global's /// thread. - pub fn script_chan(&self) -> Box<ScriptChan + Send> { + pub fn dom_manipulation_task_source(&self) -> Box<ScriptChan + Send> { match *self { - GlobalRef::Window(ref window) => window.script_chan(), + GlobalRef::Window(ref window) => window.dom_manipulation_task_source(), + GlobalRef::Worker(ref worker) => worker.script_chan(), + } + } + + /// `ScriptChan` used to send messages to the event loop of this global's + /// thread. + pub fn user_interaction_task_source(&self) -> Box<ScriptChan + Send> { + match *self { + GlobalRef::Window(ref window) => window.user_interaction_task_source(), + GlobalRef::Worker(ref worker) => worker.script_chan(), + } + } + + /// `ScriptChan` used to send messages to the event loop of this global's + /// thread. + pub fn networking_task_source(&self) -> Box<ScriptChan + Send> { + match *self { + GlobalRef::Window(ref window) => window.networking_task_source(), + GlobalRef::Worker(ref worker) => worker.script_chan(), + } + } + + /// `ScriptChan` used to send messages to the event loop of this global's + /// thread. + pub fn history_traversal_task_source(&self) -> Box<ScriptChan + Send> { + match *self { + GlobalRef::Window(ref window) => window.history_traversal_task_source(), + GlobalRef::Worker(ref worker) => worker.script_chan(), + } + } + + /// `ScriptChan` used to send messages to the event loop of this global's + /// thread. + pub fn file_reading_task_source(&self) -> Box<ScriptChan + Send> { + match *self { + GlobalRef::Window(ref window) => window.file_reading_task_source(), GlobalRef::Worker(ref worker) => worker.script_chan(), } } diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs index 96b14caed9d..02aef5e3f01 100644 --- a/components/script/dom/filereader.rs +++ b/components/script/dom/filereader.rs @@ -360,10 +360,10 @@ impl FileReader { let load_data = ReadMetaData::new(String::from(type_), label.map(String::from), function); - let fr = Trusted::new(global.get_cx(), self, global.script_chan()); + let fr = Trusted::new(global.get_cx(), self, global.file_reading_task_source()); let gen_id = self.generation_id.get(); - let script_chan = global.script_chan(); + let script_chan = global.file_reading_task_source(); spawn_named("file reader async operation".to_owned(), move || { perform_annotated_read_operation(gen_id, load_data, bytes, fr, script_chan) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 11ebf4360de..50f80b83a5d 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -106,9 +106,9 @@ impl HTMLImageElement { let img_url = img_url.unwrap(); *self.url.borrow_mut() = Some(img_url.clone()); - let trusted_node = Trusted::new(window.get_cx(), self, window.script_chan()); + let trusted_node = Trusted::new(window.get_cx(), self, window.networking_task_source()); let (responder_sender, responder_receiver) = ipc::channel().unwrap(); - let script_chan = window.script_chan(); + let script_chan = window.networking_task_source(); let wrapper = window.get_runnable_wrapper(); ROUTER.add_route(responder_receiver.to_opaque(), box move |message| { // Return the image via a message to the script task, which marks the element diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index b8d757920a8..3ded045c834 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -197,7 +197,7 @@ impl HTMLLinkElement { // TODO: #8085 - Don't load external stylesheets if the node's mq doesn't match. let doc = window.Document(); - let script_chan = window.script_chan(); + let script_chan = window.networking_task_source(); let elem = Trusted::new(window.get_cx(), self, script_chan.clone()); let context = Arc::new(Mutex::new(StylesheetContext { diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 5bc8b1bbc60..655254debae 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -216,7 +216,9 @@ impl HTMLScriptElement { return NextParserState::Continue; } - // Step 12. + // TODO: Step 12. + + // Step 13. let for_attribute = element.get_attribute(&ns!(), &atom!("for")); let event_attribute = element.get_attribute(&ns!(), &atom!("event")); match (for_attribute.r(), event_attribute.r()) { @@ -236,46 +238,45 @@ impl HTMLScriptElement { (_, _) => (), } - // Step 13. + // Step 14. if let Some(ref charset) = element.get_attribute(&ns!(), &atom!("charset")) { if let Some(encodingRef) = encoding_from_whatwg_label(&charset.Value()) { *self.block_character_encoding.borrow_mut() = encodingRef; } } - // Step 14. + // Step 15. let window = window_from_node(self); let window = window.r(); let base_url = window.get_url(); - let deferred = element.has_attribute(&atom!("defer")); let is_external = match element.get_attribute(&ns!(), &atom!("src")) { - // Step 14. + // Step 15. Some(ref src) => { - // Step 14.1 + // Step 15.1 let src = src.value(); - // Step 14.2 + // Step 15.2 if src.is_empty() { self.queue_error_event(); return NextParserState::Continue; } - // Step 14.3 + // Step 15.3 match UrlParser::new().base_url(&base_url).parse(&src) { Err(_) => { - // Step 14.4 + // Step 15.4 error!("error parsing URL for script {}", &**src); self.queue_error_event(); return NextParserState::Continue; } Ok(url) => { - // Step 14.5 + // Step 15.5 // TODO: Do a potentially CORS-enabled fetch with the mode being the current // state of the element's `crossorigin` content attribute, the origin being // the origin of the script element's node document, and the default origin // behaviour set to taint. - let script_chan = window.script_chan(); + let script_chan = window.networking_task_source(); let elem = Trusted::new(window.get_cx(), self, script_chan.clone()); let context = Arc::new(Mutex::new(ScriptContext { @@ -305,8 +306,9 @@ impl HTMLScriptElement { None => false, }; - // Step 15. - // Step 15.a, has src, has defer, was parser-inserted, is not async. + // Step 16. + let deferred = element.has_attribute(&atom!("defer")); + // Step 16.a, has src, has defer, was parser-inserted, is not async. if is_external && deferred && was_parser_inserted && @@ -314,13 +316,13 @@ impl HTMLScriptElement { doc.add_deferred_script(self); // Second part implemented in Document::process_deferred_scripts. return NextParserState::Continue; - // Step 15.b, has src, was parser-inserted, is not async. + // Step 16.b, has src, was parser-inserted, is not async. } else if is_external && was_parser_inserted && !async { doc.set_pending_parsing_blocking_script(Some(self)); // Second part implemented in the load result handler. - // Step 15.c, doesn't have src, was parser-inserted, is blocked on stylesheet. + // Step 16.c, doesn't have src, was parser-inserted, is blocked on stylesheet. } else if !is_external && was_parser_inserted && // TODO: check for script nesting levels. @@ -328,17 +330,17 @@ impl HTMLScriptElement { doc.set_pending_parsing_blocking_script(Some(self)); *self.load.borrow_mut() = Some(ScriptOrigin::Internal(text, base_url)); self.ready_to_be_parser_executed.set(true); - // Step 15.d, has src, isn't async, isn't non-blocking. + // Step 16.d, has src, isn't async, isn't non-blocking. } else if is_external && !async && !self.non_blocking.get() { doc.push_asap_in_order_script(self); // Second part implemented in Document::process_asap_scripts. - // Step 15.e, has src. + // Step 16.e, has src. } else if is_external { doc.add_asap_script(self); // Second part implemented in Document::process_asap_scripts. - // Step 15.f, otherwise. + // Step 16.f, otherwise. } else { assert!(!text.is_empty()); self.ready_to_be_parser_executed.set(true); @@ -453,7 +455,7 @@ impl HTMLScriptElement { if external { self.dispatch_load_event(); } else { - let chan = window.script_chan(); + let chan = window.dom_manipulation_task_source(); let handler = Trusted::new(window.get_cx(), self, chan.clone()); let dispatcher = box EventDispatcher { element: handler, @@ -466,7 +468,7 @@ impl HTMLScriptElement { pub fn queue_error_event(&self) { let window = window_from_node(self); let window = window.r(); - let chan = window.script_chan(); + let chan = window.dom_manipulation_task_source(); let handler = Trusted::new(window.get_cx(), self, chan.clone()); let dispatcher = box EventDispatcher { element: handler, diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 17155a44983..12d0a47a6c8 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -343,7 +343,7 @@ impl VirtualMethods for HTMLTextAreaElement { if event.IsTrusted() { let window = window_from_node(self); let window = window.r(); - let chan = window.script_chan(); + let chan = window.user_interaction_task_source(); let handler = Trusted::new(window.get_cx(), self, chan.clone()); let dispatcher = ChangeEventRunnable { element: handler, diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs index 2d25bc8532a..ffae459e6f7 100644 --- a/components/script/dom/storage.rs +++ b/components/script/dom/storage.rs @@ -155,7 +155,7 @@ impl Storage { let global_root = self.global.root(); let global_ref = global_root.r(); let main_script_chan = global_ref.as_window().main_thread_script_chan(); - let script_chan = global_ref.script_chan(); + let script_chan = global_ref.dom_manipulation_task_source(); let trusted_storage = Trusted::new(global_ref.get_cx(), self, script_chan.clone()); main_script_chan.send(MainThreadScriptMsg::MainThreadRunnableMsg( diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index d75662c157e..79bdd0fdfd6 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -254,10 +254,10 @@ impl WebSocket { // Step 7. let ws = WebSocket::new(global, resource_url.clone()); - let address = Trusted::new(global.get_cx(), ws.r(), global.script_chan()); + let address = Trusted::new(global.get_cx(), ws.r(), global.networking_task_source()); let origin = global.get_url().serialize(); - let sender = global.script_chan(); + let sender = global.networking_task_source(); spawn_named(format!("WebSocket connection to {}", ws.Url()), move || { // Step 8: Protocols. @@ -328,7 +328,7 @@ impl WebSocket { }; let global = self.global.root(); - let chan = global.r().script_chan(); + let chan = global.r().networking_task_source(); let address = Trusted::new(global.r().get_cx(), self, chan.clone()); let new_buffer_amount = (self.buffered_amount.get() as u64) + data_byte_len; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index f8af9be77b5..e17d5dbeffb 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -237,7 +237,28 @@ impl Window { self.js_runtime.borrow().as_ref().unwrap().cx() } - pub fn script_chan(&self) -> Box<ScriptChan + Send> { + pub fn dom_manipulation_task_source(&self) -> Box<ScriptChan + Send> { + // FIXME: Use a different channel instead of the generic script_chan + self.script_chan.clone() + } + + pub fn user_interaction_task_source(&self) -> Box<ScriptChan + Send> { + // FIXME: Use a different channel instead of the generic script_chan + self.script_chan.clone() + } + + pub fn networking_task_source(&self) -> Box<ScriptChan + Send> { + // FIXME: Use a different channel instead of the generic script_chan + self.script_chan.clone() + } + + pub fn history_traversal_task_source(&self) -> Box<ScriptChan + Send> { + // FIXME: Use a different channel instead of the generic script_chan + self.script_chan.clone() + } + + pub fn file_reading_task_source(&self) -> Box<ScriptChan + Send> { + // FIXME: Use a different channel instead of the generic script_chan self.script_chan.clone() } diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index bb95138dd75..05c242a07ba 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -75,7 +75,7 @@ impl Worker { let (sender, receiver) = channel(); let worker = Worker::new(global, sender.clone()); - let worker_ref = Trusted::new(global.get_cx(), worker.r(), global.script_chan()); + let worker_ref = Trusted::new(global.get_cx(), worker.r(), global.dom_manipulation_task_source()); let worker_id = global.get_next_worker_id(); let (devtools_sender, devtools_receiver) = ipc::channel().unwrap(); @@ -106,7 +106,7 @@ impl Worker { }; DedicatedWorkerGlobalScope::run_worker_scope( init, worker_url, global.pipeline(), devtools_receiver, worker_ref, - global.script_chan(), sender, receiver); + global.dom_manipulation_task_source(), sender, receiver); Ok(worker) } @@ -150,7 +150,7 @@ impl WorkerMethods for Worker { // https://html.spec.whatwg.org/multipage/#dom-dedicatedworkerglobalscope-postmessage fn PostMessage(&self, cx: *mut JSContext, message: HandleValue) -> ErrorResult { let data = try!(StructuredCloneData::write(cx, message)); - let address = Trusted::new(cx, self, self.global.root().r().script_chan().clone()); + let address = Trusted::new(cx, self, self.global.root().r().dom_manipulation_task_source().clone()); self.sender.send((address, WorkerScriptMsg::DOMMessage(data))).unwrap(); Ok(()) } diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 24bd012f105..5a667cb34ca 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -981,7 +981,7 @@ impl XMLHttpRequest { // This will cancel all previous timeouts let global = self.global.root(); let callback = ScheduledXHRTimeout { - xhr: Trusted::new(global.r().get_cx(), self, global.r().script_chan()), + xhr: Trusted::new(global.r().get_cx(), self, global.r().networking_task_source()), generation_id: self.generation_id.get(), }; let duration = Length::new(duration_ms as u64); @@ -1053,7 +1053,7 @@ impl XMLHttpRequest { Ok(req) => req, }; - let xhr = Trusted::new(global.get_cx(), self, global.script_chan()); + let xhr = Trusted::new(global.get_cx(), self, global.networking_task_source()); let context = Arc::new(Mutex::new(XHRContext { xhr: xhr, @@ -1067,7 +1067,7 @@ impl XMLHttpRequest { let (tx, rx) = global.new_script_pair(); (tx, Some(rx)) } else { - (global.script_chan(), None) + (global.networking_task_source(), None) }; let resource_task = global.resource_task(); |