Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: third_party/WebKit/Source/core/dom/URLSearchParams.cpp

Issue 1998563002: Fix URLSearchParams to use the right encoding algorithm (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/URLSearchParams.h ('k') | third_party/WebKit/Source/core/dom/URLSearchParamsTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698