Auto merge of #8853 - KiChjang:generic-task-sources, r=jdm

Split fn script_chan into 5 different task channel fn

Partial #7959.

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8853)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2015-12-07 07:46:10 +05:30
commit ef000a458a
11 changed files with 98 additions and 39 deletions

View file

@ -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(),
}
}

View file

@ -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)

View file

@ -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

View file

@ -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 {

View file

@ -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,

View file

@ -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,

View file

@ -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(

View file

@ -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;

View file

@ -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()
}

View file

@ -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(())
}

View file

@ -984,7 +984,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);
@ -1056,7 +1056,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,
@ -1070,7 +1070,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();