mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
refactor(core): remove IE11 only sanitization code (#48438)
As IE11 support has been drop with v13, this specific code isn't needed anymore. PR Close #48438
This commit is contained in:
committed by
Andrew Scott
parent
ba38178d19
commit
2ceff3f0c2
@@ -12,7 +12,7 @@
|
||||
"aio-local": {
|
||||
"uncompressed": {
|
||||
"runtime": 4325,
|
||||
"main": 466201,
|
||||
"main": 465606,
|
||||
"polyfills": 33836,
|
||||
"styles": 74561,
|
||||
"light-theme": 92890,
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"cli-hello-world-ivy-i18n": {
|
||||
"uncompressed": {
|
||||
"runtime": 926,
|
||||
"main": 124195,
|
||||
"main": 123543,
|
||||
"polyfills": 34628
|
||||
}
|
||||
},
|
||||
|
||||
@@ -59,8 +59,7 @@ class DOMParserHelper implements InertBodyHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* Use an HTML5 `template` element, if supported, or an inert body element created via
|
||||
* `createHtmlDocument` to create and fill an inert DOM element.
|
||||
* Use an HTML5 `template` element to create and fill an inert DOM element.
|
||||
* This is the fallback strategy if the browser does not support DOMParser.
|
||||
*/
|
||||
class InertDocumentHelper implements InertBodyHelper {
|
||||
@@ -68,67 +67,12 @@ class InertDocumentHelper implements InertBodyHelper {
|
||||
|
||||
constructor(private defaultDoc: Document) {
|
||||
this.inertDocument = this.defaultDoc.implementation.createHTMLDocument('sanitization-inert');
|
||||
|
||||
if (this.inertDocument.body == null) {
|
||||
// usually there should be only one body element in the document, but IE doesn't have any, so
|
||||
// we need to create one.
|
||||
const inertHtml = this.inertDocument.createElement('html');
|
||||
this.inertDocument.appendChild(inertHtml);
|
||||
const inertBodyElement = this.inertDocument.createElement('body');
|
||||
inertHtml.appendChild(inertBodyElement);
|
||||
}
|
||||
}
|
||||
|
||||
getInertBodyElement(html: string): HTMLElement|null {
|
||||
// Prefer using <template> element if supported.
|
||||
const templateEl = this.inertDocument.createElement('template');
|
||||
if ('content' in templateEl) {
|
||||
templateEl.innerHTML = trustedHTMLFromString(html) as string;
|
||||
return templateEl;
|
||||
}
|
||||
|
||||
// Note that previously we used to do something like `this.inertDocument.body.innerHTML = html`
|
||||
// and we returned the inert `body` node. This was changed, because IE seems to treat setting
|
||||
// `innerHTML` on an inserted element differently, compared to one that hasn't been inserted
|
||||
// yet. In particular, IE appears to split some of the text into multiple text nodes rather
|
||||
// than keeping them in a single one which ends up messing with Ivy's i18n parsing further
|
||||
// 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 = trustedHTMLFromString(html) as string;
|
||||
|
||||
// Support: IE 11 only
|
||||
// strip custom-namespaced attributes on IE<=11
|
||||
if ((this.defaultDoc as any).documentMode) {
|
||||
this.stripCustomNsAttrs(inertBody);
|
||||
}
|
||||
|
||||
return inertBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* When IE11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1'
|
||||
* attribute to declare ns1 namespace and prefixes the attribute with 'ns1' (e.g.
|
||||
* 'ns1:xlink:foo').
|
||||
*
|
||||
* This is undesirable since we don't want to allow any of these custom attributes. This method
|
||||
* strips them all.
|
||||
*/
|
||||
private stripCustomNsAttrs(el: Element) {
|
||||
const elAttrs = el.attributes;
|
||||
// loop backwards so that we can support removals.
|
||||
for (let i = elAttrs.length - 1; 0 < i; i--) {
|
||||
const attrib = elAttrs.item(i);
|
||||
const attrName = attrib!.name;
|
||||
if (attrName === 'xmlns:ns1' || attrName.indexOf('ns1:') === 0) {
|
||||
el.removeAttribute(attrName);
|
||||
}
|
||||
}
|
||||
let childNode = el.firstChild as Node | null;
|
||||
while (childNode) {
|
||||
if (childNode.nodeType === Node.ELEMENT_NODE) this.stripCustomNsAttrs(childNode as Element);
|
||||
childNode = childNode.nextSibling;
|
||||
}
|
||||
templateEl.innerHTML = trustedHTMLFromString(html) as string;
|
||||
return templateEl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user