Bug 1077345 part.2 Add TextComposition::CloneAndDispatchAs() for dispatching WidgetCompositionEvent only whose message is different from original composition event r=smaug

This commit is contained in:
Masayuki Nakano 2014-11-25 14:02:30 +09:00
Родитель e33c5a94b9
Коммит 8dbdea703b
2 изменённых файлов: 29 добавлений и 10 удалений

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

@ -80,21 +80,32 @@ TextComposition::MaybeDispatchCompositionUpdate(
if (mLastData == aCompositionEvent->mData) { if (mLastData == aCompositionEvent->mData) {
return true; return true;
} }
CloneAndDispatchAs(aCompositionEvent, NS_COMPOSITION_UPDATE);
return IsValidStateForComposition(aCompositionEvent->widget);
}
WidgetCompositionEvent compositionUpdate(aCompositionEvent->mFlags.mIsTrusted, void
NS_COMPOSITION_UPDATE, TextComposition::CloneAndDispatchAs(
aCompositionEvent->widget); const WidgetCompositionEvent* aCompositionEvent,
compositionUpdate.time = aCompositionEvent->time; uint32_t aMessage)
compositionUpdate.timeStamp = aCompositionEvent->timeStamp; {
compositionUpdate.mData = aCompositionEvent->mData; MOZ_ASSERT(IsValidStateForComposition(aCompositionEvent->widget),
compositionUpdate.mFlags.mIsSynthesizedForTests = "Should be called only when it's safe to dispatch an event");
WidgetCompositionEvent compositionEvent(aCompositionEvent->mFlags.mIsTrusted,
aMessage, aCompositionEvent->widget);
compositionEvent.time = aCompositionEvent->time;
compositionEvent.timeStamp = aCompositionEvent->timeStamp;
compositionEvent.mData = aCompositionEvent->mData;
compositionEvent.mFlags.mIsSynthesizedForTests =
aCompositionEvent->mFlags.mIsSynthesizedForTests; aCompositionEvent->mFlags.mIsSynthesizedForTests;
nsEventStatus status = nsEventStatus_eConsumeNoDefault; nsEventStatus status = nsEventStatus_eConsumeNoDefault;
mLastData = compositionUpdate.mData; if (aMessage == NS_COMPOSITION_UPDATE) {
mLastData = compositionEvent.mData;
}
EventDispatcher::Dispatch(mNode, mPresContext, EventDispatcher::Dispatch(mNode, mPresContext,
&compositionUpdate, nullptr, &status, nullptr); &compositionEvent, nullptr, &status, nullptr);
return IsValidStateForComposition(aCompositionEvent->widget);
} }
void void

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

@ -275,6 +275,14 @@ private:
bool MaybeDispatchCompositionUpdate( bool MaybeDispatchCompositionUpdate(
const WidgetCompositionEvent* aCompositionEvent); const WidgetCompositionEvent* aCompositionEvent);
/**
* CloneAndDispatchAs() dispatches a composition event which is
* duplicateed from aCompositionEvent and set the aMessage.
*/
void CloneAndDispatchAs(
const WidgetCompositionEvent* aCompositionEvent,
uint32_t aMessage);
/** /**
* If IME has already dispatched compositionend event but it was discarded * If IME has already dispatched compositionend event but it was discarded
* by PresShell due to not safe to dispatch, this returns true. * by PresShell due to not safe to dispatch, this returns true.