/* jshint bitwise: false */ | |
; | |
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); | |