/compiler/traceur/trunk/test/closurebaseline/third_party/closure-library/closure/goog/dom/browserrange/w3crange.js

https://github.com/pdubroy/Purple · JavaScript · 169 lines · 168 code · 1 blank · 0 comment · 31 complexity · 4c4e42931cc5b6efa0d21a08de952d4b MD5 · raw file

  1. goog.provide('goog.dom.browserrange.W3cRange');
  2. goog.require('goog.dom');
  3. goog.require('goog.dom.NodeType');
  4. goog.require('goog.dom.RangeEndpoint');
  5. goog.require('goog.dom.browserrange.AbstractRange');
  6. goog.require('goog.string');
  7. goog.dom.browserrange.W3cRange = function(range) {
  8. this.range_ = range;
  9. };
  10. goog.inherits(goog.dom.browserrange.W3cRange, goog.dom.browserrange.AbstractRange);
  11. goog.dom.browserrange.W3cRange.getBrowserRangeForNode = function(node) {
  12. var nodeRange = goog.dom.getOwnerDocument(node).createRange();
  13. if(node.nodeType == goog.dom.NodeType.TEXT) {
  14. nodeRange.setStart(node, 0);
  15. nodeRange.setEnd(node, node.length);
  16. } else {
  17. if(! goog.dom.browserrange.canContainRangeEndpoint(node)) {
  18. var rangeParent = node.parentNode;
  19. var rangeStartOffset = goog.array.indexOf(rangeParent.childNodes, node);
  20. nodeRange.setStart(rangeParent, rangeStartOffset);
  21. nodeRange.setEnd(rangeParent, rangeStartOffset + 1);
  22. } else {
  23. var tempNode, leaf = node;
  24. while((tempNode = leaf.firstChild) && goog.dom.browserrange.canContainRangeEndpoint(tempNode)) {
  25. leaf = tempNode;
  26. }
  27. nodeRange.setStart(leaf, 0);
  28. leaf = node;
  29. while((tempNode = leaf.lastChild) && goog.dom.browserrange.canContainRangeEndpoint(tempNode)) {
  30. leaf = tempNode;
  31. }
  32. nodeRange.setEnd(leaf, leaf.nodeType == goog.dom.NodeType.ELEMENT ? leaf.childNodes.length: leaf.length);
  33. }
  34. }
  35. return nodeRange;
  36. };
  37. goog.dom.browserrange.W3cRange.getBrowserRangeForNodes = function(startNode, startOffset, endNode, endOffset) {
  38. var nodeRange = goog.dom.getOwnerDocument(startNode).createRange();
  39. nodeRange.setStart(startNode, startOffset);
  40. nodeRange.setEnd(endNode, endOffset);
  41. return nodeRange;
  42. };
  43. goog.dom.browserrange.W3cRange.createFromNodeContents = function(node) {
  44. return new goog.dom.browserrange.W3cRange(goog.dom.browserrange.W3cRange.getBrowserRangeForNode(node));
  45. };
  46. goog.dom.browserrange.W3cRange.createFromNodes = function(startNode, startOffset, endNode, endOffset) {
  47. return new goog.dom.browserrange.W3cRange(goog.dom.browserrange.W3cRange.getBrowserRangeForNodes(startNode, startOffset, endNode, endOffset));
  48. };
  49. goog.dom.browserrange.W3cRange.prototype.clone = function() {
  50. return new this.constructor(this.range_.cloneRange());
  51. };
  52. goog.dom.browserrange.W3cRange.prototype.getBrowserRange = function() {
  53. return this.range_;
  54. };
  55. goog.dom.browserrange.W3cRange.prototype.getContainer = function() {
  56. return this.range_.commonAncestorContainer;
  57. };
  58. goog.dom.browserrange.W3cRange.prototype.getStartNode = function() {
  59. return this.range_.startContainer;
  60. };
  61. goog.dom.browserrange.W3cRange.prototype.getStartOffset = function() {
  62. return this.range_.startOffset;
  63. };
  64. goog.dom.browserrange.W3cRange.prototype.getEndNode = function() {
  65. return this.range_.endContainer;
  66. };
  67. goog.dom.browserrange.W3cRange.prototype.getEndOffset = function() {
  68. return this.range_.endOffset;
  69. };
  70. goog.dom.browserrange.W3cRange.prototype.compareBrowserRangeEndpoints = function(range, thisEndpoint, otherEndpoint) {
  71. return this.range_.compareBoundaryPoints(otherEndpoint == goog.dom.RangeEndpoint.START ?(thisEndpoint == goog.dom.RangeEndpoint.START ? goog.global['Range'].START_TO_START: goog.global['Range'].START_TO_END):(thisEndpoint == goog.dom.RangeEndpoint.START ? goog.global['Range'].END_TO_START: goog.global['Range'].END_TO_END),(range));
  72. };
  73. goog.dom.browserrange.W3cRange.prototype.isCollapsed = function() {
  74. return this.range_.collapsed;
  75. };
  76. goog.dom.browserrange.W3cRange.prototype.getText = function() {
  77. return this.range_.toString();
  78. };
  79. goog.dom.browserrange.W3cRange.prototype.getValidHtml = function() {
  80. var div = goog.dom.getDomHelper(this.range_.startContainer).createDom('div');
  81. div.appendChild(this.range_.cloneContents());
  82. var result = div.innerHTML;
  83. if(goog.string.startsWith(result, '<') || ! this.isCollapsed() && ! goog.string.contains(result, '<')) {
  84. return result;
  85. }
  86. var container = this.getContainer();
  87. container = container.nodeType == goog.dom.NodeType.ELEMENT ? container: container.parentNode;
  88. var html = goog.dom.getOuterHtml((container.cloneNode(false)));
  89. return html.replace('>', '>' + result);
  90. };
  91. goog.dom.browserrange.W3cRange.prototype.select = function(reverse) {
  92. var win = goog.dom.getWindow(goog.dom.getOwnerDocument(this.getStartNode()));
  93. this.selectInternal(win.getSelection(), reverse);
  94. };
  95. goog.dom.browserrange.W3cRange.prototype.selectInternal = function(selection, reverse) {
  96. selection.removeAllRanges();
  97. selection.addRange(this.range_);
  98. };
  99. goog.dom.browserrange.W3cRange.prototype.removeContents = function() {
  100. var range = this.range_;
  101. range.extractContents();
  102. if(range.startContainer.hasChildNodes()) {
  103. var rangeStartContainer = range.startContainer.childNodes[range.startOffset];
  104. if(rangeStartContainer) {
  105. var rangePrevious = rangeStartContainer.previousSibling;
  106. if(goog.dom.getRawTextContent(rangeStartContainer) == '') {
  107. goog.dom.removeNode(rangeStartContainer);
  108. }
  109. if(rangePrevious && goog.dom.getRawTextContent(rangePrevious) == '') {
  110. goog.dom.removeNode(rangePrevious);
  111. }
  112. }
  113. }
  114. };
  115. goog.dom.browserrange.W3cRange.prototype.surroundContents = function(element) {
  116. this.range_.surroundContents(element);
  117. return element;
  118. };
  119. goog.dom.browserrange.W3cRange.prototype.insertNode = function(node, before) {
  120. var range = this.range_.cloneRange();
  121. range.collapse(before);
  122. range.insertNode(node);
  123. range.detach();
  124. return node;
  125. };
  126. goog.dom.browserrange.W3cRange.prototype.surroundWithNodes = function(startNode, endNode) {
  127. var win = goog.dom.getWindow(goog.dom.getOwnerDocument(this.getStartNode()));
  128. var selectionRange = goog.dom.Range.createFromWindow(win);
  129. if(selectionRange) {
  130. var sNode = selectionRange.getStartNode();
  131. var eNode = selectionRange.getEndNode();
  132. var sOffset = selectionRange.getStartOffset();
  133. var eOffset = selectionRange.getEndOffset();
  134. }
  135. var clone1 = this.range_.cloneRange();
  136. var clone2 = this.range_.cloneRange();
  137. clone1.collapse(false);
  138. clone2.collapse(true);
  139. clone1.insertNode(endNode);
  140. clone2.insertNode(startNode);
  141. clone1.detach();
  142. clone2.detach();
  143. if(selectionRange) {
  144. var isInsertedNode = function(n) {
  145. return n == startNode || n == endNode;
  146. };
  147. if(sNode.nodeType == goog.dom.NodeType.TEXT) {
  148. while(sOffset > sNode.length) {
  149. sOffset -= sNode.length;
  150. do {
  151. sNode = sNode.nextSibling;
  152. } while(isInsertedNode(sNode));
  153. }
  154. }
  155. if(eNode.nodeType == goog.dom.NodeType.TEXT) {
  156. while(eOffset > eNode.length) {
  157. eOffset -= eNode.length;
  158. do {
  159. eNode = eNode.nextSibling;
  160. } while(isInsertedNode(eNode));
  161. }
  162. }
  163. goog.dom.Range.createFromNodes(sNode,(sOffset), eNode,(eOffset)).select();
  164. }
  165. };
  166. goog.dom.browserrange.W3cRange.prototype.collapse = function(toStart) {
  167. this.range_.collapse(toStart);
  168. };