mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
Introduce MainThreadScriptMsg::DispatchJobQueue
This removes the last remaining use of Task::run_with_script_thread
This commit is contained in:
parent
1d52df0562
commit
8e78f18d2d
4 changed files with 16 additions and 67 deletions
|
@ -114,7 +114,7 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
|
||||||
|
|
||||||
// B: Step 8
|
// B: Step 8
|
||||||
let job = Job::create_job(JobType::Register, scope, script_url, promise.clone(), &*self.client);
|
let job = Job::create_job(JobType::Register, scope, script_url, promise.clone(), &*self.client);
|
||||||
ScriptThread::schedule_job(job, &*self.global());
|
ScriptThread::schedule_job(job);
|
||||||
promise
|
promise
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,12 +244,6 @@ impl<T> Task for CancellableTask<T>
|
||||||
where
|
where
|
||||||
T: Send + Task,
|
T: Send + Task,
|
||||||
{
|
{
|
||||||
fn run_with_script_thread(self: Box<CancellableTask<T>>, script_thread: &ScriptThread) {
|
|
||||||
if !self.is_cancelled() {
|
|
||||||
self.inner.run_with_script_thread(script_thread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run(self: Box<Self>) {
|
fn run(self: Box<Self>) {
|
||||||
if !self.is_cancelled() {
|
if !self.is_cancelled() {
|
||||||
self.inner.run()
|
self.inner.run()
|
||||||
|
@ -259,12 +253,7 @@ where
|
||||||
|
|
||||||
pub trait Task {
|
pub trait Task {
|
||||||
fn name(&self) -> &'static str { unsafe { intrinsics::type_name::<Self>() } }
|
fn name(&self) -> &'static str { unsafe { intrinsics::type_name::<Self>() } }
|
||||||
fn run(self: Box<Self>) {
|
fn run(self: Box<Self>);
|
||||||
panic!("This should probably be redefined.")
|
|
||||||
}
|
|
||||||
fn run_with_script_thread(self: Box<Self>, _script_thread: &ScriptThread) {
|
|
||||||
self.run();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Debug for Task + Send {
|
impl fmt::Debug for Task + Send {
|
||||||
|
@ -304,8 +293,8 @@ pub enum MainThreadScriptMsg {
|
||||||
properties: Vec<Atom>,
|
properties: Vec<Atom>,
|
||||||
painter: Box<Painter>
|
painter: Box<Painter>
|
||||||
},
|
},
|
||||||
/// Runs a Task in the main thread.
|
/// Dispatches a job queue.
|
||||||
MainThreadTask(ScriptThreadEventCategory, Box<Task + Send>),
|
DispatchJobQueue { scope_url: ServoUrl },
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OpaqueSender<CommonScriptMsg> for Box<ScriptChan + Send> {
|
impl OpaqueSender<CommonScriptMsg> for Box<ScriptChan + Send> {
|
||||||
|
@ -718,11 +707,11 @@ impl ScriptThread {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn schedule_job(job: Job, global: &GlobalScope) {
|
pub fn schedule_job(job: Job) {
|
||||||
SCRIPT_THREAD_ROOT.with(|root| {
|
SCRIPT_THREAD_ROOT.with(|root| {
|
||||||
let script_thread = unsafe { &*root.get().unwrap() };
|
let script_thread = unsafe { &*root.get().unwrap() };
|
||||||
let job_queue = &*script_thread.job_queue_map;
|
let job_queue = &*script_thread.job_queue_map;
|
||||||
job_queue.schedule_job(job, global, &script_thread);
|
job_queue.schedule_job(job, &script_thread);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1192,8 +1181,9 @@ impl ScriptThread {
|
||||||
MixedMessage::FromImageCache(_) => ScriptThreadEventCategory::ImageCacheMsg,
|
MixedMessage::FromImageCache(_) => ScriptThreadEventCategory::ImageCacheMsg,
|
||||||
MixedMessage::FromScript(ref inner_msg) => {
|
MixedMessage::FromScript(ref inner_msg) => {
|
||||||
match *inner_msg {
|
match *inner_msg {
|
||||||
MainThreadScriptMsg::Common(CommonScriptMsg::Task(category, _)) |
|
MainThreadScriptMsg::Common(CommonScriptMsg::Task(category, _)) => {
|
||||||
MainThreadScriptMsg::MainThreadTask(category, _) => category,
|
category
|
||||||
|
},
|
||||||
MainThreadScriptMsg::RegisterPaintWorklet { .. } => {
|
MainThreadScriptMsg::RegisterPaintWorklet { .. } => {
|
||||||
ScriptThreadEventCategory::WorkletEvent
|
ScriptThreadEventCategory::WorkletEvent
|
||||||
},
|
},
|
||||||
|
@ -1348,9 +1338,9 @@ impl ScriptThread {
|
||||||
painter,
|
painter,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
MainThreadScriptMsg::MainThreadTask(_, task) => {
|
MainThreadScriptMsg::DispatchJobQueue { scope_url } => {
|
||||||
task.run_with_script_thread(self)
|
self.job_queue_map.run_job(scope_url, self)
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1787,8 +1777,8 @@ impl ScriptThread {
|
||||||
let _ = self.script_sender.send((pipeline_id, ScriptMsg::RegisterServiceWorker(scope_things, scope.clone())));
|
let _ = self.script_sender.send((pipeline_id, ScriptMsg::RegisterServiceWorker(scope_things, scope.clone())));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dispatch_job_queue(&self, scope_url: ServoUrl) {
|
pub fn schedule_job_queue(&self, scope_url: ServoUrl) {
|
||||||
self.job_queue_map.run_job(scope_url, self);
|
let _ = self.chan.0.send(MainThreadScriptMsg::DispatchJobQueue { scope_url });
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dom_manipulation_task_source(&self) -> &DOMManipulationTaskSource {
|
pub fn dom_manipulation_task_source(&self) -> &DOMManipulationTaskSource {
|
||||||
|
|
|
@ -93,25 +93,6 @@ impl PartialEq for Job {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct AsyncJobHandler {
|
|
||||||
pub scope_url: ServoUrl,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AsyncJobHandler {
|
|
||||||
fn new(scope_url: ServoUrl) -> AsyncJobHandler {
|
|
||||||
AsyncJobHandler {
|
|
||||||
scope_url: scope_url,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Task for AsyncJobHandler {
|
|
||||||
#[allow(unrooted_must_root)]
|
|
||||||
fn run_with_script_thread(self: Box<AsyncJobHandler>, script_thread: &ScriptThread) {
|
|
||||||
script_thread.dispatch_job_queue(self.scope_url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[must_root]
|
#[must_root]
|
||||||
#[derive(JSTraceable)]
|
#[derive(JSTraceable)]
|
||||||
pub struct JobQueue(pub DOMRefCell<HashMap<ServoUrl, Vec<Job>>>);
|
pub struct JobQueue(pub DOMRefCell<HashMap<ServoUrl, Vec<Job>>>);
|
||||||
|
@ -122,10 +103,7 @@ impl JobQueue {
|
||||||
}
|
}
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
// https://w3c.github.io/ServiceWorker/#schedule-job-algorithm
|
// https://w3c.github.io/ServiceWorker/#schedule-job-algorithm
|
||||||
pub fn schedule_job(&self,
|
pub fn schedule_job(&self, job: Job, script_thread: &ScriptThread) {
|
||||||
job: Job,
|
|
||||||
global: &GlobalScope,
|
|
||||||
script_thread: &ScriptThread) {
|
|
||||||
debug!("scheduling {:?} job", job.job_type);
|
debug!("scheduling {:?} job", job.job_type);
|
||||||
let mut queue_ref = self.0.borrow_mut();
|
let mut queue_ref = self.0.borrow_mut();
|
||||||
let job_queue = queue_ref.entry(job.scope_url.clone()).or_insert(vec![]);
|
let job_queue = queue_ref.entry(job.scope_url.clone()).or_insert(vec![]);
|
||||||
|
@ -133,10 +111,7 @@ impl JobQueue {
|
||||||
if job_queue.is_empty() {
|
if job_queue.is_empty() {
|
||||||
let scope_url = job.scope_url.clone();
|
let scope_url = job.scope_url.clone();
|
||||||
job_queue.push(job);
|
job_queue.push(job);
|
||||||
let _ = script_thread.dom_manipulation_task_source().queue_main_thread_task(
|
let _ = script_thread.schedule_job_queue(scope_url);
|
||||||
box AsyncJobHandler::new(scope_url),
|
|
||||||
global,
|
|
||||||
);
|
|
||||||
debug!("queued task to run newly-queued job");
|
debug!("queued task to run newly-queued job");
|
||||||
} else {
|
} else {
|
||||||
// Step 2
|
// Step 2
|
||||||
|
|
|
@ -6,7 +6,6 @@ use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::refcounted::Trusted;
|
use dom::bindings::refcounted::Trusted;
|
||||||
use dom::event::{EventBubbles, EventCancelable, EventTask, SimpleEventTask};
|
use dom::event::{EventBubbles, EventCancelable, EventTask, SimpleEventTask};
|
||||||
use dom::eventtarget::EventTarget;
|
use dom::eventtarget::EventTarget;
|
||||||
use dom::globalscope::GlobalScope;
|
|
||||||
use dom::window::Window;
|
use dom::window::Window;
|
||||||
use script_runtime::{CommonScriptMsg, ScriptThreadEventCategory};
|
use script_runtime::{CommonScriptMsg, ScriptThreadEventCategory};
|
||||||
use script_thread::{MainThreadScriptMsg, Task, TaskCanceller};
|
use script_thread::{MainThreadScriptMsg, Task, TaskCanceller};
|
||||||
|
@ -43,21 +42,6 @@ impl TaskSource for DOMManipulationTaskSource {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DOMManipulationTaskSource {
|
impl DOMManipulationTaskSource {
|
||||||
pub fn queue_main_thread_task<T>(
|
|
||||||
&self,
|
|
||||||
task: Box<T>,
|
|
||||||
global: &GlobalScope,
|
|
||||||
) -> Result<(), ()>
|
|
||||||
where
|
|
||||||
T: Task + Send + 'static,
|
|
||||||
{
|
|
||||||
let msg = MainThreadScriptMsg::MainThreadTask(
|
|
||||||
ScriptThreadEventCategory::ScriptEvent,
|
|
||||||
global.task_canceller().wrap_task(task),
|
|
||||||
);
|
|
||||||
self.0.send(msg).map_err(|_| ())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn queue_event(&self,
|
pub fn queue_event(&self,
|
||||||
target: &EventTarget,
|
target: &EventTarget,
|
||||||
name: Atom,
|
name: Atom,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue