From 18bf0b80bc701fe0b9fb9216ce907baf4fb035ec Mon Sep 17 00:00:00 2001 From: Josh Duck Date: Mon, 4 Nov 2013 11:24:53 -0800 Subject: [PATCH] Fix ReactDOMSelection for IE 11 IE 11 no longer supports the legacy document.selection API. Their implementation of window.getSelection() doesn't support the extend() method, which we were relying on. If the selection is RTL and selection extend is missing, then just flip the selection. --- src/core/ReactDOMSelection.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/core/ReactDOMSelection.js b/src/core/ReactDOMSelection.js index bbee07f9b2..d5fa118103 100644 --- a/src/core/ReactDOMSelection.js +++ b/src/core/ReactDOMSelection.js @@ -137,7 +137,15 @@ function setModernOffsets(node, offsets) { var length = node[getTextContentAccessor()].length; var start = Math.min(offsets.start, length); var end = typeof offsets.end === 'undefined' ? - start : Math.min(offsets.end, length); + start : Math.min(offsets.end, length); + + // IE 11 uses modern selection, but doesn't support the extend method. + // Flip backward selections, so we can set with a single range. + if (!selection.extend && start > end) { + var temp = end; + end = start; + start = temp; + } var startMarker = getNodeForCharacterOffset(node, start); var endMarker = getNodeForCharacterOffset(node, end); @@ -146,8 +154,15 @@ function setModernOffsets(node, offsets) { var range = document.createRange(); range.setStart(startMarker.node, startMarker.offset); selection.removeAllRanges(); - selection.addRange(range); - selection.extend(endMarker.node, endMarker.offset); + + if (start > end) { + selection.addRange(range); + selection.extend(endMarker.node, endMarker.offset); + } else { + range.setEnd(endMarker.node, endMarker.offset); + selection.addRange(range); + } + range.detach(); } }