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::{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 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
127malloc_size_of_is_0!(StorageThreads);