diff options
Diffstat (limited to 'tests/frontend/helper.js')
-rw-r--r-- | tests/frontend/helper.js | 77 |
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(){} |