From 7ae38c7612fef83d6969dc7aed88fc9b5c82af90 Mon Sep 17 00:00:00 2001 From: "yokoyama%netscape.com" Date: Wed, 6 Jun 2001 01:21:05 +0000 Subject: [PATCH] Bug 63029: Japanese input in text area in forms confuses subsequent input The fix is to - maintain the index of PasswordBuf at the start of IME - maintain the old IME text - remove the old IME text from PasswordBuf /r=jfrancis, /sr=kin, /a=blizzard git-svn-id: svn://10.0.0.236/trunk@96481 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/editor/base/nsPlaintextEditor.cpp | 16 +++++++++ mozilla/editor/base/nsPlaintextEditor.h | 1 + mozilla/editor/base/nsTextEditRules.cpp | 35 +++++++++++++++++++ mozilla/editor/base/nsTextEditRules.h | 8 +++++ .../libeditor/text/nsPlaintextEditor.cpp | 16 +++++++++ .../editor/libeditor/text/nsPlaintextEditor.h | 1 + .../editor/libeditor/text/nsTextEditRules.cpp | 35 +++++++++++++++++++ .../editor/libeditor/text/nsTextEditRules.h | 8 +++++ 8 files changed, 120 insertions(+) diff --git a/mozilla/editor/base/nsPlaintextEditor.cpp b/mozilla/editor/base/nsPlaintextEditor.cpp index ddc0ad8e7ee..81c50141055 100644 --- a/mozilla/editor/base/nsPlaintextEditor.cpp +++ b/mozilla/editor/base/nsPlaintextEditor.cpp @@ -1073,6 +1073,22 @@ NS_IMETHODIMP nsPlaintextEditor::InsertLineBreak() return res; } +NS_IMETHODIMP +nsPlaintextEditor::BeginComposition(nsTextEventReply* aReply) +{ + if(mFlags & nsIPlaintextEditor::eEditorPasswordMask) { + if (mRules) { + nsIEditRules *p = mRules.get(); + nsTextEditRules *textEditRules = NS_STATIC_CAST(nsTextEditRules *, p); + textEditRules->ResetIMETextPWBuf(); + } + else { + return NS_ERROR_NULL_POINTER; + } + } + + return nsEditor::BeginComposition(aReply); +} NS_IMETHODIMP nsPlaintextEditor::GetDocumentIsEmpty(PRBool *aDocumentIsEmpty) diff --git a/mozilla/editor/base/nsPlaintextEditor.h b/mozilla/editor/base/nsPlaintextEditor.h index 4cc4f6f0a49..a7ad230e29a 100644 --- a/mozilla/editor/base/nsPlaintextEditor.h +++ b/mozilla/editor/base/nsPlaintextEditor.h @@ -89,6 +89,7 @@ public: NS_IMETHOD GetReconversionString(nsReconversionEventReply* aReply); /* ------------ Overrides of nsEditor interface methods -------------- */ + NS_IMETHOD BeginComposition(nsTextEventReply* aReply); /** prepare the editor for use */ NS_IMETHOD Init(nsIDOMDocument *aDoc, nsIPresShell *aPresShell, nsIContent *aRoot, nsISelectionController *aSelCon, PRUint32 aFlags); diff --git a/mozilla/editor/base/nsTextEditRules.cpp b/mozilla/editor/base/nsTextEditRules.cpp index f635b30a5f5..a5e0d8e0889 100644 --- a/mozilla/editor/base/nsTextEditRules.cpp +++ b/mozilla/editor/base/nsTextEditRules.cpp @@ -75,6 +75,8 @@ NS_NewTextEditRules(nsIEditRules** aInstancePtrResult) nsTextEditRules::nsTextEditRules() : mEditor(nsnull) , mPasswordText() +, mPasswordIMEText() +, mPasswordIMEIndex(0) , mBogusNode(nsnull) , mBody(nsnull) , mFlags(0) // initialized to 0 ("no flags set"). Real initial value is given in Init() @@ -504,6 +506,11 @@ nsTextEditRules::WillInsertText(PRInt32 aAction, // to the replacement character if (mFlags & nsIPlaintextEditor::eEditorPasswordMask) { + if (aAction == kInsertTextIME) { + res = RemoveIMETextFromPWBuf(start, outString); + if (NS_FAILED(res)) return res; + } + res = EchoInsertionToPWBuff(start, end, outString); if (NS_FAILED(res)) return res; } @@ -1257,6 +1264,34 @@ nsTextEditRules::TruncateInsertionIfNeeded(nsISelection *aSelection, return res; } +nsresult +nsTextEditRules::ResetIMETextPWBuf() +{ + mPasswordIMEText.SetLength(0); + return NS_OK; +} + +nsresult +nsTextEditRules::RemoveIMETextFromPWBuf(PRInt32 &aStart, nsAWritableString *aIMEString) +{ + if (!aIMEString) { + return NS_ERROR_NULL_POINTER; + } + + // initialize PasswordIME + if (!mPasswordIMEText.Length()) { + mPasswordIMEIndex = aStart; + mPasswordIMEText.Assign(*aIMEString); + return NS_OK; + } + + // manage the password buffer + mPasswordText.Cut(mPasswordIMEIndex, mPasswordIMEText.Length()); + aStart = mPasswordIMEIndex; + mPasswordIMEText.Assign(*aIMEString); + + return NS_OK; +} nsresult nsTextEditRules::EchoInsertionToPWBuff(PRInt32 aStart, PRInt32 aEnd, nsAWritableString *aOutString) diff --git a/mozilla/editor/base/nsTextEditRules.h b/mozilla/editor/base/nsTextEditRules.h index 86dd04f122e..675b883c2c2 100644 --- a/mozilla/editor/base/nsTextEditRules.h +++ b/mozilla/editor/base/nsTextEditRules.h @@ -85,6 +85,9 @@ public: kInsertElement = 3008 }; +public: + nsresult ResetIMETextPWBuf(); + protected: // nsTextEditRules implementation methods @@ -159,6 +162,9 @@ protected: insertion text to '*'s */ nsresult EchoInsertionToPWBuff(PRInt32 aStart, PRInt32 aEnd, nsAWritableString *aOutString); + /** Remove IME composition text from password buffer */ + nsresult RemoveIMETextFromPWBuf(PRInt32 &aStart, nsAWritableString *aIMEString); + nsresult CreateMozBR(nsIDOMNode *inParent, PRInt32 inOffset, nsCOMPtr *outBRNode); PRBool DeleteEmptyTextNode(nsIDOMNode *aNode); @@ -173,6 +179,8 @@ protected: // data members nsPlaintextEditor *mEditor; // note that we do not refcount the editor nsString mPasswordText; // a buffer we use to store the real value of password editors + nsString mPasswordIMEText; // a buffer we use to track the IME composition string + PRInt32 mPasswordIMEIndex; nsCOMPtr mBogusNode; // magic node acts as placeholder in empty doc nsCOMPtr mBody; // cached root node PRUint32 mFlags; diff --git a/mozilla/editor/libeditor/text/nsPlaintextEditor.cpp b/mozilla/editor/libeditor/text/nsPlaintextEditor.cpp index ddc0ad8e7ee..81c50141055 100644 --- a/mozilla/editor/libeditor/text/nsPlaintextEditor.cpp +++ b/mozilla/editor/libeditor/text/nsPlaintextEditor.cpp @@ -1073,6 +1073,22 @@ NS_IMETHODIMP nsPlaintextEditor::InsertLineBreak() return res; } +NS_IMETHODIMP +nsPlaintextEditor::BeginComposition(nsTextEventReply* aReply) +{ + if(mFlags & nsIPlaintextEditor::eEditorPasswordMask) { + if (mRules) { + nsIEditRules *p = mRules.get(); + nsTextEditRules *textEditRules = NS_STATIC_CAST(nsTextEditRules *, p); + textEditRules->ResetIMETextPWBuf(); + } + else { + return NS_ERROR_NULL_POINTER; + } + } + + return nsEditor::BeginComposition(aReply); +} NS_IMETHODIMP nsPlaintextEditor::GetDocumentIsEmpty(PRBool *aDocumentIsEmpty) diff --git a/mozilla/editor/libeditor/text/nsPlaintextEditor.h b/mozilla/editor/libeditor/text/nsPlaintextEditor.h index 4cc4f6f0a49..a7ad230e29a 100644 --- a/mozilla/editor/libeditor/text/nsPlaintextEditor.h +++ b/mozilla/editor/libeditor/text/nsPlaintextEditor.h @@ -89,6 +89,7 @@ public: NS_IMETHOD GetReconversionString(nsReconversionEventReply* aReply); /* ------------ Overrides of nsEditor interface methods -------------- */ + NS_IMETHOD BeginComposition(nsTextEventReply* aReply); /** prepare the editor for use */ NS_IMETHOD Init(nsIDOMDocument *aDoc, nsIPresShell *aPresShell, nsIContent *aRoot, nsISelectionController *aSelCon, PRUint32 aFlags); diff --git a/mozilla/editor/libeditor/text/nsTextEditRules.cpp b/mozilla/editor/libeditor/text/nsTextEditRules.cpp index f635b30a5f5..a5e0d8e0889 100644 --- a/mozilla/editor/libeditor/text/nsTextEditRules.cpp +++ b/mozilla/editor/libeditor/text/nsTextEditRules.cpp @@ -75,6 +75,8 @@ NS_NewTextEditRules(nsIEditRules** aInstancePtrResult) nsTextEditRules::nsTextEditRules() : mEditor(nsnull) , mPasswordText() +, mPasswordIMEText() +, mPasswordIMEIndex(0) , mBogusNode(nsnull) , mBody(nsnull) , mFlags(0) // initialized to 0 ("no flags set"). Real initial value is given in Init() @@ -504,6 +506,11 @@ nsTextEditRules::WillInsertText(PRInt32 aAction, // to the replacement character if (mFlags & nsIPlaintextEditor::eEditorPasswordMask) { + if (aAction == kInsertTextIME) { + res = RemoveIMETextFromPWBuf(start, outString); + if (NS_FAILED(res)) return res; + } + res = EchoInsertionToPWBuff(start, end, outString); if (NS_FAILED(res)) return res; } @@ -1257,6 +1264,34 @@ nsTextEditRules::TruncateInsertionIfNeeded(nsISelection *aSelection, return res; } +nsresult +nsTextEditRules::ResetIMETextPWBuf() +{ + mPasswordIMEText.SetLength(0); + return NS_OK; +} + +nsresult +nsTextEditRules::RemoveIMETextFromPWBuf(PRInt32 &aStart, nsAWritableString *aIMEString) +{ + if (!aIMEString) { + return NS_ERROR_NULL_POINTER; + } + + // initialize PasswordIME + if (!mPasswordIMEText.Length()) { + mPasswordIMEIndex = aStart; + mPasswordIMEText.Assign(*aIMEString); + return NS_OK; + } + + // manage the password buffer + mPasswordText.Cut(mPasswordIMEIndex, mPasswordIMEText.Length()); + aStart = mPasswordIMEIndex; + mPasswordIMEText.Assign(*aIMEString); + + return NS_OK; +} nsresult nsTextEditRules::EchoInsertionToPWBuff(PRInt32 aStart, PRInt32 aEnd, nsAWritableString *aOutString) diff --git a/mozilla/editor/libeditor/text/nsTextEditRules.h b/mozilla/editor/libeditor/text/nsTextEditRules.h index 86dd04f122e..675b883c2c2 100644 --- a/mozilla/editor/libeditor/text/nsTextEditRules.h +++ b/mozilla/editor/libeditor/text/nsTextEditRules.h @@ -85,6 +85,9 @@ public: kInsertElement = 3008 }; +public: + nsresult ResetIMETextPWBuf(); + protected: // nsTextEditRules implementation methods @@ -159,6 +162,9 @@ protected: insertion text to '*'s */ nsresult EchoInsertionToPWBuff(PRInt32 aStart, PRInt32 aEnd, nsAWritableString *aOutString); + /** Remove IME composition text from password buffer */ + nsresult RemoveIMETextFromPWBuf(PRInt32 &aStart, nsAWritableString *aIMEString); + nsresult CreateMozBR(nsIDOMNode *inParent, PRInt32 inOffset, nsCOMPtr *outBRNode); PRBool DeleteEmptyTextNode(nsIDOMNode *aNode); @@ -173,6 +179,8 @@ protected: // data members nsPlaintextEditor *mEditor; // note that we do not refcount the editor nsString mPasswordText; // a buffer we use to store the real value of password editors + nsString mPasswordIMEText; // a buffer we use to track the IME composition string + PRInt32 mPasswordIMEIndex; nsCOMPtr mBogusNode; // magic node acts as placeholder in empty doc nsCOMPtr mBody; // cached root node PRUint32 mFlags;