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