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 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        // TODO: Map more preferences onto their Servo values.
48        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}