From f06aa8058b7e32ba32d4551074b6e0b8a300f751 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli <thomas@roundcube.net> Date: Mon, 21 Oct 2013 15:02:40 -0400 Subject: [PATCH] Bump version after security fix --- program/js/list.js | 140 +++++++++++++++++++++++++--------------------- 1 files changed, 75 insertions(+), 65 deletions(-) diff --git a/program/js/list.js b/program/js/list.js index 0b640c7..f101804 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -90,10 +90,8 @@ this.frame = this.list.parentNode; // set body events - if (this.keyboard) { - rcube_event.add_listener({event:bw.opera?'keypress':'keydown', object:this, method:'key_press'}); - rcube_event.add_listener({event:'keydown', object:this, method:'key_down'}); - } + if (this.keyboard) + rcube_event.add_listener({event:'keydown', object:this, method:'key_press'}); } }, @@ -233,8 +231,8 @@ } } - // Un-focus already focused elements - $(document.activeElement).blur(); + // Un-focus already focused elements (#1487123, #1487316, #1488600, #1488620) + $(':focus:not(body)').blur(); $('iframe').each(function() { this.blur(); }); if (e || (e = window.event)) @@ -530,6 +528,7 @@ return false; }, + expand_all: function(row) { var depth, new_row, r; @@ -564,6 +563,7 @@ } return false; }, + update_expando: function(uid, expanded) { @@ -737,7 +737,7 @@ /** - * Select last row + * Select last row */ select_last: function(mod_key) { @@ -758,25 +758,13 @@ /** * Add all childs of the given row to selection */ -select_childs: function(uid) +select_children: function(uid) { - if (!this.rows[uid] || !this.rows[uid].has_children) - return; + var i, children = this.row_children(uid), len = children.length; - var depth = this.rows[uid].depth, - row = this.rows[uid].obj.nextSibling; - - while (row) { - if (row.nodeType == 1) { - if ((r = this.rows[row.uid])) { - if (!r.depth || r.depth <= depth) - break; - if (!this.in_selection(r.uid)) - this.select_row(r.uid, CONTROL_KEY); - } - } - row = row.nextSibling; - } + for (i=0; i<len; i++) + if (!this.in_selection(children[i])) + this.select_row(children[i], CONTROL_KEY); }, @@ -934,17 +922,22 @@ */ highlight_row: function(id, multiple) { - if (this.rows[id] && !multiple) { + if (!this.rows[id]) + return; + + if (!multiple) { if (this.selection.length > 1 || !this.in_selection(id)) { this.clear_selection(); this.selection[0] = id; $(this.rows[id].obj).addClass('selected'); } } - else if (this.rows[id]) { + else { if (!this.in_selection(id)) { // select row - this.selection[this.selection.length] = id; + this.selection.push(id); $(this.rows[id].obj).addClass('selected'); + if (!this.rows[id].expanded) + this.highlight_children(id, true); } else { // unselect row var p = $.inArray(id, this.selection), @@ -953,7 +946,25 @@ this.selection = a_pre.concat(a_post); $(this.rows[id].obj).removeClass('selected').removeClass('unfocused'); + if (!this.rows[id].expanded) + this.highlight_children(id, false); } + } +}, + + +/** + * Highlight/unhighlight all childs of the given row + */ +highlight_children: function(id, status) +{ + var i, selected, + children = this.row_children(id), len = children.length; + + for (i=0; i<len; i++) { + selected = this.in_selection(children[i]); + if ((status && !selected) || (!status && selected)) + this.highlight_row(children[i], true); } }, @@ -996,6 +1007,14 @@ case 35: // End this.select_last(mod_key); return rcube_event.cancel(e); + case 27: + if (this.drag_active) + return this.drag_mouse_up(e); + if (this.col_drag_active) { + this.selected_column = null; + return this.column_drag_mouse_up(e); + } + return rcube_event.cancel(e); default: this.key_pressed = keyCode; this.modkey = mod_key; @@ -1004,41 +1023,6 @@ if (this.key_pressed == this.BACKSPACE_KEY) return rcube_event.cancel(e); - } - - return true; -}, - -/** - * Handler for keydown events - */ -key_down: function(e) -{ - var target = e.target || {}; - if (this.focused != true || target.nodeName == 'INPUT' || target.nodeName == 'TEXTAREA' || target.nodeName == 'SELECT') - return true; - - switch (rcube_event.get_keycode(e)) { - case 27: - if (this.drag_active) - return this.drag_mouse_up(e); - if (this.col_drag_active) { - this.selected_column = null; - return this.column_drag_mouse_up(e); - } - - case 40: - case 38: - case 63233: - case 63232: - case 61: - case 107: - case 109: - case 32: - if (!rcube_event.get_modifier(e) && this.focused) - return rcube_event.cancel(e); - - default: } return true; @@ -1131,7 +1115,7 @@ else return rcube_event.cancel(e); } - + if (this.drag_start) { // check mouse movement, of less than 3 pixels, don't start dragging var m = rcube_event.get_mouse_pos(e); @@ -1148,8 +1132,8 @@ var n, uid, selection = $.merge([], this.selection); for (n in selection) { uid = selection[n]; - if (this.rows[uid].has_children && !this.rows[uid].expanded) - this.select_childs(uid); + if (!this.rows[uid].expanded) + this.select_children(uid); } // reset content @@ -1370,6 +1354,32 @@ /** + * Returns IDs of all rows in a thread (except root) for specified root + */ +row_children: function(uid) +{ + if (!this.rows[uid] || !this.rows[uid].has_children) + return []; + + var res = [], depth = this.rows[uid].depth, + row = this.rows[uid].obj.nextSibling; + + while (row) { + if (row.nodeType == 1) { + if ((r = this.rows[row.uid])) { + if (!r.depth || r.depth <= depth) + break; + res.push(r.uid); + } + } + row = row.nextSibling; + } + + return res; +}, + + +/** * Creates a layer for drag&drop over iframes */ add_dragfix: function() -- Gitblit v1.9.1