Merge pull request #999 from lepidum/develop
Fixed international composition issues (e.g., Japanese Input method)
This commit is contained in:
commit
ba8177fc6f
|
@ -1161,7 +1161,7 @@ function Ace2Inner(){
|
||||||
//if (! top.BEFORE) top.BEFORE = [];
|
//if (! top.BEFORE) top.BEFORE = [];
|
||||||
//top.BEFORE.push(magicdom.root.dom.innerHTML);
|
//top.BEFORE.push(magicdom.root.dom.innerHTML);
|
||||||
//if (! isEditable) return; // and don't reschedule
|
//if (! isEditable) return; // and don't reschedule
|
||||||
if (inInternationalComposition)
|
if (window.parent.parent.inInternationalComposition)
|
||||||
{
|
{
|
||||||
// don't do idle input incorporation during international input composition
|
// don't do idle input incorporation during international input composition
|
||||||
idleWorkTimer.atLeast(500);
|
idleWorkTimer.atLeast(500);
|
||||||
|
@ -1486,7 +1486,6 @@ function Ace2Inner(){
|
||||||
|
|
||||||
if (currentCallStack.domClean) return false;
|
if (currentCallStack.domClean) return false;
|
||||||
|
|
||||||
inInternationalComposition = false; // if we need the document normalized, so be it
|
|
||||||
currentCallStack.isUserChange = true;
|
currentCallStack.isUserChange = true;
|
||||||
|
|
||||||
isTimeUp = (isTimeUp ||
|
isTimeUp = (isTimeUp ||
|
||||||
|
@ -3690,7 +3689,7 @@ function Ace2Inner(){
|
||||||
thisKeyDoesntTriggerNormalize = true;
|
thisKeyDoesntTriggerNormalize = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!specialHandled) && (!thisKeyDoesntTriggerNormalize) && (!inInternationalComposition))
|
if ((!specialHandled) && (!thisKeyDoesntTriggerNormalize) && (!window.parent.parent.inInternationalComposition))
|
||||||
{
|
{
|
||||||
if (type != "keyup" || !incorpIfQuick())
|
if (type != "keyup" || !incorpIfQuick())
|
||||||
{
|
{
|
||||||
|
@ -4550,19 +4549,9 @@ function Ace2Inner(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var inInternationalComposition = false;
|
|
||||||
|
|
||||||
function handleCompositionEvent(evt)
|
function handleCompositionEvent(evt)
|
||||||
{
|
{
|
||||||
// international input events, fired in FF3, at least; allow e.g. Japanese input
|
window.parent.parent.handleCompositionEvent(evt);
|
||||||
if (evt.type == "compositionstart")
|
|
||||||
{
|
|
||||||
inInternationalComposition = true;
|
|
||||||
}
|
|
||||||
else if (evt.type == "compositionend")
|
|
||||||
{
|
|
||||||
inInternationalComposition = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function bindTheEventHandlers()
|
function bindTheEventHandlers()
|
||||||
|
@ -4577,7 +4566,8 @@ function Ace2Inner(){
|
||||||
$(document).on("click", handleIEOuterClick);
|
$(document).on("click", handleIEOuterClick);
|
||||||
}
|
}
|
||||||
if (browser.msie) $(root).on("paste", handleIEPaste);
|
if (browser.msie) $(root).on("paste", handleIEPaste);
|
||||||
if ((!browser.msie) && document.documentElement)
|
// CompositionEvent is not implemented below IE version 8
|
||||||
|
if ( !(browser.msie && browser.version < 9) && document.documentElement)
|
||||||
{
|
{
|
||||||
$(document.documentElement).on("compositionstart", handleCompositionEvent);
|
$(document.documentElement).on("compositionstart", handleCompositionEvent);
|
||||||
$(document.documentElement).on("compositionend", handleCompositionEvent);
|
$(document.documentElement).on("compositionend", handleCompositionEvent);
|
||||||
|
|
|
@ -62,6 +62,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
var caughtErrorCatchers = [];
|
var caughtErrorCatchers = [];
|
||||||
var caughtErrorTimes = [];
|
var caughtErrorTimes = [];
|
||||||
var debugMessages = [];
|
var debugMessages = [];
|
||||||
|
var msgQueue = [];
|
||||||
|
|
||||||
tellAceAboutHistoricalAuthors(serverVars.historicalAuthorData);
|
tellAceAboutHistoricalAuthors(serverVars.historicalAuthorData);
|
||||||
tellAceActiveAuthorInfo(initialUserInfo);
|
tellAceActiveAuthorInfo(initialUserInfo);
|
||||||
|
@ -110,6 +111,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
|
|
||||||
function handleUserChanges()
|
function handleUserChanges()
|
||||||
{
|
{
|
||||||
|
if (window.parent.parent.inInternationalComposition) return;
|
||||||
if ((!getSocket()) || channelState == "CONNECTING")
|
if ((!getSocket()) || channelState == "CONNECTING")
|
||||||
{
|
{
|
||||||
if (channelState == "CONNECTING" && (((+new Date()) - initialStartConnectTime) > 20000))
|
if (channelState == "CONNECTING" && (((+new Date()) - initialStartConnectTime) > 20000))
|
||||||
|
@ -128,12 +130,12 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
|
|
||||||
if (state != "IDLE")
|
if (state != "IDLE")
|
||||||
{
|
{
|
||||||
if (state == "COMMITTING" && (t - lastCommitTime) > 20000)
|
if (state == "COMMITTING" && msgQueue.length == 0 && (t - lastCommitTime) > 20000)
|
||||||
{
|
{
|
||||||
// a commit is taking too long
|
// a commit is taking too long
|
||||||
setChannelState("DISCONNECTED", "slowcommit");
|
setChannelState("DISCONNECTED", "slowcommit");
|
||||||
}
|
}
|
||||||
else if (state == "COMMITTING" && (t - lastCommitTime) > 5000)
|
else if (state == "COMMITTING" && msgQueue.length == 0 && (t - lastCommitTime) > 5000)
|
||||||
{
|
{
|
||||||
callbacks.onConnectionTrouble("SLOW");
|
callbacks.onConnectionTrouble("SLOW");
|
||||||
}
|
}
|
||||||
|
@ -152,6 +154,36 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// apply msgQueue changeset.
|
||||||
|
if (msgQueue.length != 0) {
|
||||||
|
while (msg = msgQueue.shift()) {
|
||||||
|
var newRev = msg.newRev;
|
||||||
|
rev=newRev;
|
||||||
|
if (msg.type == "ACCEPT_COMMIT")
|
||||||
|
{
|
||||||
|
editor.applyPreparedChangesetToBase();
|
||||||
|
setStateIdle();
|
||||||
|
callCatchingErrors("onInternalAction", function()
|
||||||
|
{
|
||||||
|
callbacks.onInternalAction("commitAcceptedByServer");
|
||||||
|
});
|
||||||
|
callCatchingErrors("onConnectionTrouble", function()
|
||||||
|
{
|
||||||
|
callbacks.onConnectionTrouble("OK");
|
||||||
|
});
|
||||||
|
handleUserChanges();
|
||||||
|
}
|
||||||
|
else if (msg.type == "NEW_CHANGES")
|
||||||
|
{
|
||||||
|
var changeset = msg.changeset;
|
||||||
|
var author = (msg.author || '');
|
||||||
|
var apool = msg.apool;
|
||||||
|
|
||||||
|
editor.applyChangesToBase(changeset, author, apool);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var sentMessage = false;
|
var sentMessage = false;
|
||||||
var userChangesData = editor.prepareUserChangeset();
|
var userChangesData = editor.prepareUserChangeset();
|
||||||
if (userChangesData.changeset)
|
if (userChangesData.changeset)
|
||||||
|
@ -254,6 +286,22 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
var changeset = msg.changeset;
|
var changeset = msg.changeset;
|
||||||
var author = (msg.author || '');
|
var author = (msg.author || '');
|
||||||
var apool = msg.apool;
|
var apool = msg.apool;
|
||||||
|
|
||||||
|
// When inInternationalComposition, msg pushed msgQueue.
|
||||||
|
if (msgQueue.length > 0 || window.parent.parent.inInternationalComposition) {
|
||||||
|
if (msgQueue.length > 0) oldRev = msgQueue[msgQueue.length - 1].newRev;
|
||||||
|
else oldRev = rev;
|
||||||
|
|
||||||
|
if (newRev != (oldRev + 1))
|
||||||
|
{
|
||||||
|
dmesg("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1));
|
||||||
|
setChannelState("DISCONNECTED", "badmessage_newchanges");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msgQueue.push(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (newRev != (rev + 1))
|
if (newRev != (rev + 1))
|
||||||
{
|
{
|
||||||
dmesg("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1));
|
dmesg("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1));
|
||||||
|
@ -266,6 +314,18 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
else if (msg.type == "ACCEPT_COMMIT")
|
else if (msg.type == "ACCEPT_COMMIT")
|
||||||
{
|
{
|
||||||
var newRev = msg.newRev;
|
var newRev = msg.newRev;
|
||||||
|
if (msgQueue.length > 0)
|
||||||
|
{
|
||||||
|
if (newRev != (msgQueue[msgQueue.length - 1].newRev + 1))
|
||||||
|
{
|
||||||
|
dmesg("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1));
|
||||||
|
setChannelState("DISCONNECTED", "badmessage_acceptcommit");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msgQueue.push(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (newRev != (rev + 1))
|
if (newRev != (rev + 1))
|
||||||
{
|
{
|
||||||
dmesg("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1));
|
dmesg("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1));
|
||||||
|
|
|
@ -50,6 +50,22 @@ var randomString = require('./pad_utils').randomString;
|
||||||
|
|
||||||
var hooks = require('./pluginfw/hooks');
|
var hooks = require('./pluginfw/hooks');
|
||||||
|
|
||||||
|
window.inInternationalComposition = false;
|
||||||
|
var inInternationalComposition = window.inInternationalComposition;
|
||||||
|
|
||||||
|
window.handleCompositionEvent = function handleCompositionEvent(evt)
|
||||||
|
{
|
||||||
|
// international input events, fired in FF3, at least; allow e.g. Japanese input
|
||||||
|
if (evt.type == "compositionstart")
|
||||||
|
{
|
||||||
|
this.inInternationalComposition = true;
|
||||||
|
}
|
||||||
|
else if (evt.type == "compositionend")
|
||||||
|
{
|
||||||
|
this.inInternationalComposition = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function createCookie(name, value, days, path)
|
function createCookie(name, value, days, path)
|
||||||
{
|
{
|
||||||
if (days)
|
if (days)
|
||||||
|
|
Loading…
Reference in New Issue