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