1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #include "nsAutoCompleteSimpleResult.h"
6 
7 #define CHECK_MATCH_INDEX(_index, _insert)                                   \
8   if (_index < 0 ||                                                          \
9       static_cast<MatchesArray::size_type>(_index) > mMatches.Length() ||    \
10       (!_insert &&                                                           \
11        static_cast<MatchesArray::size_type>(_index) == mMatches.Length())) { \
12     MOZ_ASSERT(false, "Trying to use an invalid index on mMatches");         \
13     return NS_ERROR_ILLEGAL_VALUE;                                           \
14   }
15 
NS_IMPL_ISUPPORTS(nsAutoCompleteSimpleResult,nsIAutoCompleteResult,nsIAutoCompleteSimpleResult)16 NS_IMPL_ISUPPORTS(nsAutoCompleteSimpleResult, nsIAutoCompleteResult,
17                   nsIAutoCompleteSimpleResult)
18 
19 nsAutoCompleteSimpleResult::nsAutoCompleteSimpleResult()
20     : mDefaultIndex(-1), mSearchResult(RESULT_NOMATCH) {}
21 
AppendResult(nsIAutoCompleteResult * aResult)22 nsresult nsAutoCompleteSimpleResult::AppendResult(
23     nsIAutoCompleteResult* aResult) {
24   nsAutoString searchString;
25   nsresult rv = aResult->GetSearchString(searchString);
26   NS_ENSURE_SUCCESS(rv, rv);
27   mSearchString = searchString;
28 
29   uint16_t searchResult;
30   rv = aResult->GetSearchResult(&searchResult);
31   NS_ENSURE_SUCCESS(rv, rv);
32   mSearchResult = searchResult;
33 
34   nsAutoString errorDescription;
35   if (NS_SUCCEEDED(aResult->GetErrorDescription(errorDescription)) &&
36       !errorDescription.IsEmpty()) {
37     mErrorDescription = errorDescription;
38   }
39 
40   int32_t defaultIndex = -1;
41   if (NS_SUCCEEDED(aResult->GetDefaultIndex(&defaultIndex)) &&
42       defaultIndex >= 0) {
43     mDefaultIndex = defaultIndex;
44   }
45 
46   nsCOMPtr<nsIAutoCompleteSimpleResult> simpleResult =
47       do_QueryInterface(aResult);
48   if (simpleResult) {
49     nsCOMPtr<nsIAutoCompleteSimpleResultListener> listener;
50     if (NS_SUCCEEDED(simpleResult->GetListener(getter_AddRefs(listener))) &&
51         listener) {
52       listener.swap(mListener);
53     }
54   }
55 
56   // Copy matches.
57   uint32_t matchCount = 0;
58   rv = aResult->GetMatchCount(&matchCount);
59   NS_ENSURE_SUCCESS(rv, rv);
60   for (size_t i = 0; i < matchCount; ++i) {
61     nsAutoString value, comment, image, style, finalCompleteValue, label;
62 
63     rv = aResult->GetValueAt(i, value);
64     NS_ENSURE_SUCCESS(rv, rv);
65     rv = aResult->GetCommentAt(i, comment);
66     NS_ENSURE_SUCCESS(rv, rv);
67     rv = aResult->GetImageAt(i, image);
68     NS_ENSURE_SUCCESS(rv, rv);
69     rv = aResult->GetStyleAt(i, style);
70     NS_ENSURE_SUCCESS(rv, rv);
71     rv = aResult->GetFinalCompleteValueAt(i, finalCompleteValue);
72     NS_ENSURE_SUCCESS(rv, rv);
73     rv = aResult->GetLabelAt(i, label);
74     NS_ENSURE_SUCCESS(rv, rv);
75 
76     rv = AppendMatch(value, comment, image, style, finalCompleteValue, label);
77     NS_ENSURE_SUCCESS(rv, rv);
78   }
79 
80   return NS_OK;
81 }
82 
83 // searchString
84 NS_IMETHODIMP
GetSearchString(nsAString & aSearchString)85 nsAutoCompleteSimpleResult::GetSearchString(nsAString& aSearchString) {
86   aSearchString = mSearchString;
87   return NS_OK;
88 }
89 NS_IMETHODIMP
SetSearchString(const nsAString & aSearchString)90 nsAutoCompleteSimpleResult::SetSearchString(const nsAString& aSearchString) {
91   mSearchString.Assign(aSearchString);
92   return NS_OK;
93 }
94 
95 // searchResult
96 NS_IMETHODIMP
GetSearchResult(uint16_t * aSearchResult)97 nsAutoCompleteSimpleResult::GetSearchResult(uint16_t* aSearchResult) {
98   *aSearchResult = mSearchResult;
99   return NS_OK;
100 }
101 NS_IMETHODIMP
SetSearchResult(uint16_t aSearchResult)102 nsAutoCompleteSimpleResult::SetSearchResult(uint16_t aSearchResult) {
103   mSearchResult = aSearchResult;
104   return NS_OK;
105 }
106 
107 // defaultIndex
108 NS_IMETHODIMP
GetDefaultIndex(int32_t * aDefaultIndex)109 nsAutoCompleteSimpleResult::GetDefaultIndex(int32_t* aDefaultIndex) {
110   *aDefaultIndex = mDefaultIndex;
111   return NS_OK;
112 }
113 NS_IMETHODIMP
SetDefaultIndex(int32_t aDefaultIndex)114 nsAutoCompleteSimpleResult::SetDefaultIndex(int32_t aDefaultIndex) {
115   mDefaultIndex = aDefaultIndex;
116   return NS_OK;
117 }
118 
119 // errorDescription
120 NS_IMETHODIMP
GetErrorDescription(nsAString & aErrorDescription)121 nsAutoCompleteSimpleResult::GetErrorDescription(nsAString& aErrorDescription) {
122   aErrorDescription = mErrorDescription;
123   return NS_OK;
124 }
125 NS_IMETHODIMP
SetErrorDescription(const nsAString & aErrorDescription)126 nsAutoCompleteSimpleResult::SetErrorDescription(
127     const nsAString& aErrorDescription) {
128   mErrorDescription.Assign(aErrorDescription);
129   return NS_OK;
130 }
131 
132 NS_IMETHODIMP
InsertMatchAt(int32_t aIndex,const nsAString & aValue,const nsAString & aComment,const nsAString & aImage,const nsAString & aStyle,const nsAString & aFinalCompleteValue,const nsAString & aLabel)133 nsAutoCompleteSimpleResult::InsertMatchAt(
134     int32_t aIndex, const nsAString& aValue, const nsAString& aComment,
135     const nsAString& aImage, const nsAString& aStyle,
136     const nsAString& aFinalCompleteValue, const nsAString& aLabel) {
137   CHECK_MATCH_INDEX(aIndex, true);
138 
139   AutoCompleteSimpleResultMatch match(aValue, aComment, aImage, aStyle,
140                                       aFinalCompleteValue, aLabel);
141 
142   // XXX(Bug 1631371) Check if this should use a fallible operation as it
143   // pretended earlier.
144   mMatches.InsertElementAt(aIndex, match);
145 
146   return NS_OK;
147 }
148 
149 NS_IMETHODIMP
AppendMatch(const nsAString & aValue,const nsAString & aComment,const nsAString & aImage,const nsAString & aStyle,const nsAString & aFinalCompleteValue,const nsAString & aLabel)150 nsAutoCompleteSimpleResult::AppendMatch(const nsAString& aValue,
151                                         const nsAString& aComment,
152                                         const nsAString& aImage,
153                                         const nsAString& aStyle,
154                                         const nsAString& aFinalCompleteValue,
155                                         const nsAString& aLabel) {
156   return InsertMatchAt(mMatches.Length(), aValue, aComment, aImage, aStyle,
157                        aFinalCompleteValue, aLabel);
158 }
159 
160 NS_IMETHODIMP
RemoveMatchAt(int32_t aIndex)161 nsAutoCompleteSimpleResult::RemoveMatchAt(int32_t aIndex) {
162   CHECK_MATCH_INDEX(aIndex, false);
163 
164   mMatches.RemoveElementAt(aIndex);
165   return NS_OK;
166 }
167 
168 NS_IMETHODIMP
GetMatchCount(uint32_t * aMatchCount)169 nsAutoCompleteSimpleResult::GetMatchCount(uint32_t* aMatchCount) {
170   *aMatchCount = mMatches.Length();
171   return NS_OK;
172 }
173 
174 NS_IMETHODIMP
GetValueAt(int32_t aIndex,nsAString & _retval)175 nsAutoCompleteSimpleResult::GetValueAt(int32_t aIndex, nsAString& _retval) {
176   CHECK_MATCH_INDEX(aIndex, false);
177   _retval = mMatches[aIndex].mValue;
178   return NS_OK;
179 }
180 
181 NS_IMETHODIMP
GetLabelAt(int32_t aIndex,nsAString & _retval)182 nsAutoCompleteSimpleResult::GetLabelAt(int32_t aIndex, nsAString& _retval) {
183   CHECK_MATCH_INDEX(aIndex, false);
184   _retval = mMatches[aIndex].mLabel;
185   if (_retval.IsEmpty()) {
186     _retval = mMatches[aIndex].mValue;
187   }
188   return NS_OK;
189 }
190 
191 NS_IMETHODIMP
GetCommentAt(int32_t aIndex,nsAString & _retval)192 nsAutoCompleteSimpleResult::GetCommentAt(int32_t aIndex, nsAString& _retval) {
193   CHECK_MATCH_INDEX(aIndex, false);
194   _retval = mMatches[aIndex].mComment;
195   return NS_OK;
196 }
197 
198 NS_IMETHODIMP
GetImageAt(int32_t aIndex,nsAString & _retval)199 nsAutoCompleteSimpleResult::GetImageAt(int32_t aIndex, nsAString& _retval) {
200   CHECK_MATCH_INDEX(aIndex, false);
201   _retval = mMatches[aIndex].mImage;
202   return NS_OK;
203 }
204 
205 NS_IMETHODIMP
GetStyleAt(int32_t aIndex,nsAString & _retval)206 nsAutoCompleteSimpleResult::GetStyleAt(int32_t aIndex, nsAString& _retval) {
207   CHECK_MATCH_INDEX(aIndex, false);
208   _retval = mMatches[aIndex].mStyle;
209   return NS_OK;
210 }
211 
212 NS_IMETHODIMP
GetFinalCompleteValueAt(int32_t aIndex,nsAString & _retval)213 nsAutoCompleteSimpleResult::GetFinalCompleteValueAt(int32_t aIndex,
214                                                     nsAString& _retval) {
215   CHECK_MATCH_INDEX(aIndex, false);
216   _retval = mMatches[aIndex].mFinalCompleteValue;
217   if (_retval.IsEmpty()) {
218     _retval = mMatches[aIndex].mValue;
219   }
220   return NS_OK;
221 }
222 
223 NS_IMETHODIMP
SetListener(nsIAutoCompleteSimpleResultListener * aListener)224 nsAutoCompleteSimpleResult::SetListener(
225     nsIAutoCompleteSimpleResultListener* aListener) {
226   mListener = aListener;
227   return NS_OK;
228 }
229 
230 NS_IMETHODIMP
GetListener(nsIAutoCompleteSimpleResultListener ** aListener)231 nsAutoCompleteSimpleResult::GetListener(
232     nsIAutoCompleteSimpleResultListener** aListener) {
233   nsCOMPtr<nsIAutoCompleteSimpleResultListener> listener(mListener);
234   listener.forget(aListener);
235   return NS_OK;
236 }
237 
238 NS_IMETHODIMP
RemoveValueAt(int32_t aRowIndex)239 nsAutoCompleteSimpleResult::RemoveValueAt(int32_t aRowIndex) {
240   CHECK_MATCH_INDEX(aRowIndex, false);
241 
242   nsString value = mMatches[aRowIndex].mValue;
243   mMatches.RemoveElementAt(aRowIndex);
244 
245   if (mListener) {
246     mListener->OnValueRemoved(this, value);
247   }
248 
249   return NS_OK;
250 }
251