NS_IMETHODIMP TextComposition::CompositionEventDispatcher::Run() { nsRefPtr<nsPresContext> presContext = mTextComposition->mPresContext; if (!presContext || !presContext->GetPresShell() || presContext->GetPresShell()->IsDestroying()) { return NS_OK; // cannot dispatch any events anymore } // The widget can be different from the widget which has dispatched // composition events because GetWidget() returns a widget which is proper // for calling NotifyIME(). However, this must no be problem since both // widget should share native IME context. Therefore, even if an event // handler uses the widget for requesting IME to commit or cancel, it works. nsCOMPtr<nsIWidget> widget(mTextComposition->GetWidget()); if (NS_WARN_IF(!widget)) { return NS_OK; // cannot dispatch any events anymore } nsEventStatus status = nsEventStatus_eIgnore; switch (mEventMessage) { case NS_COMPOSITION_START: { WidgetCompositionEvent compStart(true, NS_COMPOSITION_START, widget); WidgetQueryContentEvent selectedText(true, NS_QUERY_SELECTED_TEXT, widget); ContentEventHandler handler(presContext); handler.OnQuerySelectedText(&selectedText); NS_ASSERTION(selectedText.mSucceeded, "Failed to get selected text"); compStart.mData = selectedText.mReply.mString; compStart.mFlags.mIsSynthesizedForTests = mTextComposition->IsSynthesizedForTests(); IMEStateManager::DispatchCompositionEvent(mEventTarget, presContext, &compStart, &status, nullptr, mIsSynthesizedEvent); break; } case NS_COMPOSITION_END: case NS_COMPOSITION_CHANGE: { WidgetCompositionEvent compEvent(true, mEventMessage, widget); compEvent.mData = mData; compEvent.mFlags.mIsSynthesizedForTests = mTextComposition->IsSynthesizedForTests(); IMEStateManager::DispatchCompositionEvent(mEventTarget, presContext, &compEvent, &status, nullptr, mIsSynthesizedEvent); break; } default: MOZ_CRASH("Unsupported event"); } return NS_OK; }
NS_IMETHODIMP TextComposition::CompositionEventDispatcher::Run() { // The widget can be different from the widget which has dispatched // composition events because GetWidget() returns a widget which is proper // for calling NotifyIME(). However, this must no be problem since both // widget should share native IME context. Therefore, even if an event // handler uses the widget for requesting IME to commit or cancel, it works. nsCOMPtr<nsIWidget> widget(mTextComposition->GetWidget()); if (!mTextComposition->IsValidStateForComposition(widget)) { return NS_OK; // cannot dispatch any events anymore } RefPtr<nsPresContext> presContext = mTextComposition->mPresContext; nsEventStatus status = nsEventStatus_eIgnore; switch (mEventMessage) { case eCompositionStart: { WidgetCompositionEvent compStart(true, eCompositionStart, widget); compStart.mNativeIMEContext = mTextComposition->mNativeContext; WidgetQueryContentEvent selectedText(true, eQuerySelectedText, widget); ContentEventHandler handler(presContext); handler.OnQuerySelectedText(&selectedText); NS_ASSERTION(selectedText.mSucceeded, "Failed to get selected text"); compStart.mData = selectedText.mReply.mString; compStart.mFlags.mIsSynthesizedForTests = mTextComposition->IsSynthesizedForTests(); IMEStateManager::DispatchCompositionEvent(mEventTarget, presContext, &compStart, &status, nullptr, mIsSynthesizedEvent); break; } case eCompositionChange: case eCompositionCommitAsIs: case eCompositionCommit: { WidgetCompositionEvent compEvent(true, mEventMessage, widget); compEvent.mNativeIMEContext = mTextComposition->mNativeContext; if (mEventMessage != eCompositionCommitAsIs) { compEvent.mData = mData; } compEvent.mFlags.mIsSynthesizedForTests = mTextComposition->IsSynthesizedForTests(); IMEStateManager::DispatchCompositionEvent(mEventTarget, presContext, &compEvent, &status, nullptr, mIsSynthesizedEvent); break; } default: MOZ_CRASH("Unsupported event"); } return NS_OK; }
NS_IMETHODIMP TextComposition::CompositionEventDispatcher::Run() { if (!mPresContext->GetPresShell() || mPresContext->GetPresShell()->IsDestroying()) { return NS_OK; // cannot dispatch any events anymore } nsEventStatus status = nsEventStatus_eIgnore; switch (mEventMessage) { case NS_COMPOSITION_START: { nsCompositionEvent compStart(true, NS_COMPOSITION_START, mWidget); nsQueryContentEvent selectedText(true, NS_QUERY_SELECTED_TEXT, mWidget); nsContentEventHandler handler(mPresContext); handler.OnQuerySelectedText(&selectedText); NS_ASSERTION(selectedText.mSucceeded, "Failed to get selected text"); compStart.data = selectedText.mReply.mString; nsIMEStateManager::DispatchCompositionEvent(mEventTarget, mPresContext, &compStart, &status, nullptr); break; } case NS_COMPOSITION_UPDATE: case NS_COMPOSITION_END: { nsCompositionEvent compEvent(true, mEventMessage, mWidget); compEvent.data = mData; nsIMEStateManager::DispatchCompositionEvent(mEventTarget, mPresContext, &compEvent, &status, nullptr); break; } case NS_TEXT_TEXT: { nsTextEvent textEvent(true, NS_TEXT_TEXT, mWidget); textEvent.theText = mData; nsIMEStateManager::DispatchCompositionEvent(mEventTarget, mPresContext, &textEvent, &status, nullptr); break; } default: MOZ_NOT_REACHED("Unsupported event"); break; } return NS_OK; }