Skip to content

Commit

Permalink
Fix for issue 109 plus tests for rangy.features
Browse files Browse the repository at this point in the history
  • Loading branch information
timdown committed Jun 17, 2012
1 parent d733359 commit c3de815
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 20 deletions.
40 changes: 20 additions & 20 deletions src/js/core/wrappedselection.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ rangy.createModule("WrappedSelection", function(api, module) {
var body = dom.getBody(document);

// Obtaining a range from a selection
var selectionHasAnchorAndFocus = util.areHostObjects(testSelection, ["anchorNode", "focusNode"] &&
util.areHostProperties(testSelection, ["anchorOffset", "focusOffset"]));
var selectionHasAnchorAndFocus = util.areHostObjects(testSelection, ["anchorNode", "focusNode"]) &&
util.areHostProperties(testSelection, ["anchorOffset", "focusOffset"]);
api.features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;

// Test for existence of native selection extend() method
Expand All @@ -101,24 +101,23 @@ rangy.createModule("WrappedSelection", function(api, module) {
typeof testSelection.rangeCount == "number" && api.features.implementsDomRange) {

(function() {
var iframe = document.createElement("iframe");
iframe.frameBorder = 0;
iframe.style.position = "absolute";
iframe.style.left = "-10000px";
body.appendChild(iframe);

var iframeDoc = dom.getIframeDocument(iframe);
iframeDoc.open();
iframeDoc.write("<html><head></head><body>12</body></html>");
iframeDoc.close();

var sel = dom.getIframeWindow(iframe).getSelection();
// Previously an iframe was used but this caused problems in some circumatsances in IE, so tests are
// performed on the current document's selection. See issue 109.

// Note also that if a selection previously existed, it is wiped by these tests. This should usually be fine
// because initialization usually happens when the document loads, but could be a problem for a script that
// loads and initializes Rangy later. If anyone complains, code could be added to the selection could be
// saved and restored.
var sel = window.getSelection();
if (sel) {
var docEl = iframeDoc.documentElement;
var iframeBody = docEl.lastChild, textNode = iframeBody.firstChild;
var body = dom.getBody(document);
var testEl = body.appendChild( document.createElement("div") );
testEl.contentEditable = "false";
var textNode = testEl.appendChild( document.createTextNode("\u00a0\u00a0\u00a0") );

// Test whether the native selection will allow a collapsed selection within a non-editable element
var r1 = iframeDoc.createRange();
var r1 = document.createRange();

r1.setStart(textNode, 1);
r1.collapse(true);
sel.addRange(r1);
Expand All @@ -128,18 +127,19 @@ rangy.createModule("WrappedSelection", function(api, module) {
// Test whether the native selection is capable of supporting multiple ranges
var r2 = r1.cloneRange();
r1.setStart(textNode, 0);
r2.setEnd(textNode, 2);
r2.setEnd(textNode, 3);
r2.setStart(textNode, 2);
sel.addRange(r1);
sel.addRange(r2);

selectionSupportsMultipleRanges = (sel.rangeCount == 2);

// Clean up
body.removeChild(testEl);
sel.removeAllRanges();
r1.detach();
r2.detach();
}

body.removeChild(iframe);
})();
}

Expand Down
36 changes: 36 additions & 0 deletions test/featuretests.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<title>Rangy - TextRange-to-Range Performace Tests</title>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="../lib/log4javascript.js"></script>
<script type="text/javascript" src="../lib/jshashtable.js"></script>
<script type="text/javascript" src="xntest.js"></script>
<script type="text/javascript" src="testutils.js"></script>
<script type="text/javascript">
xn.test.enableStackTraces = true;
</script>
<script type="text/javascript">
var appender = new log4javascript.InPageAppender();
//log4javascript.getRootLogger().addAppender(appender);
var log = log4javascript.getRootLogger();
log4javascript.setShowStackTraces(true);

</script>
<script type="text/javascript">
//log4javascript.setEnabled(false);
</script>
<script type="text/javascript" src="../src/js/core/core.js"></script>
<script type="text/javascript" src="../src/js/core/dom.js"></script>
<script type="text/javascript" src="../src/js/core/domrange.js"></script>
<script type="text/javascript" src="../src/js/core/wrappedrange.js"></script>
<script type="text/javascript" src="../src/js/core/wrappedselection.js"></script>
<script type="text/javascript" src="featuretests.js"></script>
<link rel="stylesheet" type="text/css" href="tests.css"/>
</head>
<body>
<div id="test"></div>
<div id="messages"></div>
</body>
</html>
53 changes: 53 additions & 0 deletions test/featuretests.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
xn.test.suite("Browser feature tests", function(s) {
rangy.init();

// Detect browser version roughly. It doesn't matter too much: these are only rough tests designed to test whether
// Rangy's feature detection is hopelessly wrong


var browser = jQuery.browser;
var isIe = !!browser.msie;
var isMozilla = !!browser.mozilla;
var isOpera = !!browser.opera;
var version = parseFloat(browser.version);

s.test("DOM Range support", function(t) {
t.assertEquals(rangy.features.implementsDomRange, !isIe || version >= 9);
});

s.test("TextRange support", function(t) {
t.assertEquals(rangy.features.implementsTextRange, isIe && version >= 4);
});

s.test("document.selection support", function(t) {
t.assertEquals(rangy.features.implementsTextRange, isIe && version >= 4);
});

s.test("window.getSelection() support", function(t) {
t.assertEquals(rangy.features.implementsWinGetSelection, !isIe || version >= 9);
});

s.test("selection has rangeCount", function(t) {
t.assertEquals(rangy.features.selectionHasRangeCount, !isIe || version >= 9);
});

s.test("selection has anchor and focus support", function(t) {
t.assertEquals(rangy.features.selectionHasAnchorAndFocus, !isIe || version >= 9);
});

s.test("selection has extend() method", function(t) {
t.assertEquals(rangy.features.selectionHasExtend, !isIe);
});

s.test("HTML parsing", function(t) {
t.assertEquals(rangy.features.htmlParsingConforms, !isIe);
});

s.test("Multiple ranges per selection support", function(t) {
t.assertEquals(rangy.features.selectionSupportsMultipleRanges, isMozilla);
});

s.test("Collapsed non-editable selections support", function(t) {
t.assertEquals(rangy.features.collapsedNonEditableSelectionsSupported, !isOpera);
});
}, false);
1 change: 1 addition & 0 deletions test/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<li><a href="textrangetests.html">Text range tests</a></li>
<li><a href="buildtests.html">Build tests</a></li>
<li><a href="textrangeperformancetests.html">TextRange-to-Range performance tests</a></li>
<li><a href="featuretests.html">Feature tests</a></li>
</ul>
</body>
</html>

0 comments on commit c3de815

Please sign in to comment.