mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
As part of [Bug 1172987](https://bugzilla.mozilla.org/show_bug.cgi?id=1172897) we renamed TabActor, as the actor does not represent tabs (as in a browser tab), it instead represents a browsing context as defined by the the [HTML standard](https://html.spec.whatwg.org/multipage/browsers.html#windows). In a later PR I will mirror the structure we have on devtools to have a targets folder, which contains all target types. At the moment it looks like servo only represents workers and browsing contexts.
128 lines
3.5 KiB
Rust
128 lines
3.5 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/. */
|
|
|
|
/// Liberally derived from the [Firefox JS implementation]
|
|
/// (http://mxr.mozilla.org/mozilla-central/source/toolkit/devtools/server/actors/root.js).
|
|
/// Connection point for all new remote devtools interactions, providing lists of know actors
|
|
/// that perform more specific actions (targets, addons, browser chrome, etc.)
|
|
use actor::{Actor, ActorMessageStatus, ActorRegistry};
|
|
use actors::browsing_context::{BrowsingContextActor, BrowsingContextActorMsg};
|
|
use actors::performance::PerformanceActor;
|
|
use protocol::{ActorDescription, JsonPacketStream};
|
|
use serde_json::{Map, Value};
|
|
use std::net::TcpStream;
|
|
|
|
#[derive(Serialize)]
|
|
struct ActorTraits {
|
|
sources: bool,
|
|
highlightable: bool,
|
|
customHighlighters: bool,
|
|
networkMonitor: bool,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
struct ListAddonsReply {
|
|
from: String,
|
|
addons: Vec<AddonMsg>,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
enum AddonMsg {}
|
|
|
|
#[derive(Serialize)]
|
|
struct ListTabsReply {
|
|
from: String,
|
|
selected: u32,
|
|
tabs: Vec<BrowsingContextActorMsg>,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
pub struct RootActorMsg {
|
|
from: String,
|
|
applicationType: String,
|
|
traits: ActorTraits,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
pub struct ProtocolDescriptionReply {
|
|
from: String,
|
|
types: Types,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
pub struct Types {
|
|
performance: ActorDescription,
|
|
}
|
|
|
|
pub struct RootActor {
|
|
pub tabs: Vec<String>,
|
|
}
|
|
|
|
impl Actor for RootActor {
|
|
fn name(&self) -> String {
|
|
"root".to_owned()
|
|
}
|
|
|
|
fn handle_message(
|
|
&self,
|
|
registry: &ActorRegistry,
|
|
msg_type: &str,
|
|
_msg: &Map<String, Value>,
|
|
stream: &mut TcpStream,
|
|
) -> Result<ActorMessageStatus, ()> {
|
|
Ok(match msg_type {
|
|
"listAddons" => {
|
|
let actor = ListAddonsReply {
|
|
from: "root".to_owned(),
|
|
addons: vec![],
|
|
};
|
|
stream.write_json_packet(&actor);
|
|
ActorMessageStatus::Processed
|
|
},
|
|
|
|
// https://docs.firefox-dev.tools/backend/protocol.html#listing-browser-tabs
|
|
"listTabs" => {
|
|
let actor = ListTabsReply {
|
|
from: "root".to_owned(),
|
|
selected: 0,
|
|
tabs: self
|
|
.tabs
|
|
.iter()
|
|
.map(|target| registry.find::<BrowsingContextActor>(target).encodable())
|
|
.collect(),
|
|
};
|
|
stream.write_json_packet(&actor);
|
|
ActorMessageStatus::Processed
|
|
},
|
|
|
|
"protocolDescription" => {
|
|
let msg = ProtocolDescriptionReply {
|
|
from: self.name(),
|
|
types: Types {
|
|
performance: PerformanceActor::description(),
|
|
},
|
|
};
|
|
stream.write_json_packet(&msg);
|
|
ActorMessageStatus::Processed
|
|
},
|
|
|
|
_ => ActorMessageStatus::Ignored,
|
|
})
|
|
}
|
|
}
|
|
|
|
impl RootActor {
|
|
pub fn encodable(&self) -> RootActorMsg {
|
|
RootActorMsg {
|
|
from: "root".to_owned(),
|
|
applicationType: "browser".to_owned(),
|
|
traits: ActorTraits {
|
|
sources: true,
|
|
highlightable: true,
|
|
customHighlighters: true,
|
|
networkMonitor: true,
|
|
},
|
|
}
|
|
}
|
|
}
|