use std::path::PathBuf;
use std::sync::LazyLock;
#[doc(hidden)]
pub use inventory as _inventory;
pub type ResourceReader = &'static (dyn ResourceReaderMethods + Sync + Send);
#[macro_export]
macro_rules! submit_resource_reader {
($resource_reader:expr) => {
$crate::resources::_inventory::submit! {
$resource_reader as $crate::resources::ResourceReader
}
};
}
inventory::collect!(ResourceReader);
static RESOURCE_READER: LazyLock<ResourceReader> = {
LazyLock::new(|| {
let mut resource_reader_iterator = inventory::iter::<ResourceReader>.into_iter();
let Some(resource_reader) = resource_reader_iterator.next() else {
panic!("No resource reader registered");
};
if resource_reader_iterator.next().is_some() {
log::error!(
"Multiple resource readers registered. Taking the first implementation \
(random, non deterministic order). This is a bug! Check usages of \
`submit_resource_reader!()`. Perhaps you meant to disable the default resource reader \
(selected by depending on the `servo-default-resources` crate) ?"
);
}
*resource_reader
})
};
pub fn read_bytes(res: Resource) -> Vec<u8> {
RESOURCE_READER.read(res)
}
pub fn read_string(res: Resource) -> String {
String::from_utf8(read_bytes(res)).unwrap()
}
pub fn sandbox_access_files() -> Vec<PathBuf> {
RESOURCE_READER.sandbox_access_files()
}
pub fn sandbox_access_files_dirs() -> Vec<PathBuf> {
RESOURCE_READER.sandbox_access_files_dirs()
}
pub enum Resource {
BluetoothBlocklist,
DomainList,
HstsPreloadList,
BadCertHTML,
NetErrorHTML,
BrokenImageIcon,
CrashHTML,
DirectoryListingHTML,
AboutMemoryHTML,
DebuggerJS,
JsonViewerHTML,
}
impl Resource {
pub fn filename(&self) -> &'static str {
match self {
Resource::BluetoothBlocklist => "gatt_blocklist.txt",
Resource::DomainList => "public_domains.txt",
Resource::HstsPreloadList => "hsts_preload.fstmap",
Resource::BadCertHTML => "badcert.html",
Resource::NetErrorHTML => "neterror.html",
Resource::BrokenImageIcon => "rippy.png",
Resource::CrashHTML => "crash.html",
Resource::DirectoryListingHTML => "directory-listing.html",
Resource::AboutMemoryHTML => "about-memory.html",
Resource::DebuggerJS => "debugger.js",
Resource::JsonViewerHTML => "json-viewer.html",
}
}
}
pub trait ResourceReaderMethods {
fn read(&self, res: Resource) -> Vec<u8>;
fn sandbox_access_files(&self) -> Vec<PathBuf>;
fn sandbox_access_files_dirs(&self) -> Vec<PathBuf>;
}