NS_IMETHODIMP TextEditRules::Notify(nsITimer* aTimer) { MOZ_ASSERT(mTimer); // Check whether our text editor's password flag was changed before this // "hide password character" timer actually fires. nsresult rv = IsPasswordEditor() ? HideLastPWInput() : NS_OK; ASSERT_PASSWORD_LENGTHS_EQUAL(); mLastLength = 0; return rv; }
nsresult TextEditRules::WillSetText(Selection& aSelection, bool* aCancel, bool* aHandled, const nsAString* aString, int32_t aMaxLength) { MOZ_ASSERT(aCancel); MOZ_ASSERT(aHandled); MOZ_ASSERT(aString); CANCEL_OPERATION_IF_READONLY_OR_DISABLED *aHandled = false; *aCancel = false; if (NS_WARN_IF(!mTextEditor)) { return NS_ERROR_FAILURE; } RefPtr<TextEditor> textEditor = mTextEditor; if (!IsPlaintextEditor() || textEditor->IsIMEComposing() || aMaxLength != -1) { // SetTextImpl only supports plain text editor without IME. return NS_OK; } if (IsPasswordEditor() && LookAndFeel::GetEchoPassword() && !DontEchoPassword()) { // Echo password timer will implement on InsertText. return NS_OK; } WillInsert(aSelection, aCancel); // we want to ignore result of WillInsert() *aCancel = false; RefPtr<Element> rootElement = textEditor->GetRoot(); uint32_t count = rootElement->GetChildCount(); // handles only when there is only one node and it's a text node, or empty. if (count > 1) { return NS_OK; } nsAutoString tString(*aString); if (IsPasswordEditor()) { mPasswordText.Assign(tString); FillBufWithPWChars(&tString, tString.Length()); } else if (IsSingleLineEditor()) { HandleNewLines(tString, textEditor->mNewlineHandling); } if (!count) { if (tString.IsEmpty()) { *aHandled = true; return NS_OK; } RefPtr<nsIDocument> doc = textEditor->GetDocument(); if (NS_WARN_IF(!doc)) { return NS_OK; } RefPtr<nsTextNode> newNode = EditorBase::CreateTextNode(*doc, tString); if (NS_WARN_IF(!newNode)) { return NS_OK; } nsresult rv = textEditor->InsertNode(*newNode, *rootElement, 0); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } *aHandled = true; ASSERT_PASSWORD_LENGTHS_EQUAL(); return NS_OK; } nsINode* curNode = rootElement->GetFirstChild(); if (NS_WARN_IF(!EditorBase::IsTextNode(curNode))) { return NS_OK; } // don't change my selection in subtransactions AutoTransactionsConserveSelection dontChangeMySelection(textEditor); // Even if empty text, we don't remove text node and set empty text // for performance nsresult rv = textEditor->SetTextImpl(aSelection, tString, *curNode->GetAsText()); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } *aHandled = true; ASSERT_PASSWORD_LENGTHS_EQUAL(); return NS_OK; }
NS_IMETHODIMP nsTextEditRules::Notify(class nsITimer *) { nsresult res = HideLastPWInput(); ASSERT_PASSWORD_LENGTHS_EQUAL(); mLastLength = 0; return res; }