From 1a5d490c06a40baa5aaa7a72e107cdbffe04e0d4 Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Thu, 21 Aug 2025 22:02:38 +0100 Subject: [PATCH 1/3] Add basic element hiding poc tests --- injected/integration-test/pages.spec.js | 9 + .../element-hiding/config/element-hiding.json | 46 ++++ .../test-pages/element-hiding/index.html | 228 ++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 injected/integration-test/test-pages/element-hiding/config/element-hiding.json create mode 100644 injected/integration-test/test-pages/element-hiding/index.html diff --git a/injected/integration-test/pages.spec.js b/injected/integration-test/pages.spec.js index 7bf7a5fc62..21f9150ffe 100644 --- a/injected/integration-test/pages.spec.js +++ b/injected/integration-test/pages.spec.js @@ -97,6 +97,15 @@ test.describe('Test integration pages', () => { ); }); + test('Element hiding functionality', async ({ page }, testInfo) => { + await testPage( + page, + testInfo, + '/element-hiding/index.html', + './integration-test/test-pages/element-hiding/config/element-hiding.json', + ); + }); + test('Web compat shims correctness', async ({ page }, testInfo) => { // prettier-ignore await testPage( diff --git a/injected/integration-test/test-pages/element-hiding/config/element-hiding.json b/injected/integration-test/test-pages/element-hiding/config/element-hiding.json new file mode 100644 index 0000000000..e9ff0d3688 --- /dev/null +++ b/injected/integration-test/test-pages/element-hiding/config/element-hiding.json @@ -0,0 +1,46 @@ +{ + "readme": "This config is used to test the element hiding feature functionality.", + "version": 1, + "features": { + "elementHiding": { + "state": "enabled", + "exceptions": [], + "settings": { + "useStrictHideStyleTag": false, + "rules": [ + { + "selector": ".hide-test", + "type": "hide" + }, + { + "selector": ".hide-empty-test", + "type": "hide-empty" + }, + { + "selector": ".closest-empty-test", + "type": "closest-empty" + } + ], + "hideTimeouts": [0, 100, 300, 500, 1000], + "unhideTimeouts": [1250, 2250, 3000], + "adLabelStrings": [ + "advertisement", + "sponsored", + "ad" + ], + "domains": [ + { + "domain": "localhost:3000", + "rules": [ + { + "selector": "[class^='ad-container']", + "type": "override" + } + ] + } + ] + } + } + }, + "unprotectedTemporary": [] +} diff --git a/injected/integration-test/test-pages/element-hiding/index.html b/injected/integration-test/test-pages/element-hiding/index.html new file mode 100644 index 0000000000..cdaff088c2 --- /dev/null +++ b/injected/integration-test/test-pages/element-hiding/index.html @@ -0,0 +1,228 @@ + + + + + + Element Hiding + + + + + +

[Test Pages]

+ +

This page verifies that element hiding rules work correctly

+ + +
+
+ This element should be hidden by 'hide' rule. +
+
+ + +
+
+ +
+
+ Advertisement +
+
+ This element should not be hidden because it has text content. +
+
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
+ +
+
+ Advertisement +
+
+
+
+ +
+
+ Lorem Ipsum +
+
+
+ + +
+
+ This element should not be hidden due to override rule. +
+
+ + + + From f536dff90a6869397934e67363ff537fdad7b17e Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Fri, 22 Aug 2025 01:29:43 +0100 Subject: [PATCH 2/3] Fix up --- .../element-hiding/config/element-hiding.json | 17 ++- .../test-pages/element-hiding/index.html | 120 +++++++++++++++++- injected/integration-test/type-helpers.mjs | 1 + injected/playwright.config.js | 5 + 4 files changed, 137 insertions(+), 6 deletions(-) diff --git a/injected/integration-test/test-pages/element-hiding/config/element-hiding.json b/injected/integration-test/test-pages/element-hiding/config/element-hiding.json index e9ff0d3688..379f339cde 100644 --- a/injected/integration-test/test-pages/element-hiding/config/element-hiding.json +++ b/injected/integration-test/test-pages/element-hiding/config/element-hiding.json @@ -6,7 +6,8 @@ "state": "enabled", "exceptions": [], "settings": { - "useStrictHideStyleTag": false, + "additionalCheck": "enabled", + "useStrictHideStyleTag": true, "rules": [ { "selector": ".hide-test", @@ -21,12 +22,20 @@ "type": "closest-empty" } ], - "hideTimeouts": [0, 100, 300, 500, 1000], - "unhideTimeouts": [1250, 2250, 3000], + "hideTimeouts": [0, 100, 300, 500, 1000, 1500, 2000, 3000, 5000], + "unhideTimeouts": [1250, 2250, 3250, 5250], + "mediaAndFormSelectors": "video,canvas,embed,object,audio,map,form,input,textarea,select,option", "adLabelStrings": [ + "ad", + "advert", "advertisement", + "advertisements", + "advertising", + "sponsor message", "sponsored", - "ad" + "close", + "close ad", + "skip ad" ], "domains": [ { diff --git a/injected/integration-test/test-pages/element-hiding/index.html b/injected/integration-test/test-pages/element-hiding/index.html index cdaff088c2..aca72ced94 100644 --- a/injected/integration-test/test-pages/element-hiding/index.html +++ b/injected/integration-test/test-pages/element-hiding/index.html @@ -97,8 +97,8 @@ + diff --git a/injected/integration-test/type-helpers.mjs b/injected/integration-test/type-helpers.mjs index 5b348a85d4..16fdbb577d 100644 --- a/injected/integration-test/type-helpers.mjs +++ b/injected/integration-test/type-helpers.mjs @@ -63,6 +63,7 @@ export class Build { 'apple-isolated': () => '../build/apple/contentScopeIsolated.js', 'android-autofill-password-import': () => '../build/android/autofillPasswordImport.js', 'android-broker-protection': () => '../build/android/brokerProtection.js', + integration: () => '../build/integration/contentScope.js', }); return readFileSync(path, 'utf8'); } diff --git a/injected/playwright.config.js b/injected/playwright.config.js index 9998380b86..3e2a58115b 100644 --- a/injected/playwright.config.js +++ b/injected/playwright.config.js @@ -77,6 +77,11 @@ export default defineConfig({ testMatch: 'integration-test/remote-pages.spec.js', use: { injectName: 'firefox', platform: 'extension', ...devices['Desktop Firefox'] }, }, + { + name: 'integration', + testMatch: ['integration-test/pages.spec.js'], + use: { injectName: 'integration', platform: 'macos', ...devices['Desktop Chrome'] }, + }, ], timeout: 30 * 1000, expect: { From 9bfe0fbc75eabbcbee22ca132958cb9a1a653cce Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Fri, 22 Aug 2025 01:47:03 +0100 Subject: [PATCH 3/3] Add result collector changes --- injected/integration-test/page-objects/results-collector.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/injected/integration-test/page-objects/results-collector.js b/injected/integration-test/page-objects/results-collector.js index 5df44c70d2..90feef4845 100644 --- a/injected/integration-test/page-objects/results-collector.js +++ b/injected/integration-test/page-objects/results-collector.js @@ -166,6 +166,9 @@ export class ResultsCollector { 'android-autofill-password-import': async () => { // noop }, + integration: async () => { + // noop + }, }); const messagingMock = this.build.switch({ @@ -174,6 +177,7 @@ export class ResultsCollector { windows: () => mockWindowsMessaging, android: () => mockAndroidMessaging, 'android-autofill-password-import': () => mockAndroidMessaging, + integration: () => mockResponses, }); await this.page.addInitScript(messagingMock, { @@ -189,6 +193,7 @@ export class ResultsCollector { android: () => wrapWebkitScripts, 'android-autofill-password-import': () => wrapWebkitScripts, windows: () => wrapWindowsScripts, + integration: () => wrapWebkitScripts, }); // read the built file from disk and do replacements