浏览代码

Merge branch 'master' into anon_login

JC Brand 10 年之前
父节点
当前提交
df0c55ed4d
共有 3 个文件被更改,包括 33 次插入8 次删除
  1. 5 6
      converse.js
  2. 1 0
      docs/CHANGES.rst
  3. 27 2
      spec/chatbox.js

+ 5 - 6
converse.js

@@ -1260,12 +1260,11 @@
                  *    (string) state - The chat state (consts ACTIVE, COMPOSING, PAUSED, INACTIVE, GONE)
                  *    (no_save) no_save - Just do the cleanup or setup but don't actually save the state.
                  */
-                if (_.contains([ACTIVE, INACTIVE, GONE], state)) {
-                    if (typeof this.chat_state_timeout !== 'undefined') {
-                        clearTimeout(this.chat_state_timeout);
-                        delete this.chat_state_timeout;
-                    }
-                } else if (state === COMPOSING) {
+                if (typeof this.chat_state_timeout !== 'undefined') {
+                    clearTimeout(this.chat_state_timeout);
+                    delete this.chat_state_timeout;
+                }
+                if (state === COMPOSING) {
                     this.chat_state_timeout = setTimeout(
                             $.proxy(this.setChatState, this), converse.TIMEOUTS.PAUSED, PAUSED);
                 } else if (state === PAUSED) {

+ 1 - 0
docs/CHANGES.rst

@@ -10,6 +10,7 @@ Changelog
 * #356 Fix the plugin extend function. [floriancargoet]
 * #357 Fix the known bug where a state notification reopens a chat box. [floriancargoet]
 * #358 Bugfix. Chat rooms show the same occupants bug. [floriancargoet]
+* #359 Fix a timeout bug in chat state notifications. [floriancargoet]
 
 0.9.1 (2015-03-26)
 ------------------

+ 27 - 2
spec/chatbox.js

@@ -781,6 +781,8 @@
                         var contact_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
                         test_utils.openChatBoxFor(contact_jid);
                         var view = this.chatboxviews.get(contact_jid);
+                        spyOn(converse.connection, 'send');
+                        spyOn(view, 'setChatState').andCallThrough();
                         runs(function () {
                             expect(view.model.get('chat_state')).toBe('active');
                             view.keyPressed({
@@ -788,16 +790,39 @@
                                 keyCode: 1
                             });
                             expect(view.model.get('chat_state')).toBe('composing');
-                            spyOn(converse.connection, 'send');
+                            expect(converse.connection.send).toHaveBeenCalled();
+                            var $stanza = $(converse.connection.send.argsForCall[0][0].tree());
+                            expect($stanza.children().prop('tagName')).toBe('composing');
                         });
                         waits(250);
                         runs(function () {
                             expect(view.model.get('chat_state')).toBe('paused');
                             expect(converse.connection.send).toHaveBeenCalled();
-                            var $stanza = $(converse.connection.send.argsForCall[0][0].tree());
+                            var $stanza = $(converse.connection.send.argsForCall[1][0].tree());
                             expect($stanza.attr('to')).toBe(contact_jid);
                             expect($stanza.children().length).toBe(1);
                             expect($stanza.children().prop('tagName')).toBe('paused');
+                            // Test #359. A paused notification should not be sent
+                            // out if the user simply types longer than the
+                            // timeout.
+                            view.keyPressed({
+                                target: view.$el.find('textarea.chat-textarea'),
+                                keyCode: 1
+                            });
+                            expect(view.setChatState).toHaveBeenCalled();
+                            expect(view.model.get('chat_state')).toBe('composing');
+                        });
+                        waits(100);
+                        runs(function () {
+                            view.keyPressed({
+                                target: view.$el.find('textarea.chat-textarea'),
+                                keyCode: 1
+                            });
+                            expect(view.model.get('chat_state')).toBe('composing');
+                        });
+                        waits(150);
+                        runs(function () {
+                            expect(view.model.get('chat_state')).toBe('composing');
                         });
                     }, converse));