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

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

Issue 1860623002: Add support for URL.searchParams getter. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: restrict .searchParams to URL only Created 4 years, 8 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 "platform/network/FormDataEncoder.h" 8 #include "platform/network/FormDataEncoder.h"
8 #include "platform/weborigin/KURL.h" 9 #include "platform/weborigin/KURL.h"
9 #include "wtf/text/StringBuilder.h" 10 #include "wtf/text/StringBuilder.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 : public PairIterable<String, String> ::IterationSource { 17 class URLSearchParamsIterationSource final : public PairIterable<String, String> ::IterationSource {
(...skipping 22 matching lines...) Expand all
39 { 40 {
40 if (init.isUSVString()) 41 if (init.isUSVString())
41 return new URLSearchParams(init.getAsUSVString()); 42 return new URLSearchParams(init.getAsUSVString());
42 if (init.isURLSearchParams()) 43 if (init.isURLSearchParams())
43 return new URLSearchParams(init.getAsURLSearchParams()); 44 return new URLSearchParams(init.getAsURLSearchParams());
44 45
45 ASSERT(init.isNull()); 46 ASSERT(init.isNull());
46 return new URLSearchParams(String()); 47 return new URLSearchParams(String());
47 } 48 }
48 49
49 URLSearchParams::URLSearchParams(const String& queryString) 50 URLSearchParams::URLSearchParams(const String& queryString, DOMURL* urlObject)
51 : m_urlObject(urlObject)
50 { 52 {
51 if (!queryString.isEmpty()) 53 if (!queryString.isEmpty())
52 setInput(queryString); 54 setInput(queryString);
53 } 55 }
54 56
55 URLSearchParams::URLSearchParams(URLSearchParams* searchParams) 57 URLSearchParams::URLSearchParams(URLSearchParams* searchParams)
56 { 58 {
57 ASSERT(searchParams); 59 ASSERT(searchParams);
58 m_params = searchParams->m_params; 60 m_params = searchParams->m_params;
59 } 61 }
60 62
61 URLSearchParams::~URLSearchParams() 63 URLSearchParams::~URLSearchParams()
62 { 64 {
63 } 65 }
64 66
67 DEFINE_TRACE(URLSearchParams)
68 {
69 visitor->trace(m_urlObject);
70 }
71
72 #if ENABLE(ASSERT)
73 DOMURL* URLSearchParams::urlObject() const
74 {
75 return m_urlObject;
76 }
77 #endif
78
79 void URLSearchParams::runUpdateSteps()
80 {
81 if (!m_urlObject)
82 return;
83
84 TemporaryChange<bool> scope(m_isUpdating, true);
85 m_urlObject->setQuery(toString());
86 }
87
65 static String decodeString(String input) 88 static String decodeString(String input)
66 { 89 {
67 return decodeURLEscapeSequences(input.replace('+', ' ')); 90 return decodeURLEscapeSequences(input.replace('+', ' '));
68 } 91 }
69 92
70 void URLSearchParams::setInput(const String& queryString) 93 void URLSearchParams::setInput(const String& queryString)
71 { 94 {
72 ASSERT(m_params.isEmpty()); 95 if (m_isUpdating)
96 return;
97
98 m_params.clear();
99
73 size_t start = 0; 100 size_t start = 0;
74 size_t queryStringLength = queryString.length(); 101 size_t queryStringLength = queryString.length();
75 while (start < queryStringLength) { 102 while (start < queryStringLength) {
76 size_t nameStart = start; 103 size_t nameStart = start;
77 size_t nameValueEnd = queryString.find('&', start); 104 size_t nameValueEnd = queryString.find('&', start);
78 if (nameValueEnd == kNotFound) 105 if (nameValueEnd == kNotFound)
79 nameValueEnd = queryStringLength; 106 nameValueEnd = queryStringLength;
80 if (nameValueEnd > start) { 107 if (nameValueEnd > start) {
81 size_t endOfName = queryString.find('=', start); 108 size_t endOfName = queryString.find('=', start);
82 if (endOfName == kNotFound || endOfName > nameValueEnd) 109 if (endOfName == kNotFound || endOfName > nameValueEnd)
83 endOfName = nameValueEnd; 110 endOfName = nameValueEnd;
84 String name = decodeString(queryString.substring(nameStart, endOfNam e - nameStart)); 111 String name = decodeString(queryString.substring(nameStart, endOfNam e - nameStart));
85 String value; 112 String value;
86 if (endOfName != nameValueEnd) 113 if (endOfName != nameValueEnd)
87 value = decodeString(queryString.substring(endOfName + 1, nameVa lueEnd - endOfName - 1)); 114 value = decodeString(queryString.substring(endOfName + 1, nameVa lueEnd - endOfName - 1));
88 if (value.isNull()) 115 if (value.isNull())
89 value = ""; 116 value = "";
90 m_params.append(std::make_pair(name, value)); 117 m_params.append(std::make_pair(name, value));
91 } 118 }
92 start = nameValueEnd + 1; 119 start = nameValueEnd + 1;
93 } 120 }
121 runUpdateSteps();
94 } 122 }
123
95 static String encodeString(const String& input) 124 static String encodeString(const String& input)
96 { 125 {
97 return encodeWithURLEscapeSequences(input).replace("%20", "+"); 126 return encodeWithURLEscapeSequences(input).replace("%20", "+");
98 } 127 }
99 128
100 String URLSearchParams::toString() const 129 String URLSearchParams::toString() const
101 { 130 {
102 StringBuilder result; 131 StringBuilder result;
103 for (size_t i = 0; i < m_params.size(); ++i) { 132 for (size_t i = 0; i < m_params.size(); ++i) {
104 if (i) 133 if (i)
105 result.append('&'); 134 result.append('&');
106 result.append(encodeString(m_params[i].first)); 135 result.append(encodeString(m_params[i].first));
107 result.append('='); 136 result.append('=');
108 result.append(encodeString(m_params[i].second)); 137 result.append(encodeString(m_params[i].second));
109 } 138 }
110 return result.toString(); 139 return result.toString();
111 } 140 }
112 141
113 void URLSearchParams::append(const String& name, const String& value) 142 void URLSearchParams::append(const String& name, const String& value)
114 { 143 {
115 m_params.append(std::make_pair(name, value)); 144 m_params.append(std::make_pair(name, value));
145 runUpdateSteps();
116 } 146 }
117 147
118 void URLSearchParams::deleteAllWithName(const String& name) 148 void URLSearchParams::deleteAllWithName(const String& name)
119 { 149 {
120 for (size_t i = 0; i < m_params.size();) { 150 for (size_t i = 0; i < m_params.size();) {
121 if (m_params[i].first == name) 151 if (m_params[i].first == name)
122 m_params.remove(i); 152 m_params.remove(i);
123 else 153 else
124 i++; 154 i++;
125 } 155 }
156 runUpdateSteps();
126 } 157 }
127 158
128 String URLSearchParams::get(const String& name) const 159 String URLSearchParams::get(const String& name) const
129 { 160 {
130 for (const auto& param : m_params) { 161 for (const auto& param : m_params) {
131 if (param.first == name) 162 if (param.first == name)
132 return param.second; 163 return param.second;
133 } 164 }
134 return String(); 165 return String();
135 } 166 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 } else { 198 } else {
168 m_params.remove(i); 199 m_params.remove(i);
169 } 200 }
170 } else { 201 } else {
171 i++; 202 i++;
172 } 203 }
173 } 204 }
174 // Otherwise, append a new name-value pair to the list. 205 // Otherwise, append a new name-value pair to the list.
175 if (!foundMatch) 206 if (!foundMatch)
176 append(name, value); 207 append(name, value);
208 else
209 runUpdateSteps();
177 } 210 }
178 211
179 PassRefPtr<EncodedFormData> URLSearchParams::encodeFormData() const 212 PassRefPtr<EncodedFormData> URLSearchParams::encodeFormData() const
180 { 213 {
181 Vector<char> encodedData; 214 Vector<char> encodedData;
182 for (const auto& param : m_params) 215 for (const auto& param : m_params)
183 FormDataEncoder::addKeyValuePairAsFormData(encodedData, param.first.utf8 (), param.second.utf8(), EncodedFormData::FormURLEncoded); 216 FormDataEncoder::addKeyValuePairAsFormData(encodedData, param.first.utf8 (), param.second.utf8(), EncodedFormData::FormURLEncoded);
184 return EncodedFormData::create(encodedData.data(), encodedData.size()); 217 return EncodedFormData::create(encodedData.data(), encodedData.size());
185 } 218 }
186 219
187 DEFINE_TRACE(URLSearchParams)
188 {
189 }
190
191 PairIterable<String, String>::IterationSource* URLSearchParams::startIteration(S criptState*, ExceptionState&) 220 PairIterable<String, String>::IterationSource* URLSearchParams::startIteration(S criptState*, ExceptionState&)
192 { 221 {
193 return new URLSearchParamsIterationSource(m_params); 222 return new URLSearchParamsIterationSource(m_params);
194 } 223 }
195 224
196 } // namespace blink 225 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698