summaryrefslogtreecommitdiff
path: root/ext/fg/js/range.js
diff options
context:
space:
mode:
authorAlex Yatskov <alex@foosoft.net>2016-06-12 14:32:23 -0700
committerAlex Yatskov <alex@foosoft.net>2016-06-14 20:44:38 -0700
commit061cbb0141df513113563c86e5df7c17cd46700f (patch)
tree348902250a9ab755c98bb03e1f27e8ab6a5857eb /ext/fg/js/range.js
parent14fd0d65144bd672bcfb9702fdfb96d0963f350b (diff)
Better selection handling, fixing scan length being treated as a string.
Diffstat (limited to 'ext/fg/js/range.js')
-rw-r--r--ext/fg/js/range.js27
1 files changed, 20 insertions, 7 deletions
diff --git a/ext/fg/js/range.js b/ext/fg/js/range.js
index 0cf79ddf..f6af7122 100644
--- a/ext/fg/js/range.js
+++ b/ext/fg/js/range.js
@@ -27,16 +27,29 @@ class Range {
}
setLength(length) {
- const node = this.rng.startContainer;
- const offset = this.rng.startOffset;
+ const end = this.findEnd(this.rng.startContainer, this.rng.startOffset, length);
+ this.rng.setEnd(end.node, end.offset);
+ }
+
+ findEnd(node, offset, length) {
+ if (node.nodeType === 3) {
+ const remainder = node.data.length - offset;
+ if (remainder >= length) {
+ return {node, offset: offset + length};
+ }
+
+ length -= remainder;
+ }
+
+ if (node.childNodes.length > 0) {
+ return this.findEnd(node.childNodes[0], 0, length);
+ }
- length = Math.min(node.length - offset, length);
- if (length === 0) {
- return null;
+ if (node.nextSibling !== null) {
+ return this.findEnd(node.nextSibling, 0, length);
}
- this.rng.setEnd(node, offset + length);
- return length;
+ return {node, offset: node.data.length};
}
containsPoint(point) {