diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /toolkit/components/autocomplete/nsAutoCompleteController.h | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/components/autocomplete/nsAutoCompleteController.h')
-rw-r--r-- | toolkit/components/autocomplete/nsAutoCompleteController.h | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/toolkit/components/autocomplete/nsAutoCompleteController.h b/toolkit/components/autocomplete/nsAutoCompleteController.h new file mode 100644 index 0000000000..7e6d8a3b06 --- /dev/null +++ b/toolkit/components/autocomplete/nsAutoCompleteController.h @@ -0,0 +1,217 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef __nsAutoCompleteController__ +#define __nsAutoCompleteController__ + +#include "nsIAutoCompleteController.h" + +#include "nsCOMPtr.h" +#include "nsIAutoCompleteInput.h" +#include "nsIAutoCompletePopup.h" +#include "nsIAutoCompleteResult.h" +#include "nsIAutoCompleteSearch.h" +#include "nsINamed.h" +#include "nsString.h" +#include "nsITimer.h" +#include "nsTArray.h" +#include "nsCOMArray.h" +#include "nsCycleCollectionParticipant.h" +#include "mozilla/dom/Element.h" + +class nsAutoCompleteController final : public nsIAutoCompleteController, + public nsIAutoCompleteObserver, + public nsITimerCallback, + public nsINamed { + public: + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsAutoCompleteController, + nsIAutoCompleteController) + NS_DECL_NSIAUTOCOMPLETECONTROLLER + NS_DECL_NSIAUTOCOMPLETEOBSERVER + NS_DECL_NSITIMERCALLBACK + NS_DECL_NSINAMED + + nsAutoCompleteController(); + + protected: + MOZ_CAN_RUN_SCRIPT virtual ~nsAutoCompleteController(); + + /** + * SetValueOfInputTo() sets value of mInput to aValue. + */ + void SetValueOfInputTo(const nsString& aValue); + + /** + * SetSearchStringInternal() sets both mSearchString and mSetValue to + * aSearchString. + */ + void SetSearchStringInternal(const nsAString& aSearchString) { + mSearchString = mSetValue = aSearchString; + } + + MOZ_CAN_RUN_SCRIPT nsresult OpenPopup(); + MOZ_CAN_RUN_SCRIPT nsresult ClosePopup(); + + nsresult StartSearch(uint16_t aSearchType); + + nsresult BeforeSearches(); + MOZ_CAN_RUN_SCRIPT nsresult StartSearches(); + MOZ_CAN_RUN_SCRIPT void AfterSearches(); + nsresult ClearSearchTimer(); + void MaybeCompletePlaceholder(); + + MOZ_CAN_RUN_SCRIPT nsresult ProcessResult(int32_t aSearchIndex, + nsIAutoCompleteResult* aResult); + MOZ_CAN_RUN_SCRIPT nsresult PostSearchCleanup(); + + MOZ_CAN_RUN_SCRIPT nsresult EnterMatch(bool aIsPopupSelection, + mozilla::dom::Event* aEvent); + nsresult RevertTextValue(); + + nsresult CompleteDefaultIndex(int32_t aResultIndex); + nsresult CompleteValue(nsString& aValue); + + nsresult GetResultAt(int32_t aIndex, nsIAutoCompleteResult** aResult, + int32_t* aMatchIndex); + nsresult GetResultValueAt(int32_t aIndex, bool aGetFinalValue, + nsAString& _retval); + nsresult GetResultLabelAt(int32_t aIndex, nsAString& _retval); + + /** + * Returns autocomplete popup for the autocomplete input. nsIAutoCompleteInput + * can be implemented two different ways to return a popup. The first one is + * to return a popup object implementing nsIAutoCompletePopup interface, + * the second one is a DOM element representing a popup and implementing + * that interface. + */ + already_AddRefed<nsIAutoCompletePopup> GetPopup() { + nsCOMPtr<nsIAutoCompletePopup> popup; + mInput->GetPopup(getter_AddRefs(popup)); + if (popup) { + return popup.forget(); + } + + nsCOMPtr<mozilla::dom::Element> popupEl; + mInput->GetPopupElement(getter_AddRefs(popupEl)); + if (popupEl) { + return popupEl->AsAutoCompletePopup(); + } + return nullptr; + } + + private: + nsresult GetResultValueLabelAt(int32_t aIndex, bool aGetFinalValue, + bool aGetValue, nsAString& _retval); + + /** + * Gets and validates the defaultComplete result and the relative + * defaultIndex value. + * + * @param aResultIndex + * Index of the defaultComplete result to be used. Pass -1 to search + * for the first result providing a valid defaultIndex. + * @param _result + * The found result. + * @param _defaultIndex + * The defaultIndex relative to _result. + */ + nsresult GetDefaultCompleteResult(int32_t aResultIndex, + nsIAutoCompleteResult** _result, + int32_t* _defaultIndex); + + /** + * Gets the defaultComplete value to be suggested to the user. + * + * @param aResultIndex + * Index of the defaultComplete result to be used. + * @param aPreserveCasing + * Whether user casing should be preserved. + * @param _retval + * The value to be completed. + */ + nsresult GetDefaultCompleteValue(int32_t aResultIndex, bool aPreserveCasing, + nsAString& _retval); + + /** + * Gets the defaultComplete value to be used when the user confirms the + * current match. + * The value is returned only if it case-insensitively matches the current + * input text, otherwise the method returns NS_ERROR_FAILURE. + * This happens because we don't want to replace text if the user backspaces + * just before Enter. + * + * @param _retval + * The value to be completed. + */ + nsresult GetFinalDefaultCompleteValue(nsAString& _retval); + + nsresult ClearResults(bool aIsSearching = false); + + nsresult MatchIndexToSearch(int32_t aMatchIndex, int32_t* aSearchIndex, + int32_t* aItemIndex); + + // members ////////////////////////////////////////// + + nsCOMPtr<nsIAutoCompleteInput> mInput; + + nsCOMArray<nsIAutoCompleteSearch> mSearches; + // This is used as a sparse array, always use SafeObjectAt to access it. + nsCOMArray<nsIAutoCompleteResult> mResults; + // Temporarily keeps the results alive while invoking startSearch() for each + // search. This is needed to allow the searches to reuse the previous result, + // since otherwise the first search clears mResults. + nsCOMArray<nsIAutoCompleteResult> mResultCache; + + nsCOMPtr<nsITimer> mTimer; + + // mSearchString stores value which is the original value of the input or + // typed by the user. When user is choosing an item from the popup, this + // is NOT modified by the item because this is used for reverting the input + // value when user cancels choosing an item from the popup. + // This should be set through only SetSearchStringInternal(). + nsString mSearchString; + nsString mPlaceholderCompletionString; + // mSetValue stores value which is expected in the input. So, if input's + // value and mSetValue are different, it means somebody has changed the + // value like JS of the web content. + // This is set only by SetValueOfInputTo() or when modifying mSearchString + // through SetSearchStringInternal(). + nsString mSetValue; + bool mDefaultIndexCompleted; + bool mPopupClosedByCompositionStart; + + // Whether autofill is allowed for the next search. May be retrieved by the + // search through the "prohibit-autofill" searchParam. + bool mProhibitAutoFill; + + // Indicates whether the user cleared the autofilled part, returning to the + // originally entered search string. + bool mUserClearedAutoFill; + + // Indicates whether clearing the autofilled string should issue a new search. + bool mClearingAutoFillSearchesAgain; + + enum CompositionState { + eCompositionState_None, + eCompositionState_Composing, + eCompositionState_Committing + }; + CompositionState mCompositionState; + uint16_t mSearchStatus; + uint32_t mMatchCount; + uint32_t mSearchesOngoing; + uint32_t mSearchesFailed; + uint32_t mImmediateSearchesCount; + // The index of the match on the popup that was selected using the keyboard, + // if the completeselectedindex attribute is set. + // This is used to distinguish that selection (which would have been put in + // the input on being selected) from a moused-over selectedIndex value. This + // distinction is used to prevent mouse moves from inadvertently changing + // what happens once the user hits Enter on the keyboard. + // See bug 1043584 for more details. + int32_t mCompletedSelectionIndex; +}; + +#endif /* __nsAutoCompleteController__ */ |