2014-08-14 05:04:47 +09:00
|
|
|
/* Any copyright is dedicated to the Public Domain.
|
|
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
|
|
|
|
function xmlEncode(s){
|
|
|
|
var i = 0, ch;
|
2014-10-22 23:59:20 +09:00
|
|
|
s = String(s);
|
2014-08-14 05:04:47 +09:00
|
|
|
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 = '';
|
2015-10-28 07:48:10 +09:00
|
|
|
|
|
|
|
if (name === 'style') {
|
|
|
|
this.sheet = {
|
|
|
|
cssRules: [],
|
|
|
|
insertRule: function (rule) {
|
|
|
|
this.cssRules.push(rule);
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
2014-08-14 05:04:47 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
DOMElement.prototype = {
|
|
|
|
|
2017-06-19 21:11:13 +09:00
|
|
|
getAttributeNS: function DOMElement_getAttributeNS(NS, name) {
|
2017-07-15 01:55:17 +09:00
|
|
|
// Fast path
|
|
|
|
if (name in this.attributes) {
|
|
|
|
return this.attributes[name];
|
|
|
|
}
|
|
|
|
// Slow path - used by test/unit/display_svg_spec.js
|
|
|
|
// Assuming that there is only one matching attribute for a given name,
|
|
|
|
// across all namespaces.
|
|
|
|
if (NS) {
|
|
|
|
var suffix = ':' + name;
|
|
|
|
for (var fullName in this.attributes) {
|
|
|
|
if (fullName.slice(-suffix.length) === suffix) {
|
|
|
|
return this.attributes[fullName];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
2017-06-19 21:11:13 +09:00
|
|
|
},
|
|
|
|
|
2014-08-14 05:04:47 +09:00
|
|
|
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() {
|
2017-06-18 19:57:17 +09:00
|
|
|
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"');
|
2014-08-14 05:04:47 +09:00
|
|
|
}
|
2017-06-18 19:57:17 +09:00
|
|
|
for (var i in this.attributes) {
|
|
|
|
buf.push(' ' + i + '="' + xmlEncode(this.attributes[i]) + '"');
|
|
|
|
}
|
|
|
|
|
|
|
|
buf.push('>');
|
2014-08-14 05:04:47 +09:00
|
|
|
|
2014-08-15 05:11:27 +09:00
|
|
|
if (this.nodeName === 'svg:tspan' || this.nodeName === 'svg:style') {
|
2017-06-18 19:57:17 +09:00
|
|
|
buf.push(xmlEncode(this.textContent));
|
2014-08-14 05:04:47 +09:00
|
|
|
} else {
|
2017-06-18 19:57:17 +09:00
|
|
|
this.childNodes.forEach(function(childNode) {
|
|
|
|
buf.push(childNode.toString());
|
|
|
|
});
|
2014-08-14 05:04:47 +09:00
|
|
|
}
|
2017-06-18 19:57:17 +09:00
|
|
|
buf.push('</' + this.nodeName + '>');
|
|
|
|
return buf.join('');
|
2014-08-14 05:04:47 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
cloneNode: function DOMElement_cloneNode() {
|
|
|
|
var newNode = new DOMElement(this.nodeName);
|
|
|
|
newNode.childNodes = this.childNodes;
|
|
|
|
newNode.attributes = this.attributes;
|
|
|
|
newNode.textContent = this.textContent;
|
|
|
|
return newNode;
|
|
|
|
},
|
|
|
|
}
|
2015-02-03 00:12:52 +09:00
|
|
|
|
2017-07-06 18:55:18 +09:00
|
|
|
const document = {
|
2014-08-14 05:04:47 +09:00
|
|
|
childNodes : [],
|
|
|
|
|
2015-12-22 04:46:50 +09:00
|
|
|
get currentScript() {
|
|
|
|
return { src: '' };
|
|
|
|
},
|
|
|
|
|
2015-10-28 07:48:10 +09:00
|
|
|
get documentElement() {
|
|
|
|
return this;
|
2014-08-14 05:04:47 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
createElementNS: function (NS, element) {
|
|
|
|
var elObject = new DOMElement(element);
|
|
|
|
return elObject;
|
|
|
|
},
|
2015-10-28 07:48:10 +09:00
|
|
|
|
|
|
|
createElement: function (element) {
|
|
|
|
return this.createElementNS('', element);
|
|
|
|
},
|
|
|
|
|
|
|
|
getElementsByTagName: function (element) {
|
|
|
|
if (element === 'head') {
|
|
|
|
return [this.head || (this.head = new DOMElement('head'))];
|
|
|
|
}
|
|
|
|
return [];
|
|
|
|
}
|
2014-08-14 05:04:47 +09:00
|
|
|
};
|
2017-05-08 12:32:44 +09:00
|
|
|
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-06 18:55:18 +09:00
|
|
|
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];
|
|
|
|
});
|
|
|
|
};
|