Bug 864040 - Send key events from the UI thread the right way; r=cpeterson

This commit is contained in:
Jim Chen 2013-06-26 17:28:21 -04:00
Родитель caabfdcd8b
Коммит 83438a2314
2 изменённых файлов: 26 добавлений и 15 удалений

Просмотреть файл

@ -531,19 +531,9 @@ final class GeckoEditable
@Override
public void sendEvent(final GeckoEvent event) {
if (DEBUG) {
assertOnIcThread();
Log.d(LOGTAG, "sendEvent(" + event + ")");
}
if (!onIcThread()) {
// Events may get dispatched to the main thread;
// reroute to our IC thread instead
mIcRunHandler.post(new Runnable() {
@Override
public void run() {
sendEvent(event);
}
});
return;
}
/*
We are actually sending two events to Gecko here,
1. Event from the event parameter (key event, etc.)
@ -844,8 +834,12 @@ final class GeckoEditable
if (DEBUG) {
// GeckoEditableListener methods should all be called from the Gecko thread
ThreadUtils.assertOnGeckoThread();
Log.d(LOGTAG, "onTextChange(\"" + text + "\", " + start + ", " +
unboundedOldEnd + ", " + unboundedNewEnd + ")");
StringBuilder sb = new StringBuilder("onTextChange(");
debugAppend(sb, text);
sb.append(", ").append(start).append(", ")
.append(unboundedOldEnd).append(", ")
.append(unboundedNewEnd).append(")");
Log.d(LOGTAG, sb.toString());
}
if (start < 0 || start > unboundedOldEnd) {
throw new IllegalArgumentException("invalid text notification range: " +

Просмотреть файл

@ -125,6 +125,22 @@ class GeckoInputConnection
}
}
public void sendEventFromUiThread(final Handler uiHandler,
final GeckoEditableClient client,
final GeckoEvent event) {
final Handler icHandler = client.getInputConnectionHandler();
if (icHandler.getLooper() == uiHandler.getLooper()) {
// IC thread is UI thread; safe to send event directly
client.sendEvent(event);
return;
}
runOnIcThread(icHandler, new Runnable() {
@Override public void run() {
client.sendEvent(event);
}
});
}
public Editable getEditableForUiThread(final Handler uiHandler,
final GeckoEditableClient client) {
if (DEBUG) {
@ -782,7 +798,8 @@ class GeckoInputConnection
View view = getView();
if (view == null) {
mEditableClient.sendEvent(GeckoEvent.createKeyEvent(event, 0));
InputThreadUtils.sInstance.sendEventFromUiThread(ThreadUtils.getUiHandler(),
mEditableClient, GeckoEvent.createKeyEvent(event, 0));
return true;
}
@ -799,7 +816,7 @@ class GeckoInputConnection
if (skip ||
(down && !keyListener.onKeyDown(view, uiEditable, keyCode, event)) ||
(!down && !keyListener.onKeyUp(view, uiEditable, keyCode, event))) {
mEditableClient.sendEvent(
InputThreadUtils.sInstance.sendEventFromUiThread(uiHandler, mEditableClient,
GeckoEvent.createKeyEvent(event, TextKeyListener.getMetaState(uiEditable)));
if (skip && down) {
// Usually, the down key listener call above adjusts meta states for us.