From 5c8492d760f33e6b8793f3eabc1b24ae7647d152 Mon Sep 17 00:00:00 2001 From: codehag Date: Sun, 14 Oct 2018 16:25:45 +0200 Subject: [PATCH] DevTools - add DeviceActor and update Root to own global actors --- components/devtools/actors/device.rs | 86 ++++++++++++++++++++++++++++ components/devtools/actors/root.rs | 24 ++++++++ components/devtools/lib.rs | 14 ++++- 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 components/devtools/actors/device.rs diff --git a/components/devtools/actors/device.rs b/components/devtools/actors/device.rs new file mode 100644 index 000000000000..954a65a8083b --- /dev/null +++ b/components/devtools/actors/device.rs @@ -0,0 +1,86 @@ +/* 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 actor::{Actor, ActorMessageStatus, ActorRegistry}; +use serde_json::{Map, Value}; +use std::net::TcpStream; +use protocol::{ActorDescription, Method}; +use protocol::JsonPacketStream; + +#[derive(Serialize)] +struct GetDescriptionReply { + from: String, + value: SystemInfo, +} + +#[derive(Serialize)] +struct SystemInfo { + apptype: String, + platformVersion: String, +} + +pub struct DeviceActor { + pub name: String, +} + +impl Actor for DeviceActor { + fn name(&self) -> String { + self.name.clone() + } + fn handle_message( + &self, + _registry: &ActorRegistry, + msg_type: &str, + _msg: &Map, + stream: &mut TcpStream, + ) -> Result { + + Ok(match msg_type { + "getDescription" => { + + let msg = GetDescriptionReply { + from: self.name(), + value: SystemInfo { + apptype: "servo".to_string(), + platformVersion: "63.0".to_string(), + } + }; + stream.write_json_packet(&msg); + ActorMessageStatus::Processed + }, + + _ => ActorMessageStatus::Ignored, + }) + } +} + +impl DeviceActor { + pub fn new(name: String) -> DeviceActor { + DeviceActor { name: name } + } + + pub fn description() -> ActorDescription { + ActorDescription { + category: "actor", + typeName: "device", + methods: vec![Method { + name: "getDescription", + request: Value::Null, + response: Value::Object( + vec![( + "value".to_owned(), + Value::Object( + vec![("_retval".to_owned(), Value::String("json".to_owned()))] + .into_iter() + .collect(), + ), + )].into_iter() + .collect(), + ), + }], + } + } +} + + diff --git a/components/devtools/actors/root.rs b/components/devtools/actors/root.rs index 021bbcf353fc..3c62002a7491 100644 --- a/components/devtools/actors/root.rs +++ b/components/devtools/actors/root.rs @@ -8,6 +8,7 @@ /// that perform more specific actions (targets, addons, browser chrome, etc.) use actor::{Actor, ActorMessageStatus, ActorRegistry}; use actors::browsing_context::{BrowsingContextActor, BrowsingContextActorMsg}; +use actors::device::DeviceActor; use actors::performance::PerformanceActor; use protocol::{ActorDescription, JsonPacketStream}; use serde_json::{Map, Value}; @@ -30,6 +31,14 @@ struct ListAddonsReply { #[derive(Serialize)] enum AddonMsg {} +#[derive(Serialize)] +struct GetRootReply { + from: String, + selected: u32, + performanceActor: String, + deviceActor: String, +} + #[derive(Serialize)] struct ListTabsReply { from: String, @@ -53,10 +62,13 @@ pub struct ProtocolDescriptionReply { #[derive(Serialize)] pub struct Types { performance: ActorDescription, + device: ActorDescription, } pub struct RootActor { pub tabs: Vec, + pub performance: String, + pub device: String, } impl Actor for RootActor { @@ -81,6 +93,17 @@ impl Actor for RootActor { ActorMessageStatus::Processed }, + "getRoot" => { + let actor = GetRootReply { + from: "root".to_owned(), + selected: 0, + performanceActor: self.performance.clone(), + deviceActor: self.device.clone(), + }; + stream.write_json_packet(&actor); + ActorMessageStatus::Processed + }, + // https://docs.firefox-dev.tools/backend/protocol.html#listing-browser-tabs "listTabs" => { let actor = ListTabsReply { @@ -101,6 +124,7 @@ impl Actor for RootActor { from: self.name(), types: Types { performance: PerformanceActor::description(), + device: DeviceActor::description(), }, }; stream.write_json_packet(&msg); diff --git a/components/devtools/lib.rs b/components/devtools/lib.rs index 0600c984e9f5..8fa7ce5591d2 100644 --- a/components/devtools/lib.rs +++ b/components/devtools/lib.rs @@ -27,6 +27,7 @@ extern crate time; use actor::{Actor, ActorRegistry}; use actors::browsing_context::BrowsingContextActor; use actors::console::ConsoleActor; +use actors::device::DeviceActor; use actors::framerate::FramerateActor; use actors::inspector::InspectorActor; use actors::network_event::{EventActor, NetworkEventActor, ResponseStartMsg}; @@ -57,6 +58,7 @@ mod actor; mod actors { pub mod browsing_context; pub mod console; + pub mod device; pub mod framerate; pub mod inspector; pub mod memory; @@ -146,9 +148,19 @@ fn run_server( let mut registry = ActorRegistry::new(); - let root = Box::new(RootActor { tabs: vec![] }); + let performance = PerformanceActor::new(registry.new_name("performance")); + + let device = DeviceActor::new(registry.new_name("device")); + + let root = Box::new(RootActor { + tabs: vec![], + device: device.name(), + performance: performance.name(), + }); registry.register(root); + registry.register(Box::new(performance)); + registry.register(Box::new(device)); registry.find::("root"); let actors = registry.create_shareable();