Bug 805162 - d. Redefine and implement Gecko to Java IME notifications in widget; r=blassey

This commit is contained in:
Jim Chen 2012-10-31 17:35:31 -04:00
Родитель 04ccb72b92
Коммит 399f6c60d4
3 изменённых файлов: 12 добавлений и 71 удалений

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

@ -107,7 +107,6 @@ AndroidBridge::Init(JNIEnv *jEnv,
jEnableLocationHighAccuracy = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "enableLocationHighAccuracy", "(Z)V"); jEnableLocationHighAccuracy = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "enableLocationHighAccuracy", "(Z)V");
jEnableSensor = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "enableSensor", "(I)V"); jEnableSensor = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "enableSensor", "(I)V");
jDisableSensor = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "disableSensor", "(I)V"); jDisableSensor = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "disableSensor", "(I)V");
jReturnIMEQueryResult = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "returnIMEQueryResult", "(Ljava/lang/String;II)V");
jScheduleRestart = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "scheduleRestart", "()V"); jScheduleRestart = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "scheduleRestart", "()V");
jNotifyXreExit = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "onXreExit", "()V"); jNotifyXreExit = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "onXreExit", "()V");
jGetHandlersForMimeType = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getHandlersForMimeType", "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"); jGetHandlersForMimeType = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getHandlersForMimeType", "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;");
@ -400,25 +399,6 @@ AndroidBridge::DisableSensor(int aSensorType)
env->CallStaticVoidMethod(mGeckoAppShellClass, jDisableSensor, aSensorType); env->CallStaticVoidMethod(mGeckoAppShellClass, jDisableSensor, aSensorType);
} }
void
AndroidBridge::ReturnIMEQueryResult(const PRUnichar *aResult, uint32_t aLen,
int aSelStart, int aSelLen)
{
ALOG_BRIDGE("AndroidBridge::ReturnIMEQueryResult");
JNIEnv *env = GetJNIEnv();
if (!env)
return;
AutoLocalJNIFrame jniFrame(env);
jvalue args[3];
args[0].l = NewJavaString(&jniFrame, aResult, aLen);
args[1].i = aSelStart;
args[2].i = aSelLen;
env->CallStaticVoidMethodA(mGeckoAppShellClass,
jReturnIMEQueryResult, args);
}
void void
AndroidBridge::ScheduleRestart() AndroidBridge::ScheduleRestart()
{ {

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

@ -100,7 +100,7 @@ class AndroidBridge
public: public:
enum { enum {
NOTIFY_IME_RESETINPUTSTATE = 0, NOTIFY_IME_RESETINPUTSTATE = 0,
NOTIFY_IME_SETOPENSTATE = 1, NOTIFY_IME_REPLY_EVENT = 1,
NOTIFY_IME_CANCELCOMPOSITION = 2, NOTIFY_IME_CANCELCOMPOSITION = 2,
NOTIFY_IME_FOCUSCHANGE = 3 NOTIFY_IME_FOCUSCHANGE = 3
}; };
@ -171,8 +171,6 @@ public:
void DisableSensor(int aSensorType); void DisableSensor(int aSensorType);
void ReturnIMEQueryResult(const PRUnichar *aResult, uint32_t aLen, int aSelStart, int aSelLen);
void NotifyXreExit(); void NotifyXreExit();
void ScheduleRestart(); void ScheduleRestart();
@ -408,7 +406,6 @@ protected:
jmethodID jEnableLocationHighAccuracy; jmethodID jEnableLocationHighAccuracy;
jmethodID jEnableSensor; jmethodID jEnableSensor;
jmethodID jDisableSensor; jmethodID jDisableSensor;
jmethodID jReturnIMEQueryResult;
jmethodID jNotifyAppShellReady; jmethodID jNotifyAppShellReady;
jmethodID jNotifyXreExit; jmethodID jNotifyXreExit;
jmethodID jScheduleRestart; jmethodID jScheduleRestart;

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

@ -653,12 +653,6 @@ nsWindow::DispatchEvent(nsGUIEvent *aEvent)
MOZ_ASSERT(mIMEComposing); MOZ_ASSERT(mIMEComposing);
mIMEComposingText = static_cast<nsTextEvent*>(aEvent)->theText; mIMEComposingText = static_cast<nsTextEvent*>(aEvent)->theText;
break; break;
case NS_KEY_PRESS:
// Sometimes the text changes after a key press do not generate notifications (see Bug 723810)
// Call the corresponding methods explicitly to send those changes back to Java
OnIMETextChange(0, 0, 0);
OnIMESelectionChange();
break;
} }
return status; return status;
} }
@ -2088,28 +2082,8 @@ NS_IMETHODIMP
nsWindow::ResetInputState() nsWindow::ResetInputState()
{ {
//ALOGIME("IME: ResetInputState: s=%d", aState); //ALOGIME("IME: ResetInputState: s=%d", aState);
RemoveIMEComposition();
// Cancel composition on Gecko side
if (mIMEComposing) {
nsRefPtr<nsWindow> kungFuDeathGrip(this);
nsTextEvent textEvent(true, NS_TEXT_TEXT, this);
InitEvent(textEvent, nullptr);
textEvent.theText = mIMEComposingText;
DispatchEvent(&textEvent);
mIMEComposingText.Truncate(0);
nsCompositionEvent event(true, NS_COMPOSITION_END, this);
InitEvent(event, nullptr);
DispatchEvent(&event);
}
AndroidBridge::NotifyIME(AndroidBridge::NOTIFY_IME_RESETINPUTSTATE, 0); AndroidBridge::NotifyIME(AndroidBridge::NOTIFY_IME_RESETINPUTSTATE, 0);
// Send IME text/selection change notifications
OnIMETextChange(0, 0, 0);
OnIMESelectionChange();
return NS_OK; return NS_OK;
} }
@ -2169,7 +2143,6 @@ nsWindow::CancelIMEComposition()
nsTextEvent textEvent(true, NS_TEXT_TEXT, this); nsTextEvent textEvent(true, NS_TEXT_TEXT, this);
InitEvent(textEvent, nullptr); InitEvent(textEvent, nullptr);
DispatchEvent(&textEvent); DispatchEvent(&textEvent);
mIMEComposingText.Truncate(0);
nsCompositionEvent compEvent(true, NS_COMPOSITION_END, this); nsCompositionEvent compEvent(true, NS_COMPOSITION_END, this);
InitEvent(compEvent, nullptr); InitEvent(compEvent, nullptr);
@ -2189,7 +2162,7 @@ nsWindow::OnIMEFocusChange(bool aFocus)
int(aFocus)); int(aFocus));
if (aFocus) { if (aFocus) {
OnIMETextChange(0, 0, 0); OnIMETextChange(0, INT32_MAX, INT32_MAX);
OnIMESelectionChange(); OnIMESelectionChange();
} }
@ -2199,22 +2172,16 @@ nsWindow::OnIMEFocusChange(bool aFocus)
NS_IMETHODIMP NS_IMETHODIMP
nsWindow::OnIMETextChange(uint32_t aStart, uint32_t aOldEnd, uint32_t aNewEnd) nsWindow::OnIMETextChange(uint32_t aStart, uint32_t aOldEnd, uint32_t aNewEnd)
{ {
if (mIMEMaskTextUpdate)
return NS_OK;
ALOGIME("IME: OnIMETextChange: s=%d, oe=%d, ne=%d", ALOGIME("IME: OnIMETextChange: s=%d, oe=%d, ne=%d",
aStart, aOldEnd, aNewEnd); aStart, aOldEnd, aNewEnd);
if (!mInputContext.mIMEState.mEnabled) {
AndroidBridge::NotifyIMEChange(nullptr, 0, 0, 0, 0);
return NS_OK;
}
// A quirk in Android makes it necessary to pass the whole text.
// The more efficient way would have been passing the substring from index
// aStart to index aNewEnd
nsRefPtr<nsWindow> kungFuDeathGrip(this); nsRefPtr<nsWindow> kungFuDeathGrip(this);
nsQueryContentEvent event(true, NS_QUERY_TEXT_CONTENT, this); nsQueryContentEvent event(true, NS_QUERY_TEXT_CONTENT, this);
InitEvent(event, nullptr); InitEvent(event, nullptr);
event.InitForQueryTextContent(0, UINT32_MAX); event.InitForQueryTextContent(aStart, aNewEnd - aStart);
DispatchEvent(&event); DispatchEvent(&event);
if (!event.mSucceeded) if (!event.mSucceeded)
@ -2230,12 +2197,10 @@ nsWindow::OnIMETextChange(uint32_t aStart, uint32_t aOldEnd, uint32_t aNewEnd)
NS_IMETHODIMP NS_IMETHODIMP
nsWindow::OnIMESelectionChange(void) nsWindow::OnIMESelectionChange(void)
{ {
ALOGIME("IME: OnIMESelectionChange"); if (mIMEMaskSelectionUpdate)
if (!mInputContext.mIMEState.mEnabled) {
AndroidBridge::NotifyIMEChange(nullptr, 0, 0, 0, -1);
return NS_OK; return NS_OK;
}
ALOGIME("IME: OnIMESelectionChange");
nsRefPtr<nsWindow> kungFuDeathGrip(this); nsRefPtr<nsWindow> kungFuDeathGrip(this);
nsQueryContentEvent event(true, NS_QUERY_SELECTED_TEXT, this); nsQueryContentEvent event(true, NS_QUERY_SELECTED_TEXT, this);
@ -2245,9 +2210,8 @@ nsWindow::OnIMESelectionChange(void)
if (!event.mSucceeded) if (!event.mSucceeded)
return NS_OK; return NS_OK;
AndroidBridge::NotifyIMEChange(nullptr, 0, int(event.mReply.mOffset), AndroidBridge::NotifyIMEChange(nullptr, 0, int(event.GetSelectionStart()),
int(event.mReply.mOffset + int(event.GetSelectionEnd()), -1);
event.mReply.mString.Length()), -1);
return NS_OK; return NS_OK;
} }