From 3d0747957ea8ad1d416aca4c175b0f523d1c5a08 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Fri, 31 Jul 2015 07:41:57 -0400 Subject: [PATCH] Fix some javascript errors in rare situations (#1490441) --- program/js/app.js | 143 ++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 122 insertions(+), 21 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index b4b125f..f0e9149 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -592,7 +592,7 @@ .bind('mouseup', body_mouseup) .bind('keydown', function(e){ return ref.doc_keypress(e); }); - $('iframe').load(function(e) { + $('iframe').on('load', function(e) { try { $(this.contentDocument || this.contentWindow).on('mouseup', body_mouseup); } catch (e) {/* catch possible "Permission denied" error in IE */ } }) @@ -762,7 +762,7 @@ case 'open': if (uid = this.get_single_uid()) { - obj.href = this.url('show', {_mbox: this.get_message_mailbox(uid), _uid: uid}); + obj.href = this.url('show', this.params_from_uid(uid)); return true; } break; @@ -1188,8 +1188,8 @@ this.gui_objects.messagepartframe.contentWindow.print(); } else if (uid = this.get_single_uid()) { - url = '&_action=print&_uid='+uid+'&_mbox='+urlencode(this.get_message_mailbox(uid))+(this.env.safemode ? '&_safe=1' : ''); - if (this.open_window(this.env.comm_path + url, true, true)) { + url = this.url('print', this.params_from_uid(uid, {_safe: this.env.safemode ? 1 : 0})); + if (this.open_window(url, true, true)) { if (this.env.action != 'show') this.mark_message('read', uid); } @@ -1198,7 +1198,7 @@ case 'viewsource': if (uid = this.get_single_uid()) - this.open_window(this.env.comm_path+'&_action=viewsource&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox), true, true); + this.open_window(this.url('viewsource', this.params_from_uid(uid)), true, true); break; case 'download': @@ -1206,7 +1206,7 @@ location.href = location.href.replace(/_frame=/, '_download='); } else if (uid = this.get_single_uid()) { - this.goto_url('viewsource', { _uid: uid, _mbox: this.get_message_mailbox(uid), _save: 1 }); + this.goto_url('viewsource', this.params_from_uid(uid, {_save: 1})); } break; @@ -1268,7 +1268,7 @@ $('input[name="_unlock"]', form).val(importlock); - if (!(flag = this.upload_file(form, 'import'))) { + if (!(flag = this.upload_file(form, 'import', importlock))) { this.set_busy(false, null, importlock); if (flag !== false) alert(this.get_label('selectimportfile')); @@ -2233,35 +2233,33 @@ return; var win, target = window, - action = preview ? 'preview': 'show', - url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.get_message_mailbox(id)); + url = this.params_from_uid(id, {_caps: this.browser_capabilities()}); if (preview && (win = this.get_frame_window(this.env.contentframe))) { target = win; - url += '&_framed=1'; + url._framed = 1; } if (safe) - url += '&_safe=1'; + url._safe = 1; // also send search request to get the right messages if (this.env.search_request) - url += '&_search='+this.env.search_request; - - // add browser capabilities, so we can properly handle attachments - url += '&_caps='+urlencode(this.browser_capabilities()); + url._search = this.env.search_request; if (this.env.extwin) - url += '&_extwin=1'; + url._extwin = 1; + + url = this.url(preview ? 'preview': 'show', url); if (preview && String(target.location.href).indexOf(url) >= 0) { this.show_contentframe(true); } else { if (!preview && this.env.message_extwin && !this.env.extwin) - this.open_window(this.env.comm_path+url, true); + this.open_window(url, true); else - this.location_href(this.env.comm_path+url, target, true); + this.location_href(url, target, true); // mark as read and change mbox unread counter if (preview && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread && this.env.preview_pane_mark_read > 0) { @@ -3255,6 +3253,92 @@ this.set_alttext('delete', label); }; + // Initialize input element for list page jump + this.init_pagejumper = function(element) + { + $(element).addClass('rcpagejumper') + .on('focus', function(e) { + // create and display popup with page selection + var i, html = ''; + + for (i = 1; i <= ref.env.pagecount; i++) + html += '<li>' + i + '</li>'; + + html = '<ul class="toolbarmenu">' + html + '</ul>'; + + if (!ref.pagejump) { + ref.pagejump = $('<div id="pagejump-selector" class="popupmenu"></div>') + .appendTo(document.body) + .on('click', 'li', function() { + if (!ref.busy) + $(element).val($(this).text()).change(); + }); + } + + if (ref.pagejump.data('count') != i) + ref.pagejump.html(html); + + ref.pagejump.attr('rel', '#' + this.id).data('count', i); + + // display page selector + ref.show_menu('pagejump-selector', true, e); + $(this).keydown(); + }) + // keyboard navigation + .on('keydown keyup click', function(e) { + var current, selector = $('#pagejump-selector'), + ul = $('ul', selector), + list = $('li', ul), + height = ul.height(), + p = parseInt(this.value); + + if (e.which != 27 && e.which != 9 && e.which != 13 && !selector.is(':visible')) + return ref.show_menu('pagejump-selector', true, e); + + if (e.type == 'keydown') { + // arrow-down + if (e.which == 40) { + if (list.length > p) + this.value = (p += 1); + } + // arrow-up + else if (e.which == 38) { + if (p > 1 && list.length > p - 1) + this.value = (p -= 1); + } + // enter + else if (e.which == 13) { + return $(this).change(); + } + // esc, tab + else if (e.which == 27 || e.which == 9) { + return $(element).val(ref.env.current_page); + } + } + + $('li.selected', ul).removeClass('selected'); + + if ((current = $(list[p - 1])).length) { + current.addClass('selected'); + $('#pagejump-selector').scrollTop(((ul.height() / list.length) * (p - 1)) - selector.height() / 2); + } + }) + .on('change', function(e) { + // go to specified page + var p = parseInt(this.value); + if (p && p != ref.env.current_page && !ref.busy) { + ref.hide_menu('pagejump-selector'); + ref.list_page(p); + } + }); + }; + + // Update page-jumper state on list updates + this.update_pagejumper = function() + { + $('input.rcpagejumper').val(this.env.current_page).prop('disabled', this.env.pagecount < 2); + }; + /*********************************************************/ /********* mailbox folders methods *********/ /*********************************************************/ @@ -3878,7 +3962,7 @@ } }, 5000); - $(window).unload(function() { + $(window).on('unload', function() { // remove copy from local storage if compose screen is left after warning if (!ref.env.server_error) ref.remove_compose_data(ref.env.compose_id); @@ -4093,7 +4177,7 @@ }; // upload (attachment) file - this.upload_file = function(form, action) + this.upload_file = function(form, action, lock) { if (!form) return; @@ -4135,6 +4219,9 @@ if (!content.match(/display_message/)) ref.display_message(ref.get_label('fileuploaderror'), 'error'); ref.remove_from_attachment_list(e.data.ts); + + if (lock) + ref.set_busy(false, null, lock); } // Opera hack: handle double onload if (bw.opera) @@ -6673,6 +6760,8 @@ { this.enable_command('nextpage', 'lastpage', this.env.pagecount > this.env.current_page); this.enable_command('previouspage', 'firstpage', this.env.current_page > 1); + + this.update_pagejumper(); }; // mark a mailbox as selected and set environment variable @@ -8039,10 +8128,22 @@ // get the IMP mailbox of the message with the given UID this.get_message_mailbox = function(uid) { - var msg = this.env.messages ? this.env.messages[uid] : {}; + var msg = (this.env.messages && uid ? this.env.messages[uid] : null) || {}; return msg.mbox || this.env.mailbox; }; + // build request parameters from single message id (maybe with mailbox name) + this.params_from_uid = function(uid, params) + { + if (!params) + params = {}; + + params._uid = String(uid).split('-')[0]; + params._mbox = this.get_message_mailbox(uid); + + return params; + }; + // gets cursor position this.get_caret_pos = function(obj) { -- Gitblit v1.9.1