From fc5befff0f1aec5f9529a1892dd274350ab0f9e6 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Fri, 08 Jan 2016 04:58:16 -0500 Subject: [PATCH] Fix missing language name in "Add to Dictionary" request in HTML mode (#1490634) --- program/js/editor.js | 124 +++++++++++++++++++++-------------------- 1 files changed, 64 insertions(+), 60 deletions(-) diff --git a/program/js/editor.js b/program/js/editor.js index d16c0e8..ddf599a 100644 --- a/program/js/editor.js +++ b/program/js/editor.js @@ -65,6 +65,18 @@ } } + // 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); + // Fix missing lang parameter on addToDictionary request (#1490634) + if (e.settings && e.settings.data && /^method=addToDictionary/.test(e.settings.data) && !/&lang=/.test(e.settings.data)) + e.settings.data += '&lang=' + ref.editor.plugins.spellchecker.getLanguage(); + }); + } + // minimal editor if (config.mode == 'identity') { $.extend(conf, { @@ -107,10 +119,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 +135,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 +166,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 +247,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 +488,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); @@ -517,36 +530,27 @@ // Append the signature as a div within the body if (!sigElem) { - var body = this.editor.getBody(), - doc = this.editor.getDoc(); + var body = this.editor.getBody(); - sigElem = doc.createElement('div'); - sigElem.setAttribute('id', '_rc_sig'); + sigElem = $('<div id="_rc_sig"></div>').get(0); - if (rcmail.env.top_posting) { - // if no existing sig and top posting then insert at caret pos + // insert at start or at cursor position in top-posting mode + // (but not if the content is empty) + if (rcmail.env.top_posting && !rcmail.env.sig_below && (body.childNodes.length > 1 || $(body).text())) { 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); - } + + $(sigElem).insertBefore(node.nodeName == 'BODY' ? body.firstChild : node.nextSibling); + $('<p>').append($('<br>')).insertBefore(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