зеркало из https://github.com/mozilla/gecko-dev.git
Bug 805162 - d. Redefine and implement Gecko to Java IME notifications in widget; r=blassey
This commit is contained in:
Родитель
04ccb72b92
Коммит
399f6c60d4
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче