You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
4.3 KiB
164 lines
4.3 KiB
8 years ago
|
/* Copyright 2017 Mozilla Foundation
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
'use strict';
|
||
|
|
||
|
function xmlEncode(s) {
|
||
|
var i = 0,
|
||
|
ch;
|
||
|
s = String(s);
|
||
|
while (i < s.length && (ch = s[i]) !== '&' && ch !== '<' && ch !== '\"' && ch !== '\n' && ch !== '\r' && ch !== '\t') {
|
||
|
i++;
|
||
|
}
|
||
|
if (i >= s.length) {
|
||
|
return s;
|
||
|
}
|
||
|
var buf = s.substring(0, i);
|
||
|
while (i < s.length) {
|
||
|
ch = s[i++];
|
||
|
switch (ch) {
|
||
|
case '&':
|
||
|
buf += '&';
|
||
|
break;
|
||
|
case '<':
|
||
|
buf += '<';
|
||
|
break;
|
||
|
case '\"':
|
||
|
buf += '"';
|
||
|
break;
|
||
|
case '\n':
|
||
|
buf += '
';
|
||
|
break;
|
||
|
case '\r':
|
||
|
buf += '
';
|
||
|
break;
|
||
|
case '\t':
|
||
|
buf += '	';
|
||
|
break;
|
||
|
default:
|
||
|
buf += ch;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return buf;
|
||
|
}
|
||
|
function DOMElement(name) {
|
||
|
this.nodeName = name;
|
||
|
this.childNodes = [];
|
||
|
this.attributes = {};
|
||
|
this.textContent = '';
|
||
|
if (name === 'style') {
|
||
|
this.sheet = {
|
||
|
cssRules: [],
|
||
|
insertRule: function insertRule(rule) {
|
||
|
this.cssRules.push(rule);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
DOMElement.prototype = {
|
||
|
getAttributeNS: function DOMElement_getAttributeNS(NS, name) {
|
||
|
return name in this.attributes ? this.attributes[name] : null;
|
||
|
},
|
||
|
setAttributeNS: function DOMElement_setAttributeNS(NS, name, value) {
|
||
|
value = value || '';
|
||
|
value = xmlEncode(value);
|
||
|
this.attributes[name] = value;
|
||
|
},
|
||
|
appendChild: function DOMElement_appendChild(element) {
|
||
|
var childNodes = this.childNodes;
|
||
|
if (childNodes.indexOf(element) === -1) {
|
||
|
childNodes.push(element);
|
||
|
}
|
||
|
},
|
||
|
toString: function DOMElement_toString() {
|
||
|
var buf = [];
|
||
|
buf.push('<' + this.nodeName);
|
||
|
if (this.nodeName === 'svg:svg') {
|
||
|
buf.push(' xmlns:xlink="http://www.w3.org/1999/xlink"' + ' xmlns:svg="http://www.w3.org/2000/svg"');
|
||
|
}
|
||
|
for (var i in this.attributes) {
|
||
|
buf.push(' ' + i + '="' + xmlEncode(this.attributes[i]) + '"');
|
||
|
}
|
||
|
buf.push('>');
|
||
|
if (this.nodeName === 'svg:tspan' || this.nodeName === 'svg:style') {
|
||
|
buf.push(xmlEncode(this.textContent));
|
||
|
} else {
|
||
|
this.childNodes.forEach(function (childNode) {
|
||
|
buf.push(childNode.toString());
|
||
|
});
|
||
|
}
|
||
|
buf.push('</' + this.nodeName + '>');
|
||
|
return buf.join('');
|
||
|
},
|
||
|
cloneNode: function DOMElement_cloneNode() {
|
||
|
var newNode = new DOMElement(this.nodeName);
|
||
|
newNode.childNodes = this.childNodes;
|
||
|
newNode.attributes = this.attributes;
|
||
|
newNode.textContent = this.textContent;
|
||
|
return newNode;
|
||
|
}
|
||
|
};
|
||
|
var document = {
|
||
|
childNodes: [],
|
||
|
get currentScript() {
|
||
|
return { src: '' };
|
||
|
},
|
||
|
get documentElement() {
|
||
|
return this;
|
||
|
},
|
||
|
createElementNS: function createElementNS(NS, element) {
|
||
|
var elObject = new DOMElement(element);
|
||
|
return elObject;
|
||
|
},
|
||
|
createElement: function createElement(element) {
|
||
|
return this.createElementNS('', element);
|
||
|
},
|
||
|
getElementsByTagName: function getElementsByTagName(element) {
|
||
|
if (element === 'head') {
|
||
|
return [this.head || (this.head = new DOMElement('head'))];
|
||
|
}
|
||
|
return [];
|
||
|
}
|
||
|
};
|
||
|
function Image() {
|
||
|
this._src = null;
|
||
|
this.onload = null;
|
||
|
}
|
||
|
Image.prototype = {
|
||
|
get src() {
|
||
|
return this._src;
|
||
|
},
|
||
|
set src(value) {
|
||
|
this._src = value;
|
||
|
if (this.onload) {
|
||
|
this.onload();
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
exports.document = document;
|
||
|
exports.Image = Image;
|
||
|
var exported_symbols = Object.keys(exports);
|
||
|
exports.setStubs = function (namespace) {
|
||
|
exported_symbols.forEach(function (key) {
|
||
|
console.assert(!(key in namespace), 'property should not be set: ' + key);
|
||
|
namespace[key] = exports[key];
|
||
|
});
|
||
|
};
|
||
|
exports.unsetStubs = function (namespace) {
|
||
|
exported_symbols.forEach(function (key) {
|
||
|
console.assert(key in namespace, 'property should be set: ' + key);
|
||
|
delete namespace[key];
|
||
|
});
|
||
|
};
|