Skip to content

Commit

Permalink
perf: prevent adding multiple DOMPurify hooks
Browse files Browse the repository at this point in the history
Currently, everytime `removeScript()` is called, the same DOMPurify
hooks are getting added again and again.

Co-authored-by: Alois Klink <alois@aloisklink.com>
  • Loading branch information
sidharthv96 and aloisklink committed Jan 25, 2024
1 parent 6939cf5 commit 1c200ee
Showing 1 changed file with 24 additions and 9 deletions.
33 changes: 24 additions & 9 deletions packages/mermaid/src/diagrams/common/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,18 @@ export const getRows = (s?: string): string[] => {
return str.split('#br#');
};

/**
* Removes script tags from a text
*
* @param txt - The text to sanitize
* @returns The safer text
*/
export const removeScript = (txt: string): string => {
const setupDompurifyHooksIfNotSetup = (() => {
let setup = false;

return () => {
if (!setup) {
setupDompurifyHooks();
setup = true;
}
};
})();

function setupDompurifyHooks() {
const TEMPORARY_ATTRIBUTE = 'data-temp-href-target';

DOMPurify.addHook('beforeSanitizeAttributes', (node: Element) => {
Expand All @@ -33,8 +38,6 @@ export const removeScript = (txt: string): string => {
}
});

const sanitizedText = DOMPurify.sanitize(txt);

DOMPurify.addHook('afterSanitizeAttributes', (node: Element) => {
if (node.tagName === 'A' && node.hasAttribute(TEMPORARY_ATTRIBUTE)) {
node.setAttribute('target', node.getAttribute(TEMPORARY_ATTRIBUTE) || '');
Expand All @@ -44,6 +47,18 @@ export const removeScript = (txt: string): string => {
}
}
});
}

/**
* Removes script tags from a text
*
* @param txt - The text to sanitize
* @returns The safer text
*/
export const removeScript = (txt: string): string => {
setupDompurifyHooksIfNotSetup();

const sanitizedText = DOMPurify.sanitize(txt);

return sanitizedText;
};
Expand Down

0 comments on commit 1c200ee

Please sign in to comment.