// Copyright 2007 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @fileoverview Definition of the Gecko specific range wrapper. Inherits most * functionality from W3CRange, but adds exceptions as necessary. * * DO NOT USE THIS FILE DIRECTLY. Use goog.dom.Range instead. * * @author robbyw@google.com (Robby Walker) */ goog.provide('goog.dom.browserrange.GeckoRange'); goog.require('goog.dom.browserrange.W3cRange'); /** * The constructor for Gecko specific browser ranges. * @param {Range} range The range object. * @constructor * @extends {goog.dom.browserrange.W3cRange} * @final */ goog.dom.browserrange.GeckoRange = function(range) { goog.dom.browserrange.W3cRange.call(this, range); }; goog.inherits(goog.dom.browserrange.GeckoRange, goog.dom.browserrange.W3cRange); /** * Creates a range object that selects the given node's text. * @param {Node} node The node to select. * @return {!goog.dom.browserrange.GeckoRange} A Gecko range wrapper object. */ goog.dom.browserrange.GeckoRange.createFromNodeContents = function(node) { return new goog.dom.browserrange.GeckoRange( goog.dom.browserrange.W3cRange.getBrowserRangeForNode(node)); }; /** * Creates a range object that selects between the given nodes. * @param {Node} startNode The node to start with. * @param {number} startOffset The offset within the node to start. * @param {Node} endNode The node to end with. * @param {number} endOffset The offset within the node to end. * @return {!goog.dom.browserrange.GeckoRange} A wrapper object. */ goog.dom.browserrange.GeckoRange.createFromNodes = function( startNode, startOffset, endNode, endOffset) { return new goog.dom.browserrange.GeckoRange( goog.dom.browserrange.W3cRange.getBrowserRangeForNodes( startNode, startOffset, endNode, endOffset)); }; /** @override */ goog.dom.browserrange.GeckoRange.prototype.selectInternal = function( selection, reversed) { if (!reversed || this.isCollapsed()) { // The base implementation for select() is more robust, and works fine for // collapsed and forward ranges. This works around // https://bugzilla.mozilla.org/show_bug.cgi?id=773137, and is tested by // range_test.html's testFocusedElementDisappears. goog.dom.browserrange.GeckoRange.base( this, 'selectInternal', selection, reversed); } else { // Reversed selection -- start with a caret on the end node, and extend it // back to the start. Unfortunately, collapse() fails when focus is // invalid. selection.collapse(this.getEndNode(), this.getEndOffset()); selection.extend(this.getStartNode(), this.getStartOffset()); } };