| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 | 
							- 'use strict';
 
- const { DOCUMENT_MODE } = require('../common/html');
 
- //Node construction
 
- exports.createDocument = function() {
 
-     return {
 
-         nodeName: '#document',
 
-         mode: DOCUMENT_MODE.NO_QUIRKS,
 
-         childNodes: []
 
-     };
 
- };
 
- exports.createDocumentFragment = function() {
 
-     return {
 
-         nodeName: '#document-fragment',
 
-         childNodes: []
 
-     };
 
- };
 
- exports.createElement = function(tagName, namespaceURI, attrs) {
 
-     return {
 
-         nodeName: tagName,
 
-         tagName: tagName,
 
-         attrs: attrs,
 
-         namespaceURI: namespaceURI,
 
-         childNodes: [],
 
-         parentNode: null
 
-     };
 
- };
 
- exports.createCommentNode = function(data) {
 
-     return {
 
-         nodeName: '#comment',
 
-         data: data,
 
-         parentNode: null
 
-     };
 
- };
 
- const createTextNode = function(value) {
 
-     return {
 
-         nodeName: '#text',
 
-         value: value,
 
-         parentNode: null
 
-     };
 
- };
 
- //Tree mutation
 
- const appendChild = (exports.appendChild = function(parentNode, newNode) {
 
-     parentNode.childNodes.push(newNode);
 
-     newNode.parentNode = parentNode;
 
- });
 
- const insertBefore = (exports.insertBefore = function(parentNode, newNode, referenceNode) {
 
-     const insertionIdx = parentNode.childNodes.indexOf(referenceNode);
 
-     parentNode.childNodes.splice(insertionIdx, 0, newNode);
 
-     newNode.parentNode = parentNode;
 
- });
 
- exports.setTemplateContent = function(templateElement, contentElement) {
 
-     templateElement.content = contentElement;
 
- };
 
- exports.getTemplateContent = function(templateElement) {
 
-     return templateElement.content;
 
- };
 
- exports.setDocumentType = function(document, name, publicId, systemId) {
 
-     let doctypeNode = null;
 
-     for (let i = 0; i < document.childNodes.length; i++) {
 
-         if (document.childNodes[i].nodeName === '#documentType') {
 
-             doctypeNode = document.childNodes[i];
 
-             break;
 
-         }
 
-     }
 
-     if (doctypeNode) {
 
-         doctypeNode.name = name;
 
-         doctypeNode.publicId = publicId;
 
-         doctypeNode.systemId = systemId;
 
-     } else {
 
-         appendChild(document, {
 
-             nodeName: '#documentType',
 
-             name: name,
 
-             publicId: publicId,
 
-             systemId: systemId
 
-         });
 
-     }
 
- };
 
- exports.setDocumentMode = function(document, mode) {
 
-     document.mode = mode;
 
- };
 
- exports.getDocumentMode = function(document) {
 
-     return document.mode;
 
- };
 
- exports.detachNode = function(node) {
 
-     if (node.parentNode) {
 
-         const idx = node.parentNode.childNodes.indexOf(node);
 
-         node.parentNode.childNodes.splice(idx, 1);
 
-         node.parentNode = null;
 
-     }
 
- };
 
- exports.insertText = function(parentNode, text) {
 
-     if (parentNode.childNodes.length) {
 
-         const prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
 
-         if (prevNode.nodeName === '#text') {
 
-             prevNode.value += text;
 
-             return;
 
-         }
 
-     }
 
-     appendChild(parentNode, createTextNode(text));
 
- };
 
- exports.insertTextBefore = function(parentNode, text, referenceNode) {
 
-     const prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
 
-     if (prevNode && prevNode.nodeName === '#text') {
 
-         prevNode.value += text;
 
-     } else {
 
-         insertBefore(parentNode, createTextNode(text), referenceNode);
 
-     }
 
- };
 
- exports.adoptAttributes = function(recipient, attrs) {
 
-     const recipientAttrsMap = [];
 
-     for (let i = 0; i < recipient.attrs.length; i++) {
 
-         recipientAttrsMap.push(recipient.attrs[i].name);
 
-     }
 
-     for (let j = 0; j < attrs.length; j++) {
 
-         if (recipientAttrsMap.indexOf(attrs[j].name) === -1) {
 
-             recipient.attrs.push(attrs[j]);
 
-         }
 
-     }
 
- };
 
- //Tree traversing
 
- exports.getFirstChild = function(node) {
 
-     return node.childNodes[0];
 
- };
 
- exports.getChildNodes = function(node) {
 
-     return node.childNodes;
 
- };
 
- exports.getParentNode = function(node) {
 
-     return node.parentNode;
 
- };
 
- exports.getAttrList = function(element) {
 
-     return element.attrs;
 
- };
 
- //Node data
 
- exports.getTagName = function(element) {
 
-     return element.tagName;
 
- };
 
- exports.getNamespaceURI = function(element) {
 
-     return element.namespaceURI;
 
- };
 
- exports.getTextNodeContent = function(textNode) {
 
-     return textNode.value;
 
- };
 
- exports.getCommentNodeContent = function(commentNode) {
 
-     return commentNode.data;
 
- };
 
- exports.getDocumentTypeNodeName = function(doctypeNode) {
 
-     return doctypeNode.name;
 
- };
 
- exports.getDocumentTypeNodePublicId = function(doctypeNode) {
 
-     return doctypeNode.publicId;
 
- };
 
- exports.getDocumentTypeNodeSystemId = function(doctypeNode) {
 
-     return doctypeNode.systemId;
 
- };
 
- //Node types
 
- exports.isTextNode = function(node) {
 
-     return node.nodeName === '#text';
 
- };
 
- exports.isCommentNode = function(node) {
 
-     return node.nodeName === '#comment';
 
- };
 
- exports.isDocumentTypeNode = function(node) {
 
-     return node.nodeName === '#documentType';
 
- };
 
- exports.isElementNode = function(node) {
 
-     return !!node.tagName;
 
- };
 
- // Source code location
 
- exports.setNodeSourceCodeLocation = function(node, location) {
 
-     node.sourceCodeLocation = location;
 
- };
 
- exports.getNodeSourceCodeLocation = function(node) {
 
-     return node.sourceCodeLocation;
 
- };
 
- exports.updateNodeSourceCodeLocation = function(node, endLocation) {
 
-     node.sourceCodeLocation = Object.assign(node.sourceCodeLocation, endLocation);
 
- };
 
 
  |