From bf47230cff813453b8029b5e19d9f9d376ee65f5 Mon Sep 17 00:00:00 2001 From: Vladimir Zhelvis Date: Tue, 11 Jul 2023 12:04:15 +0300 Subject: [PATCH] Pull request #574: AG-23564 Fallback cosmetic result request for frames, cached by sw Merge in ADGUARD-FILTERS/tsurlfilter from feature/AG-23564 to master Squashed commit of the following: commit e16b6ad2f38ae89190261338282ed6437ae24eca Author: Vladimir Zhelvis Date: Mon Jul 10 20:46:59 2023 +0300 update changelog commit e91453cde3b1d47621899eaa5222c4dee716997a Merge: 23fceabb 88914a55 Author: Vladimir Zhelvis Date: Mon Jul 10 20:40:55 2023 +0300 Merge branch 'master' into feature/AG-23564 commit 23fceabbd939435aec0dbe0bc03f68b237b8ef68 Author: Vladimir Zhelvis Date: Mon Jul 10 20:40:22 2023 +0300 add cosmetic result fallback calculation --- packages/tswebextension/CHANGELOG.md | 6 +++- packages/tswebextension/package.json | 2 +- .../src/lib/mv2/background/cosmetic-api.ts | 33 +++++++++++++++---- .../src/lib/mv2/background/engine-api.ts | 22 +++++++++++++ .../src/lib/mv2/background/web-request-api.ts | 27 ++++++++++++--- 5 files changed, 76 insertions(+), 14 deletions(-) diff --git a/packages/tswebextension/CHANGELOG.md b/packages/tswebextension/CHANGELOG.md index 22f0b8dae..a9dd7c7d8 100644 --- a/packages/tswebextension/CHANGELOG.md +++ b/packages/tswebextension/CHANGELOG.md @@ -7,11 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 -## Unreleased +## [0.3.4] - 2023-07-11 ### Added - Support of $elemhide, $specifichide and $generichide modifiers. +### Fixed +- Cosmetic rule matching for frames loaded from the service worker cache. + + ## [0.3.3] - 2023-06-19 ### Changed diff --git a/packages/tswebextension/package.json b/packages/tswebextension/package.json index 8bdce37a1..d7f9183e5 100644 --- a/packages/tswebextension/package.json +++ b/packages/tswebextension/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/tswebextension", - "version": "0.3.3", + "version": "0.3.4", "description": "This is a TypeScript library that implements AdGuard's extension API", "main": "dist/index.js", "typings": "dist/types/lib/mv2/background/index.d.ts", diff --git a/packages/tswebextension/src/lib/mv2/background/cosmetic-api.ts b/packages/tswebextension/src/lib/mv2/background/cosmetic-api.ts index 58e760139..9f2a2b854 100644 --- a/packages/tswebextension/src/lib/mv2/background/cosmetic-api.ts +++ b/packages/tswebextension/src/lib/mv2/background/cosmetic-api.ts @@ -1,8 +1,7 @@ +/* eslint-disable jsdoc/require-returns */ import { nanoid } from 'nanoid'; -import type { - CosmeticResult, - CosmeticRule, -} from '@adguard/tsurlfilter'; +import { RequestType } from '@adguard/tsurlfilter/es/request-type'; +import type { CosmeticResult, CosmeticRule } from '@adguard/tsurlfilter'; import { appContext } from './context'; import { getDomain } from '../../common/utils/url'; @@ -12,7 +11,8 @@ import { buildScriptText } from './injection-helper'; import { localScriptRulesService } from './services/local-script-rules-service'; import { stealthApi } from './stealth-api'; import { TabsApi } from './tabs/tabs-api'; -import { tabsApi } from './api'; +import { MAIN_FRAME_ID } from './tabs/frame'; +import { engineApi, tabsApi } from './api'; import { getErrorMessage } from '../../common/error'; import { logger } from '../../common/utils/logger'; @@ -209,12 +209,31 @@ export class CosmeticApi { extCssRules: null, }; - const frame = tabsApi.getTabFrame(tabId, frameId); + const tabContext = tabsApi.getTabContext(tabId); - if (!frame?.cosmeticResult) { + if (!tabContext) { + return data; + } + + const frame = tabContext.frames.get(frameId); + + if (!frame) { return data; } + /** + * Cosmetic result may not be committed to frame context during worker request processing. + * We use engine request as a fallback for this case. + */ + if (!frame?.cosmeticResult) { + frame.cosmeticResult = engineApi.matchCosmetic({ + requestUrl: frame.url, + frameUrl: frame.url, + requestType: frameId === MAIN_FRAME_ID ? RequestType.Document : RequestType.SubDocument, + frameRule: tabContext.mainFrameRule, + }); + } + data.extCssRules = CosmeticApi.getExtCssRules(frame.cosmeticResult, areHitsStatsCollected); return data; diff --git a/packages/tswebextension/src/lib/mv2/background/engine-api.ts b/packages/tswebextension/src/lib/mv2/background/engine-api.ts index b27d93386..53dfa1188 100644 --- a/packages/tswebextension/src/lib/mv2/background/engine-api.ts +++ b/packages/tswebextension/src/lib/mv2/background/engine-api.ts @@ -163,6 +163,28 @@ export class EngineApi { return this.engine.matchRequest(request, frameRule); } + /** + * Searched for cosmetic rules by match query. + * + * @param matchQuery Query against which the request would be matched. + * @returns Cosmetic result. + */ + public matchCosmetic(matchQuery: MatchQuery): CosmeticResult { + if (!this.engine || !this.isFilteringEnabled) { + return new CosmeticResult(); + } + + const matchingResult = this.matchRequest(matchQuery); + + if (!matchingResult) { + return new CosmeticResult(); + } + + const cosmeticOption = matchingResult.getCosmeticOption(); + + return this.getCosmeticResult(matchQuery.requestUrl, cosmeticOption); + } + /** * Matches current frame url and returns rule if found. * diff --git a/packages/tswebextension/src/lib/mv2/background/web-request-api.ts b/packages/tswebextension/src/lib/mv2/background/web-request-api.ts index 0b1d1fdf0..6c8981b30 100644 --- a/packages/tswebextension/src/lib/mv2/background/web-request-api.ts +++ b/packages/tswebextension/src/lib/mv2/background/web-request-api.ts @@ -638,16 +638,34 @@ export class WebRequestApi { const { frameId, tabId, + url, } = params; - const frame = tabsApi.getTabFrame(tabId, frameId); + const tabContext = tabsApi.getTabContext(tabId); - if (!frame - || !frame.cosmeticResult - || !frame.requestId) { + if (!tabContext) { return; } + const frame = tabContext.frames.get(frameId); + + if (!frame) { + return; + } + + /** + * Cosmetic result may not be committed to frame context during worker request processing. + * We use engine request as a fallback for this case. + */ + if (!frame.cosmeticResult) { + frame.cosmeticResult = engineApi.matchCosmetic({ + requestUrl: url, + frameUrl: url, + requestType: frameId === MAIN_FRAME_ID ? RequestType.Document : RequestType.SubDocument, + frameRule: tabContext.mainFrameRule, + }); + } + const { cosmeticResult } = frame; const cssInjectionParams: ApplyCssRulesParams = { @@ -712,7 +730,6 @@ export class WebRequestApi { if (!mainFrame || !mainFrame.cosmeticResult - || !mainFrame.requestId || !WebRequestApi.isLocalFrame(url, frameId, mainFrame.url)) { return; }