@braidlabs/core 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/adapters/compat-adapter.js +51 -4
- package/src/adapters/compat-adapter.js.map +1 -1
- package/src/compat/database-partition.d.ts +43 -0
- package/src/compat/database-partition.js +165 -0
- package/src/compat/database-partition.js.map +1 -0
- package/src/compat/html-policy.js +10 -5
- package/src/compat/html-policy.js.map +1 -1
- package/src/compat/script-execution.js +5 -4
- package/src/compat/script-execution.js.map +1 -1
- package/src/compat/shared-globals.d.ts +1 -1
- package/src/compat/shared-globals.js +2 -2
- package/src/compat/shared-globals.js.map +1 -1
- package/src/config.d.ts +13 -2
- package/src/config.js.map +1 -1
- package/src/elements/fragment-slot.d.ts +13 -0
- package/src/elements/fragment-slot.js +89 -7
- package/src/elements/fragment-slot.js.map +1 -1
- package/src/elements/leave-guard.d.ts +49 -0
- package/src/elements/leave-guard.js +122 -0
- package/src/elements/leave-guard.js.map +1 -0
- package/src/elements/overlay-layer.d.ts +45 -0
- package/src/elements/overlay-layer.js +112 -0
- package/src/elements/overlay-layer.js.map +1 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +13 -0
- package/src/index.js.map +1 -1
- package/src/realm/realm-manager.js +2 -1
- package/src/realm/realm-manager.js.map +1 -1
- package/src/realm/sandbox-realm.d.ts +5 -7
- package/src/realm/sandbox-realm.js +104 -39
- package/src/realm/sandbox-realm.js.map +1 -1
- package/src/trusted-types.d.ts +28 -0
- package/src/trusted-types.js +58 -0
- package/src/trusted-types.js.map +1 -0
- package/src/weave/capabilities.d.ts +10 -3
- package/src/weave/capabilities.js +19 -3
- package/src/weave/capabilities.js.map +1 -1
- package/src/weave/context-bridge.d.ts +2 -0
- package/src/weave/context-bridge.js +1 -1
- package/src/weave/context-bridge.js.map +1 -1
- package/src/weave/guest.js +8 -4
- package/src/weave/guest.js.map +1 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-layer overlays: what a fragment portals to its body, lifted out of the host's box.
|
|
3
|
+
*
|
|
4
|
+
* UI libraries render modals, menus and tooltips by appending to `document.body`, which escapes
|
|
5
|
+
* whatever clips the component that opened them. In a compat realm `document.body` is the
|
|
6
|
+
* fragment's own body — inside the slot — so the escape stops at the host's container: an
|
|
7
|
+
* `overflow: hidden` ancestor clips the modal, and a transformed one becomes its fixed-position
|
|
8
|
+
* frame. Other micro-frontend frameworks answer this by letting fragments write into the host's
|
|
9
|
+
* real body, which gives up the isolation the fragment boundary exists for.
|
|
10
|
+
*
|
|
11
|
+
* With `overlays="top-layer"` the slot instead shows each element the fragment appends to its
|
|
12
|
+
* body after mount as a manual popover. The browser renders popovers in the top layer, above and
|
|
13
|
+
* outside every ancestor's clipping, while the element stays exactly where it was in the DOM:
|
|
14
|
+
* inside the fragment's shadow tree, styled by the fragment's stylesheets, its events handled by
|
|
15
|
+
* the fragment's own listeners. Removing the element closes it; appending it again shows it again.
|
|
16
|
+
*
|
|
17
|
+
* Opt-in, because it changes positioning: a lifted element is laid out against the page rather
|
|
18
|
+
* than the slot (see `OVERLAY_STYLES`), and stacks by the order it was shown, not its `z-index`.
|
|
19
|
+
*/
|
|
20
|
+
/** Marks an element the slot lifted, so a popover of the fragment's own is never mistaken for one. */
|
|
21
|
+
export const OVERLAY_ATTRIBUTE = 'data-braid-overlay';
|
|
22
|
+
/**
|
|
23
|
+
* Undoes the browser's popover look (centred, bordered, padded, opaque) so a lifted portal looks as
|
|
24
|
+
* it did in the body, laid out from the page's origin as a body child would be. `inset: auto`
|
|
25
|
+
* rather than zeros, so a portal anchored by `right` or `bottom` alone does not stretch.
|
|
26
|
+
*
|
|
27
|
+
* It must lose to everything of the fragment's: any author rule beats the browser's popover rules,
|
|
28
|
+
* so it only needs to beat those. So it sits in a cascade layer declared first in the slot's
|
|
29
|
+
* stylesheet (the first in its shadow root), below every layer of the fragment's own — Tailwind's
|
|
30
|
+
* utilities, say — and every unlayered rule, and its selector has no specificity. The gateway's
|
|
31
|
+
* slot stylesheet for a pierced slot opens with the same rule.
|
|
32
|
+
*/
|
|
33
|
+
export const OVERLAY_STYLES = `@layer braid-overlay-reset { :where([${OVERLAY_ATTRIBUTE}]) { position: absolute; inset: auto; margin: 0; padding: 0; border: 0; ` +
|
|
34
|
+
'background: none; color: inherit; overflow: visible; width: auto; height: auto; max-width: none; max-height: none; } }';
|
|
35
|
+
/**
|
|
36
|
+
* Body children that are not overlays: they render nothing, a `<dialog>` has the top layer of its
|
|
37
|
+
* own through `showModal()`, and Braid's elements are Braid's.
|
|
38
|
+
*/
|
|
39
|
+
const NOT_OVERLAYS = new Set(['script', 'style', 'link', 'template', 'meta', 'noscript', 'dialog']);
|
|
40
|
+
/**
|
|
41
|
+
* Lifts each element appended to the fragment's body from now on. Stops when `signal` aborts (the
|
|
42
|
+
* fragment closes). Does nothing for a fragment with no body (a custom-element fragment) or in a
|
|
43
|
+
* browser without popovers.
|
|
44
|
+
*/
|
|
45
|
+
export function liftPortals(contentRoot, signal) {
|
|
46
|
+
// the element the fragment's realm answers `document.body` with (see document-overrides.ts)
|
|
47
|
+
const body = contentRoot.querySelector('braid-body') ?? contentRoot.firstElementChild;
|
|
48
|
+
if (!body || typeof HTMLElement.prototype.showPopover !== 'function')
|
|
49
|
+
return;
|
|
50
|
+
const lift = (node) => {
|
|
51
|
+
if (!(node instanceof HTMLElement) || node.parentNode !== body)
|
|
52
|
+
return;
|
|
53
|
+
if (NOT_OVERLAYS.has(node.localName) || node.localName.startsWith('braid-'))
|
|
54
|
+
return;
|
|
55
|
+
const ours = node.hasAttribute(OVERLAY_ATTRIBUTE);
|
|
56
|
+
// a popover the fragment declared itself is the fragment's to show
|
|
57
|
+
if (node.hasAttribute('popover') && !ours)
|
|
58
|
+
return;
|
|
59
|
+
node.setAttribute('popover', 'manual');
|
|
60
|
+
try {
|
|
61
|
+
node.showPopover();
|
|
62
|
+
node.setAttribute(OVERLAY_ATTRIBUTE, '');
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// removed again before this ran, or not showable: leave it as the fragment made it
|
|
66
|
+
node.removeAttribute('popover');
|
|
67
|
+
node.removeAttribute(OVERLAY_ATTRIBUTE);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* One the fragment moved out of its body, into its app, is an overlay no longer: left a closed
|
|
72
|
+
* popover, it would never render again.
|
|
73
|
+
*/
|
|
74
|
+
const settle = (node) => {
|
|
75
|
+
if (!(node instanceof HTMLElement) || !node.hasAttribute(OVERLAY_ATTRIBUTE))
|
|
76
|
+
return;
|
|
77
|
+
queueMicrotask(() => {
|
|
78
|
+
if (node.isConnected && node.parentNode !== body) {
|
|
79
|
+
node.removeAttribute('popover');
|
|
80
|
+
node.removeAttribute(OVERLAY_ATTRIBUTE);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
// Observed rather than intercepted: it sees every way in, captured native methods included, and
|
|
85
|
+
// its callback runs before the next paint, so nothing renders clipped first. (A synchronous
|
|
86
|
+
// measurement straight after `appendChild` still sees the element where it was appended.)
|
|
87
|
+
const observer = new MutationObserver((records) => {
|
|
88
|
+
for (const record of records) {
|
|
89
|
+
record.removedNodes.forEach(settle);
|
|
90
|
+
record.addedNodes.forEach(lift);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
observer.observe(body, { childList: true });
|
|
94
|
+
signal.addEventListener('abort', () => observer.disconnect(), { once: true });
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Shows again what the slot lifted. A move that disconnected the slot closed every open popover in
|
|
98
|
+
* it, and nothing was appended to the body for the observer to notice. (`moveBefore` keeps them
|
|
99
|
+
* open.)
|
|
100
|
+
*/
|
|
101
|
+
export function reshowLifted(root) {
|
|
102
|
+
for (const element of root.querySelectorAll(`[${OVERLAY_ATTRIBUTE}]`)) {
|
|
103
|
+
try {
|
|
104
|
+
if (!element.matches(':popover-open'))
|
|
105
|
+
element.showPopover();
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// not showable now: it stays as the fragment left it
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=overlay-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay-layer.js","sourceRoot":"","sources":["../../../../../libs/core/src/elements/overlay-layer.ts"],"names":[],"mappings":"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"}
|
package/src/index.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export { contractAdapter } from './adapters/contract-adapter.js';
|
|
|
27
27
|
export { defineFragment } from './env/define-fragment.js';
|
|
28
28
|
export type { FragmentDefinition } from './env/define-fragment.js';
|
|
29
29
|
export { FragmentSlot, prefetchFragment } from './elements/fragment-slot.js';
|
|
30
|
+
export { clearBraidDatabases } from './compat/database-partition.js';
|
|
31
|
+
export { dirtySlots, leaveConfirmed, type ConfirmLeave, type DirtySlot } from './elements/leave-guard.js';
|
|
30
32
|
export { clearPrefetchedFragments } from './elements/prefetch.js';
|
|
31
33
|
export type { FragmentSlotState } from './elements/fragment-slot.js';
|
|
32
34
|
export { braidContext, createContextBus } from './context/context-bus.js';
|
package/src/index.js
CHANGED
|
@@ -19,6 +19,8 @@ import { customElementAdapter } from './adapters/custom-element-adapter.js';
|
|
|
19
19
|
import { contractAdapter } from './adapters/contract-adapter.js';
|
|
20
20
|
import { FragmentSlot } from './elements/fragment-slot.js';
|
|
21
21
|
import { BraidLate, BraidLateEnd } from './elements/late-content.js';
|
|
22
|
+
import { claimBraidPolicy } from './trusted-types.js';
|
|
23
|
+
import { installLeaveGuard } from './elements/leave-guard.js';
|
|
22
24
|
export { BraidError } from './errors.js';
|
|
23
25
|
export { NotEntitledError } from './elements/prerequisites.js';
|
|
24
26
|
export { BRAID_FRAGMENT_REPORTER, braidFragmentReporter } from './weave/messages.js';
|
|
@@ -27,6 +29,8 @@ export { customElementAdapter } from './adapters/custom-element-adapter.js';
|
|
|
27
29
|
export { contractAdapter } from './adapters/contract-adapter.js';
|
|
28
30
|
export { defineFragment } from './env/define-fragment.js';
|
|
29
31
|
export { FragmentSlot, prefetchFragment } from './elements/fragment-slot.js';
|
|
32
|
+
export { clearBraidDatabases } from './compat/database-partition.js';
|
|
33
|
+
export { dirtySlots, leaveConfirmed } from './elements/leave-guard.js';
|
|
30
34
|
export { clearPrefetchedFragments } from './elements/prefetch.js';
|
|
31
35
|
export { braidContext, createContextBus } from './context/context-bus.js';
|
|
32
36
|
export { registerBraidServiceWorker } from './compat/register-worker.js';
|
|
@@ -49,8 +53,17 @@ export function initBraid(options = {}) {
|
|
|
49
53
|
customElements.define('braid-late', BraidLate);
|
|
50
54
|
customElements.define('braid-late-end', BraidLateEnd);
|
|
51
55
|
}
|
|
56
|
+
// before any slot boots: the policy name the host's directive grants must be Braid's first
|
|
57
|
+
claimBraidPolicy();
|
|
52
58
|
if (!customElements.get('fragment-slot')) {
|
|
53
59
|
customElements.define('fragment-slot', FragmentSlot);
|
|
54
60
|
}
|
|
61
|
+
// Once per page, like the elements. A later initBraid that names `confirmLeave` replaces the
|
|
62
|
+
// question (null or undefined removes it); one that does not leaves it, as config merges.
|
|
63
|
+
if ('confirmLeave' in options) {
|
|
64
|
+
removeLeaveGuard?.();
|
|
65
|
+
removeLeaveGuard = options.confirmLeave ? installLeaveGuard(options.confirmLeave) : undefined;
|
|
66
|
+
}
|
|
55
67
|
}
|
|
68
|
+
let removeLeaveGuard;
|
|
56
69
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAgB,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { BraidError } from '../errors.js';
|
|
2
2
|
import { getBraidConfig, isDevMode } from '../config.js';
|
|
3
3
|
import { BRAID_ADAPTER_META, BRAID_ADAPTER_OPTIONS_META, BRAID_PROTOCOL_META, BRAID_PROTOCOL_VERSION, braidFragmentUrl, braidRealmUrl, } from '../protocol.js';
|
|
4
|
+
import { trustedScript } from '../trusted-types.js';
|
|
4
5
|
export async function createRealm(kind, init) {
|
|
5
6
|
switch (kind) {
|
|
6
7
|
case 'compat-http':
|
|
@@ -134,7 +135,7 @@ function createRealmHandle(kind, iframe, realmWindow, realmDocument, manifestAda
|
|
|
134
135
|
script.type = 'module';
|
|
135
136
|
// import declarations are hoisted, so appending the completion call after the fragment's
|
|
136
137
|
// own source is valid regardless of what the source imports
|
|
137
|
-
script.textContent = `${source}\n;window.${callbackName}?.()
|
|
138
|
+
script.textContent = trustedScript(`${source}\n;window.${callbackName}?.();`, realmWindow);
|
|
138
139
|
const onError = (event) => reject(new BraidError(`module evaluation failed in the fragment's realm: ${event.message}`, {
|
|
139
140
|
fragmentId: init.fragmentId,
|
|
140
141
|
stage: 'adapter-mount',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realm-manager.js","sourceRoot":"","sources":["../../../../../libs/core/src/realm/realm-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"realm-manager.js","sourceRoot":"","sources":["../../../../../libs/core/src/realm/realm-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* | --- | --- | --- |
|
|
16
16
|
* | isolation | namespace, not security | browser-enforced |
|
|
17
17
|
* | DOM | projected into the host document | stays in its own document |
|
|
18
|
-
* | cookies/storage | the host's |
|
|
18
|
+
* | cookies/storage | the host's | none: an opaque origin has no cookies, Web Storage or IndexedDB |
|
|
19
19
|
* | composition | gateway namespaces, piercing, compat facade | none of it applies |
|
|
20
20
|
*
|
|
21
21
|
* **Why this is not a `RealmHandle`.** That interface exposes `window`, `document`, `evaluate()`
|
|
@@ -65,7 +65,7 @@ export interface SandboxRealm {
|
|
|
65
65
|
readonly fragmentId: string;
|
|
66
66
|
/** The frame element, so a host can size it. Its contents are not reachable from here. */
|
|
67
67
|
readonly frame: HTMLIFrameElement;
|
|
68
|
-
/** The fragment's
|
|
68
|
+
/** The origin the fragment's src names. The frame itself runs in an opaque origin, never this one. */
|
|
69
69
|
readonly origin: string;
|
|
70
70
|
/** The host end of the message channel. */
|
|
71
71
|
readonly port: MessagePort;
|
|
@@ -86,10 +86,8 @@ export declare function resolveSandboxTokens(requested: readonly string[] | unde
|
|
|
86
86
|
/**
|
|
87
87
|
* Creates the frame, waits for it to load, and establishes the message channel.
|
|
88
88
|
*
|
|
89
|
-
* The
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* whether or not it has already been posted to. Either order converges; neither has to be the fast
|
|
93
|
-
* one.
|
|
89
|
+
* The guest announces itself and the host answers that window with the port. The host listens
|
|
90
|
+
* before the frame is attached, so there is no ordering to race: however fast the guest's script
|
|
91
|
+
* runs, its announcement finds a listener.
|
|
94
92
|
*/
|
|
95
93
|
export declare function createSandboxRealm(init: SandboxRealmInit): Promise<SandboxRealm>;
|
|
@@ -16,7 +16,7 @@ import { BraidError } from '../errors.js';
|
|
|
16
16
|
* | --- | --- | --- |
|
|
17
17
|
* | isolation | namespace, not security | browser-enforced |
|
|
18
18
|
* | DOM | projected into the host document | stays in its own document |
|
|
19
|
-
* | cookies/storage | the host's |
|
|
19
|
+
* | cookies/storage | the host's | none: an opaque origin has no cookies, Web Storage or IndexedDB |
|
|
20
20
|
* | composition | gateway namespaces, piercing, compat facade | none of it applies |
|
|
21
21
|
*
|
|
22
22
|
* **Why this is not a `RealmHandle`.** That interface exposes `window`, `document`, `evaluate()`
|
|
@@ -45,7 +45,51 @@ export const DEFAULT_SANDBOX_TOKENS = ['allow-scripts', 'allow-forms'];
|
|
|
45
45
|
* grant if you need it, and it must be granted deliberately rather than inherited from a broad
|
|
46
46
|
* "let this fragment navigate" instinct.
|
|
47
47
|
*/
|
|
48
|
-
const
|
|
48
|
+
const TOP_NAVIGATION_HINT = 'use "allow-top-navigation-by-user-activation" if the fragment genuinely needs to navigate the page';
|
|
49
|
+
const REFUSED_SANDBOX_TOKENS = new Map([
|
|
50
|
+
['allow-top-navigation', TOP_NAVIGATION_HINT],
|
|
51
|
+
['allow-top-navigation-to-custom-protocols', TOP_NAVIGATION_HINT],
|
|
52
|
+
/**
|
|
53
|
+
* The same navigation by another door: a popup that escapes the sandbox can set
|
|
54
|
+
* `window.opener.top.location` and swap the host page for a lookalike.
|
|
55
|
+
*/
|
|
56
|
+
[
|
|
57
|
+
'allow-popups-to-escape-sandbox',
|
|
58
|
+
'"allow-popups" alone lets the fragment open windows; they stay sandboxed, which is the point',
|
|
59
|
+
],
|
|
60
|
+
/**
|
|
61
|
+
* The token that turns the sandbox off. With it the frame keeps a real origin: a `javascript:`
|
|
62
|
+
* src, or a navigation to a URL on the host's origin, then runs with the host's own authority.
|
|
63
|
+
* The handshake works without it, so nothing on this tier needs it.
|
|
64
|
+
*/
|
|
65
|
+
[
|
|
66
|
+
'allow-same-origin',
|
|
67
|
+
'leave it out: the untrusted tier connects from an opaque origin, which is what keeps it isolated',
|
|
68
|
+
],
|
|
69
|
+
]);
|
|
70
|
+
/**
|
|
71
|
+
* Every token the HTML standard defines. Anything else is refused rather than passed through: the
|
|
72
|
+
* browser ignores a token it does not know, so a typo would silently grant less than intended — or,
|
|
73
|
+
* as browsers add tokens, silently grant something nobody reviewed.
|
|
74
|
+
*/
|
|
75
|
+
const KNOWN_SANDBOX_TOKENS = new Set([
|
|
76
|
+
'allow-downloads',
|
|
77
|
+
'allow-forms',
|
|
78
|
+
'allow-modals',
|
|
79
|
+
'allow-orientation-lock',
|
|
80
|
+
'allow-pointer-lock',
|
|
81
|
+
'allow-popups',
|
|
82
|
+
'allow-popups-to-escape-sandbox',
|
|
83
|
+
'allow-presentation',
|
|
84
|
+
'allow-same-origin',
|
|
85
|
+
'allow-scripts',
|
|
86
|
+
'allow-storage-access-by-user-activation',
|
|
87
|
+
'allow-top-navigation',
|
|
88
|
+
'allow-top-navigation-by-user-activation',
|
|
89
|
+
'allow-top-navigation-to-custom-protocols',
|
|
90
|
+
]);
|
|
91
|
+
/** Loopback hosts, where plain `http:` is how local development serves a second origin. */
|
|
92
|
+
const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);
|
|
49
93
|
const LOAD_TIMEOUT_MS = 15_000;
|
|
50
94
|
/**
|
|
51
95
|
* Refuses a same-origin URL for the untrusted tier.
|
|
@@ -69,6 +113,20 @@ export function assertCrossOrigin(src, fragmentId) {
|
|
|
69
113
|
fixHint: 'untrusted fragments are addressed by absolute url, e.g. src="https://vendor.example.com/widget"',
|
|
70
114
|
});
|
|
71
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Only a network scheme can name another origin. `javascript:`, `data:` and `blob:` have an
|
|
118
|
+
* opaque origin, which never equals the host's, so the comparison below would wave them through
|
|
119
|
+
* — and a `javascript:` src in a frame granted `allow-same-origin` runs in the host's origin.
|
|
120
|
+
*/
|
|
121
|
+
const secure = url.protocol === 'https:';
|
|
122
|
+
const loopback = url.protocol === 'http:' && LOOPBACK_HOSTS.has(url.hostname);
|
|
123
|
+
if (!secure && !loopback) {
|
|
124
|
+
throw new BraidError(`the untrusted tier loads fragments over https, and "${src}" is not an https url`, {
|
|
125
|
+
fragmentId,
|
|
126
|
+
stage: 'slot-config',
|
|
127
|
+
fixHint: 'serve the fragment from its own https origin; plain http is accepted only on localhost',
|
|
128
|
+
});
|
|
129
|
+
}
|
|
72
130
|
if (url.origin === location.origin) {
|
|
73
131
|
throw new BraidError(`the untrusted tier requires a cross-origin url, and "${url.origin}" is this host's origin`, {
|
|
74
132
|
fragmentId,
|
|
@@ -82,12 +140,23 @@ export function assertCrossOrigin(src, fragmentId) {
|
|
|
82
140
|
/** Resolves the sandbox token list, refusing the ones that would undo the sandbox. */
|
|
83
141
|
export function resolveSandboxTokens(requested = [], fragmentId) {
|
|
84
142
|
const tokens = new Set(DEFAULT_SANDBOX_TOKENS);
|
|
85
|
-
|
|
86
|
-
|
|
143
|
+
// The browser splits the attribute on whitespace and matches tokens case-insensitively, so this
|
|
144
|
+
// must too — or "ALLOW-TOP-NAVIGATION" and "allow-popups allow-top-navigation" slip past.
|
|
145
|
+
const normalized = requested.flatMap((entry) => String(entry).toLowerCase().split(/\s+/).filter(Boolean));
|
|
146
|
+
for (const token of normalized) {
|
|
147
|
+
if (!KNOWN_SANDBOX_TOKENS.has(token)) {
|
|
148
|
+
throw new BraidError(`"${token}" is not a sandbox token`, {
|
|
149
|
+
fragmentId,
|
|
150
|
+
stage: 'slot-config',
|
|
151
|
+
fixHint: 'sandbox tokens are the allow-* keywords the HTML standard defines, e.g. "allow-popups"',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const refusal = REFUSED_SANDBOX_TOKENS.get(token);
|
|
155
|
+
if (refusal !== undefined) {
|
|
87
156
|
throw new BraidError(`the sandbox token "${token}" is never granted to an untrusted fragment`, {
|
|
88
157
|
fragmentId,
|
|
89
158
|
stage: 'slot-config',
|
|
90
|
-
fixHint:
|
|
159
|
+
fixHint: refusal,
|
|
91
160
|
});
|
|
92
161
|
}
|
|
93
162
|
tokens.add(token);
|
|
@@ -97,11 +166,9 @@ export function resolveSandboxTokens(requested = [], fragmentId) {
|
|
|
97
166
|
/**
|
|
98
167
|
* Creates the frame, waits for it to load, and establishes the message channel.
|
|
99
168
|
*
|
|
100
|
-
* The
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* whether or not it has already been posted to. Either order converges; neither has to be the fast
|
|
104
|
-
* one.
|
|
169
|
+
* The guest announces itself and the host answers that window with the port. The host listens
|
|
170
|
+
* before the frame is attached, so there is no ordering to race: however fast the guest's script
|
|
171
|
+
* runs, its announcement finds a listener.
|
|
105
172
|
*/
|
|
106
173
|
export async function createSandboxRealm(init) {
|
|
107
174
|
const { fragmentId, src, container, signal } = init;
|
|
@@ -109,7 +176,9 @@ export async function createSandboxRealm(init) {
|
|
|
109
176
|
const tokens = resolveSandboxTokens(init.sandboxTokens, fragmentId);
|
|
110
177
|
const instance = `${fragmentId}:${Date.now().toString(36)}`;
|
|
111
178
|
const frame = document.createElement('iframe');
|
|
112
|
-
|
|
179
|
+
// The absolute URL that was checked, not the string: `src` would resolve against
|
|
180
|
+
// `document.baseURI`, which a `<base>` element can point somewhere `location.href` does not.
|
|
181
|
+
frame.src = new URL(src, location.href).href;
|
|
113
182
|
frame.setAttribute('sandbox', tokens.join(' '));
|
|
114
183
|
frame.setAttribute('part', 'frame');
|
|
115
184
|
frame.style.cssText = 'display:block;border:0;width:100%;height:100%';
|
|
@@ -125,53 +194,50 @@ export async function createSandboxRealm(init) {
|
|
|
125
194
|
if ('credentialless' in HTMLIFrameElement.prototype) {
|
|
126
195
|
frame.setAttribute('credentialless', '');
|
|
127
196
|
}
|
|
128
|
-
container.append(frame);
|
|
129
197
|
const channel = new MessageChannel();
|
|
130
198
|
const dispose = () => {
|
|
131
199
|
channel.port1.close();
|
|
132
200
|
frame.remove();
|
|
133
201
|
};
|
|
134
202
|
signal.addEventListener('abort', dispose, { once: true });
|
|
135
|
-
const post = () => {
|
|
136
|
-
const message = { braid: SANDBOX_CONNECT, v: 1, fragmentId, instance };
|
|
137
|
-
/**
|
|
138
|
-
* The target origin is the fragment's exact origin, never `'*'`.
|
|
139
|
-
*
|
|
140
|
-
* With `'*'` the port would be delivered to whatever document happens to occupy the frame — and
|
|
141
|
-
* an untrusted fragment that navigated itself elsewhere between load and this call would hand a
|
|
142
|
-
* live channel into the host to a document nobody vetted.
|
|
143
|
-
*/
|
|
144
|
-
frame.contentWindow?.postMessage(message, origin, [channel.port2]);
|
|
145
|
-
};
|
|
146
203
|
const { promise, resolve, reject } = Promise.withResolvers();
|
|
147
204
|
let connected = false;
|
|
205
|
+
/**
|
|
206
|
+
* The guest speaks first, and the host answers that window and no other.
|
|
207
|
+
*
|
|
208
|
+
* A sandboxed frame without `allow-same-origin` has an opaque origin. A message targeted at the
|
|
209
|
+
* fragment's origin is never delivered to it, and its own messages arrive with origin `"null"`.
|
|
210
|
+
* The origin cannot identify it, so the window does: `event.source` is set by the browser, and
|
|
211
|
+
* only this frame's window can be `frame.contentWindow`. The reply goes to that window with `'*'`,
|
|
212
|
+
* the only target an opaque origin accepts. It reaches whichever document the frame holds when it
|
|
213
|
+
* arrives, which is the one that asked unless the frame navigated in between. Only the frame
|
|
214
|
+
* itself can navigate it, so any document it lands on is the vendor's choice and as trusted as the
|
|
215
|
+
* vendor.
|
|
216
|
+
*/
|
|
148
217
|
const onWindowMessage = (event) => {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (event.origin !==
|
|
218
|
+
if (event.source === null || event.source !== frame.contentWindow)
|
|
219
|
+
return;
|
|
220
|
+
if (event.origin !== 'null')
|
|
152
221
|
return;
|
|
153
222
|
if (event.data?.braid !== SANDBOX_READY)
|
|
154
223
|
return;
|
|
155
224
|
if (connected)
|
|
156
225
|
return;
|
|
157
226
|
connected = true;
|
|
158
|
-
|
|
227
|
+
const message = { braid: SANDBOX_CONNECT, v: 1, fragmentId, instance };
|
|
228
|
+
event.source.postMessage(message, '*', [channel.port2]);
|
|
159
229
|
resolve();
|
|
160
230
|
};
|
|
231
|
+
// Listening before the frame exists, so a guest that announces itself at once is not missed.
|
|
161
232
|
window.addEventListener('message', onWindowMessage);
|
|
162
|
-
|
|
163
|
-
if (connected)
|
|
164
|
-
return;
|
|
165
|
-
connected = true;
|
|
166
|
-
post();
|
|
167
|
-
resolve();
|
|
168
|
-
};
|
|
169
|
-
frame.addEventListener('load', onLoad, { once: true });
|
|
233
|
+
container.append(frame);
|
|
170
234
|
const timeout = setTimeout(() => {
|
|
171
|
-
reject(new BraidError(`the untrusted fragment at "${src}" did not
|
|
235
|
+
reject(new BraidError(`the untrusted fragment at "${src}" did not connect within ${init.loadTimeoutMs ?? LOAD_TIMEOUT_MS}ms`, {
|
|
172
236
|
fragmentId,
|
|
173
|
-
stage: '
|
|
174
|
-
fixHint:
|
|
237
|
+
stage: 'handshake',
|
|
238
|
+
fixHint: `the fragment must call connectToBraidHost({ hostOrigin: '${location.origin}' }). Its frame runs in an opaque ` +
|
|
239
|
+
'origin, so its module scripts need Access-Control-Allow-Origin. Also check that its origin does not refuse ' +
|
|
240
|
+
'framing via X-Frame-Options or CSP frame-ancestors',
|
|
175
241
|
}));
|
|
176
242
|
}, init.loadTimeoutMs ?? LOAD_TIMEOUT_MS);
|
|
177
243
|
try {
|
|
@@ -180,7 +246,6 @@ export async function createSandboxRealm(init) {
|
|
|
180
246
|
finally {
|
|
181
247
|
clearTimeout(timeout);
|
|
182
248
|
window.removeEventListener('message', onWindowMessage);
|
|
183
|
-
frame.removeEventListener('load', onLoad);
|
|
184
249
|
}
|
|
185
250
|
return {
|
|
186
251
|
kind: 'sandbox',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-realm.js","sourceRoot":"","sources":["../../../../../libs/core/src/realm/sandbox-realm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAC/C,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAc3C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,eAAe,EAAE,aAAa,CAAU,CAAC;AAEhF;;;;;;;GAOG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sandbox-realm.js","sourceRoot":"","sources":["../../../../../libs/core/src/realm/sandbox-realm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Braid's own writes into the sinks Trusted Types guards, for a host page that enforces them
|
|
3
|
+
* (`require-trusted-types-for 'script'`).
|
|
4
|
+
*
|
|
5
|
+
* The runtime writes to a handful of sinks itself: it parses the markup the gateway prepared, it
|
|
6
|
+
* marks a script as already started by giving it a line of text, and the opt-in HTML policy
|
|
7
|
+
* parses a fragment's write into an inert document before cleaning it. Under enforcement each of
|
|
8
|
+
* those needs a trusted value, so they go through one policy, named `braid`, which a host lists in
|
|
9
|
+
* its `trusted-types` directive.
|
|
10
|
+
*
|
|
11
|
+
* The policy passes values through unchanged, which is why it is never exported: only these call
|
|
12
|
+
* sites can reach it, and each one either writes something Braid authored or parses into a
|
|
13
|
+
* document where nothing runs. Everything a fragment writes itself still meets the host's own
|
|
14
|
+
* enforcement — which is the point of turning it on.
|
|
15
|
+
*
|
|
16
|
+
* Created on first use, in whichever realm the write happens: a realm document inherits the host's
|
|
17
|
+
* policy, and a trusted value is checked against the realm that writes it.
|
|
18
|
+
*/
|
|
19
|
+
/** Markup Braid parses: the gateway's prepared document, or a write it is about to clean. */
|
|
20
|
+
export declare function trustedHTML(markup: string, realm?: object): string;
|
|
21
|
+
/** Script text Braid writes itself. */
|
|
22
|
+
export declare function trustedScript(source: string, realm?: object): string;
|
|
23
|
+
/**
|
|
24
|
+
* Creates the host's policy now, if the page has Trusted Types. Called by `initBraid`, before any
|
|
25
|
+
* fragment code runs: what the host's directive grants is the name `braid`, so it must be Braid's
|
|
26
|
+
* before anything else on the page can create it.
|
|
27
|
+
*/
|
|
28
|
+
export declare function claimBraidPolicy(): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Braid's own writes into the sinks Trusted Types guards, for a host page that enforces them
|
|
3
|
+
* (`require-trusted-types-for 'script'`).
|
|
4
|
+
*
|
|
5
|
+
* The runtime writes to a handful of sinks itself: it parses the markup the gateway prepared, it
|
|
6
|
+
* marks a script as already started by giving it a line of text, and the opt-in HTML policy
|
|
7
|
+
* parses a fragment's write into an inert document before cleaning it. Under enforcement each of
|
|
8
|
+
* those needs a trusted value, so they go through one policy, named `braid`, which a host lists in
|
|
9
|
+
* its `trusted-types` directive.
|
|
10
|
+
*
|
|
11
|
+
* The policy passes values through unchanged, which is why it is never exported: only these call
|
|
12
|
+
* sites can reach it, and each one either writes something Braid authored or parses into a
|
|
13
|
+
* document where nothing runs. Everything a fragment writes itself still meets the host's own
|
|
14
|
+
* enforcement — which is the point of turning it on.
|
|
15
|
+
*
|
|
16
|
+
* Created on first use, in whichever realm the write happens: a realm document inherits the host's
|
|
17
|
+
* policy, and a trusted value is checked against the realm that writes it.
|
|
18
|
+
*/
|
|
19
|
+
const POLICY_NAME = 'braid';
|
|
20
|
+
const policies = new WeakMap();
|
|
21
|
+
function policyFor(realm) {
|
|
22
|
+
if (policies.has(realm))
|
|
23
|
+
return policies.get(realm) ?? null;
|
|
24
|
+
const factory = realm.trustedTypes;
|
|
25
|
+
let policy = null;
|
|
26
|
+
if (factory) {
|
|
27
|
+
try {
|
|
28
|
+
const same = (input) => input;
|
|
29
|
+
policy = factory.createPolicy(POLICY_NAME, { createHTML: same, createScript: same });
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// Not listed in the host's `trusted-types` directive, or the name already taken — by a second
|
|
33
|
+
// copy of the runtime, or by script that ran first. Writes go as plain strings and enforcement
|
|
34
|
+
// reports them; the warning says which.
|
|
35
|
+
console.warn(`[braid] could not create the "${POLICY_NAME}" Trusted Types policy: ${error?.message ?? error}`);
|
|
36
|
+
policy = null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
policies.set(realm, policy);
|
|
40
|
+
return policy;
|
|
41
|
+
}
|
|
42
|
+
/** Markup Braid parses: the gateway's prepared document, or a write it is about to clean. */
|
|
43
|
+
export function trustedHTML(markup, realm = globalThis) {
|
|
44
|
+
return policyFor(realm)?.createHTML(markup) ?? markup;
|
|
45
|
+
}
|
|
46
|
+
/** Script text Braid writes itself. */
|
|
47
|
+
export function trustedScript(source, realm = globalThis) {
|
|
48
|
+
return policyFor(realm)?.createScript(source) ?? source;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates the host's policy now, if the page has Trusted Types. Called by `initBraid`, before any
|
|
52
|
+
* fragment code runs: what the host's directive grants is the name `braid`, so it must be Braid's
|
|
53
|
+
* before anything else on the page can create it.
|
|
54
|
+
*/
|
|
55
|
+
export function claimBraidPolicy() {
|
|
56
|
+
policyFor(globalThis);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=trusted-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-types.js","sourceRoot":"","sources":["../../../../libs/core/src/trusted-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAWH,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAoC,CAAC;AAEjE,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC5D,MAAM,OAAO,GAAI,KAA4B,CAAC,YAAY,CAAC;IAC3D,IAAI,MAAM,GAA6B,IAAI,CAAC;IAC5C,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;YACtC,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,8FAA8F;YAC9F,+FAA+F;YAC/F,wCAAwC;YACxC,OAAO,CAAC,IAAI,CAAC,iCAAiC,WAAW,2BAA4B,KAAe,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;YAC1H,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAgB,UAAU;IACpE,OAAQ,SAAS,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,MAAM,CAAwB,IAAI,MAAM,CAAC;AAChF,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB,UAAU;IACtE,OAAQ,SAAS,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,MAAM,CAAwB,IAAI,MAAM,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,SAAS,CAAC,UAAU,CAAC,CAAC;AACxB,CAAC"}
|