mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-30 00:01:50 +00:00
#59405 IME candidate window position is not correct in text field on New card and To field
r = sfraser sr=kin a=blizzard Handle the difference of cursor coordinate required by different platform. nsICaret.h nsCaret.cpp nsEditor.cpp nsPlaintextEditor.cpp nsHTMLEditor.cpp
This commit is contained in:
parent
b0baaeabc3
commit
819a855d2b
@ -1893,7 +1893,7 @@ nsEditor::QueryComposition(nsTextEventReply* aReply)
|
||||
if (NS_SUCCEEDED(result) && caretP) {
|
||||
if (aReply) {
|
||||
caretP->SetCaretDOMSelection(selection);
|
||||
result = caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
||||
result = caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||
}
|
||||
}
|
||||
|
@ -3404,7 +3404,7 @@ nsHTMLEditor::SetCompositionString(const nsAReadableString& aCompositionString,
|
||||
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
||||
ps->GetCaret(getter_AddRefs(caretP));
|
||||
caretP->SetCaretDOMSelection(selection);
|
||||
result = caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
||||
result = caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||
|
||||
// second part of 23558 fix:
|
||||
|
@ -1886,19 +1886,8 @@ nsPlaintextEditor::SetCompositionString(const nsAReadableString& aCompositionStr
|
||||
ps->GetCaret(getter_AddRefs(caretP));
|
||||
caretP->SetCaretDOMSelection(selection);
|
||||
|
||||
// XXX: The following ifdef should really be pushed up into the
|
||||
// IME front-end code, or down into the caret code. There was a
|
||||
// suggestion that perhaps nsCaret::GetCaretCoordinates() should
|
||||
// be modified so that we can pass in something like eIMECoordinates
|
||||
// and let it decide what to return based on the platform we are
|
||||
// running on.
|
||||
#ifdef XP_MAC
|
||||
caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
||||
caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||
#else
|
||||
caretP->GetCaretCoordinates(nsICaret::eRenderingViewCoordinates, selection,
|
||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||
#endif
|
||||
|
||||
// second part of 23558 fix:
|
||||
if (aCompositionString.IsEmpty())
|
||||
|
@ -1893,7 +1893,7 @@ nsEditor::QueryComposition(nsTextEventReply* aReply)
|
||||
if (NS_SUCCEEDED(result) && caretP) {
|
||||
if (aReply) {
|
||||
caretP->SetCaretDOMSelection(selection);
|
||||
result = caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
||||
result = caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||
}
|
||||
}
|
||||
|
@ -3404,7 +3404,7 @@ nsHTMLEditor::SetCompositionString(const nsAReadableString& aCompositionString,
|
||||
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
||||
ps->GetCaret(getter_AddRefs(caretP));
|
||||
caretP->SetCaretDOMSelection(selection);
|
||||
result = caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
||||
result = caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||
|
||||
// second part of 23558 fix:
|
||||
|
@ -1886,19 +1886,8 @@ nsPlaintextEditor::SetCompositionString(const nsAReadableString& aCompositionStr
|
||||
ps->GetCaret(getter_AddRefs(caretP));
|
||||
caretP->SetCaretDOMSelection(selection);
|
||||
|
||||
// XXX: The following ifdef should really be pushed up into the
|
||||
// IME front-end code, or down into the caret code. There was a
|
||||
// suggestion that perhaps nsCaret::GetCaretCoordinates() should
|
||||
// be modified so that we can pass in something like eIMECoordinates
|
||||
// and let it decide what to return based on the platform we are
|
||||
// running on.
|
||||
#ifdef XP_MAC
|
||||
caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
||||
caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||
#else
|
||||
caretP->GetCaretCoordinates(nsICaret::eRenderingViewCoordinates, selection,
|
||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||
#endif
|
||||
|
||||
// second part of 23558 fix:
|
||||
if (aCompositionString.IsEmpty())
|
||||
|
@ -305,6 +305,15 @@ NS_IMETHODIMP nsCaret::GetCaretCoordinates(EViewCoordinates aRelativeToType, nsI
|
||||
nsPoint viewOffset(0, 0);
|
||||
nsRect clipRect;
|
||||
nsIView *drawingView; // views are not refcounted
|
||||
|
||||
//#59405, on windows and unix, the coordinate for IME need to be view (nearest native window) related.
|
||||
if (aRelativeToType == eIMECoordinates)
|
||||
#ifdef XP_MAC
|
||||
aRelativeToType = eTopLevelWindowCoordinates;
|
||||
#else
|
||||
aRelativeToType = eRenderingViewCoordinates;
|
||||
#endif
|
||||
|
||||
GetViewForRendering(theFrame, aRelativeToType, viewOffset, clipRect, drawingView);
|
||||
if (!drawingView)
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
@ -45,7 +45,8 @@ public:
|
||||
typedef enum EViewCoordinates {
|
||||
eTopLevelWindowCoordinates,
|
||||
eRenderingViewCoordinates,
|
||||
eClosestViewCoordinates
|
||||
eClosestViewCoordinates,
|
||||
eIMECoordinates
|
||||
} EViewCoordinates;
|
||||
|
||||
NS_IMETHOD Init(nsIPresShell *inPresShell) = 0;
|
||||
|
@ -45,7 +45,8 @@ public:
|
||||
typedef enum EViewCoordinates {
|
||||
eTopLevelWindowCoordinates,
|
||||
eRenderingViewCoordinates,
|
||||
eClosestViewCoordinates
|
||||
eClosestViewCoordinates,
|
||||
eIMECoordinates
|
||||
} EViewCoordinates;
|
||||
|
||||
NS_IMETHOD Init(nsIPresShell *inPresShell) = 0;
|
||||
|
@ -305,6 +305,15 @@ NS_IMETHODIMP nsCaret::GetCaretCoordinates(EViewCoordinates aRelativeToType, nsI
|
||||
nsPoint viewOffset(0, 0);
|
||||
nsRect clipRect;
|
||||
nsIView *drawingView; // views are not refcounted
|
||||
|
||||
//#59405, on windows and unix, the coordinate for IME need to be view (nearest native window) related.
|
||||
if (aRelativeToType == eIMECoordinates)
|
||||
#ifdef XP_MAC
|
||||
aRelativeToType = eTopLevelWindowCoordinates;
|
||||
#else
|
||||
aRelativeToType = eRenderingViewCoordinates;
|
||||
#endif
|
||||
|
||||
GetViewForRendering(theFrame, aRelativeToType, viewOffset, clipRect, drawingView);
|
||||
if (!drawingView)
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
Loading…
Reference in New Issue
Block a user