From 90d61033e02b8965b93815f742b87b2b761693be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Wed, 6 Nov 2019 22:24:05 +0100 Subject: [PATCH 1/5] Rework to make DOMImplementation lazy and injectable --- src/ol/dom.js | 29 +++++++++++++++++++++++++++++ src/ol/format/xsd.js | 13 +++++++------ src/ol/xml.js | 12 ++---------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/ol/dom.js b/src/ol/dom.js index 900fa6d559..74e3f45f6c 100644 --- a/src/ol/dom.js +++ b/src/ol/dom.js @@ -122,3 +122,32 @@ export function replaceChildren(node, children) { node.insertBefore(newChild, oldChild); } } + +let domImplementation_ = undefined; + +/** + * Register an external DOMImplementation. Can be used to supply a DOMImplementation + * in non-browser environments. + * + * @param {DOMImplementation} domImplementation A DOMImplementation. + * @api + */ +export function registerDOMImplementation(domImplementation) { + domImplementation_ = document; +} + +let document_ = undefined; + +/** + * Get a document that should be used when creating nodes for XML serializations. + * @return {Document} The document. + */ +export function getDocument() { + if (document_ === undefined) { + if (!domImplementation_ && typeof document !== 'undefined') { + domImplementation_ = document.implementation; + } + document_ = domImplementation_.createDocument('', '', null); + } + return document_; +} diff --git a/src/ol/format/xsd.js b/src/ol/format/xsd.js index 5e7f8436e9..0aeb2c5c01 100644 --- a/src/ol/format/xsd.js +++ b/src/ol/format/xsd.js @@ -1,7 +1,8 @@ /** * @module ol/format/xsd */ -import {getAllTextContent, DOCUMENT} from '../xml.js'; +import {getDocument} from '../dom.js'; +import {getAllTextContent} from '../xml.js'; import {padNumber} from '../string.js'; @@ -112,7 +113,7 @@ export function writeBooleanTextNode(node, bool) { * @param {string} string String. */ export function writeCDATASection(node, string) { - node.appendChild(DOCUMENT.createCDATASection(string)); + node.appendChild(getDocument().createCDATASection(string)); } @@ -128,7 +129,7 @@ export function writeDateTimeTextNode(node, dateTime) { padNumber(date.getUTCHours(), 2) + ':' + padNumber(date.getUTCMinutes(), 2) + ':' + padNumber(date.getUTCSeconds(), 2) + 'Z'; - node.appendChild(DOCUMENT.createTextNode(string)); + node.appendChild(getDocument().createTextNode(string)); } @@ -138,7 +139,7 @@ export function writeDateTimeTextNode(node, dateTime) { */ export function writeDecimalTextNode(node, decimal) { const string = decimal.toPrecision(); - node.appendChild(DOCUMENT.createTextNode(string)); + node.appendChild(getDocument().createTextNode(string)); } @@ -148,7 +149,7 @@ export function writeDecimalTextNode(node, decimal) { */ export function writeNonNegativeIntegerTextNode(node, nonNegativeInteger) { const string = nonNegativeInteger.toString(); - node.appendChild(DOCUMENT.createTextNode(string)); + node.appendChild(getDocument().createTextNode(string)); } @@ -157,5 +158,5 @@ export function writeNonNegativeIntegerTextNode(node, nonNegativeInteger) { * @param {string} string String. */ export function writeStringTextNode(node, string) { - node.appendChild(DOCUMENT.createTextNode(string)); + node.appendChild(getDocument().createTextNode(string)); } diff --git a/src/ol/xml.js b/src/ol/xml.js index 0f47f57a4a..cee71100eb 100644 --- a/src/ol/xml.js +++ b/src/ol/xml.js @@ -2,6 +2,7 @@ * @module ol/xml */ import {extend} from './array.js'; +import {getDocument} from './dom.js'; /** @@ -23,15 +24,6 @@ import {extend} from './array.js'; */ -/** - * This document should be used when creating nodes for XML serializations. This - * document is also used by {@link module:ol/xml~createElementNS} - * @const - * @type {Document} - */ -export const DOCUMENT = document.implementation.createDocument('', '', null); - - /** * @type {string} */ @@ -44,7 +36,7 @@ export const XML_SCHEMA_INSTANCE_URI = 'http://www.w3.org/2001/XMLSchema-instanc * @return {Element} Node. */ export function createElementNS(namespaceURI, qualifiedName) { - return DOCUMENT.createElementNS(namespaceURI, qualifiedName); + return getDocument().createElementNS(namespaceURI, qualifiedName); } From fc461668214ef42cffa8b037194aa5ad75aa7acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Thu, 7 Nov 2019 20:39:28 +0100 Subject: [PATCH 2/5] Fix argument name mixup --- src/ol/dom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/dom.js b/src/ol/dom.js index 74e3f45f6c..94604f4ae3 100644 --- a/src/ol/dom.js +++ b/src/ol/dom.js @@ -133,7 +133,7 @@ let domImplementation_ = undefined; * @api */ export function registerDOMImplementation(domImplementation) { - domImplementation_ = document; + domImplementation_ = domImplementation; } let document_ = undefined; From bdc20e0293d7d4b23c12bc86bc25fb345d319ba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Wed, 13 Nov 2019 22:54:56 +0100 Subject: [PATCH 3/5] Rework to register Document and add XMLSerializer --- src/ol/dom.js | 21 ++++++++------------- src/ol/format/XMLFeature.js | 4 ++-- src/ol/xml.js | 24 ++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/ol/dom.js b/src/ol/dom.js index 94604f4ae3..bf3274686a 100644 --- a/src/ol/dom.js +++ b/src/ol/dom.js @@ -123,31 +123,26 @@ export function replaceChildren(node, children) { } } -let domImplementation_ = undefined; +let document_ = undefined; /** - * Register an external DOMImplementation. Can be used to supply a DOMImplementation - * in non-browser environments. + * Register a Document to use when creating nodes for XML serializations. Can be used + * to inject a Document where there is no globally available implementation. * - * @param {DOMImplementation} domImplementation A DOMImplementation. + * @param {Document} document A Document. * @api */ -export function registerDOMImplementation(domImplementation) { - domImplementation_ = domImplementation; +export function registerDocument(document) { + document_ = document; } -let document_ = undefined; - /** * Get a document that should be used when creating nodes for XML serializations. * @return {Document} The document. */ export function getDocument() { - if (document_ === undefined) { - if (!domImplementation_ && typeof document !== 'undefined') { - domImplementation_ = document.implementation; - } - document_ = domImplementation_.createDocument('', '', null); + if (document_ === undefined && typeof document !== 'undefined') { + document_ = document.implementation.createDocument('', '', null); } return document_; } diff --git a/src/ol/format/XMLFeature.js b/src/ol/format/XMLFeature.js index b0bed3b402..0f413e21c3 100644 --- a/src/ol/format/XMLFeature.js +++ b/src/ol/format/XMLFeature.js @@ -5,7 +5,7 @@ import {abstract} from '../util.js'; import {extend} from '../array.js'; import FeatureFormat from '../format/Feature.js'; import FormatType from '../format/FormatType.js'; -import {isDocument, parse} from '../xml.js'; +import {isDocument, parse, getXMLSerializer} from '../xml.js'; /** * @classdesc @@ -23,7 +23,7 @@ class XMLFeature extends FeatureFormat { * @type {XMLSerializer} * @private */ - this.xmlSerializer_ = new XMLSerializer(); + this.xmlSerializer_ = getXMLSerializer(); } /** diff --git a/src/ol/xml.js b/src/ol/xml.js index cee71100eb..27b2ee9e6f 100644 --- a/src/ol/xml.js +++ b/src/ol/xml.js @@ -486,3 +486,27 @@ export function pushSerializeAndPop(object, serializersNS, nodeFactory, values, serialize(serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this); return /** @type {O|undefined} */ (objectStack.pop()); } + +let xmlSerializer_ = undefined; + +/** + * Register a XMLSerializer. Can be used + * to inject a XMLSerializer where there is no globally available implementation. + * + * @param {XMLSerializer} xmlSerializer A XMLSerializer. + * @api + */ +export function registerXMLSerializer(xmlSerializer) { + xmlSerializer_ = xmlSerializer; +} + +/** + * Get a document that should be used when creating nodes for XML serializations. + * @return {XMLSerializer} The XMLSerializer. + */ +export function getXMLSerializer() { + if (xmlSerializer_ === undefined && typeof XMLSerializer !== 'undefined') { + xmlSerializer_ = new XMLSerializer(); + } + return xmlSerializer_; +} From 5b661ed84ca2ca15c7019f1decd115b1440d30cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Wed, 13 Nov 2019 23:00:34 +0100 Subject: [PATCH 4/5] Fix jsdoc --- src/ol/xml.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ol/xml.js b/src/ol/xml.js index 27b2ee9e6f..5d040a3ae1 100644 --- a/src/ol/xml.js +++ b/src/ol/xml.js @@ -490,8 +490,8 @@ export function pushSerializeAndPop(object, serializersNS, nodeFactory, values, let xmlSerializer_ = undefined; /** - * Register a XMLSerializer. Can be used - * to inject a XMLSerializer where there is no globally available implementation. + * Register a XMLSerializer. Can be used to inject a XMLSerializer + * where there is no globally available implementation. * * @param {XMLSerializer} xmlSerializer A XMLSerializer. * @api @@ -501,7 +501,6 @@ export function registerXMLSerializer(xmlSerializer) { } /** - * Get a document that should be used when creating nodes for XML serializations. * @return {XMLSerializer} The XMLSerializer. */ export function getXMLSerializer() { From 05a5f162d482d593adc1e3a687b85b1d23a249d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Sun, 5 Jan 2020 13:12:27 +0100 Subject: [PATCH 5/5] Move logic from dom to xml module --- src/ol/dom.js | 24 ------------------------ src/ol/format/xsd.js | 3 +-- src/ol/xml.js | 26 +++++++++++++++++++++++++- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/ol/dom.js b/src/ol/dom.js index bf3274686a..900fa6d559 100644 --- a/src/ol/dom.js +++ b/src/ol/dom.js @@ -122,27 +122,3 @@ export function replaceChildren(node, children) { node.insertBefore(newChild, oldChild); } } - -let document_ = undefined; - -/** - * Register a Document to use when creating nodes for XML serializations. Can be used - * to inject a Document where there is no globally available implementation. - * - * @param {Document} document A Document. - * @api - */ -export function registerDocument(document) { - document_ = document; -} - -/** - * Get a document that should be used when creating nodes for XML serializations. - * @return {Document} The document. - */ -export function getDocument() { - if (document_ === undefined && typeof document !== 'undefined') { - document_ = document.implementation.createDocument('', '', null); - } - return document_; -} diff --git a/src/ol/format/xsd.js b/src/ol/format/xsd.js index 0aeb2c5c01..271b590679 100644 --- a/src/ol/format/xsd.js +++ b/src/ol/format/xsd.js @@ -1,8 +1,7 @@ /** * @module ol/format/xsd */ -import {getDocument} from '../dom.js'; -import {getAllTextContent} from '../xml.js'; +import {getAllTextContent, getDocument} from '../xml.js'; import {padNumber} from '../string.js'; diff --git a/src/ol/xml.js b/src/ol/xml.js index 5d040a3ae1..276a9c4482 100644 --- a/src/ol/xml.js +++ b/src/ol/xml.js @@ -2,7 +2,6 @@ * @module ol/xml */ import {extend} from './array.js'; -import {getDocument} from './dom.js'; /** @@ -509,3 +508,28 @@ export function getXMLSerializer() { } return xmlSerializer_; } + + +let document_ = undefined; + +/** + * Register a Document to use when creating nodes for XML serializations. Can be used + * to inject a Document where there is no globally available implementation. + * + * @param {Document} document A Document. + * @api + */ +export function registerDocument(document) { + document_ = document; +} + +/** + * Get a document that should be used when creating nodes for XML serializations. + * @return {Document} The document. + */ +export function getDocument() { + if (document_ === undefined && typeof document !== 'undefined') { + document_ = document.implementation.createDocument('', '', null); + } + return document_; +}