Update adblock crate to 0.10.3 (#31247)
The adblock-rust changes to publish: https://github.com/brave/adblock-rust/pull/517 This should partially address the perf issue related to the resource memory usage.
This commit is contained in:
@@ -5,7 +5,7 @@ edition = "2021"
|
||||
license = "MPL-2.0"
|
||||
|
||||
[dependencies]
|
||||
adblock = { version = "0.10.2", default-features = false, features = ["full-regex-handling", "regex-debug-info", "css-validation"] }
|
||||
adblock = { version = "0.10.3", default-features = false, features = ["full-regex-handling", "regex-debug-info", "css-validation"] }
|
||||
cxx = "1.0"
|
||||
serde_json = "1.0"
|
||||
thiserror = "1.0"
|
||||
|
||||
+1
-1
@@ -51,7 +51,7 @@ cargo_crate("lib") {
|
||||
cargo_pkg_name = "adblock"
|
||||
cargo_pkg_description = "Native Rust module for Adblock Plus syntax (e.g. EasyList, EasyPrivacy) filter parsing and matching."
|
||||
cargo_pkg_repository = "https://github.com/brave/adblock-rust/"
|
||||
cargo_pkg_version = "0.10.2"
|
||||
cargo_pkg_version = "0.10.3"
|
||||
|
||||
deps = [
|
||||
"//brave/third_party/rust/base64/v0_22:lib",
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
Name: adblock
|
||||
URL: https://crates.io/crates/adblock
|
||||
Version: 0.10.2
|
||||
Revision: 082f2d61c940caf09e1d73ce88712ef038642bbe
|
||||
Version: 0.10.3
|
||||
Revision: 3652b04666ebdf082d029f775d01fa1a575c1918
|
||||
License: Mozilla-Public-License-2.0
|
||||
License File: //brave/third_party/rust/chromium_crates_io/vendor/adblock-v0_10/LICENSE
|
||||
Shipped: yes
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ version = 4
|
||||
|
||||
[[package]]
|
||||
name = "adblock"
|
||||
version = "0.10.2"
|
||||
version = "0.10.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"base64",
|
||||
|
||||
@@ -65,7 +65,7 @@ ub-risk-4 = "ub-risk-4"
|
||||
|
||||
[policy."adblock-cxx:1.0.0"]
|
||||
criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
|
||||
[policy."adblock:0.10.2"]
|
||||
[policy."adblock:0.10.3"]
|
||||
criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
|
||||
[policy."addchain:0.2.0"]
|
||||
criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"git": {
|
||||
"sha1": "082f2d61c940caf09e1d73ce88712ef038642bbe"
|
||||
"sha1": "3652b04666ebdf082d029f775d01fa1a575c1918"
|
||||
},
|
||||
"path_in_vcs": ""
|
||||
}
|
||||
+1
-1
@@ -4,7 +4,7 @@ version = 4
|
||||
|
||||
[[package]]
|
||||
name = "adblock"
|
||||
version = "0.10.2"
|
||||
version = "0.10.3"
|
||||
dependencies = [
|
||||
"addr",
|
||||
"base64",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
[package]
|
||||
edition = "2021"
|
||||
name = "adblock"
|
||||
version = "0.10.2"
|
||||
version = "0.10.3"
|
||||
authors = [
|
||||
"Anton Lazarev <alazarev@brave.com>",
|
||||
"Andrius Aucinas",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "adblock"
|
||||
version = "0.10.2"
|
||||
version = "0.10.3"
|
||||
authors = ["Anton Lazarev <alazarev@brave.com>", "Andrius Aucinas"]
|
||||
edition = "2021"
|
||||
|
||||
|
||||
+69
-16
@@ -9,11 +9,45 @@ use thiserror::Error;
|
||||
|
||||
use super::{PermissionMask, Resource, ResourceType};
|
||||
|
||||
#[derive(Clone)]
|
||||
enum ResourceContent {
|
||||
/// A valid utf8 string. Used for text/* mime types or for ResourceType:Template
|
||||
Text(String),
|
||||
|
||||
/// Raw content in the form of a byte array. Used for other mime types like
|
||||
/// "image/gif" or "audio/mp3"
|
||||
Raw(Vec<u8>),
|
||||
}
|
||||
|
||||
impl ResourceContent {
|
||||
fn text_from_base64(base64: &str) -> Result<Self, AddResourceError> {
|
||||
let decoded = BASE64_STANDARD.decode(base64)?;
|
||||
Ok(Self::Text(String::from_utf8(decoded)?))
|
||||
}
|
||||
|
||||
fn raw_from_base64(base64: &str) -> Result<Self, AddResourceError> {
|
||||
let decoded = BASE64_STANDARD.decode(base64)?;
|
||||
Ok(Self::Raw(decoded))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
/// A internal representation of a Resource to store. Stores the content
|
||||
/// in the decoded form to use less memory.
|
||||
/// See [Resource] for details
|
||||
struct ResourceImpl {
|
||||
name: String,
|
||||
kind: ResourceType,
|
||||
content: ResourceContent,
|
||||
dependencies: Vec<String>,
|
||||
permission: PermissionMask,
|
||||
}
|
||||
|
||||
/// Unified resource storage for both redirects and scriptlets.
|
||||
#[derive(Default)]
|
||||
pub struct ResourceStorage {
|
||||
/// Stores each resource by its canonical name
|
||||
resources: HashMap<String, Resource>,
|
||||
resources: HashMap<String, ResourceImpl>,
|
||||
/// Stores mappings from aliases to their canonical resource names
|
||||
aliases: HashMap<String, String>,
|
||||
}
|
||||
@@ -130,16 +164,20 @@ impl ResourceStorage {
|
||||
|
||||
/// Adds a resource to storage so that it can be retrieved later.
|
||||
pub fn add_resource(&mut self, resource: Resource) -> Result<(), AddResourceError> {
|
||||
let resource_content: ResourceContent;
|
||||
|
||||
if let ResourceType::Mime(content_type) = &resource.kind {
|
||||
if !resource.dependencies.is_empty() && !content_type.supports_dependencies() {
|
||||
return Err(AddResourceError::ContentTypeDoesNotSupportDependencies);
|
||||
}
|
||||
|
||||
// Ensure the resource contents are valid base64 (and utf8 if applicable)
|
||||
let decoded = BASE64_STANDARD.decode(&resource.content)?;
|
||||
if content_type.is_textual() {
|
||||
let _ = String::from_utf8(decoded)?;
|
||||
resource_content = ResourceContent::text_from_base64(&resource.content)?;
|
||||
} else {
|
||||
resource_content = ResourceContent::raw_from_base64(&resource.content)?;
|
||||
}
|
||||
} else {
|
||||
resource_content = ResourceContent::text_from_base64(&resource.content)?;
|
||||
}
|
||||
|
||||
for ident in std::iter::once(&resource.name).chain(resource.aliases.iter()) {
|
||||
@@ -151,7 +189,14 @@ impl ResourceStorage {
|
||||
resource.aliases.iter().for_each(|alias| {
|
||||
self.aliases.insert(alias.clone(), resource.name.clone());
|
||||
});
|
||||
self.resources.insert(resource.name.clone(), resource);
|
||||
let resource_impl = ResourceImpl {
|
||||
name: resource.name.clone(),
|
||||
kind: resource.kind,
|
||||
content: resource_content,
|
||||
dependencies: resource.dependencies,
|
||||
permission: resource.permission,
|
||||
};
|
||||
self.resources.insert(resource.name, resource_impl);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -176,11 +221,9 @@ impl ResourceStorage {
|
||||
let mut result = String::new();
|
||||
|
||||
for dep in deps.iter() {
|
||||
if let Ok(decoded) = BASE64_STANDARD.decode(&dep.content) {
|
||||
if let Ok(dep) = core::str::from_utf8(&decoded) {
|
||||
result += dep;
|
||||
result += "\n";
|
||||
}
|
||||
if let ResourceContent::Text(content) = &dep.content {
|
||||
result += content;
|
||||
result += "\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,7 +240,7 @@ impl ResourceStorage {
|
||||
fn recursive_dependencies<'a: 'b, 'b>(
|
||||
&'a self,
|
||||
new_dep: &str,
|
||||
prev_deps: &mut Vec<&'b Resource>,
|
||||
prev_deps: &mut Vec<&'b ResourceImpl>,
|
||||
filter_permission: PermissionMask,
|
||||
) -> Result<(), ScriptletResourceError> {
|
||||
if prev_deps.iter().any(|dep| dep.name == new_dep) {
|
||||
@@ -221,7 +264,7 @@ impl ResourceStorage {
|
||||
&'a self,
|
||||
scriptlet_args: &str,
|
||||
filter_permission: PermissionMask,
|
||||
required_deps: &mut Vec<&'b Resource>,
|
||||
required_deps: &mut Vec<&'b ResourceImpl>,
|
||||
) -> Result<String, ScriptletResourceError> {
|
||||
// `unwrap` is safe because these are guaranteed valid at filter parsing.
|
||||
let scriptlet_args = parse_scriptlet_args(scriptlet_args).unwrap();
|
||||
@@ -247,7 +290,12 @@ impl ResourceStorage {
|
||||
self.recursive_dependencies(dep, required_deps, filter_permission)?;
|
||||
}
|
||||
|
||||
let template = String::from_utf8(BASE64_STANDARD.decode(&resource.content)?)?;
|
||||
let template = match &resource.content {
|
||||
ResourceContent::Raw(_content) => {
|
||||
return Err(ScriptletResourceError::ContentTypeNotInjectable);
|
||||
}
|
||||
ResourceContent::Text(content) => content.clone(),
|
||||
};
|
||||
|
||||
if let Some(function_name) = extract_function_name(&template) {
|
||||
// newer function-style resource: pass args using function call syntax
|
||||
@@ -284,7 +332,12 @@ impl ResourceStorage {
|
||||
return None;
|
||||
}
|
||||
if let ResourceType::Mime(mime) = &resource.kind {
|
||||
Some(format!("data:{};base64,{}", mime, &resource.content))
|
||||
let bytes = match &resource.content {
|
||||
ResourceContent::Raw(content) => content,
|
||||
ResourceContent::Text(content) => content.as_bytes(),
|
||||
};
|
||||
let encoded = BASE64_STANDARD.encode(bytes);
|
||||
Some(format!("data:{};base64,{}", mime, encoded))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
@@ -292,7 +345,7 @@ impl ResourceStorage {
|
||||
}
|
||||
|
||||
/// Gets the resource associated with `resource_ident`, respecting aliases if necessary.
|
||||
fn get_internal_resource(&self, resource_ident: &str) -> Option<&Resource> {
|
||||
fn get_internal_resource(&self, resource_ident: &str) -> Option<&ResourceImpl> {
|
||||
let resource = if let Some(resource) = self.resources.get(resource_ident) {
|
||||
Some(resource)
|
||||
} else if let Some(canonical_name) = self.aliases.get(resource_ident) {
|
||||
@@ -308,7 +361,7 @@ impl ResourceStorage {
|
||||
&self,
|
||||
scriptlet_name: &str,
|
||||
filter_permission: PermissionMask,
|
||||
) -> Result<&Resource, ScriptletResourceError> {
|
||||
) -> Result<&ResourceImpl, ScriptletResourceError> {
|
||||
let resource = self
|
||||
.get_internal_resource(scriptlet_name)
|
||||
.ok_or(ScriptletResourceError::NoMatchingScriptlet)?;
|
||||
|
||||
Reference in New Issue
Block a user