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::client_storage::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 webstorage_origins(&self, storage_type: WebStorageType) -> Vec<OriginDescriptor> {
72 let (sender, receiver) = generic_channel::channel().unwrap();
73 let _ = self
74 .web_storage_thread
75 .send(WebStorageThreadMsg::ListOrigins(sender, storage_type));
76 receiver.recv().unwrap()
77 }
78
79 pub fn clear_webstorage_for_sites(&self, storage_type: WebStorageType, sites: &[&str]) {
80 let sites = sites.iter().map(|site| site.to_string()).collect();
81 let (sender, receiver) = generic_channel::channel().unwrap();
82 let _ = self
83 .web_storage_thread
84 .send(WebStorageThreadMsg::ClearDataForSites(
85 sender,
86 storage_type,
87 sites,
88 ));
89 let _ = receiver.recv();
90 }
91}
92
93impl GenericSend<ClientStorageThreadMessage> for StorageThreads {
94 fn send(&self, msg: ClientStorageThreadMessage) -> SendResult {
95 self.client_storage_thread.send(msg)
96 }
97
98 fn sender(&self) -> GenericSender<ClientStorageThreadMessage> {
99 self.client_storage_thread.clone()
100 }
101}
102
103impl GenericSend<IndexedDBThreadMsg> for StorageThreads {
104 fn send(&self, msg: IndexedDBThreadMsg) -> SendResult {
105 self.idb_thread.send(msg)
106 }
107
108 fn sender(&self) -> GenericSender<IndexedDBThreadMsg> {
109 self.idb_thread.clone()
110 }
111}
112
113impl GenericSend<WebStorageThreadMsg> for StorageThreads {
114 fn send(&self, msg: WebStorageThreadMsg) -> SendResult {
115 self.web_storage_thread.send(msg)
116 }
117
118 fn sender(&self) -> GenericSender<WebStorageThreadMsg> {
119 self.web_storage_thread.clone()
120 }
121}
122
123malloc_size_of_is_0!(StorageThreads);