1use base::generic_channel::{self, GenericSend, GenericSender, SendResult};
6use malloc_size_of::malloc_size_of_is_0;
7use serde::{Deserialize, Serialize};
8
9use crate::client_storage::ClientStorageThreadMessage;
10use crate::indexeddb::IndexedDBThreadMsg;
11use crate::webstorage_thread::{OriginDescriptor, WebStorageThreadMsg, WebStorageType};
12
13pub mod client_storage;
14pub mod indexeddb;
15pub mod webstorage_thread;
16
17#[derive(Clone, Debug, Deserialize, Serialize)]
18pub struct StorageThreads {
19 client_storage_thread: GenericSender<ClientStorageThreadMessage>,
20 idb_thread: GenericSender<IndexedDBThreadMsg>,
21 web_storage_thread: GenericSender<WebStorageThreadMsg>,
22}
23
24impl StorageThreads {
25 pub fn new(
26 client_storage_thread: GenericSender<ClientStorageThreadMessage>,
27 idb_thread: GenericSender<IndexedDBThreadMsg>,
28 web_storage_thread: GenericSender<WebStorageThreadMsg>,
29 ) -> StorageThreads {
30 StorageThreads {
31 client_storage_thread,
32 idb_thread,
33 web_storage_thread,
34 }
35 }
36
37 pub fn webstorage_origins(&self, storage_type: WebStorageType) -> Vec<OriginDescriptor> {
39 let (sender, receiver) = generic_channel::channel().unwrap();
40 let _ = self
41 .web_storage_thread
42 .send(WebStorageThreadMsg::ListOrigins(sender, storage_type));
43 receiver.recv().unwrap()
44 }
45
46 pub fn clear_webstorage_for_sites(&self, storage_type: WebStorageType, sites: &[&str]) {
47 let sites = sites.iter().map(|site| site.to_string()).collect();
48 let (sender, receiver) = generic_channel::channel().unwrap();
49 let _ = self
50 .web_storage_thread
51 .send(WebStorageThreadMsg::ClearDataForSites(
52 sender,
53 storage_type,
54 sites,
55 ));
56 let _ = receiver.recv();
57 }
58}
59
60impl GenericSend<ClientStorageThreadMessage> for StorageThreads {
61 fn send(&self, msg: ClientStorageThreadMessage) -> SendResult {
62 self.client_storage_thread.send(msg)
63 }
64
65 fn sender(&self) -> GenericSender<ClientStorageThreadMessage> {
66 self.client_storage_thread.clone()
67 }
68}
69
70impl GenericSend<IndexedDBThreadMsg> for StorageThreads {
71 fn send(&self, msg: IndexedDBThreadMsg) -> SendResult {
72 self.idb_thread.send(msg)
73 }
74
75 fn sender(&self) -> GenericSender<IndexedDBThreadMsg> {
76 self.idb_thread.clone()
77 }
78}
79
80impl GenericSend<WebStorageThreadMsg> for StorageThreads {
81 fn send(&self, msg: WebStorageThreadMsg) -> SendResult {
82 self.web_storage_thread.send(msg)
83 }
84
85 fn sender(&self) -> GenericSender<WebStorageThreadMsg> {
86 self.web_storage_thread.clone()
87 }
88}
89
90malloc_size_of_is_0!(StorageThreads);