Bug 1189396 part.4 IMEContentObserver should cache the selection data at notifying IME of selection change r=smaug

This commit is contained in:
Masayuki Nakano 2015-08-22 01:43:41 +09:00
Родитель a8be9560f4
Коммит d2cd0b82ed
3 изменённых файлов: 69 добавлений и 17 удалений

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

@ -852,6 +852,35 @@ IMEContentObserver::PostSelectionChangeNotification(
mIsSelectionChangeEventPending = true;
}
bool
IMEContentObserver::UpdateSelectionCache()
{
MOZ_ASSERT(IsSafeToNotifyIME());
if (!mUpdatePreference.WantSelectionChange()) {
return false;
}
mSelectionData.Clear();
// XXX Cannot we cache some information for reducing the cost to compute
// selection offset and writing mode?
WidgetQueryContentEvent selection(true, NS_QUERY_SELECTED_TEXT, mWidget);
ContentEventHandler handler(GetPresContext());
handler.OnQuerySelectedText(&selection);
if (NS_WARN_IF(!selection.mSucceeded)) {
return false;
}
mSelectionData.mOffset = selection.mReply.mOffset;
*mSelectionData.mString = selection.mReply.mString;
mSelectionData.SetWritingMode(selection.GetWritingMode());
mSelectionData.mReversed = selection.mReply.mReversed;
mSelectionData.mCausedByComposition = false;
mSelectionData.mCausedBySelectionEvent = false;
return mSelectionData.IsValid();
}
void
IMEContentObserver::PostPositionChangeNotification()
{
@ -1060,13 +1089,7 @@ IMEContentObserver::SelectionChangeEvent::Run()
return NS_OK;
}
// XXX Cannot we cache some information for reducing the cost to compute
// selection offset and writing mode?
WidgetQueryContentEvent selection(true, NS_QUERY_SELECTED_TEXT,
mIMEContentObserver->mWidget);
ContentEventHandler handler(mIMEContentObserver->GetPresContext());
handler.OnQuerySelectedText(&selection);
if (NS_WARN_IF(!selection.mSucceeded)) {
if (NS_WARN_IF(!mIMEContentObserver->UpdateSelectionCache())) {
return NS_OK;
}
@ -1076,15 +1099,8 @@ IMEContentObserver::SelectionChangeEvent::Run()
}
IMENotification notification(NOTIFY_IME_OF_SELECTION_CHANGE);
notification.mSelectionChangeData.mOffset = selection.mReply.mOffset;
*notification.mSelectionChangeData.mString = selection.mReply.mString;
notification.mSelectionChangeData.SetWritingMode(
selection.GetWritingMode());
notification.mSelectionChangeData.mReversed = selection.mReply.mReversed;
notification.mSelectionChangeData.mCausedByComposition =
mCausedByComposition;
notification.mSelectionChangeData.mCausedBySelectionEvent =
mCausedBySelectionEvent;
notification.SetData(mIMEContentObserver->mSelectionData,
mCausedByComposition, mCausedBySelectionEvent);
IMEStateManager::NotifyIME(notification, mIMEContentObserver->mWidget);
return NS_OK;
}
@ -1106,7 +1122,7 @@ IMEContentObserver::TextChangeEvent::Run()
}
IMENotification notification(NOTIFY_IME_OF_TEXT_CHANGE);
notification.mTextChangeData = mTextChangeData;
notification.SetData(mTextChangeData);
IMEStateManager::NotifyIME(notification, mIMEContentObserver->mWidget);
return NS_OK;
}

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

@ -40,6 +40,7 @@ class IMEContentObserver final : public nsISelectionListener
, public nsIEditorObserver
{
public:
typedef widget::IMENotification::SelectionChangeData SelectionChangeData;
typedef widget::IMENotification::TextChangeData TextChangeData;
typedef widget::IMENotification::TextChangeDataBase TextChangeDataBase;
@ -167,6 +168,15 @@ private:
mTextChangeData.Clear();
}
/**
* UpdateSelectionCache() updates mSelectionData with the latest selection.
* This should be called only when IsSafeToNotifyIME() returns true.
*
* Note that this does nothing if mUpdatePreference.WantSelectionChange()
* returns false.
*/
bool UpdateSelectionCache();
nsCOMPtr<nsIWidget> mWidget;
nsCOMPtr<nsISelection> mSelection;
nsCOMPtr<nsIContent> mRootContent;
@ -230,6 +240,11 @@ private:
TextChangeData mTextChangeData;
// mSelectionData is the last selection data which was notified. This is
// modified by UpdateSelectionCache(). Note that mCausedBy* are always
// false. Do NOT refer them.
SelectionChangeData mSelectionData;
EventStateManager* mESM;
nsIMEUpdatePreference mUpdatePreference;

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

@ -757,6 +757,27 @@ struct IMENotification final
MouseButtonEventData mMouseButtonEventData;
};
void SetData(const SelectionChangeDataBase& aSelectionChangeData)
{
MOZ_RELEASE_ASSERT(mMessage == NOTIFY_IME_OF_SELECTION_CHANGE);
mSelectionChangeData.Assign(aSelectionChangeData);
}
void SetData(const SelectionChangeDataBase& aSelectionChangeData,
bool aCausedByComposition,
bool aCausedBySelectionEvent)
{
MOZ_RELEASE_ASSERT(mMessage == NOTIFY_IME_OF_SELECTION_CHANGE);
mSelectionChangeData.Assign(aSelectionChangeData);
mSelectionChangeData.mCausedByComposition = aCausedByComposition;
mSelectionChangeData.mCausedBySelectionEvent = aCausedBySelectionEvent;
}
void SetData(const TextChangeDataBase& aTextChangeData)
{
MOZ_RELEASE_ASSERT(mMessage == NOTIFY_IME_OF_TEXT_CHANGE);
mTextChangeData = aTextChangeData;
}
bool IsCausedByComposition() const
{
switch (mMessage) {