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 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    // TODO: Consider changing to `webstorage_sites`
38    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
90// Ignore the sub-fields
91malloc_size_of_is_0!(StorageThreads);