From c971b991a8138195e97b27541be00ef6b84a8538 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 24 Jul 2018 10:12:14 +0200 Subject: [PATCH] MOBILE-2442 dom: Prevent http requests when parsing HTML --- src/providers/utils/dom.ts | 10 +++++----- src/providers/utils/text.ts | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/providers/utils/dom.ts b/src/providers/utils/dom.ts index 3e03e9d41..efc818100 100644 --- a/src/providers/utils/dom.ts +++ b/src/providers/utils/dom.ts @@ -35,6 +35,8 @@ export class CoreDomUtilsProvider { 'search', 'tel', 'text', 'time', 'url', 'week']; protected INSTANCE_ID_ATTR_NAME = 'core-instance-id'; + protected template = document.createElement('template'); // A template element to convert HTML to element. + protected matchesFn: string; // Name of the "matches" function to use when simulating a closest call. protected instances: {[id: string]: any} = {}; // Store component/directive instances by id. protected lastInstanceId = 0; @@ -125,17 +127,15 @@ export class CoreDomUtilsProvider { /** * Convert some HTML as text into an HTMLElement. This HTML is put inside a div or a body. - * @todo: Try to use DOMParser or similar since this approach will send a request to all embedded media. - * We removed DOMParser solution because it isn't synchronous, document.body wasn't always loaded at start. * * @param {string} html Text to convert. * @return {HTMLElement} Element. */ convertToElement(html: string): HTMLElement { - const element = document.createElement('div'); - element.innerHTML = html; + // Add a div to hold the content, that's the element that will be returned. + this.template.innerHTML = '
' + html + '
'; - return element; + return this.template.content.children[0]; } /** diff --git a/src/providers/utils/text.ts b/src/providers/utils/text.ts index 7477db9ff..228a6e6bd 100644 --- a/src/providers/utils/text.ts +++ b/src/providers/utils/text.ts @@ -68,6 +68,8 @@ export class CoreTextUtilsProvider { {old: /_mmaModWorkshop/g, new: '_AddonModWorkshop'}, ]; + protected template = document.createElement('template'); // A template element to convert HTML to element. + constructor(private translate: TranslateService, private langProvider: CoreLangProvider, private modalCtrl: ModalController) { } /** @@ -177,17 +179,15 @@ export class CoreTextUtilsProvider { /** * Convert some HTML as text into an HTMLElement. This HTML is put inside a div or a body. * This function is the same as in DomUtils, but we cannot use that one because of circular dependencies. - * @todo: Try to use DOMParser or similar since this approach will send a request to all embedded media. - * We removed DOMParser solution because it isn't synchronous, document.body wasn't always loaded at start. * * @param {string} html Text to convert. * @return {HTMLElement} Element. */ protected convertToElement(html: string): HTMLElement { - const element = document.createElement('div'); - element.innerHTML = html; + // Add a div to hold the content, that's the element that will be returned. + this.template.innerHTML = '
' + html + '
'; - return element; + return this.template.content.children[0]; } /**