зеркало из https://github.com/mozilla/pjs.git
#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:
Родитель
6a048b1a8f
Коммит
7e501c5ca2
|
@ -1893,7 +1893,7 @@ nsEditor::QueryComposition(nsTextEventReply* aReply)
|
||||||
if (NS_SUCCEEDED(result) && caretP) {
|
if (NS_SUCCEEDED(result) && caretP) {
|
||||||
if (aReply) {
|
if (aReply) {
|
||||||
caretP->SetCaretDOMSelection(selection);
|
caretP->SetCaretDOMSelection(selection);
|
||||||
result = caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
result = caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3404,7 +3404,7 @@ nsHTMLEditor::SetCompositionString(const nsAReadableString& aCompositionString,
|
||||||
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
||||||
ps->GetCaret(getter_AddRefs(caretP));
|
ps->GetCaret(getter_AddRefs(caretP));
|
||||||
caretP->SetCaretDOMSelection(selection);
|
caretP->SetCaretDOMSelection(selection);
|
||||||
result = caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
result = caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||||
|
|
||||||
// second part of 23558 fix:
|
// second part of 23558 fix:
|
||||||
|
|
|
@ -1886,19 +1886,8 @@ nsPlaintextEditor::SetCompositionString(const nsAReadableString& aCompositionStr
|
||||||
ps->GetCaret(getter_AddRefs(caretP));
|
ps->GetCaret(getter_AddRefs(caretP));
|
||||||
caretP->SetCaretDOMSelection(selection);
|
caretP->SetCaretDOMSelection(selection);
|
||||||
|
|
||||||
// XXX: The following ifdef should really be pushed up into the
|
caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||||
// 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,
|
|
||||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||||
#else
|
|
||||||
caretP->GetCaretCoordinates(nsICaret::eRenderingViewCoordinates, selection,
|
|
||||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// second part of 23558 fix:
|
// second part of 23558 fix:
|
||||||
if (aCompositionString.IsEmpty())
|
if (aCompositionString.IsEmpty())
|
||||||
|
|
|
@ -1893,7 +1893,7 @@ nsEditor::QueryComposition(nsTextEventReply* aReply)
|
||||||
if (NS_SUCCEEDED(result) && caretP) {
|
if (NS_SUCCEEDED(result) && caretP) {
|
||||||
if (aReply) {
|
if (aReply) {
|
||||||
caretP->SetCaretDOMSelection(selection);
|
caretP->SetCaretDOMSelection(selection);
|
||||||
result = caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
result = caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3404,7 +3404,7 @@ nsHTMLEditor::SetCompositionString(const nsAReadableString& aCompositionString,
|
||||||
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
||||||
ps->GetCaret(getter_AddRefs(caretP));
|
ps->GetCaret(getter_AddRefs(caretP));
|
||||||
caretP->SetCaretDOMSelection(selection);
|
caretP->SetCaretDOMSelection(selection);
|
||||||
result = caretP->GetCaretCoordinates(nsICaret::eTopLevelWindowCoordinates, selection,
|
result = caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||||
|
|
||||||
// second part of 23558 fix:
|
// second part of 23558 fix:
|
||||||
|
|
|
@ -1886,19 +1886,8 @@ nsPlaintextEditor::SetCompositionString(const nsAReadableString& aCompositionStr
|
||||||
ps->GetCaret(getter_AddRefs(caretP));
|
ps->GetCaret(getter_AddRefs(caretP));
|
||||||
caretP->SetCaretDOMSelection(selection);
|
caretP->SetCaretDOMSelection(selection);
|
||||||
|
|
||||||
// XXX: The following ifdef should really be pushed up into the
|
caretP->GetCaretCoordinates(nsICaret::eIMECoordinates, selection,
|
||||||
// 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,
|
|
||||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
||||||
#else
|
|
||||||
caretP->GetCaretCoordinates(nsICaret::eRenderingViewCoordinates, selection,
|
|
||||||
&(aReply->mCursorPosition), &(aReply->mCursorIsCollapsed));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// second part of 23558 fix:
|
// second part of 23558 fix:
|
||||||
if (aCompositionString.IsEmpty())
|
if (aCompositionString.IsEmpty())
|
||||||
|
|
|
@ -305,6 +305,15 @@ NS_IMETHODIMP nsCaret::GetCaretCoordinates(EViewCoordinates aRelativeToType, nsI
|
||||||
nsPoint viewOffset(0, 0);
|
nsPoint viewOffset(0, 0);
|
||||||
nsRect clipRect;
|
nsRect clipRect;
|
||||||
nsIView *drawingView; // views are not refcounted
|
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);
|
GetViewForRendering(theFrame, aRelativeToType, viewOffset, clipRect, drawingView);
|
||||||
if (!drawingView)
|
if (!drawingView)
|
||||||
return NS_ERROR_UNEXPECTED;
|
return NS_ERROR_UNEXPECTED;
|
||||||
|
|
|
@ -45,7 +45,8 @@ public:
|
||||||
typedef enum EViewCoordinates {
|
typedef enum EViewCoordinates {
|
||||||
eTopLevelWindowCoordinates,
|
eTopLevelWindowCoordinates,
|
||||||
eRenderingViewCoordinates,
|
eRenderingViewCoordinates,
|
||||||
eClosestViewCoordinates
|
eClosestViewCoordinates,
|
||||||
|
eIMECoordinates
|
||||||
} EViewCoordinates;
|
} EViewCoordinates;
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresShell *inPresShell) = 0;
|
NS_IMETHOD Init(nsIPresShell *inPresShell) = 0;
|
||||||
|
|
|
@ -45,7 +45,8 @@ public:
|
||||||
typedef enum EViewCoordinates {
|
typedef enum EViewCoordinates {
|
||||||
eTopLevelWindowCoordinates,
|
eTopLevelWindowCoordinates,
|
||||||
eRenderingViewCoordinates,
|
eRenderingViewCoordinates,
|
||||||
eClosestViewCoordinates
|
eClosestViewCoordinates,
|
||||||
|
eIMECoordinates
|
||||||
} EViewCoordinates;
|
} EViewCoordinates;
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresShell *inPresShell) = 0;
|
NS_IMETHOD Init(nsIPresShell *inPresShell) = 0;
|
||||||
|
|
|
@ -305,6 +305,15 @@ NS_IMETHODIMP nsCaret::GetCaretCoordinates(EViewCoordinates aRelativeToType, nsI
|
||||||
nsPoint viewOffset(0, 0);
|
nsPoint viewOffset(0, 0);
|
||||||
nsRect clipRect;
|
nsRect clipRect;
|
||||||
nsIView *drawingView; // views are not refcounted
|
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);
|
GetViewForRendering(theFrame, aRelativeToType, viewOffset, clipRect, drawingView);
|
||||||
if (!drawingView)
|
if (!drawingView)
|
||||||
return NS_ERROR_UNEXPECTED;
|
return NS_ERROR_UNEXPECTED;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче