Skip to content

Commit 3c7eb34

Browse files
committed
Improve trusted-create-html scriptlet
1 parent c8c29fa commit 3c7eb34

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

src/js/resources/create-html.js

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
*/
2222

2323
import { registerScriptlet } from './base.js';
24+
import { runAt } from './run-at.js';
2425
import { safeSelf } from './safe-self.js';
2526

2627
/******************************************************************************/
@@ -55,6 +56,7 @@ function trustedCreateHTML(
5556
if ( htmlStr === '' ) { return; }
5657
const safe = safeSelf();
5758
const logPrefix = safe.makeLogPrefix('trusted-create-html', parentSelector, htmlStr, durationStr);
59+
const extraArgs = safe.getExtraArgs(Array.from(arguments), 3);
5860
// We do not want to recursively create elements
5961
self.trustedCreateHTML = true;
6062
let ancestor = self.frameElement;
@@ -94,17 +96,37 @@ function trustedCreateHTML(
9496
setTimeout(remove, duration);
9597
return true;
9698
};
97-
if ( append() ) { return; }
98-
const observer = new MutationObserver(( ) => {
99-
if ( append() === false ) { return; }
100-
observer.disconnect();
101-
});
102-
observer.observe(document, { childList: true, subtree: true });
99+
const start = ( ) => {
100+
if ( append() ) { return; }
101+
const observer = new MutationObserver(( ) => {
102+
if ( append() === false ) { return; }
103+
observer.disconnect();
104+
});
105+
const observerOptions = {
106+
childList: true,
107+
subtree: true,
108+
};
109+
if ( /[#.[]/.test(parentSelector) ) {
110+
observerOptions.attributes = true;
111+
if ( parentSelector.includes('[') === false ) {
112+
observerOptions.attributeFilter = [];
113+
if ( parentSelector.includes('#') ) {
114+
observerOptions.attributeFilter.push('id');
115+
}
116+
if ( parentSelector.includes('.') ) {
117+
observerOptions.attributeFilter.push('class');
118+
}
119+
}
120+
}
121+
observer.observe(document, observerOptions);
122+
};
123+
runAt(start, extraArgs.runAt || 'loading');
103124
}
104125
registerScriptlet(trustedCreateHTML, {
105126
name: 'trusted-create-html.js',
106127
requiresTrust: true,
107128
dependencies: [
129+
runAt,
108130
safeSelf,
109131
],
110132
world: 'ISOLATED',

0 commit comments

Comments
 (0)