Bug 1275914 part.8 TextComposition should always update its composition start offset during composing r?smaug draft
authorMasayuki Nakano <masayuki@d-toybox.com>
Mon, 20 Jun 2016 16:34:40 +0900
changeset 380221 89b9650ddd2f0aaa5853ec33e324c7a589c5e345
parent 380220 ffb04ea86fa925b12c7f89b8fb26bbc50dfbe1b7
child 523674 347f513a604ff9c67fe66da0292cbcdfb9d7f8f1
push id21167
push usermasayuki@d-toybox.com
push dateTue, 21 Jun 2016 06:55:55 +0000
reviewerssmaug
bugs1275914
milestone50.0a1
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
dom/events/TextComposition.cpp
widget/TextRange.h
--- 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 &range;
+      }
+    }
+    MOZ_ASSERT(!HasClauses());
+    return nullptr;
+  }
 };
 
 } // namespace mozilla
 
 #endif // mozilla_TextRage_h_