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; }