From b45e9b49b9e4d38f6beebfb15f76e7d2b5d7e3c7 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Sat, 01 Aug 2015 11:18:33 -0400 Subject: [PATCH] Fix removing signature when switching to identity with an empty sig in HTML mode (#1490470) --- program/js/editor.js | 114 +++++++++++++++++++++++++++++---------------------------- 1 files changed, 58 insertions(+), 56 deletions(-) diff --git a/program/js/editor.js b/program/js/editor.js index d16c0e8..6446dc5 100644 --- a/program/js/editor.js +++ b/program/js/editor.js @@ -65,6 +65,15 @@ } } + // secure spellchecker requests with Roundcube token + // Note: must be registered only once (#1490311) + if (!tinymce.registered_request_token) { + tinymce.registered_request_token = true; + tinymce.util.XHR.on('beforeSend', function(e) { + e.xhr.setRequestHeader('X-Roundcube-Request', rcmail.env.request_token); + }); + } + // minimal editor if (config.mode == 'identity') { $.extend(conf, { @@ -107,10 +116,6 @@ ed.on('keypress', function() { rcmail.compose_type_activity++; }); - // secure spellchecker requests with Roundcube token - tinymce.util.XHR.on('beforeSend', function(e) { - e.xhr.setRequestHeader('X-Roundcube-Request', rcmail.env.request_token); - }); }; // textarea identifier @@ -127,6 +132,15 @@ if (rcmail.env.action != 'compose') { return; + } + + var area = $('#' + this.id), + height = $('div.mce-toolbar-grp:first', area.parent()).height(); + + // the editor might be still not fully loaded, making the editing area + // inaccessible, wait and try again (#1490310) + if (height > 200 || height > area.height()) { + return setTimeout(function () { ref.init_callback(event); }, 300); } var css = {}, @@ -149,21 +163,16 @@ // Focus previously focused element if (fe && fe.id != this.id) { - // use setTimeout() for IE9 (#1488541) - window.setTimeout(function() { - window.focus(); // for WebKit (#1486674) - fe.focus(); - rcmail.env.compose_focus_elem = null; - }, 10); + window.focus(); // for WebKit (#1486674) + fe.focus(); + rcmail.env.compose_focus_elem = null; } } - window.setTimeout(function() { - // set tabIndex and set focus to element that was focused before - ref.tabindex(fe && fe.id == ref.id); - // Trigger resize (needed for proper editor resizing in some browsers) - $(window).resize(); - }, 100); + // set tabIndex and set focus to element that was focused before + ref.tabindex(fe && fe.id == ref.id); + // Trigger resize (needed for proper editor resizing in some browsers) + $(window).resize(); }; // set tabIndex on tinymce editor @@ -235,17 +244,13 @@ input.val(data); tinymce.execCommand('mceAddEditor', false, ref.id); - setTimeout(function() { - if (ref.editor) { - var body = $(ref.editor.getBody()); - if (rcmail.env.default_font) - body.css('font-family', rcmail.env.default_font); - // #1486593 - ref.tabindex(true); - // put cursor on start of the compose body - ref.editor.selection.setCursorLocation(body.children().first().get(0)); - } - }, 500); + if (ref.editor) { + var body = $(ref.editor.getBody()); + // #1486593 + ref.tabindex(true); + // put cursor on start of the compose body + ref.editor.selection.setCursorLocation(body.children().first().get(0)); + } }; // convert to html @@ -480,32 +485,37 @@ sig = rcmail.env.signatures[id].text; sig = sig.replace(/\r\n/g, '\n'); - if (rcmail.env.top_posting) { - if (p >= 0) { // in place of removed signature - message = message.substring(0, p) + sig + message.substring(p, message.length); - cursor_pos = p - 1; - } - else if (!message) { // empty message - cursor_pos = 0; - message = '\n\n' + sig; - } - else if (pos = rcmail.get_caret_pos(input_message.get(0))) { // at cursor position + // in place of removed signature + if (p >= 0) { + message = message.substring(0, p) + sig + message.substring(p, message.length); + cursor_pos = p - 1; + } + // empty message + else if (!message) { + message = '\n\n' + sig; + cursor_pos = 0; + } + else if (rcmail.env.top_posting && !rcmail.env.sig_below) { + // at cursor position + if (pos = rcmail.get_caret_pos(input_message.get(0))) { message = message.substring(0, pos) + '\n' + sig + '\n\n' + message.substring(pos, message.length); cursor_pos = pos; } - else { // on top - cursor_pos = 0; + // on top + else { message = '\n\n' + sig + '\n\n' + message.replace(/^[\r\n]+/, ''); + cursor_pos = 0; } } else { message = message.replace(/[\r\n]+$/, ''); - cursor_pos = !rcmail.env.top_posting && message.length ? message.length+1 : 0; + cursor_pos = !rcmail.env.top_posting && message.length ? message.length + 1 : 0; message += '\n\n' + sig; } } - else + else { cursor_pos = rcmail.env.top_posting ? 0 : message.length; + } input_message.val(message); @@ -523,30 +533,22 @@ sigElem = doc.createElement('div'); sigElem.setAttribute('id', '_rc_sig'); - if (rcmail.env.top_posting) { - // if no existing sig and top posting then insert at caret pos + if (rcmail.env.top_posting && !rcmail.env.sig_below) { this.editor.getWin().focus(); // correct focus in IE & Chrome var node = this.editor.selection.getNode(); - if (node.nodeName == 'BODY') { - // no real focus, insert at start - body.insertBefore(sigElem, body.firstChild); - body.insertBefore(doc.createElement('br'), body.firstChild); - } - else { - body.insertBefore(sigElem, node.nextSibling); - body.insertBefore(doc.createElement('br'), node.nextSibling); - } + + // insert at start or at cursor position if found + body.insertBefore(sigElem, node.nodeName == 'BODY' ? body.firstChild : node.nextSibling); + body.insertBefore(doc.createElement('p'), sigElem); } else { body.appendChild(sigElem); - position_element = $(sigElem).prev(); + position_element = rcmail.env.top_posting ? body.firstChild : $(sigElem).prev(); } } - if (rcmail.env.signatures[id]) { - sigElem.innerHTML = rcmail.env.signatures[id].html; - } + sigElem.innerHTML = rcmail.env.signatures[id] ? rcmail.env.signatures[id].html : ''; } else if (!rcmail.env.top_posting) { position_element = $(this.editor.getBody()).children().last(); -- Gitblit v1.9.1