summaryrefslogtreecommitdiff
path: root/tests/frontend/specs/responsiveness.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/frontend/specs/responsiveness.js')
-rw-r--r--tests/frontend/specs/responsiveness.js80
1 files changed, 80 insertions, 0 deletions
diff --git a/tests/frontend/specs/responsiveness.js b/tests/frontend/specs/responsiveness.js
new file mode 100644
index 00000000..44bdd611
--- /dev/null
+++ b/tests/frontend/specs/responsiveness.js
@@ -0,0 +1,80 @@
+// Test for https://github.com/ether/etherpad-lite/issues/1763
+
+// This test fails in Opera, IE and Safari
+// Opera fails due to a weird way of handling the order of execution, yet actual performance seems fine
+// Safari fails due the delay being too great yet the actual performance seems fine
+// Firefox might panic that the script is taking too long so will fail
+// IE will fail due to running out of memory as it can't fit 2M chars in memory.
+
+// Just FYI Google Docs crashes on large docs whilst trying to Save, it's likely the limitations we are
+// experiencing are more to do with browser limitations than improper implementation.
+// A ueber fix for this would be to have a separate lower cpu priority thread that handles operations that aren't
+// visible to the user.
+
+// Adapted from John McLear's original test case.
+
+describe('Responsiveness of Editor', function() {
+ // create a new pad before each test run
+ beforeEach(function(cb) {
+ helper.newPad(cb);
+ this.timeout(6000);
+ });
+ it('Fast response to keypress in pad with large amount of contents', function(done) {
+ var inner$ = helper.padInner$;
+ var chrome$ = helper.padChrome$;
+ var chars = '0000000000'; // row of placeholder chars
+ var amount = 200000; //number of blocks of chars we will insert
+ var length = (amount * (chars.length) +1); // include a counter for each space
+ var text = ''; // the text we're gonna insert
+ this.timeout(amount * 100);
+
+ // get keys to send
+ var keyMultiplier = 10; // multiplier * 10 == total number of key events
+ var keysToSend = '';
+ for(var i=0; i <= keyMultiplier; i++) {
+ keysToSend += chars;
+ }
+
+ var textElement = inner$('div');
+ textElement.sendkeys('{selectall}'); // select all
+ textElement.sendkeys('{del}'); // clear the pad text
+
+ for(var i=0; i <= amount; i++) {
+ text = text + chars + ' '; // add the chars and space to the text contents
+ }
+ inner$('div').first().text(text); // Put the text contents into the pad
+
+ helper.waitFor(function(){ // Wait for the new contents to be on the pad
+ return inner$('div').text().length > length;
+ }).done(function(){
+
+ expect( inner$('div').text().length ).to.be.greaterThan( length ); // has the text changed?
+ var start = new Date().getTime(); // get the start time
+
+ // send some new text to the screen (ensure all 3 key events are sent)
+ var el = inner$('div').first();
+ for(var i = 0; i < keysToSend.length; ++i) {
+ var x = keysToSend.charCodeAt(i);
+ ['keyup', 'keypress', 'keydown'].forEach(function(type) {
+ var e = $.Event(type);
+ e.keyCode = x;
+ el.trigger(e);
+ });
+ }
+
+ helper.waitFor(function(){ // Wait for the ability to process
+ return true; // Ghetto but works for now
+ }).done(function(){
+ var end = new Date().getTime(); // get the current time
+ var delay = end - start; // get the delay as the current time minus the start time
+
+ console.log('delay:', delay);
+ expect(delay).to.be.below(200);
+ done();
+ }, 1000);
+
+ }, 10000);
+ });
+
+});
+