@braidlabs/core 0.6.0 → 0.7.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/adapter.d.ts +11 -0
- package/src/adapters/adapter.js.map +1 -1
- package/src/adapters/compat-adapter.js +2 -2
- package/src/adapters/compat-adapter.js.map +1 -1
- package/src/compat/born-inert-scripts.d.ts +2 -0
- package/src/compat/born-inert-scripts.js +39 -0
- package/src/compat/born-inert-scripts.js.map +1 -1
- package/src/compat/cookie-partition.d.ts +25 -0
- package/src/compat/cookie-partition.js +79 -0
- package/src/compat/cookie-partition.js.map +1 -0
- package/src/compat/document-member-classification.js +3 -2
- package/src/compat/document-member-classification.js.map +1 -1
- package/src/compat/document-overrides.d.ts +6 -6
- package/src/compat/document-overrides.js +23 -0
- package/src/compat/document-overrides.js.map +1 -1
- package/src/compat/fragment-boundary.d.ts +5 -0
- package/src/compat/fragment-boundary.js +291 -36
- package/src/compat/fragment-boundary.js.map +1 -1
- package/src/compat/html-policy.d.ts +50 -0
- package/src/compat/html-policy.js +155 -0
- package/src/compat/html-policy.js.map +1 -0
- package/src/compat/realm-patches.d.ts +2 -1
- package/src/compat/realm-patches.js +117 -3
- package/src/compat/realm-patches.js.map +1 -1
- package/src/compat/script-execution.d.ts +24 -0
- package/src/compat/script-execution.js +177 -10
- package/src/compat/script-execution.js.map +1 -1
- package/src/compat/storage-partition.d.ts +47 -0
- package/src/compat/storage-partition.js +291 -0
- package/src/compat/storage-partition.js.map +1 -0
- package/src/compat/subresource-urls.d.ts +41 -0
- package/src/compat/subresource-urls.js +133 -0
- package/src/compat/subresource-urls.js.map +1 -0
- package/src/config.d.ts +28 -0
- package/src/config.js +24 -0
- package/src/config.js.map +1 -1
- package/src/elements/boot-gate.d.ts +47 -0
- package/src/elements/boot-gate.js +207 -0
- package/src/elements/boot-gate.js.map +1 -0
- package/src/elements/fragment-slot.d.ts +62 -15
- package/src/elements/fragment-slot.js +388 -26
- package/src/elements/fragment-slot.js.map +1 -1
- package/src/elements/late-content.d.ts +44 -0
- package/src/elements/late-content.js +107 -0
- package/src/elements/late-content.js.map +1 -0
- package/src/elements/prefetch.d.ts +27 -0
- package/src/elements/prefetch.js +100 -0
- package/src/elements/prefetch.js.map +1 -0
- package/src/elements/prerequisites.d.ts +42 -0
- package/src/elements/prerequisites.js +133 -0
- package/src/elements/prerequisites.js.map +1 -0
- package/src/elements/recovery.d.ts +46 -0
- package/src/elements/recovery.js +59 -0
- package/src/elements/recovery.js.map +1 -0
- package/src/env/create-env.js +2 -1
- package/src/env/create-env.js.map +1 -1
- package/src/env/fragment-env.d.ts +6 -0
- package/src/errors.d.ts +4 -1
- package/src/errors.js +2 -0
- package/src/errors.js.map +1 -1
- package/src/index.d.ts +5 -1
- package/src/index.js +11 -1
- package/src/index.js.map +1 -1
- package/src/realm/realm-manager.js +23 -0
- package/src/realm/realm-manager.js.map +1 -1
- package/src/weave/capabilities.d.ts +35 -7
- package/src/weave/capabilities.js +17 -0
- package/src/weave/capabilities.js.map +1 -1
- package/src/weave/guest.d.ts +2 -0
- package/src/weave/guest.js +2 -1
- package/src/weave/guest.js.map +1 -1
- package/src/weave/messages.d.ts +24 -0
- package/src/weave/messages.js +22 -0
- package/src/weave/messages.js.map +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unsafe-function-type, prefer-rest-params --
|
|
2
2
|
* ported from the matrix-tested web-fragments fork: the wrappers must forward the exact
|
|
3
3
|
* original `arguments` object to native DOM methods, and accept any native function shape. */
|
|
4
|
-
import { compatDomInsertion, compatMultiNodeDomInsertion, executeInertScript, executeInertPreloadLink, restoreScriptType, alreadyExecutedScriptsAndLinks, } from './script-execution.js';
|
|
4
|
+
import { compatDomInsertion, compatMultiNodeDomInsertion, executeInertScript, executeInertPreloadLink, INERT_SELECTOR, isBraidInertLink, isRunnable, markBraidInertLink, markGatewayContent, markRunnable, markStartedInPlace, restoreScriptType, alreadyExecutedScriptsAndLinks, } from './script-execution.js';
|
|
5
5
|
import { removeBornInertShadowing, unwrapBornInertScriptToLive } from './born-inert-scripts.js';
|
|
6
6
|
import { isDevMode } from '../config.js';
|
|
7
|
+
import { fragmentRootOf, subresourceUrlOverrides } from './subresource-urls.js';
|
|
7
8
|
/**
|
|
8
9
|
* The fragment boundary: all main-realm interception is confined here — the
|
|
9
10
|
* host page's `Node`/`Element` prototypes are never touched.
|
|
@@ -43,14 +44,116 @@ const native = {
|
|
|
43
44
|
fragmentAppend: DocumentFragment.prototype.append,
|
|
44
45
|
fragmentPrepend: DocumentFragment.prototype.prepend,
|
|
45
46
|
fragmentReplaceChildren: DocumentFragment.prototype.replaceChildren,
|
|
47
|
+
elementBefore: Element.prototype.before,
|
|
48
|
+
elementAfter: Element.prototype.after,
|
|
46
49
|
shadowRootInnerHTML: Object.getOwnPropertyDescriptor(ShadowRoot.prototype, 'innerHTML'),
|
|
47
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* Every boundary's stamped prototypes and installed wrappers, page-wide. A node that moves between
|
|
53
|
+
* fragments carries a stamp from each, and delegation has to see past all of them.
|
|
54
|
+
*/
|
|
55
|
+
const allStampedProtos = new WeakSet();
|
|
56
|
+
const allBoundaryWrappers = new WeakSet();
|
|
57
|
+
/**
|
|
58
|
+
* The built-in prototypes the intercepted methods are defined on. A method found on one of these is
|
|
59
|
+
* the platform's — or a host page's later patch of it, which fragment nodes have never run.
|
|
60
|
+
*/
|
|
61
|
+
const PLATFORM_PROTOTYPES = new Set([Node.prototype, Element.prototype, HTMLElement.prototype, DocumentFragment.prototype]);
|
|
62
|
+
/**
|
|
63
|
+
* The method a node would have without any boundary's stamp: whatever its prototype chain defines
|
|
64
|
+
* below the lowest stamp, read at call time — or the native method, when that is the platform's.
|
|
65
|
+
*
|
|
66
|
+
* A custom element may override insertion on its own class — Stencil's scoped components do, to
|
|
67
|
+
* move light-DOM children into the element's inner slot. The stamp sits above that class, so
|
|
68
|
+
* calling the native method unconditionally would skip the override: children land on the host
|
|
69
|
+
* instead of in the slot, and an `insertBefore` whose reference the component had relocated throws
|
|
70
|
+
* `NotFoundError`.
|
|
71
|
+
*
|
|
72
|
+
* Past the *lowest* stamp, of any boundary, so a node stamped by fragment A, then B, then A again
|
|
73
|
+
* never delegates from one boundary's wrapper to another's and back. Unstamped receivers (a shadow
|
|
74
|
+
* root's own-property overrides) get the native method.
|
|
75
|
+
*/
|
|
76
|
+
function unstampedMethod(node, name, nativeMethod) {
|
|
77
|
+
let belowStamps;
|
|
78
|
+
for (let proto = Object.getPrototypeOf(node); proto !== null; proto = Object.getPrototypeOf(proto)) {
|
|
79
|
+
if (allStampedProtos.has(proto))
|
|
80
|
+
belowStamps = Object.getPrototypeOf(proto);
|
|
81
|
+
}
|
|
82
|
+
for (let owner = belowStamps; owner; owner = Object.getPrototypeOf(owner)) {
|
|
83
|
+
if (!Object.hasOwn(owner, name))
|
|
84
|
+
continue;
|
|
85
|
+
if (PLATFORM_PROTOTYPES.has(owner))
|
|
86
|
+
return nativeMethod;
|
|
87
|
+
const method = Object.getOwnPropertyDescriptor(owner, name)?.value;
|
|
88
|
+
return typeof method === 'function' && !allBoundaryWrappers.has(method) ? method : nativeMethod;
|
|
89
|
+
}
|
|
90
|
+
return nativeMethod;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Custom elements stamped before their definition existed, page-wide by tag name, and what restamps
|
|
94
|
+
* each one.
|
|
95
|
+
*
|
|
96
|
+
* Upgrading an element replaces its prototype with the definition's, which drops the stamp. Most
|
|
97
|
+
* upgrades happen during an insertion the boundary stamps after anyway; this catches the rest — an
|
|
98
|
+
* element already in a fragment's DOM when its definition arrives *in the host's registry*, which is
|
|
99
|
+
* the one that upgrades fragment DOM: a shared component bundle the host loads. A compat fragment's
|
|
100
|
+
* own `customElements.define` goes to its realm's registry and never resolves here.
|
|
101
|
+
*
|
|
102
|
+
* Many dashed names are never defined at all (every Angular component host), so nothing here may
|
|
103
|
+
* keep a boundary alive: one `whenDefined` per name for the page, closing over only the waiting
|
|
104
|
+
* set, and each element's restamper held weakly by the element.
|
|
105
|
+
*/
|
|
106
|
+
const awaitingDefinition = new Map();
|
|
107
|
+
const restampers = new WeakMap();
|
|
108
|
+
function restampWhenDefined(element, restamp) {
|
|
109
|
+
const alreadyWaiting = restampers.has(element);
|
|
110
|
+
restampers.set(element, restamp);
|
|
111
|
+
if (alreadyWaiting)
|
|
112
|
+
return;
|
|
113
|
+
const name = element.localName;
|
|
114
|
+
let waiting = awaitingDefinition.get(name);
|
|
115
|
+
if (!waiting) {
|
|
116
|
+
const entry = { elements: new Set(), pruneAt: 1024 };
|
|
117
|
+
awaitingDefinition.set(name, (waiting = entry));
|
|
118
|
+
customElements.whenDefined(name).then(() => {
|
|
119
|
+
awaitingDefinition.delete(name);
|
|
120
|
+
for (const ref of entry.elements) {
|
|
121
|
+
const defined = ref.deref();
|
|
122
|
+
if (defined)
|
|
123
|
+
restampers.get(defined)?.(defined);
|
|
124
|
+
}
|
|
125
|
+
}, () => awaitingDefinition.delete(name));
|
|
126
|
+
}
|
|
127
|
+
// a long-lived list of a never-defined element leaves dead refs behind; sweep them as it grows
|
|
128
|
+
if (waiting.elements.size >= waiting.pruneAt) {
|
|
129
|
+
for (const ref of waiting.elements)
|
|
130
|
+
if (!ref.deref())
|
|
131
|
+
waiting.elements.delete(ref);
|
|
132
|
+
waiting.pruneAt = Math.max(1024, waiting.elements.size * 2);
|
|
133
|
+
}
|
|
134
|
+
waiting.elements.add(new WeakRef(element));
|
|
135
|
+
}
|
|
48
136
|
export function createFragmentBoundary(options) {
|
|
49
|
-
const { realmDocument, shadowRoot, braidDocumentElement, abortSignal } = options;
|
|
137
|
+
const { realmDocument, shadowRoot, braidDocumentElement, abortSignal, htmlPolicy } = options;
|
|
50
138
|
const stampedNodes = new WeakSet();
|
|
51
139
|
const stampedProtos = new Map();
|
|
52
140
|
const stampedProtoSet = new WeakSet();
|
|
53
141
|
let warnedAboutUnstampedEntry = false;
|
|
142
|
+
/** Restamps an upgraded element, unless it has left this fragment or the fragment is gone. */
|
|
143
|
+
function restampIfStillInFragment(element) {
|
|
144
|
+
if (!abortSignal.aborted && isInFragmentDom(element))
|
|
145
|
+
stampNode(element);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Stamps what an insertion put in place: anything in the fragment's DOM, or in a detached tree,
|
|
149
|
+
* which may enter it later. Not a node a component's own insertion override placed in the host's
|
|
150
|
+
* DOM instead (a portal, an overlay) — that is the host's, and stays on pristine prototypes.
|
|
151
|
+
*/
|
|
152
|
+
function stampInserted(node) {
|
|
153
|
+
if (node.isConnected && !isInFragmentDom(node))
|
|
154
|
+
return;
|
|
155
|
+
stampTree(node);
|
|
156
|
+
}
|
|
54
157
|
/** A node is inside this fragment's DOM iff its plain root is the fragment's shadow root. */
|
|
55
158
|
function isInFragmentDom(node) {
|
|
56
159
|
return native.getRootNode.call(node) === shadowRoot;
|
|
@@ -65,10 +168,87 @@ export function createFragmentBoundary(options) {
|
|
|
65
168
|
*/
|
|
66
169
|
function reviveInertScript(script) {
|
|
67
170
|
unwrapBornInertScriptToLive(script);
|
|
68
|
-
|
|
171
|
+
// only a script that may run at all: one markup wrote as `type="inert"` stays exactly that
|
|
172
|
+
if (script.getAttribute('type') === 'inert' && !alreadyExecutedScriptsAndLinks.has(script) && isRunnable(script)) {
|
|
69
173
|
restoreScriptType(script);
|
|
70
174
|
}
|
|
71
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* A clone carries its source's provenance, as the browser carries a script's started flag: a clone
|
|
178
|
+
* of a script that may run and has not yet may run, a clone of one that has run has run, and a
|
|
179
|
+
* clone of an inert link Braid made is Braid's. Matched by position: a deep clone has its source's
|
|
180
|
+
* shape. Only clones made through the boundary carry it — any other clone path (a `Range`, a
|
|
181
|
+
* fragment's own `DocumentFragment`) yields scripts that never run, which is the safe side.
|
|
182
|
+
*/
|
|
183
|
+
function inheritProvenance(source, clone, deep) {
|
|
184
|
+
if (!(source instanceof Element) && !(source instanceof DocumentFragment))
|
|
185
|
+
return;
|
|
186
|
+
const select = 'script,link[rel^="inert-"]';
|
|
187
|
+
const sources = [...(source instanceof Element && source.matches(select) ? [source] : [])];
|
|
188
|
+
const clones = [...(clone instanceof Element && clone.matches(select) ? [clone] : [])];
|
|
189
|
+
if (deep) {
|
|
190
|
+
sources.push(...source.querySelectorAll(select));
|
|
191
|
+
clones.push(...clone.querySelectorAll(select));
|
|
192
|
+
}
|
|
193
|
+
sources.forEach((element, index) => {
|
|
194
|
+
const copy = clones[index];
|
|
195
|
+
if (!copy || copy.localName !== element.localName)
|
|
196
|
+
return;
|
|
197
|
+
if (element.localName === 'script') {
|
|
198
|
+
if (alreadyExecutedScriptsAndLinks.has(element))
|
|
199
|
+
alreadyExecutedScriptsAndLinks.add(copy);
|
|
200
|
+
else if (isRunnable(element))
|
|
201
|
+
markRunnable(copy);
|
|
202
|
+
}
|
|
203
|
+
else if (isBraidInertLink(element)) {
|
|
204
|
+
markBraidInertLink(copy);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
if (deep)
|
|
208
|
+
inheritThroughTemplates(source, clone);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* A template's content is copied with it, but no selector enters it: pair the templates up and
|
|
212
|
+
* carry provenance into each copied content, which can itself be instantiated later.
|
|
213
|
+
*/
|
|
214
|
+
function inheritThroughTemplates(source, clone) {
|
|
215
|
+
const sources = [...(source instanceof Element && source.localName === 'template' ? [source] : []), ...source.querySelectorAll('template')];
|
|
216
|
+
const clones = [
|
|
217
|
+
...(clone instanceof Element && clone.localName === 'template' ? [clone] : []),
|
|
218
|
+
...(clone.querySelectorAll?.('template') ?? []),
|
|
219
|
+
];
|
|
220
|
+
sources.forEach((template, index) => {
|
|
221
|
+
const copy = clones[index];
|
|
222
|
+
if (!copy)
|
|
223
|
+
return;
|
|
224
|
+
inheritProvenance(template.content, copy.content, true);
|
|
225
|
+
carryProvenanceOnClone(copy.content);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* The gateway's templates hold scripts a fragment instantiates later, with
|
|
230
|
+
* `template.content.cloneNode(true)`. A template's content is a DocumentFragment, which the
|
|
231
|
+
* boundary does not stamp, so each one gets its own `cloneNode` that carries provenance — an own
|
|
232
|
+
* property of the fragment's DOM object, not a host prototype.
|
|
233
|
+
*/
|
|
234
|
+
function carryProvenanceThroughTemplates(root) {
|
|
235
|
+
for (const template of root.querySelectorAll('template')) {
|
|
236
|
+
const content = template.content;
|
|
237
|
+
carryProvenanceOnClone(content);
|
|
238
|
+
carryProvenanceThroughTemplates(content);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function carryProvenanceOnClone(content) {
|
|
242
|
+
Object.defineProperty(content, 'cloneNode', {
|
|
243
|
+
configurable: true,
|
|
244
|
+
writable: true,
|
|
245
|
+
value: function templateContentCloneNode(deep) {
|
|
246
|
+
const clone = native.cloneNode.call(this, deep);
|
|
247
|
+
inheritProvenance(this, clone, Boolean(deep));
|
|
248
|
+
return clone;
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
}
|
|
72
252
|
function prepareForInsertion(node) {
|
|
73
253
|
if (node instanceof HTMLScriptElement) {
|
|
74
254
|
reviveInertScript(node);
|
|
@@ -94,13 +274,13 @@ export function createFragmentBoundary(options) {
|
|
|
94
274
|
* `compatDomInsertion`). In all cases the inserted subtree is stamped so the stamped set
|
|
95
275
|
* stays closed.
|
|
96
276
|
*/
|
|
97
|
-
function makeSingleNodeInsertion(nativeFn) {
|
|
277
|
+
function makeSingleNodeInsertion(name, nativeFn) {
|
|
98
278
|
return function boundaryInsertion(childNode) {
|
|
99
279
|
const args = arguments;
|
|
100
280
|
const futureStamps = nodesToStampAfterInsertion(childNode);
|
|
101
281
|
const doInsertTheNode = () => {
|
|
102
|
-
const result = nativeFn.apply(this, args);
|
|
103
|
-
futureStamps.forEach(
|
|
282
|
+
const result = unstampedMethod(this, name, nativeFn).apply(this, args);
|
|
283
|
+
futureStamps.forEach(stampInserted);
|
|
104
284
|
return result;
|
|
105
285
|
};
|
|
106
286
|
if (!isInFragmentDom(this)) {
|
|
@@ -115,8 +295,8 @@ export function createFragmentBoundary(options) {
|
|
|
115
295
|
const args = arguments;
|
|
116
296
|
const futureStamps = nodesToStampAfterInsertion(newChild);
|
|
117
297
|
const doInsertTheNode = () => {
|
|
118
|
-
const result = native.replaceChild.apply(this, args);
|
|
119
|
-
futureStamps.forEach(
|
|
298
|
+
const result = unstampedMethod(this, 'replaceChild', native.replaceChild).apply(this, args);
|
|
299
|
+
futureStamps.forEach(stampInserted);
|
|
120
300
|
return result;
|
|
121
301
|
};
|
|
122
302
|
if (!isInFragmentDom(this)) {
|
|
@@ -130,8 +310,8 @@ export function createFragmentBoundary(options) {
|
|
|
130
310
|
function boundaryInsertAdjacentElement(where, element) {
|
|
131
311
|
const args = arguments;
|
|
132
312
|
const doInsertTheNode = () => {
|
|
133
|
-
const result = native.insertAdjacentElement.apply(this, args);
|
|
134
|
-
|
|
313
|
+
const result = unstampedMethod(this, 'insertAdjacentElement', native.insertAdjacentElement).apply(this, args);
|
|
314
|
+
stampInserted(element);
|
|
135
315
|
return result;
|
|
136
316
|
};
|
|
137
317
|
if (!isInFragmentDom(this)) {
|
|
@@ -144,14 +324,14 @@ export function createFragmentBoundary(options) {
|
|
|
144
324
|
* replaceWith): the native insertion runs once, after every node argument has been
|
|
145
325
|
* preprocessed.
|
|
146
326
|
*/
|
|
147
|
-
function makeMultiNodeInsertion(nativeFn) {
|
|
327
|
+
function makeMultiNodeInsertion(name, nativeFn) {
|
|
148
328
|
return function boundaryMultiInsertion(...nodes) {
|
|
149
329
|
const args = arguments;
|
|
150
330
|
const nodeArgs = nodes.filter((node) => typeof node !== 'string');
|
|
151
331
|
const futureStamps = nodeArgs.flatMap(nodesToStampAfterInsertion);
|
|
152
332
|
const doInsertTheNodes = () => {
|
|
153
|
-
nativeFn.apply(this, args);
|
|
154
|
-
futureStamps.forEach(
|
|
333
|
+
unstampedMethod(this, name, nativeFn).apply(this, args);
|
|
334
|
+
futureStamps.forEach(stampInserted);
|
|
155
335
|
};
|
|
156
336
|
if (!isInFragmentDom(this)) {
|
|
157
337
|
return doInsertTheNodes();
|
|
@@ -162,7 +342,9 @@ export function createFragmentBoundary(options) {
|
|
|
162
342
|
}
|
|
163
343
|
function makeHtmlParsingOverrides(innerHTMLDescriptor) {
|
|
164
344
|
return {
|
|
165
|
-
//
|
|
345
|
+
// Scripts parsed from html never execute (per spec), so parsing only needs stamp propagation.
|
|
346
|
+
// A fragment with an HTML policy has the markup parsed and cleaned first (`html-policy.ts`),
|
|
347
|
+
// and the result inserted natively, so the write means what the native setter would have.
|
|
166
348
|
innerHTML: {
|
|
167
349
|
configurable: true,
|
|
168
350
|
enumerable: true,
|
|
@@ -170,40 +352,79 @@ export function createFragmentBoundary(options) {
|
|
|
170
352
|
return innerHTMLDescriptor.get.call(this);
|
|
171
353
|
},
|
|
172
354
|
set(value) {
|
|
173
|
-
|
|
355
|
+
// a shadow root's markup is parsed with its host for context, as the native setter does
|
|
356
|
+
const context = this instanceof ShadowRoot ? this.host : this;
|
|
357
|
+
const cleaned = htmlPolicy?.filter(value === null ? '' : value, context, 'innerHTML');
|
|
358
|
+
if (cleaned) {
|
|
359
|
+
// a template's markup is its content, not its children
|
|
360
|
+
const target = this instanceof HTMLTemplateElement ? this.content : this;
|
|
361
|
+
if (target instanceof Element)
|
|
362
|
+
native.elementReplaceChildren.call(target, cleaned);
|
|
363
|
+
else
|
|
364
|
+
native.fragmentReplaceChildren.call(target, cleaned);
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
innerHTMLDescriptor.set.call(this, value);
|
|
368
|
+
}
|
|
174
369
|
stampTree(this);
|
|
175
370
|
},
|
|
176
371
|
},
|
|
177
372
|
};
|
|
178
373
|
}
|
|
179
374
|
const elementOverrides = {
|
|
180
|
-
appendChild: { configurable: true, writable: true, value: makeSingleNodeInsertion(native.appendChild) },
|
|
181
|
-
insertBefore: { configurable: true, writable: true, value: makeSingleNodeInsertion(native.insertBefore) },
|
|
375
|
+
appendChild: { configurable: true, writable: true, value: makeSingleNodeInsertion('appendChild', native.appendChild) },
|
|
376
|
+
insertBefore: { configurable: true, writable: true, value: makeSingleNodeInsertion('insertBefore', native.insertBefore) },
|
|
182
377
|
replaceChild: { configurable: true, writable: true, value: boundaryReplaceChild },
|
|
183
378
|
insertAdjacentElement: { configurable: true, writable: true, value: boundaryInsertAdjacentElement },
|
|
184
|
-
append: { configurable: true, writable: true, value: makeMultiNodeInsertion(native.elementAppend) },
|
|
185
|
-
prepend: { configurable: true, writable: true, value: makeMultiNodeInsertion(native.elementPrepend) },
|
|
379
|
+
append: { configurable: true, writable: true, value: makeMultiNodeInsertion('append', native.elementAppend) },
|
|
380
|
+
prepend: { configurable: true, writable: true, value: makeMultiNodeInsertion('prepend', native.elementPrepend) },
|
|
186
381
|
replaceChildren: {
|
|
187
382
|
configurable: true,
|
|
188
383
|
writable: true,
|
|
189
|
-
value: makeMultiNodeInsertion(native.elementReplaceChildren),
|
|
384
|
+
value: makeMultiNodeInsertion('replaceChildren', native.elementReplaceChildren),
|
|
190
385
|
},
|
|
191
|
-
replaceWith: { configurable: true, writable: true, value: makeMultiNodeInsertion(native.elementReplaceWith) },
|
|
386
|
+
replaceWith: { configurable: true, writable: true, value: makeMultiNodeInsertion('replaceWith', native.elementReplaceWith) },
|
|
192
387
|
insertAdjacentHTML: {
|
|
193
388
|
configurable: true,
|
|
194
389
|
writable: true,
|
|
195
390
|
value: function boundaryInsertAdjacentHTML(position, text) {
|
|
196
|
-
const result = native.insertAdjacentHTML.call(this, position, text);
|
|
197
391
|
const lowercasePosition = String(position).toLowerCase();
|
|
198
|
-
|
|
199
|
-
|
|
392
|
+
const outside = lowercasePosition === 'beforebegin' || lowercasePosition === 'afterend';
|
|
393
|
+
const inside = lowercasePosition === 'afterbegin' || lowercasePosition === 'beforeend';
|
|
394
|
+
const parent = this.parentNode;
|
|
395
|
+
// the native method's context and errors, so a policy changes nothing but what is removed:
|
|
396
|
+
// outside the element, its parent is the context, or a <body> when the parent is no element
|
|
397
|
+
const context = inside
|
|
398
|
+
? this
|
|
399
|
+
: parent instanceof Element
|
|
400
|
+
? parent
|
|
401
|
+
: this.ownerDocument.createElement('body');
|
|
402
|
+
const cleaned = htmlPolicy && (inside || (outside && parent && parent.nodeType !== Node.DOCUMENT_NODE))
|
|
403
|
+
? htmlPolicy.filter(text, context, 'insertAdjacentHTML')
|
|
404
|
+
: null;
|
|
405
|
+
if (cleaned) {
|
|
406
|
+
if (lowercasePosition === 'beforebegin')
|
|
407
|
+
native.elementBefore.call(this, cleaned);
|
|
408
|
+
else if (lowercasePosition === 'afterbegin')
|
|
409
|
+
native.elementPrepend.call(this, cleaned);
|
|
410
|
+
else if (lowercasePosition === 'beforeend')
|
|
411
|
+
native.elementAppend.call(this, cleaned);
|
|
412
|
+
else
|
|
413
|
+
native.elementAfter.call(this, cleaned);
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
// also what throws for an unknown position, or outside an element with no parent
|
|
417
|
+
unstampedMethod(this, 'insertAdjacentHTML', native.insertAdjacentHTML).call(this, position, text);
|
|
418
|
+
}
|
|
419
|
+
stampTree(inside ? this : this.parentNode ?? this);
|
|
200
420
|
},
|
|
201
421
|
},
|
|
202
422
|
cloneNode: {
|
|
203
423
|
configurable: true,
|
|
204
424
|
writable: true,
|
|
205
425
|
value: function boundaryCloneNode(deep) {
|
|
206
|
-
const clone = native.cloneNode.call(this, deep);
|
|
426
|
+
const clone = unstampedMethod(this, 'cloneNode', native.cloneNode).call(this, deep);
|
|
427
|
+
inheritProvenance(this, clone, Boolean(deep));
|
|
207
428
|
stampTree(clone);
|
|
208
429
|
return clone;
|
|
209
430
|
},
|
|
@@ -229,21 +450,43 @@ export function createFragmentBoundary(options) {
|
|
|
229
450
|
},
|
|
230
451
|
...makeHtmlParsingOverrides(native.elementInnerHTML),
|
|
231
452
|
};
|
|
453
|
+
for (const descriptor of Object.values(elementOverrides)) {
|
|
454
|
+
if (typeof descriptor.value === 'function')
|
|
455
|
+
allBoundaryWrappers.add(descriptor.value);
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* What a URL set from fragment script resolves against, read when it is set: the namespace from
|
|
459
|
+
* the realm's base, and the fragment's own `<base href>` from its markup — the two the gateway
|
|
460
|
+
* uses for the same URL in markup, so markup and script agree on every route.
|
|
461
|
+
*/
|
|
462
|
+
const urlBase = () => ({
|
|
463
|
+
root: fragmentRootOf(realmDocument.baseURI),
|
|
464
|
+
baseHref: braidDocumentElement.querySelector('base[href]')?.getAttribute('href') ?? '/',
|
|
465
|
+
});
|
|
232
466
|
function stampNode(node) {
|
|
233
467
|
if (node.nodeType !== Node.ELEMENT_NODE)
|
|
234
468
|
return;
|
|
235
|
-
|
|
236
|
-
|
|
469
|
+
// by prototype, not by membership: an upgrade replaces a stamped element's prototype, and the
|
|
470
|
+
// next stamping pass that reaches it should put the stamp back
|
|
237
471
|
const proto = Object.getPrototypeOf(node);
|
|
238
472
|
if (proto === null || stampedProtoSet.has(proto)) {
|
|
239
473
|
stampedNodes.add(node);
|
|
240
474
|
return;
|
|
241
475
|
}
|
|
476
|
+
if (proto === HTMLElement.prototype && node.localName.includes('-')) {
|
|
477
|
+
restampWhenDefined(node, restampIfStillInFragment);
|
|
478
|
+
}
|
|
242
479
|
let stampedProto = stampedProtos.get(proto);
|
|
243
480
|
if (!stampedProto) {
|
|
244
|
-
|
|
481
|
+
// a subresource URL the fragment's code sets resolves into its namespace, as one in its
|
|
482
|
+
// markup does (see subresource-urls.ts); keyed by prototype, which fixes the element type
|
|
483
|
+
stampedProto = Object.create(proto, {
|
|
484
|
+
...elementOverrides,
|
|
485
|
+
...subresourceUrlOverrides(proto, node.localName, urlBase),
|
|
486
|
+
});
|
|
245
487
|
stampedProtos.set(proto, stampedProto);
|
|
246
488
|
stampedProtoSet.add(stampedProto);
|
|
489
|
+
allStampedProtos.add(stampedProto);
|
|
247
490
|
}
|
|
248
491
|
Object.setPrototypeOf(node, stampedProto);
|
|
249
492
|
stampedNodes.add(node);
|
|
@@ -264,21 +507,27 @@ export function createFragmentBoundary(options) {
|
|
|
264
507
|
* (reporting the main document) — only insertions are intercepted.
|
|
265
508
|
*/
|
|
266
509
|
Object.defineProperties(shadowRoot, {
|
|
267
|
-
appendChild: { configurable: true, writable: true, value: makeSingleNodeInsertion(native.appendChild) },
|
|
268
|
-
insertBefore: { configurable: true, writable: true, value: makeSingleNodeInsertion(native.insertBefore) },
|
|
510
|
+
appendChild: { configurable: true, writable: true, value: makeSingleNodeInsertion('appendChild', native.appendChild) },
|
|
511
|
+
insertBefore: { configurable: true, writable: true, value: makeSingleNodeInsertion('insertBefore', native.insertBefore) },
|
|
269
512
|
replaceChild: { configurable: true, writable: true, value: boundaryReplaceChild },
|
|
270
|
-
append: { configurable: true, writable: true, value: makeMultiNodeInsertion(native.fragmentAppend) },
|
|
271
|
-
prepend: { configurable: true, writable: true, value: makeMultiNodeInsertion(native.fragmentPrepend) },
|
|
513
|
+
append: { configurable: true, writable: true, value: makeMultiNodeInsertion('append', native.fragmentAppend) },
|
|
514
|
+
prepend: { configurable: true, writable: true, value: makeMultiNodeInsertion('prepend', native.fragmentPrepend) },
|
|
272
515
|
replaceChildren: {
|
|
273
516
|
configurable: true,
|
|
274
517
|
writable: true,
|
|
275
|
-
value: makeMultiNodeInsertion(native.fragmentReplaceChildren),
|
|
518
|
+
value: makeMultiNodeInsertion('replaceChildren', native.fragmentReplaceChildren),
|
|
276
519
|
},
|
|
277
520
|
...makeHtmlParsingOverrides(native.shadowRootInnerHTML),
|
|
278
521
|
});
|
|
279
522
|
// stamp the initial fragment DOM (for pierced fragments this includes the SSR'ed content;
|
|
280
523
|
// for slot-fetched fragments this is the already-inserted, neutralized content)
|
|
281
524
|
stampTree(braidDocumentElement);
|
|
525
|
+
// that content is the gateway's: its scripts may run and its inert links are the ones it
|
|
526
|
+
// neutralized, and nothing of the fragment's has run yet to have written any of its own
|
|
527
|
+
markGatewayContent(braidDocumentElement);
|
|
528
|
+
carryProvenanceThroughTemplates(braidDocumentElement);
|
|
529
|
+
// before the observer starts, so moving them out and back is not mistaken for an insertion
|
|
530
|
+
markStartedInPlace(braidDocumentElement);
|
|
282
531
|
/**
|
|
283
532
|
* The boundary observer: activates inert scripts/preload-links that entered the fragment's
|
|
284
533
|
* DOM through unstamped paths, stamps stray subtrees, and reports bypasses in dev mode.
|
|
@@ -298,18 +547,23 @@ export function createFragmentBoundary(options) {
|
|
|
298
547
|
}
|
|
299
548
|
stampTree(addedElement);
|
|
300
549
|
}
|
|
550
|
+
// scripts that arrived by a path the boundary did not intercept were not marked started
|
|
551
|
+
markStartedInPlace(addedElement);
|
|
301
552
|
activateInertScriptsAndLinks(addedElement);
|
|
302
553
|
}
|
|
303
554
|
}
|
|
304
555
|
});
|
|
305
556
|
function activateInertScriptsAndLinks(root) {
|
|
306
|
-
const inertSelector = 'script[type="inert"],link[rel="inert-preload"],link[rel="inert-prefetch"],link[rel="inert-modulepreload"]';
|
|
307
557
|
const candidates = [];
|
|
308
|
-
if (root.matches(
|
|
558
|
+
if (root.matches(INERT_SELECTOR)) {
|
|
309
559
|
candidates.push(root);
|
|
310
560
|
}
|
|
311
|
-
candidates.push(...root.querySelectorAll(
|
|
561
|
+
candidates.push(...root.querySelectorAll(INERT_SELECTOR));
|
|
312
562
|
for (const candidate of candidates) {
|
|
563
|
+
// a script that may not run, or a marker Braid did not set, is markup the fragment wrote, and
|
|
564
|
+
// it stays as inert as it would be natively — see `isRunnable`
|
|
565
|
+
if (candidate instanceof HTMLLinkElement ? !isBraidInertLink(candidate) : !isRunnable(candidate))
|
|
566
|
+
continue;
|
|
313
567
|
if (candidate instanceof HTMLLinkElement) {
|
|
314
568
|
executeInertPreloadLink(candidate, realmDocument);
|
|
315
569
|
}
|
|
@@ -329,6 +583,7 @@ export function createFragmentBoundary(options) {
|
|
|
329
583
|
return {
|
|
330
584
|
stampNode,
|
|
331
585
|
stampTree,
|
|
586
|
+
inheritProvenance,
|
|
332
587
|
disconnect: () => observer.disconnect(),
|
|
333
588
|
};
|
|
334
589
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fragment-boundary.js","sourceRoot":"","sources":["../../../../../libs/core/src/compat/fragment-boundary.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fragment-boundary.js","sourceRoot":"","sources":["../../../../../libs/core/src/compat/fragment-boundary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { FragmentCapabilities } from '../weave/capabilities.js';
|
|
2
|
+
/**
|
|
3
|
+
* What a compat fragment's own HTML writes may put in the page: `capabilities.html`, opt-in.
|
|
4
|
+
*
|
|
5
|
+
* The gateway already neutralizes the markup a fragment *sends*: no handler, script, `javascript:`
|
|
6
|
+
* frame or meta refresh in server-rendered HTML runs in the host realm. Markup a fragment's code
|
|
7
|
+
* *writes* at runtime has had no such treatment. `el.innerHTML = userInput` with a stray
|
|
8
|
+
* `<img onerror>` compiles that handler in the host page's realm, because the element is the host
|
|
9
|
+
* document's — an XSS in one fragment becomes script in the shell.
|
|
10
|
+
*
|
|
11
|
+
* - `'sanitize'` removes what could run, or make Braid run something: every `<script>`, `on*`
|
|
12
|
+
* attributes, `javascript:` URLs, frame documents from anything but http(s) (the gateway's
|
|
13
|
+
* allowlist), SVG animation (which can set a link's `href`), meta refresh, `<base>`, Braid's own
|
|
14
|
+
* elements (a written `<fragment-slot entry>` would boot a realm), and the `inert-*` links and
|
|
15
|
+
* `data-script-type` markers only the gateway may write.
|
|
16
|
+
* - `'report'` writes the markup unchanged, and warns once per distinct finding with what
|
|
17
|
+
* `'sanitize'` would have removed. It parses every write a second time to know, so it is for
|
|
18
|
+
* development and staging.
|
|
19
|
+
*
|
|
20
|
+
* **Parsing is the native parse, somewhere harmless.** The markup is parsed by the browser's own
|
|
21
|
+
* fragment parser, with an element of the same name and namespace as the write's target for
|
|
22
|
+
* context, in a document with no browsing context — where nothing loads, runs or dispatches. So a
|
|
23
|
+
* write into an `<svg>` yields SVG, a `<tr>` into a `<table>` gets its `<tbody>`, exactly as the
|
|
24
|
+
* native setter would; only then are the cleaned nodes moved into the page. They are never
|
|
25
|
+
* serialized and parsed again: a second parse is how sanitizers get bypassed. Writes whose result
|
|
26
|
+
* is only ever text — into a `<textarea>`, `<style>`, `<script>`, `<title>` — and `TrustedHTML`
|
|
27
|
+
* values, which the host's own policy already vetted, are passed straight to the native setter.
|
|
28
|
+
* Any other value is converted to a string, as the native setter would, and cleaned.
|
|
29
|
+
*
|
|
30
|
+
* Not in scope: CSS. A written `<style>`, stylesheet link or `style` attribute can still restyle or
|
|
31
|
+
* overlay the host page.
|
|
32
|
+
*
|
|
33
|
+
* Covered: `innerHTML` on the fragment's elements and shadow root, and `insertAdjacentHTML` — the
|
|
34
|
+
* sinks the fragment boundary already stamps. Not covered: `outerHTML`, `setHTMLUnsafe`,
|
|
35
|
+
* `Range.createContextualFragment`, markup parsed elsewhere and then inserted (`DOMParser`,
|
|
36
|
+
* `document.implementation`, `jQuery.parseHTML`), `document.write`, captured native setters, and DOM
|
|
37
|
+
* a fragment builds attribute by attribute. A custom element the host defines upgrades wherever it
|
|
38
|
+
* is inserted, so its tag in written markup is as capable as the element is.
|
|
39
|
+
*/
|
|
40
|
+
export type HtmlPolicyMode = 'report' | 'sanitize';
|
|
41
|
+
export declare function resolveHtmlPolicy(capabilities: FragmentCapabilities | undefined, fragmentId: string): HtmlPolicyMode | null;
|
|
42
|
+
export interface HtmlPolicy {
|
|
43
|
+
/**
|
|
44
|
+
* Parses `markup` as a write into `context` through `sink`. Returns the cleaned nodes to insert
|
|
45
|
+
* in its place under `'sanitize'`, or null to let the native setter write `markup` as it is:
|
|
46
|
+
* always under `'report'` (after warning), and for writes that cannot produce markup.
|
|
47
|
+
*/
|
|
48
|
+
filter(markup: unknown, context: Element, sink: string): DocumentFragment | null;
|
|
49
|
+
}
|
|
50
|
+
export declare function createHtmlPolicy(mode: HtmlPolicyMode, fragmentId: string, mainDocument: Document): HtmlPolicy;
|