Skip to content

Commit

Permalink
fix(core): use Trusted Types policy in inert DOM builder (#39208)
Browse files Browse the repository at this point in the history
When Angular is used in an environment that enforces Trusted Types, the
inert DOM builder raises a Trusted Types violation due to its use of
DOMParser and element.innerHTML with plain strings. Since it is only
used internally (in the HTML sanitizer and for i18n ICU parsing), we
update it to use Angular's Trusted Types policy to promote the provided
HTML to TrustedHTML.

PR Close #39208
  • Loading branch information
bjarkler authored and atscott committed Oct 13, 2020
1 parent b642f0b commit 7d49299
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions packages/core/src/sanitization/inert_body.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* found in the LICENSE file at https://angular.io/license
*/

import {trustedHTMLFromString} from '../util/security/trusted_types';

/**
* This helper is used to get hold of an inert tree of DOM elements containing dirty HTML
* that needs sanitizing.
Expand Down Expand Up @@ -36,8 +38,9 @@ class DOMParserHelper implements InertBodyHelper {
// in `html` from consuming the otherwise explicit `</body>` tag.
html = '<body><remove></remove>' + html;
try {
const body = new (window as any).DOMParser().parseFromString(html, 'text/html').body as
HTMLBodyElement;
const body = new window.DOMParser()
.parseFromString(trustedHTMLFromString(html) as string, 'text/html')
.body as HTMLBodyElement;
body.removeChild(body.firstChild!);
return body;
} catch {
Expand Down Expand Up @@ -71,7 +74,7 @@ class InertDocumentHelper implements InertBodyHelper {
// Prefer using <template> element if supported.
const templateEl = this.inertDocument.createElement('template');
if ('content' in templateEl) {
templateEl.innerHTML = html;
templateEl.innerHTML = trustedHTMLFromString(html) as string;
return templateEl;
}

Expand All @@ -83,7 +86,7 @@ class InertDocumentHelper implements InertBodyHelper {
// down the line. This has been worked around by creating a new inert `body` and using it as
// the root node in which we insert the HTML.
const inertBody = this.inertDocument.createElement('body');
inertBody.innerHTML = html;
inertBody.innerHTML = trustedHTMLFromString(html) as string;

// Support: IE 9-11 only
// strip custom-namespaced attributes on IE<=11
Expand Down Expand Up @@ -129,7 +132,8 @@ class InertDocumentHelper implements InertBodyHelper {
*/
export function isDOMParserAvailable() {
try {
return !!new (window as any).DOMParser().parseFromString('', 'text/html');
return !!new window.DOMParser().parseFromString(
trustedHTMLFromString('') as string, 'text/html');
} catch {
return false;
}
Expand Down

0 comments on commit 7d49299

Please sign in to comment.