Skip to main content

storage_traits/
lib.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::malloc_size_of_is_0;
6use serde::{Deserialize, Serialize};
7use servo_base::generic_channel::{self, GenericCallback, GenericSend, GenericSender, SendResult};
8use servo_url::ImmutableOrigin;
9
10use crate::client_storage::{ClientStorageThreadHandle, ClientStorageThreadMessage};
11use crate::indexeddb::IndexedDBThreadMsg;
12use crate::webstorage_thread::{OriginDescriptor, WebStorageThreadMsg, WebStorageType};
13
14pub mod client_storage;
15pub mod indexeddb;
16pub mod webstorage_thread;
17
18#[derive(Clone, Debug, Deserialize, Serialize)]
19pub struct StorageThreads {
20    client_storage_thread: GenericSender<ClientStorageThreadMessage>,
21    idb_thread: GenericSender<IndexedDBThreadMsg>,
22    web_storage_thread: GenericSender<WebStorageThreadMsg>,
23}
24
25impl StorageThreads {
26    pub fn new(
27        client_storage_thread: GenericSender<ClientStorageThreadMessage>,
28        idb_thread: GenericSender<IndexedDBThreadMsg>,
29        web_storage_thread: GenericSender<WebStorageThreadMsg>,
30    ) -> StorageThreads {
31        StorageThreads {
32            client_storage_thread,
33            idb_thread,
34            web_storage_thread,
35        }
36    }
37
38    pub fn persisted(
39        &self,
40        origin: ImmutableOrigin,
41        sender: GenericCallback<Result<bool, String>>,
42    ) -> SendResult {
43        self.client_storage_thread
44            .send(ClientStorageThreadMessage::Persisted { origin, sender })
45    }
46
47    pub fn persist(
48        &self,
49        origin: ImmutableOrigin,
50        permission_granted: bool,
51        sender: GenericCallback<Result<bool, String>>,
52    ) -> SendResult {
53        self.client_storage_thread
54            .send(ClientStorageThreadMessage::Persist {
55                origin,
56                permission_granted,
57                sender,
58            })
59    }
60
61    pub fn estimate(
62        &self,
63        origin: ImmutableOrigin,
64        sender: GenericCallback<Result<(u64, u64), String>>,
65    ) -> SendResult {
66        self.client_storage_thread
67            .send(ClientStorageThreadMessage::Estimate { origin, sender })
68    }
69
70    pub fn client_storage_handle(&self) -> ClientStorageThreadHandle {
71        self.client_storage_thread.clone().into()
72    }
73
74    // TODO: Consider changing to `webstorage_sites`
75    pub fn webstorage_origins(&self, storage_type: WebStorageType) -> Vec<OriginDescriptor> {
76        let (sender, receiver) = generic_channel::channel().unwrap();
77        let _ = self
78            .web_storage_thread
79            .send(WebStorageThreadMsg::ListOrigins(sender, storage_type));
80        receiver.recv().unwrap()
81    }
82
83    pub fn clear_webstorage_for_sites(&self, storage_type: WebStorageType, sites: &[&str]) {
84        let sites = sites.iter().map(|site| site.to_string()).collect();
85        let (sender, receiver) = generic_channel::channel().unwrap();
86        let _ = self
87            .web_storage_thread
88            .send(WebStorageThreadMsg::ClearDataForSites(
89                sender,
90                storage_type,
91                sites,
92            ));
93        let _ = receiver.recv();
94    }
95}
96
97impl GenericSend<ClientStorageThreadMessage> for StorageThreads {
98    fn send(&self, msg: ClientStorageThreadMessage) -> SendResult {
99        self.client_storage_thread.send(msg)
100    }
101
102    fn sender(&self) -> GenericSender<ClientStorageThreadMessage> {
103        self.client_storage_thread.clone()
104    }
105}
106
107impl GenericSend<IndexedDBThreadMsg> for StorageThreads {
108    fn send(&self, msg: IndexedDBThreadMsg) -> SendResult {
109        self.idb_thread.send(msg)
110    }
111
112    fn sender(&self) -> GenericSender<IndexedDBThreadMsg> {
113        self.idb_thread.clone()
114    }
115}
116
117impl GenericSend<WebStorageThreadMsg> for StorageThreads {
118    fn send(&self, msg: WebStorageThreadMsg) -> SendResult {
119        self.web_storage_thread.send(msg)
120    }
121
122    fn sender(&self) -> GenericSender<WebStorageThreadMsg> {
123        self.web_storage_thread.clone()
124    }
125}
126
127// Ignore the sub-fields
128malloc_size_of_is_0!(StorageThreads);