Bug 1275914 part.8 TextComposition should always update its composition start offset during composing r?smaug
TextComposition should update its composition start offset after every DOM event dispatch with first clause's selection type if there is composition string.
MozReview-Commit-ID: HFkePci1PhU
--- a/dom/events/TextComposition.cpp
+++ b/dom/events/TextComposition.cpp
@@ -434,16 +434,22 @@ TextComposition::HandleSelectionEvent(ns
handler.OnSelectionEvent(aSelectionEvent);
}
uint32_t
TextComposition::GetSelectionStartOffset()
{
nsCOMPtr<nsIWidget> widget = mPresContext->GetRootWidget();
WidgetQueryContentEvent selectedTextEvent(true, eQuerySelectedText, widget);
+ if (mRanges && mRanges->HasClauses()) {
+ selectedTextEvent.InitForQuerySelectedText(
+ ToSelectionType(mRanges->GetFirstClause()->mRangeType));
+ } else {
+ selectedTextEvent.InitForQuerySelectedText(SelectionType::eNormal);
+ }
// The editor which has this composition is observed by active
// IMEContentObserver, we can use the cache of it.
RefPtr<IMEContentObserver> contentObserver =
IMEStateManager::GetActiveContentObserver();
bool doQuerySelection = true;
if (contentObserver) {
if (contentObserver->IsManaging(this)) {
--- a/widget/TextRange.h
+++ b/widget/TextRange.h
@@ -270,22 +270,45 @@ public:
for (const TextRange& range : *this) {
if (range.mRangeType == TextRangeType::eCaret) {
return true;
}
}
return false;
}
+ bool HasClauses() const
+ {
+ for (const TextRange& range : *this) {
+ if (range.IsClause()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
uint32_t GetCaretPosition() const
{
for (const TextRange& range : *this) {
if (range.mRangeType == TextRangeType::eCaret) {
return range.mStartOffset;
}
}
return UINT32_MAX;
}
+
+ const TextRange* GetFirstClause() const
+ {
+ for (const TextRange& range : *this) {
+ // Look for the range of a clause whose start offset is 0 because the
+ // first clause's start offset is always 0.
+ if (range.IsClause() && !range.mStartOffset) {
+ return ⦥
+ }
+ }
+ MOZ_ASSERT(!HasClauses());
+ return nullptr;
+ }
};
} // namespace mozilla
#endif // mozilla_TextRage_h_