|
378 | 378 |
|
379 | 379 | const checked = ret.checks.map((i) => checks[i]._val); |
380 | 380 |
|
| 381 | + const wantsContext = checked.includes("ctx") |
| 382 | + |
381 | 383 | let { siteMatch, contextMatch, perms } = ns.policy.get(key, contextUrl); |
382 | 384 |
|
383 | | - if (!perms.capabilities.has(policyType)) { |
| 385 | + if (!perms.capabilities.has(policyType) || |
| 386 | + !contextMatch && wantsContext && ctxKey) { |
384 | 387 | if (!contextMatch) { |
385 | 388 | perms = perms.clone(); |
386 | 389 | ns.policy.set(key, perms); |
387 | | - if (ctxKey && checked.includes("ctx")) { |
| 390 | + if (ctxKey && wantsContext) { |
388 | 391 | perms.contextual.set(ctxKey, perms = perms.clone(/* noContext = */ true)); |
389 | 392 | } |
390 | 393 | } |
|
494 | 497 | } |
495 | 498 | }; |
496 | 499 |
|
497 | | - function intersectCapabilities(perms, request) { |
| 500 | + function intersectCapabilities(policyMatch, request) { |
498 | 501 | if (request.frameId !== 0 && ns.sync.cascadeRestrictions) { |
499 | 502 | const {tabUrl, frameAncestors} = request; |
500 | 503 | const topUrl = tabUrl || |
501 | 504 | frameAncestors && frameAncestors[frameAncestors?.length - 1]?.url || |
502 | 505 | TabCache.get(request.tabId)?.url; |
503 | 506 | if (topUrl) { |
504 | | - return ns.policy.cascadeRestrictions(perms, topUrl).capabilities; |
| 507 | + return ns.policy.cascadeRestrictions(policyMatch, topUrl).capabilities; |
505 | 508 | } |
506 | 509 | } |
507 | | - return perms.capabilities; |
| 510 | + return policyMatch.perms.capabilities; |
508 | 511 | } |
509 | 512 |
|
510 | 513 | const ABORT = {cancel: true}, |
|
652 | 655 | .some(tabId => TabStatus.hasOrigin(tabId, documentUrl)); |
653 | 656 | } |
654 | 657 | if (!allowed) { |
655 | | - let capabilities = intersectCapabilities( |
656 | | - policy.get(url, ns.policyContext(request)).perms, |
| 658 | + const capabilities = intersectCapabilities( |
| 659 | + policy.get(url, ns.policyContext(request)), |
657 | 660 | request); |
658 | 661 | allowed = !policyType || capabilities.has(policyType); |
659 | 662 | if (allowed && request._dataUrl && type.endsWith("frame")) { |
|
762 | 765 | try { |
763 | 766 | let capabilities; |
764 | 767 | if (ns.isEnforced(tabId)) { |
765 | | - let policy = ns.policy; |
766 | | - let {perms} = policy.get(url, ns.policyContext(request)); |
| 768 | + const { policy } = ns; |
| 769 | + const policyMatch = policy.get(url, ns.policyContext(request)); |
| 770 | + let perms = { match: policyMatch }; |
767 | 771 | if (isMainFrame) { |
768 | 772 | const autoPerms = policy.autoAllow(url, perms); |
769 | 773 | if (autoPerms) { |
770 | 774 | perms = autoPerms; |
771 | 775 | } |
772 | 776 | capabilities = perms.capabilities; |
773 | 777 | } else { |
774 | | - capabilities = intersectCapabilities(perms, request); |
| 778 | + capabilities = intersectCapabilities(policyMatch, request); |
775 | 779 | } |
776 | 780 | } // else unrestricted, either globally or per-tab |
777 | 781 | if (isMainFrame && !TabStatus.map.has(tabId)) { |
|
0 commit comments