Skip to main content

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