diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-09-15 08:34:22 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-15 08:34:22 -0500 |
commit | 0ec4ea4ee188f2e5db9d387d182c34a9d97d07cd (patch) | |
tree | 738a39d85d1ce67f5ab9d7b4a04a60cc2bf41287 /components/script/dom/serviceworkerglobalscope.rs | |
parent | b3db4b4c0dfc41ffbf566da15bd85ebdb7b1ea1f (diff) | |
parent | 314dedb96fdea9d7656a3be166aec7749d2b85da (diff) | |
download | servo-0ec4ea4ee188f2e5db9d387d182c34a9d97d07cd.tar.gz servo-0ec4ea4ee188f2e5db9d387d182c34a9d97d07cd.zip |
Auto merge of #12910 - creativcoder:swsender, r=jdm
Implement postMessage for ServiceWorkers
<!-- Please describe your changes on the following line: -->
Fixes #12773
r? @jdm
Changes:
* Implements `postMessage` on `ServiceWorker` object.
* Removes unused channels from sw and their scopes.
* Fixes a crash when calling `scope.script_chan()` in sw-scopes event handling.
---
<!-- 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 fix #12773
<!-- Either: -->
- [X] There are tests for these changes at `tests/html/service-worker`
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/12910)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/serviceworkerglobalscope.rs')
-rw-r--r-- | components/script/dom/serviceworkerglobalscope.rs | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index 16d5348b6e5..f473c6cadb2 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -5,7 +5,6 @@ use devtools; use devtools_traits::DevtoolScriptControlMsg; use dom::abstractworker::WorkerScriptMsg; -use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::ServiceWorkerGlobalScopeBinding; use dom::bindings::codegen::Bindings::ServiceWorkerGlobalScopeBinding::ServiceWorkerGlobalScopeMethods; @@ -16,7 +15,6 @@ use dom::bindings::reflector::Reflectable; use dom::bindings::str::DOMString; use dom::eventtarget::EventTarget; use dom::messageevent::MessageEvent; -use dom::serviceworker::TrustedServiceWorkerAddress; use dom::workerglobalscope::WorkerGlobalScope; use ipc_channel::ipc::{self, IpcSender, IpcReceiver}; use ipc_channel::router::ROUTER; @@ -26,13 +24,12 @@ use js::rust::Runtime; use msg::constellation_msg::PipelineId; use net_traits::{LoadContext, load_whole_resource, IpcSend, CustomResponseMediator}; use rand::random; -use script_runtime::{CommonScriptMsg, StackRootTLS, get_reports, new_rt_and_cx}; +use script_runtime::{CommonScriptMsg, StackRootTLS, get_reports, new_rt_and_cx, ScriptChan}; use script_traits::{TimerEvent, WorkerGlobalScopeInit, ScopeThings, ServiceWorkerMsg}; use std::sync::mpsc::{Receiver, RecvError, Select, Sender, channel}; use std::thread; use std::time::Duration; -use style::thread_state; -use style::thread_state::{IN_WORKER, SCRIPT}; +use style::thread_state::{self, IN_WORKER, SCRIPT}; use url::Url; use util::prefs::PREFS; use util::thread::spawn_named; @@ -48,7 +45,26 @@ pub enum ServiceWorkerScriptMsg { pub enum MixedMessage { FromServiceWorker(ServiceWorkerScriptMsg), FromDevtools(DevtoolScriptControlMsg), - FromTimeoutThread(()), + FromTimeoutThread(()) +} + +#[derive(JSTraceable, Clone)] +pub struct ServiceWorkerChan { + pub sender: Sender<ServiceWorkerScriptMsg> +} + +impl ScriptChan for ServiceWorkerChan { + fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { + self.sender + .send(ServiceWorkerScriptMsg::CommonWorker(WorkerScriptMsg::Common(msg))) + .map_err(|_| ()) + } + + fn clone(&self) -> Box<ScriptChan + Send> { + box ServiceWorkerChan { + sender: self.sender.clone(), + } + } } #[dom_struct] @@ -61,12 +77,9 @@ pub struct ServiceWorkerGlobalScope { own_sender: Sender<ServiceWorkerScriptMsg>, #[ignore_heap_size_of = "Defined in std"] timer_event_port: Receiver<()>, - #[ignore_heap_size_of = "Trusted<T> has unclear ownership like JS<T>"] - worker: DOMRefCell<Option<TrustedServiceWorkerAddress>>, #[ignore_heap_size_of = "Defined in std"] swmanager_sender: IpcSender<ServiceWorkerMsg>, - #[ignore_heap_size_of = "Defined in std"] - scope_url: Url + scope_url: Url, } impl ServiceWorkerGlobalScope { @@ -93,7 +106,6 @@ impl ServiceWorkerGlobalScope { receiver: receiver, timer_event_port: timer_event_port, own_sender: own_sender, - worker: DOMRefCell::new(None), swmanager_sender: swmanager_sender, scope_url: scope_url } @@ -228,8 +240,7 @@ impl ServiceWorkerGlobalScope { CommonWorker(WorkerScriptMsg::DOMMessage(data)) => { let scope = self.upcast::<WorkerGlobalScope>(); let target = self.upcast(); - let _ac = JSAutoCompartment::new(scope.get_cx(), - scope.reflector().get_jsobject().get()); + let _ac = JSAutoCompartment::new(scope.get_cx(), scope.reflector().get_jsobject().get()); rooted!(in(scope.get_cx()) let mut message = UndefinedValue()); data.read(GlobalRef::Worker(scope), message.handle_mut()); MessageEvent::dispatch_jsval(target, GlobalRef::Worker(scope), message.handle()); @@ -292,6 +303,12 @@ impl ServiceWorkerGlobalScope { pub fn process_event(&self, msg: CommonScriptMsg) { self.handle_script_event(ServiceWorkerScriptMsg::CommonWorker(WorkerScriptMsg::Common(msg))); } + + pub fn script_chan(&self) -> Box<ScriptChan + Send> { + box ServiceWorkerChan { + sender: self.own_sender.clone() + } + } } #[allow(unsafe_code)] |