devtools/actors/
preference.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use 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        // TODO: Map more preferences onto their Servo values.
43        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}