11/*
22 * NoScript - a Firefox extension for whitelist driven safe JavaScript execution
33 *
4- * Copyright (C) 2005-2021 Giorgio Maone <https://maone.net>
4+ * Copyright (C) 2005-2022 Giorgio Maone <https://maone.net>
55 *
66 * SPDX-License-Identifier: GPL-3.0-or-later
77 *
@@ -54,10 +54,21 @@ var RequestGuard = (() => {
5454 origins : new Set ( ) ,
5555 }
5656 } ,
57- hasOrigin ( tabId , origin ) {
57+ hasOrigin ( tabId , url ) {
5858 let records = this . map . get ( tabId ) ;
59- return records && records . origins . has ( origin ) ;
59+ return records && records . origins . has ( Sites . origin ( url ) ) ;
6060 } ,
61+ addOrigin ( tabId , url ) {
62+ if ( tabId < 0 ) return ;
63+ let origin = Sites . origin ( url ) ;
64+ if ( ! origin ) return ;
65+ let { origins} = this . map . get ( tabId ) || this . initTab ( tabId ) ;
66+ if ( ! origins . has ( origin ) ) {
67+ origins . add ( origin ) ;
68+ this . _originsCache . clear ( ) ;
69+ }
70+ } ,
71+
6172 findTabsByOrigin ( origin ) {
6273 let tabIds = this . _originsCache . get ( origin ) ;
6374 if ( ! tabIds ) {
@@ -78,7 +89,7 @@ var RequestGuard = (() => {
7889 let { tabId, frameId, type, url, documentUrl} = request ;
7990 let policyType = policyTypesMap [ type ] || type ;
8091 let requestKey = Policy . requestKey ( url , policyType , documentUrl ) ;
81- let map = this . map ;
92+ let { map} = this ;
8293 let records = map . has ( tabId ) ? map . get ( tabId ) : this . initTab ( tabId ) ;
8394 if ( what === "noscriptFrame" && type !== "object" ) {
8495 let nsf = records . noscriptFrames ;
@@ -90,8 +101,9 @@ var RequestGuard = (() => {
90101 }
91102 }
92103 if ( type . endsWith ( "frame" ) ) {
93- records . origins . add ( Sites . origin ( url ) ) ;
94- TabStatus . _originsCache . clear ( ) ;
104+ this . addOrigin ( tabId , url ) ;
105+ } else if ( documentUrl ) {
106+ this . addOrigin ( tabId , documentUrl ) ;
95107 }
96108 let collection = records [ what ] ;
97109 if ( collection ) {
@@ -412,12 +424,17 @@ var RequestGuard = (() => {
412424
413425 let policyType = policyTypesMap [ type ] ;
414426 let { url, originUrl, documentUrl, tabId} = request ;
427+
428+ if ( ns . unrestrictedTabs . has ( tabId ) && type . endsWith ( "frame" ) && url . startsWith ( "https:" ) ) {
429+ TabStatus . addOrigin ( tabId , url ) ;
430+ }
431+
415432 let isFetch = "fetch" === policyType ;
416433
417434 if ( ( isFetch || "frame" === policyType ) &&
418435 ( ( ( isFetch && ( ! originUrl ||
419436 browser . runtime . onSyncMessage &&
420- url . includes ( browser . runtime . onSyncMessage . ENDPOINT_PREFIX )
437+ url . startsWith ( browser . runtime . onSyncMessage . ENDPOINT_PREFIX )
421438 ) || url === originUrl ) && originUrl === documentUrl
422439 // some extensions make them both undefined,
423440 // see https://github.com/eight04/image-picka/issues/150
@@ -433,14 +450,11 @@ var RequestGuard = (() => {
433450 request . url = url = documentUrl || originUrl ;
434451 }
435452
436- let allowed = Sites . isInternal ( url ) ;
453+ let allowed = Sites . isInternal ( url ) || ! ns . isEnforced ( tabId ) ;
437454 if ( ! allowed ) {
438- if ( tabId < 0 && documentUrl && documentUrl . startsWith ( "https://" ) ) {
439- let origin = Sites . origin ( documentUrl ) ;
455+ if ( tabId < 0 && documentUrl && documentUrl . startsWith ( "https:" ) ) {
440456 allowed = [ ...ns . unrestrictedTabs ]
441- . some ( tabId => TabStatus . hasOrigin ( tabId , origin ) ) ;
442- } else {
443- allowed = ! ns . isEnforced ( tabId ) ;
457+ . some ( tabId => TabStatus . hasOrigin ( tabId , documentUrl ) ) ;
444458 }
445459 if ( ! allowed ) {
446460 let capabilities = intersectCapabilities (
0 commit comments