OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/dom/URLSearchParams.h" | 5 #include "core/dom/URLSearchParams.h" |
6 | 6 |
7 #include "core/dom/DOMURL.h" | 7 #include "core/dom/DOMURL.h" |
8 #include "platform/network/FormDataEncoder.h" | 8 #include "platform/network/FormDataEncoder.h" |
9 #include "platform/weborigin/KURL.h" | 9 #include "platform/weborigin/KURL.h" |
10 #include "wtf/text/StringBuilder.h" | |
11 #include "wtf/text/TextEncoding.h" | 10 #include "wtf/text/TextEncoding.h" |
12 | 11 |
13 namespace blink { | 12 namespace blink { |
14 | 13 |
15 namespace { | 14 namespace { |
16 | 15 |
17 class URLSearchParamsIterationSource final : public PairIterable<String, String>
::IterationSource { | 16 class URLSearchParamsIterationSource final : public PairIterable<String, String>
::IterationSource { |
18 public: | 17 public: |
19 URLSearchParamsIterationSource(Vector<std::pair<String, String>> params) : m
_params(params), m_current(0) { } | 18 URLSearchParamsIterationSource(Vector<std::pair<String, String>> params) : m
_params(params), m_current(0) { } |
20 | 19 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 value = decodeString(queryString.substring(endOfName + 1, nameVa
lueEnd - endOfName - 1)); | 116 value = decodeString(queryString.substring(endOfName + 1, nameVa
lueEnd - endOfName - 1)); |
118 if (value.isNull()) | 117 if (value.isNull()) |
119 value = ""; | 118 value = ""; |
120 m_params.append(std::make_pair(name, value)); | 119 m_params.append(std::make_pair(name, value)); |
121 } | 120 } |
122 start = nameValueEnd + 1; | 121 start = nameValueEnd + 1; |
123 } | 122 } |
124 runUpdateSteps(); | 123 runUpdateSteps(); |
125 } | 124 } |
126 | 125 |
127 static String encodeString(const String& input) | |
128 { | |
129 return encodeWithURLEscapeSequences(input).replace("%20", "+"); | |
130 } | |
131 | |
132 String URLSearchParams::toString() const | 126 String URLSearchParams::toString() const |
133 { | 127 { |
134 StringBuilder result; | 128 Vector<char> encodedData; |
135 for (size_t i = 0; i < m_params.size(); ++i) { | 129 encodeAsFormData(encodedData); |
136 if (i) | 130 return String(encodedData.data(), encodedData.size()); |
137 result.append('&'); | |
138 result.append(encodeString(m_params[i].first)); | |
139 result.append('='); | |
140 result.append(encodeString(m_params[i].second)); | |
141 } | |
142 return result.toString(); | |
143 } | 131 } |
144 | 132 |
145 void URLSearchParams::append(const String& name, const String& value) | 133 void URLSearchParams::append(const String& name, const String& value) |
146 { | 134 { |
147 m_params.append(std::make_pair(name, value)); | 135 m_params.append(std::make_pair(name, value)); |
148 runUpdateSteps(); | 136 runUpdateSteps(); |
149 } | 137 } |
150 | 138 |
151 void URLSearchParams::deleteAllWithName(const String& name) | 139 void URLSearchParams::deleteAllWithName(const String& name) |
152 { | 140 { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 i++; | 193 i++; |
206 } | 194 } |
207 } | 195 } |
208 // Otherwise, append a new name-value pair to the list. | 196 // Otherwise, append a new name-value pair to the list. |
209 if (!foundMatch) | 197 if (!foundMatch) |
210 append(name, value); | 198 append(name, value); |
211 else | 199 else |
212 runUpdateSteps(); | 200 runUpdateSteps(); |
213 } | 201 } |
214 | 202 |
215 PassRefPtr<EncodedFormData> URLSearchParams::encodeFormData() const | 203 void URLSearchParams::encodeAsFormData(Vector<char>& encodedData) const |
| 204 { |
| 205 for (const auto& param : m_params) |
| 206 FormDataEncoder::addKeyValuePairAsFormData(encodedData, param.first.utf8
(), param.second.utf8(), EncodedFormData::FormURLEncoded, FormDataEncoder::DoNot
NormalizeCRLF); |
| 207 } |
| 208 |
| 209 PassRefPtr<EncodedFormData> URLSearchParams::toEncodedFormData() const |
216 { | 210 { |
217 Vector<char> encodedData; | 211 Vector<char> encodedData; |
218 for (const auto& param : m_params) | 212 encodeAsFormData(encodedData); |
219 FormDataEncoder::addKeyValuePairAsFormData(encodedData, param.first.utf8
(), param.second.utf8(), EncodedFormData::FormURLEncoded); | |
220 return EncodedFormData::create(encodedData.data(), encodedData.size()); | 213 return EncodedFormData::create(encodedData.data(), encodedData.size()); |
221 } | 214 } |
222 | 215 |
223 PairIterable<String, String>::IterationSource* URLSearchParams::startIteration(S
criptState*, ExceptionState&) | 216 PairIterable<String, String>::IterationSource* URLSearchParams::startIteration(S
criptState*, ExceptionState&) |
224 { | 217 { |
225 return new URLSearchParamsIterationSource(m_params); | 218 return new URLSearchParamsIterationSource(m_params); |
226 } | 219 } |
227 | 220 |
228 } // namespace blink | 221 } // namespace blink |
OLD | NEW |