121 lines
4.1 KiB
JavaScript
121 lines
4.1 KiB
JavaScript
|
/* jshint bitwise: false */
|
||
|
"use strict";
|
||
|
module.exports = CharacterData;
|
||
|
|
||
|
var Leaf = require('./Leaf');
|
||
|
var utils = require('./utils');
|
||
|
var ChildNode = require('./ChildNode');
|
||
|
var NonDocumentTypeChildNode = require('./NonDocumentTypeChildNode');
|
||
|
|
||
|
function CharacterData() {
|
||
|
Leaf.call(this);
|
||
|
}
|
||
|
|
||
|
CharacterData.prototype = Object.create(Leaf.prototype, {
|
||
|
// DOMString substringData(unsigned long offset,
|
||
|
// unsigned long count);
|
||
|
// The substringData(offset, count) method must run these steps:
|
||
|
//
|
||
|
// If offset is greater than the context object's
|
||
|
// length, throw an INDEX_SIZE_ERR exception and
|
||
|
// terminate these steps.
|
||
|
//
|
||
|
// If offset+count is greater than the context
|
||
|
// object's length, return a DOMString whose value is
|
||
|
// the UTF-16 code units from the offsetth UTF-16 code
|
||
|
// unit to the end of data.
|
||
|
//
|
||
|
// Return a DOMString whose value is the UTF-16 code
|
||
|
// units from the offsetth UTF-16 code unit to the
|
||
|
// offset+countth UTF-16 code unit in data.
|
||
|
substringData: { value: function substringData(offset, count) {
|
||
|
if (arguments.length < 2) { throw new TypeError("Not enough arguments"); }
|
||
|
// Convert arguments to WebIDL "unsigned long"
|
||
|
offset = offset >>> 0;
|
||
|
count = count >>> 0;
|
||
|
if (offset > this.data.length || offset < 0 || count < 0) {
|
||
|
utils.IndexSizeError();
|
||
|
}
|
||
|
return this.data.substring(offset, offset+count);
|
||
|
}},
|
||
|
|
||
|
// void appendData(DOMString data);
|
||
|
// The appendData(data) method must append data to the context
|
||
|
// object's data.
|
||
|
appendData: { value: function appendData(data) {
|
||
|
if (arguments.length < 1) { throw new TypeError("Not enough arguments"); }
|
||
|
this.data += String(data);
|
||
|
}},
|
||
|
|
||
|
// void insertData(unsigned long offset, DOMString data);
|
||
|
// The insertData(offset, data) method must run these steps:
|
||
|
//
|
||
|
// If offset is greater than the context object's
|
||
|
// length, throw an INDEX_SIZE_ERR exception and
|
||
|
// terminate these steps.
|
||
|
//
|
||
|
// Insert data into the context object's data after
|
||
|
// offset UTF-16 code units.
|
||
|
//
|
||
|
insertData: { value: function insertData(offset, data) {
|
||
|
return this.replaceData(offset, 0, data);
|
||
|
}},
|
||
|
|
||
|
|
||
|
// void deleteData(unsigned long offset, unsigned long count);
|
||
|
// The deleteData(offset, count) method must run these steps:
|
||
|
//
|
||
|
// If offset is greater than the context object's
|
||
|
// length, throw an INDEX_SIZE_ERR exception and
|
||
|
// terminate these steps.
|
||
|
//
|
||
|
// If offset+count is greater than the context
|
||
|
// object's length var count be length-offset.
|
||
|
//
|
||
|
// Starting from offset UTF-16 code units remove count
|
||
|
// UTF-16 code units from the context object's data.
|
||
|
deleteData: { value: function deleteData(offset, count) {
|
||
|
return this.replaceData(offset, count, '');
|
||
|
}},
|
||
|
|
||
|
|
||
|
// void replaceData(unsigned long offset, unsigned long count,
|
||
|
// DOMString data);
|
||
|
//
|
||
|
// The replaceData(offset, count, data) method must act as
|
||
|
// if the deleteData() method is invoked with offset and
|
||
|
// count as arguments followed by the insertData() method
|
||
|
// with offset and data as arguments and re-throw any
|
||
|
// exceptions these methods might have thrown.
|
||
|
replaceData: { value: function replaceData(offset, count, data) {
|
||
|
var curtext = this.data, len = curtext.length;
|
||
|
// Convert arguments to correct WebIDL type
|
||
|
offset = offset >>> 0;
|
||
|
count = count >>> 0;
|
||
|
data = String(data);
|
||
|
|
||
|
if (offset > len || offset < 0) utils.IndexSizeError();
|
||
|
|
||
|
if (offset+count > len)
|
||
|
count = len - offset;
|
||
|
|
||
|
var prefix = curtext.substring(0, offset),
|
||
|
suffix = curtext.substring(offset+count);
|
||
|
|
||
|
this.data = prefix + data + suffix;
|
||
|
}},
|
||
|
|
||
|
// Utility method that Node.isEqualNode() calls to test Text and
|
||
|
// Comment nodes for equality. It is okay to put it here, since
|
||
|
// Node will have already verified that nodeType is equal
|
||
|
isEqual: { value: function isEqual(n) {
|
||
|
return this._data === n._data;
|
||
|
}},
|
||
|
|
||
|
length: { get: function() { return this.data.length; }}
|
||
|
|
||
|
});
|
||
|
|
||
|
Object.defineProperties(CharacterData.prototype, ChildNode);
|
||
|
Object.defineProperties(CharacterData.prototype, NonDocumentTypeChildNode);
|