Bug 1166436 part.12 Log the behavior of mozilla::ContentCache r=m_kato
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
|
||||
#include "mozilla/ContentCache.h"
|
||||
#include "mozilla/IMEStateManager.h"
|
||||
#include "mozilla/Logging.h"
|
||||
#include "mozilla/TextComposition.h"
|
||||
#include "mozilla/TextEvents.h"
|
||||
#include "nsIWidget.h"
|
||||
@@ -16,10 +17,105 @@ namespace mozilla {
|
||||
|
||||
using namespace widget;
|
||||
|
||||
static const char*
|
||||
GetBoolName(bool aBool)
|
||||
{
|
||||
return aBool ? "true" : "false";
|
||||
}
|
||||
|
||||
static const char*
|
||||
GetEventMessageName(uint32_t aMessage)
|
||||
{
|
||||
switch (aMessage) {
|
||||
case NS_COMPOSITION_START:
|
||||
return "NS_COMPOSITION_START";
|
||||
case NS_COMPOSITION_END:
|
||||
return "NS_COMPOSITION_END";
|
||||
case NS_COMPOSITION_UPDATE:
|
||||
return "NS_COMPOSITION_UPDATE";
|
||||
case NS_COMPOSITION_CHANGE:
|
||||
return "NS_COMPOSITION_CHANGE";
|
||||
case NS_COMPOSITION_COMMIT_AS_IS:
|
||||
return "NS_COMPOSITION_COMMIT_AS_IS";
|
||||
case NS_COMPOSITION_COMMIT:
|
||||
return "NS_COMPOSITION_COMMIT";
|
||||
default:
|
||||
return "unacceptable event message";
|
||||
}
|
||||
}
|
||||
|
||||
static const char*
|
||||
GetNotificationName(const IMENotification* aNotification)
|
||||
{
|
||||
if (!aNotification) {
|
||||
return "Not notification";
|
||||
}
|
||||
switch (aNotification->mMessage) {
|
||||
case NOTIFY_IME_OF_FOCUS:
|
||||
return "NOTIFY_IME_OF_FOCUS";
|
||||
case NOTIFY_IME_OF_BLUR:
|
||||
return "NOTIFY_IME_OF_BLUR";
|
||||
case NOTIFY_IME_OF_SELECTION_CHANGE:
|
||||
return "NOTIFY_IME_OF_SELECTION_CHANGE";
|
||||
case NOTIFY_IME_OF_TEXT_CHANGE:
|
||||
return "NOTIFY_IME_OF_TEXT_CHANGE";
|
||||
case NOTIFY_IME_OF_COMPOSITION_UPDATE:
|
||||
return "NOTIFY_IME_OF_COMPOSITION_UPDATE";
|
||||
case NOTIFY_IME_OF_POSITION_CHANGE:
|
||||
return "NOTIFY_IME_OF_POSITION_CHANGE";
|
||||
case NOTIFY_IME_OF_MOUSE_BUTTON_EVENT:
|
||||
return "NOTIFY_IME_OF_MOUSE_BUTTON_EVENT";
|
||||
case REQUEST_TO_COMMIT_COMPOSITION:
|
||||
return "REQUEST_TO_COMMIT_COMPOSITION";
|
||||
case REQUEST_TO_CANCEL_COMPOSITION:
|
||||
return "REQUEST_TO_CANCEL_COMPOSITION";
|
||||
default:
|
||||
return "Unsupported notification";
|
||||
}
|
||||
}
|
||||
|
||||
class GetRectText : public nsAutoCString
|
||||
{
|
||||
public:
|
||||
explicit GetRectText(const LayoutDeviceIntRect& aRect)
|
||||
{
|
||||
Assign("{ x=");
|
||||
AppendInt(aRect.x);
|
||||
Append(", y=");
|
||||
AppendInt(aRect.y);
|
||||
Append(", width=");
|
||||
AppendInt(aRect.width);
|
||||
Append(", height=");
|
||||
AppendInt(aRect.height);
|
||||
Append(" }");
|
||||
}
|
||||
virtual ~GetRectText() {}
|
||||
};
|
||||
|
||||
class GetWritingModeName : public nsAutoCString
|
||||
{
|
||||
public:
|
||||
explicit GetWritingModeName(const WritingMode& aWritingMode)
|
||||
{
|
||||
if (!aWritingMode.IsVertical()) {
|
||||
Assign("Horizontal");
|
||||
return;
|
||||
}
|
||||
if (aWritingMode.IsVerticalLR()) {
|
||||
Assign("Vertical (LTR)");
|
||||
return;
|
||||
}
|
||||
Assign("Vertical (RTL)");
|
||||
}
|
||||
virtual ~GetWritingModeName() {}
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* mozilla::ContentCache
|
||||
*****************************************************************************/
|
||||
|
||||
PRLogModuleInfo* sContentCacheLog = nullptr;
|
||||
|
||||
ContentCache::ContentCache()
|
||||
: mCompositionStart(UINT32_MAX)
|
||||
, mCompositionEventsDuringRequest(0)
|
||||
@@ -27,11 +123,40 @@ ContentCache::ContentCache()
|
||||
, mRequestedToCommitOrCancelComposition(false)
|
||||
, mIsChrome(XRE_GetProcessType() == GeckoProcessType_Default)
|
||||
{
|
||||
if (!sContentCacheLog) {
|
||||
sContentCacheLog = PR_NewLogModule("ContentCacheWidgets");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ContentCache::AssignContent(const ContentCache& aOther,
|
||||
const IMENotification* aNotification)
|
||||
{
|
||||
mText = aOther.mText;
|
||||
mSelection = aOther.mSelection;
|
||||
mCaret = aOther.mCaret;
|
||||
mTextRectArray = aOther.mTextRectArray;
|
||||
mEditorRect = aOther.mEditorRect;
|
||||
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) AssignContent(aNotification=%s), "
|
||||
"Succeeded, mText.Length()=%u, mSelection={ mAnchor=%u, mFocus=%u, "
|
||||
" mWritingMode=%s }, mCaret={ mOffset=%u, mRect=%s }, "
|
||||
"mTextRectArray={ mStart=%u, mRects.Length()=%u }, mEditorRect=%s",
|
||||
this, GetBoolName(mIsChrome), GetNotificationName(aNotification),
|
||||
mText.Length(), mSelection.mAnchor, mSelection.mFocus,
|
||||
GetWritingModeName(mSelection.mWritingMode).get(), mCaret.mOffset,
|
||||
GetRectText(mCaret.mRect).get(), mTextRectArray.mStart,
|
||||
mTextRectArray.mRects.Length(), GetRectText(mEditorRect).get()));
|
||||
}
|
||||
|
||||
void
|
||||
ContentCache::Clear()
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) Clear()",
|
||||
this, GetBoolName(mIsChrome)));
|
||||
|
||||
mText.Truncate();
|
||||
mSelection.Clear();
|
||||
mCaret.Clear();
|
||||
@@ -51,11 +176,21 @@ ContentCache::HandleQueryContentEvent(WidgetQueryContentEvent& aEvent,
|
||||
|
||||
switch (aEvent.message) {
|
||||
case NS_QUERY_SELECTED_TEXT:
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent("
|
||||
"aEvent={ message=NS_QUERY_SELECTED_TEXT }, aWidget=0x%p)",
|
||||
this, GetBoolName(mIsChrome), aWidget));
|
||||
aEvent.mReply.mOffset = mSelection.StartOffset();
|
||||
if (mSelection.Collapsed()) {
|
||||
aEvent.mReply.mString.Truncate(0);
|
||||
} else {
|
||||
if (NS_WARN_IF(mSelection.EndOffset() > mText.Length())) {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"FAILED because mSelection.EndOffset()=%u is larger than "
|
||||
"mText.Length()=%u",
|
||||
this, GetBoolName(mIsChrome), mSelection.EndOffset(),
|
||||
mText.Length()));
|
||||
return false;
|
||||
}
|
||||
aEvent.mReply.mString =
|
||||
@@ -64,24 +199,58 @@ ContentCache::HandleQueryContentEvent(WidgetQueryContentEvent& aEvent,
|
||||
aEvent.mReply.mReversed = mSelection.Reversed();
|
||||
aEvent.mReply.mHasSelection = true;
|
||||
aEvent.mReply.mWritingMode = mSelection.mWritingMode;
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"Succeeded, aEvent={ mReply={ mOffset=%u, mString=\"%s\", "
|
||||
"mReversed=%s, mHasSelection=%s, mWritingMode=%s } }",
|
||||
this, GetBoolName(mIsChrome), aEvent.mReply.mOffset,
|
||||
NS_ConvertUTF16toUTF8(aEvent.mReply.mString).get(),
|
||||
GetBoolName(aEvent.mReply.mReversed),
|
||||
GetBoolName(aEvent.mReply.mHasSelection),
|
||||
GetWritingModeName(aEvent.mReply.mWritingMode).get()));
|
||||
break;
|
||||
case NS_QUERY_TEXT_CONTENT: {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent("
|
||||
"aEvent={ message=NS_QUERY_TEXT_CONTENT, mInput={ mOffset=%u, "
|
||||
"mLength=%u } }, aWidget=0x%p), mText.Length()=%u",
|
||||
this, GetBoolName(mIsChrome), aEvent.mInput.mOffset,
|
||||
aEvent.mInput.mLength, aWidget, mText.Length()));
|
||||
uint32_t inputOffset = aEvent.mInput.mOffset;
|
||||
uint32_t inputEndOffset =
|
||||
std::min(aEvent.mInput.EndOffset(), mText.Length());
|
||||
if (NS_WARN_IF(inputEndOffset < inputOffset)) {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"FAILED because inputOffset=%u is larger than inputEndOffset=%u",
|
||||
this, GetBoolName(mIsChrome), inputOffset, inputEndOffset));
|
||||
return false;
|
||||
}
|
||||
aEvent.mReply.mOffset = inputOffset;
|
||||
aEvent.mReply.mString =
|
||||
Substring(mText, inputOffset, inputEndOffset - inputOffset);
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"Succeeded, aEvent={ mReply={ mOffset=%u, mString.Length()=%u } }",
|
||||
this, GetBoolName(mIsChrome), aEvent.mReply.mOffset,
|
||||
aEvent.mReply.mString.Length()));
|
||||
break;
|
||||
}
|
||||
case NS_QUERY_TEXT_RECT:
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent("
|
||||
"aEvent={ message=NS_QUERY_TEXT_RECT, mInput={ mOffset=%u, "
|
||||
"mLength=%u } }, aWidget=0x%p), mText.Length()=%u",
|
||||
this, GetBoolName(mIsChrome), aEvent.mInput.mOffset,
|
||||
aEvent.mInput.mLength, aWidget, mText.Length()));
|
||||
if (NS_WARN_IF(!GetUnionTextRects(aEvent.mInput.mOffset,
|
||||
aEvent.mInput.mLength,
|
||||
aEvent.mReply.mRect))) {
|
||||
// XXX We don't have cache for this request.
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"FAILED to get union rect",
|
||||
this, GetBoolName(mIsChrome)));
|
||||
return false;
|
||||
}
|
||||
if (aEvent.mInput.mOffset < mText.Length()) {
|
||||
@@ -95,18 +264,49 @@ ContentCache::HandleQueryContentEvent(WidgetQueryContentEvent& aEvent,
|
||||
aEvent.mReply.mOffset = aEvent.mInput.mOffset;
|
||||
// XXX This may be wrong if storing range isn't in the selection range.
|
||||
aEvent.mReply.mWritingMode = mSelection.mWritingMode;
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"Succeeded, aEvent={ mReply={ mOffset=%u, mString=\"%s\", "
|
||||
"mWritingMode=%s, mRect=%s } }",
|
||||
this, GetBoolName(mIsChrome), aEvent.mReply.mOffset,
|
||||
NS_ConvertUTF16toUTF8(aEvent.mReply.mString).get(),
|
||||
GetWritingModeName(aEvent.mReply.mWritingMode).get(),
|
||||
GetRectText(aEvent.mReply.mRect).get()));
|
||||
break;
|
||||
case NS_QUERY_CARET_RECT:
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent("
|
||||
"aEvent={ message=NS_QUERY_CARET_RECT, mInput={ mOffset=%u } }, "
|
||||
"aWidget=0x%p), mText.Length()=%u",
|
||||
this, GetBoolName(mIsChrome), aEvent.mInput.mOffset, aWidget,
|
||||
mText.Length()));
|
||||
if (NS_WARN_IF(!GetCaretRect(aEvent.mInput.mOffset,
|
||||
aEvent.mReply.mRect))) {
|
||||
// XXX If the input offset is in the range of cached text rects,
|
||||
// we can guess the caret rect.
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"FAILED to get caret rect",
|
||||
this, GetBoolName(mIsChrome)));
|
||||
return false;
|
||||
}
|
||||
aEvent.mReply.mOffset = aEvent.mInput.mOffset;
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"Succeeded, aEvent={ mReply={ mOffset=%u, mRect=%s } }",
|
||||
this, GetBoolName(mIsChrome), aEvent.mReply.mOffset,
|
||||
GetRectText(aEvent.mReply.mRect).get()));
|
||||
break;
|
||||
case NS_QUERY_EDITOR_RECT:
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent("
|
||||
"aEvent={ message=NS_QUERY_EDITOR_RECT }, aWidget=0x%p)",
|
||||
this, GetBoolName(mIsChrome), aWidget));
|
||||
aEvent.mReply.mRect = mEditorRect;
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) HandleQueryContentEvent(), "
|
||||
"Succeeded, aEvent={ mReply={ mRect=%s } }",
|
||||
this, GetBoolName(mIsChrome), GetRectText(aEvent.mReply.mRect).get()));
|
||||
break;
|
||||
}
|
||||
aEvent.mSucceeded = true;
|
||||
@@ -114,25 +314,39 @@ ContentCache::HandleQueryContentEvent(WidgetQueryContentEvent& aEvent,
|
||||
}
|
||||
|
||||
bool
|
||||
ContentCache::CacheAll(nsIWidget* aWidget)
|
||||
ContentCache::CacheAll(nsIWidget* aWidget,
|
||||
const IMENotification* aNotification)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheAll(aWidget=0x%p, "
|
||||
"aNotification=%s)",
|
||||
this, GetBoolName(mIsChrome), aWidget,
|
||||
GetNotificationName(aNotification)));
|
||||
|
||||
// CacheAll() must be called in content process.
|
||||
if (NS_WARN_IF(mIsChrome)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (NS_WARN_IF(!CacheText(aWidget)) ||
|
||||
NS_WARN_IF(!CacheSelection(aWidget)) ||
|
||||
NS_WARN_IF(!CacheTextRects(aWidget)) ||
|
||||
NS_WARN_IF(!CacheEditorRect(aWidget))) {
|
||||
if (NS_WARN_IF(!CacheText(aWidget, aNotification)) ||
|
||||
NS_WARN_IF(!CacheSelection(aWidget, aNotification)) ||
|
||||
NS_WARN_IF(!CacheTextRects(aWidget, aNotification)) ||
|
||||
NS_WARN_IF(!CacheEditorRect(aWidget, aNotification))) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ContentCache::CacheSelection(nsIWidget* aWidget)
|
||||
ContentCache::CacheSelection(nsIWidget* aWidget,
|
||||
const IMENotification* aNotification)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheSelection(aWidget=0x%p, "
|
||||
"aNotification=%s)",
|
||||
this, GetBoolName(mIsChrome), aWidget,
|
||||
GetNotificationName(aNotification)));
|
||||
|
||||
// CacheSelection() must be called in content process.
|
||||
if (NS_WARN_IF(mIsChrome)) {
|
||||
return false;
|
||||
@@ -145,6 +359,10 @@ ContentCache::CacheSelection(nsIWidget* aWidget)
|
||||
WidgetQueryContentEvent selection(true, NS_QUERY_SELECTED_TEXT, aWidget);
|
||||
aWidget->DispatchEvent(&selection, status);
|
||||
if (NS_WARN_IF(!selection.mSucceeded)) {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheSelection(), FAILED, "
|
||||
"couldn't retrieve the selected text",
|
||||
this, GetBoolName(mIsChrome)));
|
||||
return false;
|
||||
}
|
||||
if (selection.mReply.mReversed) {
|
||||
@@ -171,16 +389,34 @@ ContentCache::CacheSelection(nsIWidget* aWidget)
|
||||
caretRect.InitForQueryCaretRect(mCaret.mOffset);
|
||||
aWidget->DispatchEvent(&caretRect, status);
|
||||
if (NS_WARN_IF(!caretRect.mSucceeded)) {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheSelection(), FAILED, "
|
||||
"couldn't retrieve the caret rect at offset=%u",
|
||||
this, GetBoolName(mIsChrome), mCaret.mOffset));
|
||||
mCaret.Clear();
|
||||
return false;
|
||||
}
|
||||
mCaret.mRect = caretRect.mReply.mRect;
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheSelection(), Succeeded, "
|
||||
"mSelection={ mAnchor=%u, mFocus=%u, mWritingMode=%s }, "
|
||||
"mCaret={ mOffset=%u, mRect=%s }",
|
||||
this, GetBoolName(mIsChrome), mSelection.mAnchor, mSelection.mFocus,
|
||||
GetWritingModeName(mSelection.mWritingMode).get(), mCaret.mOffset,
|
||||
GetRectText(mCaret.mRect).get()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ContentCache::CacheEditorRect(nsIWidget* aWidget)
|
||||
ContentCache::CacheEditorRect(nsIWidget* aWidget,
|
||||
const IMENotification* aNotification)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheEditorRect(aWidget=0x%p, "
|
||||
"aNotification=%s)",
|
||||
this, GetBoolName(mIsChrome), aWidget,
|
||||
GetNotificationName(aNotification)));
|
||||
|
||||
// CacheEditorRect() must be called in content process.
|
||||
if (NS_WARN_IF(mIsChrome)) {
|
||||
return false;
|
||||
@@ -190,15 +426,30 @@ ContentCache::CacheEditorRect(nsIWidget* aWidget)
|
||||
WidgetQueryContentEvent editorRectEvent(true, NS_QUERY_EDITOR_RECT, aWidget);
|
||||
aWidget->DispatchEvent(&editorRectEvent, status);
|
||||
if (NS_WARN_IF(!editorRectEvent.mSucceeded)) {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheEditorRect(), FAILED, "
|
||||
"couldn't retrieve the editor rect",
|
||||
this, GetBoolName(mIsChrome)));
|
||||
return false;
|
||||
}
|
||||
mEditorRect = editorRectEvent.mReply.mRect;
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheEditorRect(), Succeeded, "
|
||||
"mEditorRect=%s",
|
||||
this, GetBoolName(mIsChrome), GetRectText(mEditorRect).get()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ContentCache::CacheText(nsIWidget* aWidget)
|
||||
ContentCache::CacheText(nsIWidget* aWidget,
|
||||
const IMENotification* aNotification)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheText(aWidget=0x%p, "
|
||||
"aNotification=%s)",
|
||||
this, GetBoolName(mIsChrome), aWidget,
|
||||
GetNotificationName(aNotification)));
|
||||
|
||||
// CacheText() must be called in content process.
|
||||
if (NS_WARN_IF(mIsChrome)) {
|
||||
return false;
|
||||
@@ -209,16 +460,31 @@ ContentCache::CacheText(nsIWidget* aWidget)
|
||||
queryText.InitForQueryTextContent(0, UINT32_MAX);
|
||||
aWidget->DispatchEvent(&queryText, status);
|
||||
if (NS_WARN_IF(!queryText.mSucceeded)) {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheText(), FAILED, "
|
||||
"couldn't retrieve whole text",
|
||||
this, GetBoolName(mIsChrome)));
|
||||
mText.Truncate();
|
||||
return false;
|
||||
}
|
||||
mText = queryText.mReply.mString;
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheText(), Succeeded, "
|
||||
"mText.Length()=%u",
|
||||
this, GetBoolName(mIsChrome), mText.Length()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ContentCache::CacheTextRects(nsIWidget* aWidget)
|
||||
ContentCache::CacheTextRects(nsIWidget* aWidget,
|
||||
const IMENotification* aNotification)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheTextRects(aWidget=0x%p, "
|
||||
"aNotification=%s)",
|
||||
this, GetBoolName(mIsChrome), aWidget,
|
||||
GetNotificationName(aNotification)));
|
||||
|
||||
// CacheTextRects() must be called in content process.
|
||||
if (NS_WARN_IF(mIsChrome)) {
|
||||
return false;
|
||||
@@ -229,6 +495,10 @@ ContentCache::CacheTextRects(nsIWidget* aWidget)
|
||||
nsRefPtr<TextComposition> textComposition =
|
||||
IMEStateManager::GetTextCompositionFor(aWidget);
|
||||
if (NS_WARN_IF(!textComposition)) {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheTextRects(), not caching "
|
||||
"text rects because there is no composition string",
|
||||
this, GetBoolName(mIsChrome), aWidget));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -242,11 +512,20 @@ ContentCache::CacheTextRects(nsIWidget* aWidget)
|
||||
textRect.InitForQueryTextRect(i, 1);
|
||||
aWidget->DispatchEvent(&textRect, status);
|
||||
if (NS_WARN_IF(!textRect.mSucceeded)) {
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Error,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheTextRects(), FAILED, "
|
||||
"couldn't retrieve text rect at offset=%u",
|
||||
this, GetBoolName(mIsChrome), i));
|
||||
mTextRectArray.Clear();
|
||||
return false;
|
||||
}
|
||||
mTextRectArray.mRects.AppendElement(textRect.mReply.mRect);
|
||||
}
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) CacheTextRects(), Succeeded, "
|
||||
"mTextRectArray={ mStart=%u, mRects.Length()=%u }, mText.Length()=%u",
|
||||
this, GetBoolName(mIsChrome), mTextRectArray.mStart,
|
||||
mTextRectArray.mRects.Length(), mText.Length()));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -256,6 +535,13 @@ ContentCache::SetSelection(uint32_t aStartOffset,
|
||||
bool aReversed,
|
||||
const WritingMode& aWritingMode)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) SetSelection(aStartOffset=%u, "
|
||||
"aLength=%u, aReversed=%s, aWritingMode=%s), mText.Length()=%u",
|
||||
this, GetBoolName(mIsChrome), aStartOffset, aLength,
|
||||
GetBoolName(aReversed), GetWritingModeName(aWritingMode).get(),
|
||||
mText.Length()));
|
||||
|
||||
if (!aReversed) {
|
||||
mSelection.mAnchor = aStartOffset;
|
||||
mSelection.mFocus = aStartOffset + aLength;
|
||||
@@ -271,6 +557,12 @@ ContentCache::SetSelection(uint32_t aAnchorOffset,
|
||||
uint32_t aFocusOffset,
|
||||
const WritingMode& aWritingMode)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) SetSelection(aAnchorOffset=%u, "
|
||||
"aFocusOffset=%u, aWritingMode=%s), mText.Length()=%u",
|
||||
this, GetBoolName(mIsChrome), aAnchorOffset, aFocusOffset,
|
||||
GetWritingModeName(aWritingMode).get(), mText.Length()));
|
||||
|
||||
mSelection.mAnchor = aAnchorOffset;
|
||||
mSelection.mFocus = aFocusOffset;
|
||||
mSelection.mWritingMode = aWritingMode;
|
||||
@@ -280,6 +572,12 @@ bool
|
||||
ContentCache::GetTextRect(uint32_t aOffset,
|
||||
LayoutDeviceIntRect& aTextRect) const
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) GetTextRect(aOffset=%u), "
|
||||
"mTextRectArray={ mStart=%u, mRects.Length()=%u }",
|
||||
this, GetBoolName(mIsChrome), aOffset, mTextRectArray.mStart,
|
||||
mTextRectArray.mRects.Length()));
|
||||
|
||||
if (NS_WARN_IF(!mTextRectArray.InRange(aOffset))) {
|
||||
aTextRect.SetEmpty();
|
||||
return false;
|
||||
@@ -293,6 +591,12 @@ ContentCache::GetUnionTextRects(uint32_t aOffset,
|
||||
uint32_t aLength,
|
||||
LayoutDeviceIntRect& aUnionTextRect) const
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) GetUnionTextRects(aOffset=%u, "
|
||||
"aLength=%u), mTextRectArray={ mStart=%u, mRects.Length()=%u }",
|
||||
this, GetBoolName(mIsChrome), aOffset, aLength,
|
||||
mTextRectArray.mStart, mTextRectArray.mRects.Length()));
|
||||
|
||||
if (NS_WARN_IF(!mTextRectArray.InRange(aOffset, aLength))) {
|
||||
aUnionTextRect.SetEmpty();
|
||||
return false;
|
||||
@@ -305,6 +609,12 @@ bool
|
||||
ContentCache::GetCaretRect(uint32_t aOffset,
|
||||
LayoutDeviceIntRect& aCaretRect) const
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) GetCaretRect(aOffset=%u), "
|
||||
"mCaret={ mOffset=%u, mRect=%s }",
|
||||
this, GetBoolName(mIsChrome), aOffset, mCaret.mOffset,
|
||||
GetRectText(mCaret.mRect).get()));
|
||||
|
||||
if (mCaret.mOffset != aOffset) {
|
||||
aCaretRect.SetEmpty();
|
||||
return false;
|
||||
@@ -316,6 +626,15 @@ ContentCache::GetCaretRect(uint32_t aOffset,
|
||||
bool
|
||||
ContentCache::OnCompositionEvent(const WidgetCompositionEvent& aEvent)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) OnCompositionEvent(aEvent={ "
|
||||
"message=%s, mData=\"%s\" (Length()=%u), mRanges->Length()=%u }), "
|
||||
"mIsComposing=%s, mRequestedToCommitOrCancelComposition=%s",
|
||||
this, GetBoolName(mIsChrome), GetEventMessageName(aEvent.message),
|
||||
NS_ConvertUTF16toUTF8(aEvent.mData).get(), aEvent.mData.Length(),
|
||||
aEvent.mRanges ? aEvent.mRanges->Length() : 0, GetBoolName(mIsComposing),
|
||||
GetBoolName(mRequestedToCommitOrCancelComposition)));
|
||||
|
||||
if (!aEvent.CausesDOMTextEvent()) {
|
||||
MOZ_ASSERT(aEvent.message == NS_COMPOSITION_START);
|
||||
mIsComposing = !aEvent.CausesDOMCompositionEndEvent();
|
||||
@@ -363,6 +682,15 @@ ContentCache::RequestToCommitComposition(nsIWidget* aWidget,
|
||||
bool aCancel,
|
||||
nsAString& aLastString)
|
||||
{
|
||||
MOZ_LOG(sContentCacheLog, LogLevel::Info,
|
||||
("ContentCache: 0x%p (mIsChrome=%s) RequestToCommitComposition(aWidget=%p, "
|
||||
"aCancel=%s), mIsComposing=%s, mRequestedToCommitOrCancelComposition=%s, "
|
||||
"mCompositionEventsDuringRequest=%u",
|
||||
this, GetBoolName(mIsChrome), aWidget, GetBoolName(aCancel),
|
||||
GetBoolName(mIsComposing),
|
||||
GetBoolName(mRequestedToCommitOrCancelComposition),
|
||||
mCompositionEventsDuringRequest));
|
||||
|
||||
mRequestedToCommitOrCancelComposition = true;
|
||||
mCompositionEventsDuringRequest = 0;
|
||||
|
||||
@@ -376,17 +704,15 @@ ContentCache::RequestToCommitComposition(nsIWidget* aWidget,
|
||||
}
|
||||
|
||||
void
|
||||
ContentCache::NotifyIMEOfSelectionChange(nsIWidget* aWidget,
|
||||
bool aCausedByComposition) const
|
||||
ContentCache::InitNotification(IMENotification& aNotification) const
|
||||
{
|
||||
IMENotification notification(NOTIFY_IME_OF_SELECTION_CHANGE);
|
||||
notification.mSelectionChangeData.mOffset = mSelection.StartOffset();
|
||||
notification.mSelectionChangeData.mLength = mSelection.Length();
|
||||
notification.mSelectionChangeData.mReversed = mSelection.Reversed();
|
||||
notification.mSelectionChangeData.SetWritingMode(mSelection.mWritingMode);
|
||||
notification.mSelectionChangeData.mCausedByComposition =
|
||||
aCausedByComposition;
|
||||
aWidget->NotifyIME(notification);
|
||||
if (NS_WARN_IF(aNotification.mMessage != NOTIFY_IME_OF_SELECTION_CHANGE)) {
|
||||
return;
|
||||
}
|
||||
aNotification.mSelectionChangeData.mOffset = mSelection.StartOffset();
|
||||
aNotification.mSelectionChangeData.mLength = mSelection.Length();
|
||||
aNotification.mSelectionChangeData.mReversed = mSelection.Reversed();
|
||||
aNotification.mSelectionChangeData.SetWritingMode(mSelection.mWritingMode);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
||||
Reference in New Issue
Block a user