mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
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:
commit
ef000a458a
11 changed files with 98 additions and 39 deletions
|
@ -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(),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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(())
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue