Enable multi-line selection on frontend tests

This commit is contained in:
Luiza Pagliari 2016-06-21 06:48:10 -03:00
parent b24e62f90a
commit 95dc9d0315
3 changed files with 209 additions and 10 deletions

View file

@ -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(){}