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