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