diff --git a/Cargo.lock b/Cargo.lock index 0f3efc96f45..790738373b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1729,7 +1729,6 @@ dependencies = [ name = "net_traits" version = "0.0.1" dependencies = [ - "bluetooth_traits 0.0.1", "cookie 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/components/bluetooth_traits/lib.rs b/components/bluetooth_traits/lib.rs index ede1c8ecdba..f7293b74bb4 100644 --- a/components/bluetooth_traits/lib.rs +++ b/components/bluetooth_traits/lib.rs @@ -108,7 +108,3 @@ pub enum BluetoothResponse { EnableNotification(()), WatchAdvertisements(()), } - -pub trait BluetoothResponseListener { - fn response(&mut self, response: BluetoothResponseResult); -} diff --git a/components/net_traits/Cargo.toml b/components/net_traits/Cargo.toml index 6b7e117ebba..a43158bb9ea 100644 --- a/components/net_traits/Cargo.toml +++ b/components/net_traits/Cargo.toml @@ -10,7 +10,6 @@ name = "net_traits" path = "lib.rs" [dependencies] -bluetooth_traits = {path = "../bluetooth_traits"} msg = {path = "../msg"} ipc-channel = "0.5" heapsize = "0.3.0" diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index de0f2c2725b..ac8ec07c2bb 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -9,7 +9,6 @@ #![deny(unsafe_code)] -extern crate bluetooth_traits; extern crate cookie as cookie_rs; extern crate heapsize; #[macro_use] extern crate heapsize_derive; @@ -34,7 +33,6 @@ extern crate uuid; extern crate webrender_traits; extern crate websocket; -use bluetooth_traits::{BluetoothResponseListener, BluetoothResponseResult}; use cookie_rs::Cookie; use filemanager_thread::FileManagerThreadMsg; use heapsize::HeapSizeOf; @@ -238,13 +236,6 @@ impl Action for FetchResponseMsg { } } -impl Action for BluetoothResponseResult { - /// Execute the default action on a provided listener. - fn process(self, listener: &mut T) { - listener.response(self) - } -} - /// Handle to a resource thread pub type CoreResourceThread = IpcSender; diff --git a/components/script/dom/bluetooth.rs b/components/script/dom/bluetooth.rs index d2b3ced25fe..29b5ee5aa72 100644 --- a/components/script/dom/bluetooth.rs +++ b/components/script/dom/bluetooth.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use bluetooth_traits::{BluetoothError, BluetoothRequest, GATTType}; -use bluetooth_traits::{BluetoothResponse, BluetoothResponseListener, BluetoothResponseResult}; +use bluetooth_traits::{BluetoothResponse, BluetoothResponseResult}; use bluetooth_traits::blocklist::{Blocklist, uuid_is_blocklisted}; use bluetooth_traits::scanfilter::{BluetoothScanfilter, BluetoothScanfilterSequence}; use bluetooth_traits::scanfilter::{RequestDeviceoptions, ServiceUUIDSequence}; @@ -27,7 +27,7 @@ use dom::promise::Promise; use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::router::ROUTER; use js::jsapi::{JSAutoCompartment, JSContext}; -use network_listener::{NetworkListener, PreInvoke}; +use script_thread::Runnable; use std::collections::HashMap; use std::rc::Rc; use std::str::FromStr; @@ -61,9 +61,7 @@ pub trait AsyncBluetoothListener { fn handle_response(&self, result: BluetoothResponse, cx: *mut JSContext, promise: &Rc); } -impl PreInvoke for BluetoothContext {} - -impl BluetoothResponseListener for BluetoothContext { +impl BluetoothContext { #[allow(unrooted_must_root)] fn response(&mut self, response: BluetoothResponseResult) { let promise = self.promise.take().expect("bt promise is missing").root(); @@ -182,13 +180,29 @@ pub fn response_async( promise: Some(TrustedPromise::new(promise.clone())), receiver: Trusted::new(receiver), })); - let listener = NetworkListener { - context: context, - task_source: task_source, - wrapper: None, - }; ROUTER.add_route(action_receiver.to_opaque(), box move |message| { - listener.notify_response(message.to().unwrap()); + struct ListenerRunnable { + context: Arc>>, + action: BluetoothResponseResult, + } + + impl Runnable for ListenerRunnable { + fn handler(self: Box) { + let this = *self; + let mut context = this.context.lock().unwrap(); + context.response(this.action); + } + } + + let runnable = box ListenerRunnable { + context: context.clone(), + action: message.to().unwrap(), + }; + + let result = task_source.queue_wrapperless(runnable); + if let Err(err) = result { + warn!("failed to deliver network data: {:?}", err); + } }); action_sender } diff --git a/components/script/network_listener.rs b/components/script/network_listener.rs index 5a96317fb18..fc7b4635756 100644 --- a/components/script/network_listener.rs +++ b/components/script/network_listener.rs @@ -2,7 +2,6 @@ * 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 bluetooth_traits::{BluetoothResponseListener, BluetoothResponseResult}; use net_traits::{Action, FetchResponseListener, FetchResponseMsg}; use script_thread::{Runnable, RunnableWrapper}; use std::sync::{Arc, Mutex}; @@ -41,13 +40,6 @@ impl NetworkListen } } -// helps type inference -impl NetworkListener { - pub fn notify_response(&self, action: BluetoothResponseResult) { - self.notify(action); - } -} - /// A gating mechanism that runs before invoking the runnable on the target thread. /// If the `should_invoke` method returns false, the runnable is discarded without /// being invoked.