From 849f4a9d0cc197944b17902a87a4cf607a51b84b Mon Sep 17 00:00:00 2001 From: louix <28579246+louix@users.noreply.github.com> Date: Sat, 26 Sep 2020 19:59:14 +0100 Subject: [PATCH 01/10] feat: origin in per domain rules --- src/_locales/en/messages.json | 7 ++- src/background/isolation.ts | 37 ++++++++----- src/background/migration.ts | 2 +- src/background/mouseclick.ts | 2 +- src/background/utils.ts | 3 +- src/types.ts | 10 +++- src/ui/components/domainpattern.vue | 44 ++++++++++----- src/ui/components/isolation/global.vue | 2 +- src/ui/components/isolation/perdomain.vue | 66 +++++++++++------------ test/background.alwaysopenin.test.ts | 8 +-- test/background.isolation.test.ts | 14 ++--- test/background.mouseclicks.test.ts | 18 +++---- 12 files changed, 125 insertions(+), 88 deletions(-) diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index ccc5c410..fc3bef52 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -155,8 +155,11 @@ "optionsGeneralToolbarIconColorWhiteSimple": { "message": "white (simple)" }, - "optionsDomainPattern": { - "message": "Domain Pattern" + "optionsTargetPattern": { + "message": "Target Domain Pattern" + }, + "optionsOptionalOriginPattern": { + "message": "Origin Domain Pattern (Optional)" }, "optionsExclusionPattern": { "message": "Exclusion Pattern" diff --git a/src/background/isolation.ts b/src/background/isolation.ts index 97eebc80..32a77123 100644 --- a/src/background/isolation.ts +++ b/src/background/isolation.ts @@ -8,7 +8,6 @@ import { BrowserAction } from './browseraction'; import { PageAction } from './pageaction'; import { Storage } from './storage'; import { Utils } from './utils'; -import { StorageLocal } from '~/types'; import { PreferencesSchema, IsolationAction, @@ -398,20 +397,29 @@ export class Isolation { const parsedRequestURL = new URL(request.url); for (const patternPreferences of this.pref.isolation.domain) { - const domainPattern = patternPreferences.pattern; + const targetDomainPattern = patternPreferences.targetPattern; + const originDomainPattern = patternPreferences.originPattern; - if ( - !this.utils.matchDomainPattern( - (tab.url === 'about:blank' && - openerTab && - openerTab.url.startsWith('http') && - openerTab.url) || - tab.url, - domainPattern - ) - ) { + const originUrl = + (tab.url === 'about:blank' && + openerTab && + openerTab.url.startsWith('http') && + openerTab.url) || + tab.url; + + const originUrlMatches = this.utils.matchDomainPattern( + originUrl, + originDomainPattern + ); + const targetUrlMatches = this.utils.matchDomainPattern( + request.url, + targetDomainPattern + ); + + if (!targetUrlMatches || !originUrlMatches) { continue; } + if (patternPreferences.excluded) { for (const excludedDomainPattern of Object.keys( patternPreferences.excluded @@ -434,7 +442,8 @@ export class Isolation { const navigationPreferences = patternPreferences.navigation; this.debug( '[shouldIsolateNavigation] found pattern', - domainPattern, + targetDomainPattern, + originDomainPattern, navigationPreferences ); @@ -484,7 +493,7 @@ export class Isolation { } for (const patternPreferences of this.pref.isolation.domain) { - const domainPattern = patternPreferences.pattern; + const domainPattern = patternPreferences.targetPattern; if (!this.utils.matchDomainPattern(request.url, domainPattern)) { continue; } diff --git a/src/background/migration.ts b/src/background/migration.ts index e91d4998..284819c0 100644 --- a/src/background/migration.ts +++ b/src/background/migration.ts @@ -84,7 +84,7 @@ export class Migration { perDomainIsolation.push( Object.assign( { - pattern: domainPattern, + targetPattern: domainPattern, }, preferences.isolation.domain[domainPattern] ) diff --git a/src/background/mouseclick.ts b/src/background/mouseclick.ts index 45941b8b..519010a5 100644 --- a/src/background/mouseclick.ts +++ b/src/background/mouseclick.ts @@ -174,7 +174,7 @@ export class MouseClick { this.debug('[checkClick] checking click', type, message, sender); for (const domainPatternPreferences of this.pref.isolation.domain) { - const domainPattern = domainPatternPreferences.pattern; + const domainPattern = domainPatternPreferences.targetPattern; if (!this.utils.matchDomainPattern(tab.url, domainPattern)) { continue; } diff --git a/src/background/utils.ts b/src/background/utils.ts index 5d43a962..e253a0ff 100644 --- a/src/background/utils.ts +++ b/src/background/utils.ts @@ -19,7 +19,8 @@ export class Utils { return parsedOrigin.domain === parsedTarget.domain; } - matchDomainPattern(url: string, domainPattern: string): boolean { + matchDomainPattern(url: string, domainPattern?: string): boolean { + if (!domainPattern) return true; if (domainPattern.startsWith('/')) { const regexp = domainPattern.match(/^\s*\/(.*)\/([gimsuy]+)?\s*$/); if (!regexp) { diff --git a/src/types.ts b/src/types.ts index 4ad05770..1751c2b3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -84,7 +84,8 @@ export interface IsolationGlobal { } export interface IsolationDomain extends IsolationGlobal { - pattern: string; + targetPattern: string; + originPattern?: string; always: { action: 'enabled' | 'disabled'; allowedInPermanent: boolean; @@ -279,3 +280,10 @@ export interface WebRequestOnBeforeRequestDetails extends browser.webRequest._OnBeforeRequestDetails { cookieStoreId: string; } + +export interface ToolTip { + hidden: boolean; + position?: 'bottom left' | 'top left'; +} + +export type DomainPatternType = 'target' | 'origin' | 'exclusion'; diff --git a/src/ui/components/domainpattern.vue b/src/ui/components/domainpattern.vue index 3dd615bd..15a222a1 100644 --- a/src/ui/components/domainpattern.vue +++ b/src/ui/components/domainpattern.vue @@ -1,6 +1,7 @@ - diff --git a/src/ui/components/isolation/global.vue b/src/ui/components/isolation/global.vue index 6ed8006f..136a81a7 100644 --- a/src/ui/components/isolation/global.vue +++ b/src/ui/components/isolation/global.vue @@ -225,7 +225,7 @@ export default mixins(mixin).extend({ !popup ? { position: 'top left' } : { hidden: true } " :domain-pattern.sync="excludeDomainPattern" - :exclusion="true" + :type="'exclusion'" />