summaryrefslogtreecommitdiff
path: root/tests/frontend/helper.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/frontend/helper.js')
-rw-r--r--tests/frontend/helper.js77
1 files changed, 68 insertions, 9 deletions
diff --git a/tests/frontend/helper.js b/tests/frontend/helper.js
index 7131119a..d8aa096f 100644
--- a/tests/frontend/helper.js
+++ b/tests/frontend/helper.js
@@ -6,11 +6,11 @@ var helper = {};
helper.init = function(cb){
$iframeContainer = $("#iframe-container");
- $.get('/static/js/jquery.js').done(function(code){
+ $.get('/static/js/jquery.js').done(function(code){
// make sure we don't override existing jquery
jsLibraries["jquery"] = "if(typeof $ === 'undefined') {\n" + code + "\n}";
- $.get('/tests/frontend/lib/sendkeys.js').done(function(code){
+ $.get('/tests/frontend/lib/sendkeys.js').done(function(code){
jsLibraries["sendkeys"] = code;
cb();
@@ -32,7 +32,7 @@ var helper = {};
var getFrameJQuery = function($iframe){
/*
- I tried over 9000 ways to inject javascript into iframes.
+ I tried over 9000 ways to inject javascript into iframes.
This is the only way I found that worked in IE 7+8+9, FF and Chrome
*/
@@ -45,7 +45,7 @@ var helper = {};
win.eval(jsLibraries["jquery"]);
win.eval(jsLibraries["sendkeys"]);
-
+
win.$.window = win;
win.$.document = doc;
@@ -73,14 +73,14 @@ var helper = {};
if(!padName)
padName = "FRONTEND_TEST_" + helper.randomString(20);
$iframe = $("<iframe src='/p/" + padName + "'></iframe>");
-
+
//clean up inner iframe references
helper.padChrome$ = helper.padOuter$ = helper.padInner$ = null;
//clean up iframes properly to prevent IE from memoryleaking
$iframeContainer.find("iframe").purgeFrame().done(function(){
$iframeContainer.append($iframe);
- $iframe.one('load', function(){
+ $iframe.one('load', function(){
helper.waitFor(function(){
return !$iframe.contents().find("#editorloadingbox").is(":visible");
}, 50000).done(function(){
@@ -92,13 +92,13 @@ var helper = {};
helper.padChrome$.fx.off = true;
helper.padOuter$.fx.off = true;
helper.padInner$.fx.off = true;
-
+
opts.cb();
}).fail(function(){
throw new Error("Pad never loaded");
});
});
- });
+ });
return padName;
}
@@ -108,7 +108,7 @@ var helper = {};
var intervalTime = _intervalTime || 10;
var deferred = $.Deferred();
-
+
var _fail = deferred.fail;
var listenForFail = false;
deferred.fail = function(){
@@ -142,6 +142,65 @@ var helper = {};
return deferred;
}
+ helper.selectLines = function($startLine, $endLine, startOffset, endOffset){
+ // if no offset is provided, use beginning of start line and end of end line
+ startOffset = startOffset || 0;
+ endOffset = endOffset || $endLine.text().length;
+
+ var inner$ = helper.padInner$;
+ var selection = inner$.document.getSelection();
+ var range = selection.getRangeAt(0);
+
+ var start = getTextNodeAndOffsetOf($startLine, startOffset);
+ var end = getTextNodeAndOffsetOf($endLine, endOffset);
+
+ range.setStart(start.node, start.offset);
+ range.setEnd(end.node, end.offset);
+
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+
+ var getTextNodeAndOffsetOf = function($targetLine, targetOffsetAtLine){
+ var $textNodes = $targetLine.find('*').contents().filter(function(){
+ return this.nodeType === Node.TEXT_NODE;
+ });
+
+ // search node where targetOffsetAtLine is reached, and its 'inner offset'
+ var textNodeWhereOffsetIs = null;
+ var offsetBeforeTextNode = 0;
+ var offsetInsideTextNode = 0;
+ $textNodes.each(function(index, element){
+ var elementTotalOffset = element.textContent.length;
+ textNodeWhereOffsetIs = element;
+ offsetInsideTextNode = targetOffsetAtLine - offsetBeforeTextNode;
+
+ var foundTextNode = offsetBeforeTextNode + elementTotalOffset >= targetOffsetAtLine;
+ if (foundTextNode){
+ return false; //stop .each by returning false
+ }
+
+ offsetBeforeTextNode += elementTotalOffset;
+ });
+
+ // edge cases
+ if (textNodeWhereOffsetIs === null){
+ // there was no text node inside $targetLine, so it is an empty line (<br>).
+ // Use beginning of line
+ textNodeWhereOffsetIs = $targetLine.get(0);
+ offsetInsideTextNode = 0;
+ }
+ // avoid errors if provided targetOffsetAtLine is higher than line offset (maxOffset).
+ // Use max allowed instead
+ var maxOffset = textNodeWhereOffsetIs.textContent.length;
+ offsetInsideTextNode = Math.min(offsetInsideTextNode, maxOffset);
+
+ return {
+ node: textNodeWhereOffsetIs,
+ offset: offsetInsideTextNode,
+ };
+ }
+
/* Ensure console.log doesn't blow up in IE, ugly but ok for a test framework imho*/
window.console = window.console || {};
window.console.log = window.console.log || function(){}