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