aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/bindings/global.rs40
-rw-r--r--components/script/dom/filereader.rs4
-rw-r--r--components/script/dom/htmlimageelement.rs4
-rw-r--r--components/script/dom/htmllinkelement.rs2
-rw-r--r--components/script/dom/htmlscriptelement.rs42
-rw-r--r--components/script/dom/htmltextareaelement.rs2
-rw-r--r--components/script/dom/storage.rs2
-rw-r--r--components/script/dom/websocket.rs6
-rw-r--r--components/script/dom/window.rs23
-rw-r--r--components/script/dom/worker.rs6
-rw-r--r--components/script/dom/xmlhttprequest.rs6
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();