Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: brave/adblock-rust
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v0.9.5
Choose a base ref
...
head repository: brave/adblock-rust
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v0.9.6
Choose a head ref
  • 3 commits
  • 15 files changed
  • 3 contributors

Commits on Mar 13, 2025

  1. bump base64 to 0.22

    bridiver authored and antonok-edm committed Mar 13, 2025

    Verified

    This commit was signed with the committer’s verified signature.
    antonok-edm Anton Lazarev
    Copy the full SHA
    33025bf View commit details
  2. Merge pull request #443 from brave/bump-base64-0.9.x

    Bump base64 (0.9.x)
    antonok-edm authored Mar 13, 2025

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    d168421 View commit details
  3. v0.9.6 - bump base64 to v0.22

    antonok-edm committed Mar 13, 2025

    Verified

    This commit was signed with the committer’s verified signature.
    antonok-edm Anton Lazarev
    Copy the full SHA
    b59e60c View commit details
16 changes: 11 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "adblock"
version = "0.9.5"
version = "0.9.6"
authors = ["Anton Lazarev <alazarev@brave.com>", "Andrius Aucinas"]
edition = "2021"

@@ -34,7 +34,7 @@ idna = "1.0.3"
serde = { version = "1.0", features = ["derive", "rc"] }
seahash = "3" # seahash 4 introduces a breaking hash algorithm change
memchr = "2.4"
base64 = "0.13"
base64 = "0.22"
rmp-serde = "0.15"
lifeguard = { version = "^ 0.6.1", optional = true }
cssparser = { version = "0.29", optional = true }
3 changes: 2 additions & 1 deletion benches/bench_redirect_performance.rs
Original file line number Diff line number Diff line change
@@ -126,6 +126,7 @@ fn build_resources_for_filters(#[allow(unused)] filters: &[NetworkFilter]) -> Re
#[cfg(not(feature = "resource-assembler"))]
{
use adblock::resources::{Resource, ResourceType, MimeType};
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};

filters
.iter()
@@ -141,7 +142,7 @@ fn build_resources_for_filters(#[allow(unused)] filters: &[NetworkFilter]) -> Re
name: redirect.to_owned(),
aliases: vec![],
kind: ResourceType::Mime(MimeType::from_extension(&redirect)),
content: base64::encode(redirect),
content: BASE64_STANDARD.encode(redirect),
dependencies: vec![],
permission: Default::default(),
}
6 changes: 3 additions & 3 deletions fuzz/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions js/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion js/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "adblock-rs"
version = "0.9.5"
version = "0.9.6"
authors = ["Anton Lazarev <alazarev@brave.com>", "Andrius Aucinas"]
edition = "2018"
license = "MPL-2.0"
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "adblock-rs",
"version": "0.9.5",
"version": "0.9.6",
"description": "Very fast, Rust-based, native implementation of ad-blocker engine for Node",
"keywords": [
"adblock",
3 changes: 2 additions & 1 deletion src/blocker.rs
Original file line number Diff line number Diff line change
@@ -1334,6 +1334,7 @@ mod blocker_tests {
use crate::lists::parse_filters;
use crate::resources::Resource;
use crate::request::Request;
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
use std::collections::HashSet;
use std::iter::FromIterator;

@@ -1841,7 +1842,7 @@ fn test_removeparam_same_tokens() {
let mut resources = ResourceStorage::default();
fn add_simple_resource(resources: &mut ResourceStorage, identifier: &str) -> Option<String> {
resources.add_resource(Resource::simple(identifier, crate::resources::MimeType::TextPlain, identifier)).unwrap();
Some(format!("data:text/plain;base64,{}", base64::encode(identifier)))
Some(format!("data:text/plain;base64,{}", BASE64_STANDARD.encode(identifier)))
}
let a_redirect = add_simple_resource(&mut resources, "a");
let b_redirect = add_simple_resource(&mut resources, "b");
5 changes: 3 additions & 2 deletions src/cosmetic_filter_cache.rs
Original file line number Diff line number Diff line change
@@ -604,6 +604,7 @@ mod key_from_selector_tests {
mod cosmetic_cache_tests {
use super::*;
use crate::resources::Resource;
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};

fn cache_from_rules(rules: Vec<&str>) -> CosmeticFilterCache {
let parsed_rules = rules
@@ -715,7 +716,7 @@ mod cosmetic_cache_tests {
name: "set-constant.js".into(),
aliases: vec![],
kind: ResourceType::Template,
content: base64::encode("set-constant.js, {{1}}, {{2}}"),
content: BASE64_STANDARD.encode("set-constant.js, {{1}}, {{2}}"),
dependencies: vec![],
permission: Default::default(),
},
@@ -1151,7 +1152,7 @@ mod cosmetic_cache_tests {
name: "abort-on-property-read.js".into(),
aliases: vec!["aopr".to_string()],
kind: ResourceType::Template,
content: base64::encode("abort-on-property-read.js, {{1}}"),
content: BASE64_STANDARD.encode("abort-on-property-read.js, {{1}}"),
dependencies: vec![],
permission: Default::default(),
}
9 changes: 5 additions & 4 deletions src/engine.rs
Original file line number Diff line number Diff line change
@@ -256,6 +256,7 @@ mod tests {
use super::*;
use crate::resources::MimeType;
use crate::lists::FilterFormat;
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};

#[test]
fn tags_enable_adds_tags() {
@@ -518,7 +519,7 @@ mod tests {
let request = Request::new(url, "", "").unwrap();
let matched_rule = engine.check_network_request(&request);
assert!(matched_rule.matched, "Expected match for {}", url);
assert_eq!(matched_rule.redirect, Some(format!("data:application/javascript;base64,{}", base64::encode(format!("{}", script)))), "Expected redirect to contain resource");
assert_eq!(matched_rule.redirect, Some(format!("data:application/javascript;base64,{}", BASE64_STANDARD.encode(format!("{}", script)))), "Expected redirect to contain resource");
}

#[test]
@@ -798,15 +799,15 @@ mod tests {
name: "trusted-set-cookie.js".to_string(),
aliases: vec![],
kind: ResourceType::Mime(MimeType::ApplicationJavascript),
content: base64::encode("trusted-set-cookie"),
content: BASE64_STANDARD.encode("trusted-set-cookie"),
dependencies: vec![],
permission: UBO_PERM,
},
Resource {
name: "brave-fix.js".to_string(),
aliases: vec![],
kind: ResourceType::Mime(MimeType::ApplicationJavascript),
content: base64::encode("brave-fix"),
content: BASE64_STANDARD.encode("brave-fix"),
dependencies: vec![],
permission: BRAVE_PERM,
},
@@ -864,7 +865,7 @@ mod tests {
name: "trusted-set-local-storage-item.js".into(),
aliases: vec![],
kind: ResourceType::Mime(MimeType::ApplicationJavascript),
content: base64::encode("function trustedSetLocalStorageItem(key = '', value = '') { setLocalStorageItemFn('local', true, key, value); }"),
content: BASE64_STANDARD.encode("function trustedSetLocalStorageItem(key = '', value = '') { setLocalStorageItemFn('local', true, key, value); }"),
dependencies: vec![],
permission: Default::default(),
},
3 changes: 2 additions & 1 deletion src/resources/mod.rs
Original file line number Diff line number Diff line change
@@ -156,11 +156,12 @@ impl Resource {
/// dependencies. Content will be automatically base64-encoded by the constructor.
#[cfg(test)]
pub fn simple(name: &str, kind: MimeType, content: &str) -> Self {
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
Self {
name: name.to_string(),
aliases: vec![],
kind: ResourceType::Mime(kind),
content: base64::encode(content),
content: BASE64_STANDARD.encode(content),
dependencies: vec![],
permission: Default::default(),
}
17 changes: 10 additions & 7 deletions src/resources/resource_assembler.rs
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@
//! files in the uBlock Origin repository.
use crate::resources::{MimeType, Resource, ResourceType};
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
use memchr::memmem;
use once_cell::sync::Lazy;
use regex::Regex;
@@ -193,7 +194,7 @@ fn read_template_resources(scriptlets_data: &str) -> Vec<Resource> {
.map(|aliases| aliases.iter().map(|alias| alias.to_string()).collect())
.unwrap_or_default(),
kind,
content: base64::encode(&script),
content: BASE64_STANDARD.encode(&script),
dependencies: vec![],
permission: Default::default(),
});
@@ -222,9 +223,9 @@ fn build_resource_from_file_contents(
let content = match mimetype {
MimeType::ApplicationJavascript | MimeType::TextHtml | MimeType::TextPlain => {
let utf8string = std::str::from_utf8(resource_contents).unwrap();
base64::encode(&utf8string.replace('\r', ""))
BASE64_STANDARD.encode(&utf8string.replace('\r', ""))
}
_ => base64::encode(&resource_contents),
_ => BASE64_STANDARD.encode(&resource_contents),
};

Resource {
@@ -397,7 +398,9 @@ mod tests {
.replace('\r', "");
assert_eq!(
std::str::from_utf8(
&base64::decode(&reserialized[34].content).expect("decode base64 content")
&BASE64_STANDARD
.decode(&reserialized[34].content)
.expect("decode base64 content")
)
.expect("convert to utf8 string"),
noopjs_contents,
@@ -489,7 +492,7 @@ mod tests {
);
assert_eq!(
std::str::from_utf8(
&base64::decode(&reserialized[20].content).expect("decode base64 content")
&BASE64_STANDARD.decode(&reserialized[20].content).expect("decode base64 content")
).expect("convert to utf8 string"),
"(function() {\nif ( window !== window.top ) {\nreturn;\n}\nvar tstart;\nvar ttl = 30000;\nvar delay = 0;\nvar delayStep = 50;\nvar buster = function() {\nvar docEl = document.documentElement,\nbodyEl = document.body,\nvw = Math.min(docEl.clientWidth, window.innerWidth),\nvh = Math.min(docEl.clientHeight, window.innerHeight),\ntol = Math.min(vw, vh) * 0.05,\nel = document.elementFromPoint(vw/2, vh/2),\nstyle, rect;\nfor (;;) {\nif ( el === null || el.parentNode === null || el === bodyEl ) {\nbreak;\n}\nstyle = window.getComputedStyle(el);\nif ( parseInt(style.zIndex, 10) >= 1000 || style.position === 'fixed' ) {\nrect = el.getBoundingClientRect();\nif ( rect.left <= tol && rect.top <= tol && (vw - rect.right) <= tol && (vh - rect.bottom) < tol ) {\nel.parentNode.removeChild(el);\ntstart = Date.now();\nel = document.elementFromPoint(vw/2, vh/2);\nbodyEl.style.setProperty('overflow', 'auto', 'important');\ndocEl.style.setProperty('overflow', 'auto', 'important');\ncontinue;\n}\n}\nel = el.parentNode;\n}\nif ( (Date.now() - tstart) < ttl ) {\ndelay = Math.min(delay + delayStep, 1000);\nsetTimeout(buster, delay);\n}\n};\nvar domReady = function(ev) {\nif ( ev ) {\ndocument.removeEventListener(ev.type, domReady);\n}\ntstart = Date.now();\nsetTimeout(buster, delay);\n};\nif ( document.readyState === 'loading' ) {\ndocument.addEventListener('DOMContentLoaded', domReady);\n} else {\ndomReady();\n}\n})();\n",
);
@@ -499,7 +502,7 @@ mod tests {
assert_eq!(reserialized[6].kind, ResourceType::Template);
assert_eq!(
std::str::from_utf8(
&base64::decode(&reserialized[6].content).expect("decode base64 content")
&BASE64_STANDARD.decode(&reserialized[6].content).expect("decode base64 content")
).expect("convert to utf8 string"),
"(function() {\nconst rawPrunePaths = '{{1}}';\nconst rawNeedlePaths = '{{2}}';\nconst prunePaths = rawPrunePaths !== '{{1}}' && rawPrunePaths !== ''\n? rawPrunePaths.split(/ +/)\n: [];\nlet needlePaths;\nlet log, reLogNeedle;\nif ( prunePaths.length !== 0 ) {\nneedlePaths = prunePaths.length !== 0 &&\nrawNeedlePaths !== '{{2}}' && rawNeedlePaths !== ''\n? rawNeedlePaths.split(/ +/)\n: [];\n} else {\nlog = console.log.bind(console);\nlet needle;\nif ( rawNeedlePaths === '' || rawNeedlePaths === '{{2}}' ) {\nneedle = '.?';\n} else if ( rawNeedlePaths.charAt(0) === '/' && rawNeedlePaths.slice(-1) === '/' ) {\nneedle = rawNeedlePaths.slice(1, -1);\n} else {\nneedle = rawNeedlePaths.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\nreLogNeedle = new RegExp(needle);\n}\nconst findOwner = function(root, path, prune = false) {\nlet owner = root;\nlet chain = path;\nfor (;;) {\nif ( typeof owner !== 'object' || owner === null ) {\nreturn false;\n}\nconst pos = chain.indexOf('.');\nif ( pos === -1 ) {\nif ( prune === false ) {\nreturn owner.hasOwnProperty(chain);\n}\nif ( chain === '*' ) {\nfor ( const key in owner ) {\nif ( owner.hasOwnProperty(key) === false ) { continue; }\ndelete owner[key];\n}\n} else if ( owner.hasOwnProperty(chain) ) {\ndelete owner[chain];\n}\nreturn true;\n}\nconst prop = chain.slice(0, pos);\nif (\nprop === '[]' && Array.isArray(owner) ||\nprop === '*' && owner instanceof Object\n) {\nconst next = chain.slice(pos + 1);\nlet found = false;\nfor ( const key of Object.keys(owner) ) {\nfound = findOwner(owner[key], next, prune) || found;\n}\nreturn found;\n}\nif ( owner.hasOwnProperty(prop) === false ) { return false; }\nowner = owner[prop];\nchain = chain.slice(pos + 1);\n}\n};\nconst mustProcess = function(root) {\nfor ( const needlePath of needlePaths ) {\nif ( findOwner(root, needlePath) === false ) {\nreturn false;\n}\n}\nreturn true;\n};\nconst pruner = function(o) {\nif ( log !== undefined ) {\nconst json = JSON.stringify(o, null, 2);\nif ( reLogNeedle.test(json) ) {\nlog('uBO:', location.hostname, json);\n}\nreturn o;\n}\nif ( mustProcess(o) === false ) { return o; }\nfor ( const path of prunePaths ) {\nfindOwner(o, path, true);\n}\nreturn o;\n};\nJSON.parse = new Proxy(JSON.parse, {\napply: function() {\nreturn pruner(Reflect.apply(...arguments));\n},\n});\nResponse.prototype.json = new Proxy(Response.prototype.json, {\napply: function() {\nreturn Reflect.apply(...arguments).then(o => pruner(o));\n},\n});\n})();\n",
);
@@ -581,7 +584,7 @@ mod tests {
);
assert_eq!(
std::str::from_utf8(
&base64::decode(&reserialized[18].content).expect("decode base64 content")
&BASE64_STANDARD.decode(&reserialized[18].content).expect("decode base64 content")
).expect("convert to utf8 string"),
"(function() {\nif ( window !== window.top ) {\nreturn;\n}\nvar tstart;\nvar ttl = 30000;\nvar delay = 0;\nvar delayStep = 50;\nvar buster = function() {\nvar docEl = document.documentElement,\nbodyEl = document.body,\nvw = Math.min(docEl.clientWidth, window.innerWidth),\nvh = Math.min(docEl.clientHeight, window.innerHeight),\ntol = Math.min(vw, vh) * 0.05,\nel = document.elementFromPoint(vw/2, vh/2),\nstyle, rect;\nfor (;;) {\nif ( el === null || el.parentNode === null || el === bodyEl ) {\nbreak;\n}\nstyle = window.getComputedStyle(el);\nif ( parseInt(style.zIndex, 10) >= 1000 || style.position === 'fixed' ) {\nrect = el.getBoundingClientRect();\nif ( rect.left <= tol && rect.top <= tol && (vw - rect.right) <= tol && (vh - rect.bottom) < tol ) {\nel.parentNode.removeChild(el);\ntstart = Date.now();\nel = document.elementFromPoint(vw/2, vh/2);\nbodyEl.style.setProperty('overflow', 'auto', 'important');\ndocEl.style.setProperty('overflow', 'auto', 'important');\ncontinue;\n}\n}\nel = el.parentNode;\n}\nif ( (Date.now() - tstart) < ttl ) {\ndelay = Math.min(delay + delayStep, 1000);\nsetTimeout(buster, delay);\n}\n};\nvar domReady = function(ev) {\nif ( ev ) {\ndocument.removeEventListener(ev.type, domReady);\n}\ntstart = Date.now();\nsetTimeout(buster, delay);\n};\nif ( document.readyState === 'loading' ) {\ndocument.addEventListener('DOMContentLoaded', domReady);\n} else {\ndomReady();\n}\n})();\n",
);
Loading