From eaae6c2774c37e248e74dc1a05bbbb6c88ff0bd4 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Mon, 2 Dec 2024 16:12:07 +0800 Subject: [PATCH] Feat: salvage `$document` and `$subdocument` from filters --- Build/lib/parse-filter.ts | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/Build/lib/parse-filter.ts b/Build/lib/parse-filter.ts index f2b893baf..d0509b132 100644 --- a/Build/lib/parse-filter.ts +++ b/Build/lib/parse-filter.ts @@ -142,7 +142,7 @@ export async function processFilterRules( ttl: number | null = null, allowThirdParty = false ): Promise<{ white: string[], black: string[], foundDebugDomain: boolean }> { - const [white, black, warningMessages] = await parentSpan.traceChild(`process filter rules: ${filterRulesUrl}`).traceAsyncFn((span) => fsFetchCache.applyWithHttp304AndMirrors>( + const [white, black, warningMessages] = await parentSpan.traceChild(`process filter rules: ${filterRulesUrl}`).traceAsyncFn((span) => fsFetchCache.applyWithHttp304AndMirrors>( filterRulesUrl, fallbackUrls ?? [], getFileContentHash(__filename), @@ -334,13 +334,23 @@ export function parse($line: string, result: [string, ParseType], allowThirdPart || filter.isRedirectRule() || filter.hasDomains() || filter.isCSP() // must not be csp rule - || (!filter.fromAny() && !filter.fromDocument()) + || (!filter.fromHttp() && !filter.fromHttps()) ) { // not supported type result[1] = ParseType.Null; return result; } + if ( + !filter.fromAny() + // $image, $websocket, $xhr this are all non-any + && !filter.fromDocument() // $document, $doc + && !filter.fromSubdocument() // $subdocument, $subdoc + ) { + result[1] = ParseType.Null; + return result; + } + if ( filter.hostname // filter.hasHostname() // must have && filter.isPlain() // isPlain() === !isRegex() @@ -366,10 +376,11 @@ export function parse($line: string, result: [string, ParseType], allowThirdPart const _1p = filter.firstParty(); const _3p = filter.thirdParty(); - if (_1p) { - if (_1p === _3p) { + if (_1p) { // first party is true + if (_3p) { // third party is also true result[0] = hostname; result[1] = isIncludeAllSubDomain ? ParseType.BlackIncludeSubdomain : ParseType.BlackAbsolute; + return result; } result[1] = ParseType.Null; @@ -549,6 +560,16 @@ export function parse($line: string, result: [string, ParseType], allowThirdPart return result; } + // if (line.endsWith('$image')) { + // /** + // * Some $image filters are not NetworkFilter: + // * + // * `app.site123.com$image` + // * `t.signaux$image` + // * `track.customer.io$image` + // */ + // } + const lineStartsWithSingleDot = firstCharCode === 46; // 46 `.` if ( lineStartsWithSingleDot