diff --git a/src/tests/frontend/helper.js b/src/tests/frontend/helper.js index 9e63cc8f5..b3c8d90db 100644 --- a/src/tests/frontend/helper.js +++ b/src/tests/frontend/helper.js @@ -4,19 +4,6 @@ const helper = {}; (() => { let $iframe; - const jsLibraries = {}; - - helper.init = async () => { - [ - jsLibraries.jquery, - jsLibraries.sendkeys, - ] = await Promise.all([ - $.get('../../static/js/vendors/jquery.js'), - $.get('lib/sendkeys.js'), - ]); - // make sure we don't override existing jquery - jsLibraries.jquery = `if (typeof $ === 'undefined') {\n${jsLibraries.jquery}\n}`; - }; helper.randomString = (len) => { const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; @@ -28,20 +15,29 @@ const helper = {}; return randomstring; }; - const getFrameJQuery = ($iframe) => { - /* - I tried over 9001 ways to inject javascript into iframes. - This is the only way I found that worked in IE 7+8+9, FF and Chrome - */ + const getFrameJQuery = async ($iframe, includeJquery = false, includeSendkeys = false) => { const win = $iframe[0].contentWindow; const doc = win.document; - // IE 8+9 Hack to make eval appear - // https://stackoverflow.com/q/2720444 - win.execScript && win.execScript('null'); + const load = async (url) => { + const elem = doc.createElement('script'); + elem.setAttribute('src', url); + const p = new Promise((resolve, reject) => { + const handler = (evt) => { + elem.removeEventListener('load', handler); + elem.removeEventListener('error', handler); + if (evt.type === 'error') return reject(new Error(`failed to load ${url}`)); + resolve(); + }; + elem.addEventListener('load', handler); + elem.addEventListener('error', handler); + }); + doc.head.appendChild(elem); + await p; + }; - win.eval(jsLibraries.jquery); - win.eval(jsLibraries.sendkeys); + if (!win.$ && includeJquery) await load('../../static/js/vendors/jquery.js'); + if (!win.bililiteRange && includeSendkeys) await load('../tests/frontend/lib/sendkeys.js'); win.$.window = win; win.$.document = doc; @@ -125,7 +121,7 @@ const helper = {}; // set new iframe $('#iframe-container').append($iframe); await new Promise((resolve) => $iframe.one('load', resolve)); - helper.padChrome$ = getFrameJQuery($('#iframe-container iframe')); + helper.padChrome$ = await getFrameJQuery($('#iframe-container iframe'), true, true); helper.padChrome$.padeditor = helper.padChrome$.window.require('ep_etherpad-lite/static/js/pad_editor').padeditor; if (opts.clearCookies) { @@ -141,8 +137,10 @@ const helper = {}; if (opts._retry++ >= 4) throw new Error('Pad never loaded'); return await helper.aNewPad(opts); } - helper.padOuter$ = getFrameJQuery(helper.padChrome$('iframe[name="ace_outer"]')); - helper.padInner$ = getFrameJQuery(helper.padOuter$('iframe[name="ace_inner"]')); + helper.padOuter$ = await getFrameJQuery( + helper.padChrome$('iframe[name="ace_outer"]'), true, false); + helper.padInner$ = await getFrameJQuery( + helper.padOuter$('iframe[name="ace_inner"]'), true, true); // disable all animations, this makes tests faster and easier helper.padChrome$.fx.off = true; @@ -184,8 +182,8 @@ const helper = {}; $('#iframe-container iframe').remove(); // set new iframe $('#iframe-container').append($iframe); - $iframe.one('load', () => { - helper.admin$ = getFrameJQuery($('#iframe-container iframe')); + $iframe.one('load', async () => { + helper.admin$ = await getFrameJQuery($('#iframe-container iframe'), true, false); }); }; diff --git a/src/tests/frontend/helper/multipleUsers.js b/src/tests/frontend/helper/multipleUsers.js index d34676a66..9266bbe28 100644 --- a/src/tests/frontend/helper/multipleUsers.js +++ b/src/tests/frontend/helper/multipleUsers.js @@ -34,18 +34,11 @@ helper.multipleUsers = { }, async _loadJQueryForUser1Frame() { - const code = await $.get('/static/js/jquery.js'); - - // make sure we don't override existing jquery - const jQueryCode = `if(typeof $ === "undefined") {\n${code}\n}`; - const sendkeysCode = await $.get('/tests/frontend/lib/sendkeys.js'); - const codesToLoad = [jQueryCode, sendkeysCode]; - - this._user1.padChrome$ = getFrameJQuery(codesToLoad, this._user1.$frame); + this._user1.padChrome$ = await getFrameJQuery(this._user1.$frame, true, true); this._user1.padOuter$ = - getFrameJQuery(codesToLoad, this._user1.padChrome$('iframe[name="ace_outer"]')); + await getFrameJQuery(this._user1.padChrome$('iframe[name="ace_outer"]'), true, false); this._user1.padInner$ = - getFrameJQuery(codesToLoad, this._user1.padOuter$('iframe[name="ace_inner"]')); + await getFrameJQuery(this._user1.padOuter$('iframe[name="ace_inner"]'), true, true); // update helper vars now that they are available helper.padChrome$ = this._user1.padChrome$; @@ -86,14 +79,30 @@ helper.multipleUsers = { }, }; -// adapted form helper.js on Etherpad code -const getFrameJQuery = (codesToLoad, $iframe) => { +// copied from helper.js +const getFrameJQuery = async ($iframe, includeJquery = false, includeSendkeys = false) => { const win = $iframe[0].contentWindow; const doc = win.document; - for (let i = 0; i < codesToLoad.length; i++) { - win.eval(codesToLoad[i]); - } + const load = async (url) => { + const elem = doc.createElement('script'); + elem.setAttribute('src', url); + const p = new Promise((resolve, reject) => { + const handler = (evt) => { + elem.removeEventListener('load', handler); + elem.removeEventListener('error', handler); + if (evt.type === 'error') return reject(new Error(`failed to load ${url}`)); + resolve(); + }; + elem.addEventListener('load', handler); + elem.addEventListener('error', handler); + }); + doc.head.appendChild(elem); + await p; + }; + + if (!win.$ && includeJquery) await load('../../static/js/vendors/jquery.js'); + if (!win.bililiteRange && includeSendkeys) await load('../tests/frontend/lib/sendkeys.js'); win.$.window = win; win.$.document = doc; diff --git a/src/tests/frontend/index.html b/src/tests/frontend/index.html index 2b70ca667..9f542ee13 100644 --- a/src/tests/frontend/index.html +++ b/src/tests/frontend/index.html @@ -16,6 +16,7 @@ + diff --git a/src/tests/frontend/runner.js b/src/tests/frontend/runner.js index 449c126c5..48a473aa7 100644 --- a/src/tests/frontend/runner.js +++ b/src/tests/frontend/runner.js @@ -314,7 +314,6 @@ $(() => (async () => { } $progressArea.remove(); - await helper.init(); const grep = getURLParameter('grep'); if (grep != null) { mocha.grep(grep);