1use 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 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
142malloc_size_of_is_0!(StorageThreads);