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

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

Issue 2725593003: Construct URLSearchParams from sequence initializer. (Closed)
Patch Set: allow appending name-value pairs without update Created 3 years, 9 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 <utility>
7 #include "core/dom/DOMURL.h" 8 #include "core/dom/DOMURL.h"
8 #include "platform/network/FormDataEncoder.h" 9 #include "platform/network/FormDataEncoder.h"
9 #include "platform/weborigin/KURL.h" 10 #include "platform/weborigin/KURL.h"
10 #include "wtf/text/TextEncoding.h" 11 #include "wtf/text/TextEncoding.h"
11 12
12 namespace blink { 13 namespace blink {
13 14
14 namespace { 15 namespace {
15 16
16 class URLSearchParamsIterationSource final 17 class URLSearchParamsIterationSource final
(...skipping 15 matching lines...) Expand all
32 return true; 33 return true;
33 } 34 }
34 35
35 private: 36 private:
36 Vector<std::pair<String, String>> m_params; 37 Vector<std::pair<String, String>> m_params;
37 size_t m_current; 38 size_t m_current;
38 }; 39 };
39 40
40 } // namespace 41 } // namespace
41 42
42 URLSearchParams* URLSearchParams::create(const URLSearchParamsInit& init) { 43 URLSearchParams* URLSearchParams::create(const URLSearchParamsInit& init,
44 ExceptionState& exceptionState) {
43 if (init.isUSVString()) { 45 if (init.isUSVString()) {
44 const String& queryString = init.getAsUSVString(); 46 const String& queryString = init.getAsUSVString();
45 if (queryString.startsWith('?')) 47 if (queryString.startsWith('?'))
46 return new URLSearchParams(queryString.substring(1)); 48 return new URLSearchParams(queryString.substring(1));
47 return new URLSearchParams(queryString); 49 return new URLSearchParams(queryString);
48 } 50 }
51 // TODO(sof): copy constructor no longer in the spec,
52 // consider removing.
49 if (init.isURLSearchParams()) 53 if (init.isURLSearchParams())
50 return new URLSearchParams(init.getAsURLSearchParams()); 54 return new URLSearchParams(init.getAsURLSearchParams());
51 55
56 if (init.isUSVStringSequenceSequence()) {
57 return URLSearchParams::create(init.getAsUSVStringSequenceSequence(),
58 exceptionState);
59 }
60
52 DCHECK(init.isNull()); 61 DCHECK(init.isNull());
53 return new URLSearchParams(String()); 62 return new URLSearchParams(String());
54 } 63 }
55 64
65 URLSearchParams* URLSearchParams::create(const Vector<Vector<String>>& init,
66 ExceptionState& exceptionState) {
67 URLSearchParams* instance = new URLSearchParams(String());
68 for (unsigned i = 0; i < init.size(); ++i) {
69 const Vector<String>& pair = init[i];
70 if (pair.size() != 2) {
71 exceptionState.throwTypeError(ExceptionMessages::failedToConstruct(
72 "URLSearchParams",
73 "Sequence initializer must only contain pair elements"));
74 return nullptr;
75 }
76 instance->appendWithoutUpdate(pair[0], pair[1]);
77 }
78 if (init.size())
79 instance->runUpdateSteps();
tyoshino (SeeGerritForStatus) 2017/03/01 08:57:06 optional: we can also early return before the for-
sof 2017/03/01 09:06:09 ok, consistent style to do so.
80 return instance;
81 }
82
56 URLSearchParams::URLSearchParams(const String& queryString, DOMURL* urlObject) 83 URLSearchParams::URLSearchParams(const String& queryString, DOMURL* urlObject)
57 : m_urlObject(urlObject) { 84 : m_urlObject(urlObject) {
58 if (!queryString.isEmpty()) 85 if (!queryString.isEmpty())
59 setInput(queryString); 86 setInput(queryString);
60 } 87 }
61 88
62 URLSearchParams::URLSearchParams(URLSearchParams* searchParams) { 89 URLSearchParams::URLSearchParams(URLSearchParams* searchParams) {
63 DCHECK(searchParams); 90 DCHECK(searchParams);
64 m_params = searchParams->m_params; 91 m_params = searchParams->m_params;
65 } 92 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 if (endOfName == kNotFound || endOfName > nameValueEnd) 132 if (endOfName == kNotFound || endOfName > nameValueEnd)
106 endOfName = nameValueEnd; 133 endOfName = nameValueEnd;
107 String name = 134 String name =
108 decodeString(queryString.substring(nameStart, endOfName - nameStart)); 135 decodeString(queryString.substring(nameStart, endOfName - nameStart));
109 String value; 136 String value;
110 if (endOfName != nameValueEnd) 137 if (endOfName != nameValueEnd)
111 value = decodeString( 138 value = decodeString(
112 queryString.substring(endOfName + 1, nameValueEnd - endOfName - 1)); 139 queryString.substring(endOfName + 1, nameValueEnd - endOfName - 1));
113 if (value.isNull()) 140 if (value.isNull())
114 value = ""; 141 value = "";
115 m_params.push_back(std::make_pair(name, value)); 142 appendWithoutUpdate(name, value);
116 } 143 }
117 start = nameValueEnd + 1; 144 start = nameValueEnd + 1;
118 } 145 }
119 runUpdateSteps(); 146 runUpdateSteps();
120 } 147 }
121 148
122 String URLSearchParams::toString() const { 149 String URLSearchParams::toString() const {
123 Vector<char> encodedData; 150 Vector<char> encodedData;
124 encodeAsFormData(encodedData); 151 encodeAsFormData(encodedData);
125 return String(encodedData.data(), encodedData.size()); 152 return String(encodedData.data(), encodedData.size());
126 } 153 }
127 154
155 void URLSearchParams::appendWithoutUpdate(const String& name,
156 const String& value) {
157 m_params.push_back(std::make_pair(name, value));
158 }
159
128 void URLSearchParams::append(const String& name, const String& value) { 160 void URLSearchParams::append(const String& name, const String& value) {
129 m_params.push_back(std::make_pair(name, value)); 161 appendWithoutUpdate(name, value);
130 runUpdateSteps(); 162 runUpdateSteps();
131 } 163 }
132 164
133 void URLSearchParams::deleteAllWithName(const String& name) { 165 void URLSearchParams::deleteAllWithName(const String& name) {
134 for (size_t i = 0; i < m_params.size();) { 166 for (size_t i = 0; i < m_params.size();) {
135 if (m_params[i].first == name) 167 if (m_params[i].first == name)
136 m_params.remove(i); 168 m_params.remove(i);
137 else 169 else
138 i++; 170 i++;
139 } 171 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 return EncodedFormData::create(encodedData.data(), encodedData.size()); 234 return EncodedFormData::create(encodedData.data(), encodedData.size());
203 } 235 }
204 236
205 PairIterable<String, String>::IterationSource* URLSearchParams::startIteration( 237 PairIterable<String, String>::IterationSource* URLSearchParams::startIteration(
206 ScriptState*, 238 ScriptState*,
207 ExceptionState&) { 239 ExceptionState&) {
208 return new URLSearchParamsIterationSource(m_params); 240 return new URLSearchParamsIterationSource(m_params);
209 } 241 }
210 242
211 } // namespace blink 243 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/URLSearchParams.h ('k') | third_party/WebKit/Source/core/dom/URLSearchParams.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698