mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
added autoclose worker
This commit is contained in:
parent
d423e54d58
commit
36991b9d79
5 changed files with 38 additions and 0 deletions
|
@ -47,6 +47,8 @@ use std::collections::HashMap;
|
||||||
use std::collections::hash_map::Entry;
|
use std::collections::hash_map::Entry;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use task::TaskCanceller;
|
use task::TaskCanceller;
|
||||||
use task_source::file_reading::FileReadingTaskSource;
|
use task_source::file_reading::FileReadingTaskSource;
|
||||||
use task_source::networking::NetworkingTaskSource;
|
use task_source::networking::NetworkingTaskSource;
|
||||||
|
@ -55,6 +57,17 @@ use time::{Timespec, get_time};
|
||||||
use timers::{IsInterval, OneshotTimerCallback, OneshotTimerHandle};
|
use timers::{IsInterval, OneshotTimerCallback, OneshotTimerHandle};
|
||||||
use timers::{OneshotTimers, TimerCallback};
|
use timers::{OneshotTimers, TimerCallback};
|
||||||
|
|
||||||
|
#[derive(JSTraceable)]
|
||||||
|
pub struct AutoCloseWorker(
|
||||||
|
Arc<AtomicBool>,
|
||||||
|
);
|
||||||
|
|
||||||
|
impl Drop for AutoCloseWorker {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
self.0.store(true, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct GlobalScope {
|
pub struct GlobalScope {
|
||||||
eventtarget: EventTarget,
|
eventtarget: EventTarget,
|
||||||
|
@ -110,6 +123,10 @@ pub struct GlobalScope {
|
||||||
/// <https://html.spec.whatwg.org/multipage/#microtask-queue>
|
/// <https://html.spec.whatwg.org/multipage/#microtask-queue>
|
||||||
#[ignore_malloc_size_of = "Rc<T> is hard"]
|
#[ignore_malloc_size_of = "Rc<T> is hard"]
|
||||||
microtask_queue: Rc<MicrotaskQueue>,
|
microtask_queue: Rc<MicrotaskQueue>,
|
||||||
|
|
||||||
|
/// Vector storing closing references of all workers
|
||||||
|
#[ignore_malloc_size_of = "Arc"]
|
||||||
|
list_auto_close_worker: DomRefCell<Vec<AutoCloseWorker>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GlobalScope {
|
impl GlobalScope {
|
||||||
|
@ -142,9 +159,14 @@ impl GlobalScope {
|
||||||
timers: OneshotTimers::new(timer_event_chan, scheduler_chan),
|
timers: OneshotTimers::new(timer_event_chan, scheduler_chan),
|
||||||
origin,
|
origin,
|
||||||
microtask_queue,
|
microtask_queue,
|
||||||
|
list_auto_close_worker: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn track_worker(&self, closing_worker: Arc<AtomicBool>) {
|
||||||
|
self.list_auto_close_worker.borrow_mut().push(AutoCloseWorker(closing_worker));
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the global scope of the realm that the given DOM object's reflector
|
/// Returns the global scope of the realm that the given DOM object's reflector
|
||||||
/// was created in.
|
/// was created in.
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
|
|
|
@ -79,6 +79,7 @@ impl Worker {
|
||||||
let (sender, receiver) = channel();
|
let (sender, receiver) = channel();
|
||||||
let closing = Arc::new(AtomicBool::new(false));
|
let closing = Arc::new(AtomicBool::new(false));
|
||||||
let worker = Worker::new(global, sender.clone(), closing.clone());
|
let worker = Worker::new(global, sender.clone(), closing.clone());
|
||||||
|
global.track_worker(closing.clone());
|
||||||
let worker_ref = Trusted::new(&*worker);
|
let worker_ref = Trusted::new(&*worker);
|
||||||
|
|
||||||
let worker_load_origin = WorkerScriptLoadOrigin {
|
let worker_load_origin = WorkerScriptLoadOrigin {
|
||||||
|
|
3
tests/html/child.html
Normal file
3
tests/html/child.html
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<script>
|
||||||
|
var w = new Worker('work.js');
|
||||||
|
</script>
|
8
tests/html/parent.html
Normal file
8
tests/html/parent.html
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
var iframe = document.createElement('iframe');
|
||||||
|
iframe.src = "child.html";
|
||||||
|
iframe.onload = function() { iframe.remove(); }
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
</script>
|
||||||
|
</body>
|
4
tests/html/work.js
Normal file
4
tests/html/work.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
console.log("reached inside work.js file");
|
||||||
|
setInterval(function() {
|
||||||
|
console.log('hi');
|
||||||
|
}, 500);
|
Loading…
Add table
Add a link
Reference in a new issue