<!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes are part of #11091 <!-- Either: --> - [X] There are tests for these changes at my [gh-pages](https://github.com/creativcoder/gsoc16/tree/gh-pages) branch to test the instantiation of service workers by their manager, but will need to discuss how that would integrate into master. Changes: - Introduces a `ServiceWorkerManager`, which maintains an map of registered service workers as well as a map of active workers keyed by their `scope_url`. - Adds the initialization of ServiceWorkerManager, at the `script::init()`, which makes it available as a single entity listening for requests from different script threads. - Adds a timeout thread in `serviceworkerglobalscope`, which terminates the workers, after a timeout of 60 secs, thereby removing it from the active workers list. - Adds the matching of scope urls, in longest prefix way rather than path structural way, according to [spec](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#scope-match-algorithm). - Make ServiceWorkerManager, the holder of network sender, instead of script thread, so it can send `CustomResponse`. <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> Source-Repo: https://github.com/servo/servo Source-Revision: 513811f6b40d522bc425c2588320b889614f2973
79 lines
2.0 KiB
Rust
79 lines
2.0 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
use dom::bindings::refcounted::Trusted;
|
|
use dom::bindings::reflector::Reflectable;
|
|
use dom::bindings::str::DOMString;
|
|
use dom::bindings::structuredclone::StructuredCloneData;
|
|
use js::jsapi::{JSRuntime, JS_RequestInterruptCallback};
|
|
use js::rust::Runtime;
|
|
use script_runtime::CommonScriptMsg;
|
|
|
|
/// Messages used to control the worker event loops
|
|
pub enum WorkerScriptMsg {
|
|
/// Common variants associated with the script messages
|
|
Common(CommonScriptMsg),
|
|
/// Message sent through Worker.postMessage
|
|
DOMMessage(StructuredCloneData),
|
|
}
|
|
|
|
pub struct SimpleWorkerErrorHandler<T: Reflectable> {
|
|
pub addr: Trusted<T>,
|
|
}
|
|
|
|
impl<T: Reflectable> SimpleWorkerErrorHandler<T> {
|
|
pub fn new(addr: Trusted<T>) -> SimpleWorkerErrorHandler<T> {
|
|
SimpleWorkerErrorHandler {
|
|
addr: addr
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct WorkerErrorHandler<T: Reflectable> {
|
|
pub addr: Trusted<T>,
|
|
pub msg: DOMString,
|
|
pub file_name: DOMString,
|
|
pub line_num: u32,
|
|
pub col_num: u32,
|
|
}
|
|
|
|
impl<T: Reflectable> WorkerErrorHandler<T> {
|
|
pub fn new(addr: Trusted<T>, msg: DOMString, file_name: DOMString, line_num: u32, col_num: u32)
|
|
-> WorkerErrorHandler<T> {
|
|
WorkerErrorHandler {
|
|
addr: addr,
|
|
msg: msg,
|
|
file_name: file_name,
|
|
line_num: line_num,
|
|
col_num: col_num,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Copy, Clone)]
|
|
pub struct SharedRt {
|
|
pub rt: *mut JSRuntime
|
|
}
|
|
|
|
impl SharedRt {
|
|
pub fn new(rt: &Runtime) -> SharedRt {
|
|
SharedRt {
|
|
rt: rt.rt()
|
|
}
|
|
}
|
|
|
|
#[allow(unsafe_code)]
|
|
pub fn request_interrupt(&self) {
|
|
unsafe {
|
|
JS_RequestInterruptCallback(self.rt);
|
|
}
|
|
}
|
|
|
|
pub fn rt(&self) -> *mut JSRuntime {
|
|
self.rt
|
|
}
|
|
}
|
|
#[allow(unsafe_code)]
|
|
unsafe impl Send for SharedRt {}
|