devtools/actors/
preference.rs1use std::sync::Arc;
6
7use malloc_size_of_derive::MallocSizeOf;
8use serde::Serialize;
9use serde_json::{Map, Value};
10use servo_config::pref;
11
12use crate::StreamId;
13use crate::actor::{Actor, ActorError, ActorRegistry, new_actor_name};
14use crate::protocol::ClientRequest;
15
16#[derive(MallocSizeOf)]
17pub(crate) struct PreferenceActor {
18 name: String,
19}
20
21impl PreferenceActor {
22 pub fn register(registry: &ActorRegistry) -> Arc<Self> {
23 let name = new_actor_name::<Self>();
24 let actor = Self { name };
25 registry.register::<Self>(actor)
26 }
27}
28
29impl Actor for PreferenceActor {
30 fn name(&self) -> &str {
31 &self.name
32 }
33
34 fn handle_message(
35 &self,
36 request: ClientRequest,
37 _registry: &ActorRegistry,
38 msg_type: &str,
39 msg: &Map<String, Value>,
40 _id: StreamId,
41 ) -> Result<(), ActorError> {
42 let key = msg
43 .get("value")
44 .ok_or(ActorError::MissingParameter)?
45 .as_str()
46 .ok_or(ActorError::BadParameterType)?;
47
48 match key {
50 "dom.serviceWorkers.enabled" => {
51 self.write_bool(request, pref!(dom_serviceworker_enabled))
52 },
53 _ => self.handle_missing_preference(request, msg_type),
54 }
55 }
56}
57
58impl PreferenceActor {
59 fn handle_missing_preference(
60 &self,
61 request: ClientRequest,
62 msg_type: &str,
63 ) -> Result<(), ActorError> {
64 match msg_type {
65 "getBoolPref" => self.write_bool(request, false),
66 "getCharPref" => self.write_char(request, String::new()),
67 "getIntPref" => self.write_int(request, 0),
68 "getFloatPref" => self.write_float(request, 0.),
69 _ => Err(ActorError::UnrecognizedPacketType),
70 }
71 }
72
73 fn write_bool(&self, request: ClientRequest, pref_value: bool) -> Result<(), ActorError> {
74 #[derive(Serialize)]
75 struct BoolReply {
76 from: String,
77 value: bool,
78 }
79
80 let reply = BoolReply {
81 from: self.name.clone(),
82 value: pref_value,
83 };
84 request.reply_final(&reply)
85 }
86
87 fn write_char(&self, request: ClientRequest, pref_value: String) -> Result<(), ActorError> {
88 #[derive(Serialize)]
89 struct CharReply {
90 from: String,
91 value: String,
92 }
93
94 let reply = CharReply {
95 from: self.name.clone(),
96 value: pref_value,
97 };
98 request.reply_final(&reply)
99 }
100
101 fn write_int(&self, request: ClientRequest, pref_value: i64) -> Result<(), ActorError> {
102 #[derive(Serialize)]
103 struct IntReply {
104 from: String,
105 value: i64,
106 }
107
108 let reply = IntReply {
109 from: self.name.clone(),
110 value: pref_value,
111 };
112 request.reply_final(&reply)
113 }
114
115 fn write_float(&self, request: ClientRequest, pref_value: f64) -> Result<(), ActorError> {
116 #[derive(Serialize)]
117 struct FloatReply {
118 from: String,
119 value: f64,
120 }
121
122 let reply = FloatReply {
123 from: self.name.clone(),
124 value: pref_value,
125 };
126 request.reply_final(&reply)
127 }
128}