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

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: rebased 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 DCHECK(init.isNull()); 46 DCHECK(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 DCHECK(searchParams); 59 DCHECK(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 if (m_urlObject->isInUpdate())
85 return;
86
87 m_urlObject->setSearchInternal(toString());
88 }
89
65 static String decodeString(String input) 90 static String decodeString(String input)
66 { 91 {
67 return decodeURLEscapeSequences(input.replace('+', ' ')); 92 return decodeURLEscapeSequences(input.replace('+', ' '));
68 } 93 }
69 94
70 void URLSearchParams::setInput(const String& queryString) 95 void URLSearchParams::setInput(const String& queryString)
71 { 96 {
72 DCHECK(m_params.isEmpty()); 97 m_params.clear();
98
73 size_t start = 0; 99 size_t start = 0;
74 size_t queryStringLength = queryString.length(); 100 size_t queryStringLength = queryString.length();
75 while (start < queryStringLength) { 101 while (start < queryStringLength) {
76 size_t nameStart = start; 102 size_t nameStart = start;
77 size_t nameValueEnd = queryString.find('&', start); 103 size_t nameValueEnd = queryString.find('&', start);
78 if (nameValueEnd == kNotFound) 104 if (nameValueEnd == kNotFound)
79 nameValueEnd = queryStringLength; 105 nameValueEnd = queryStringLength;
80 if (nameValueEnd > start) { 106 if (nameValueEnd > start) {
81 size_t endOfName = queryString.find('=', start); 107 size_t endOfName = queryString.find('=', start);
82 if (endOfName == kNotFound || endOfName > nameValueEnd) 108 if (endOfName == kNotFound || endOfName > nameValueEnd)
83 endOfName = nameValueEnd; 109 endOfName = nameValueEnd;
84 String name = decodeString(queryString.substring(nameStart, endOfNam e - nameStart)); 110 String name = decodeString(queryString.substring(nameStart, endOfNam e - nameStart));
85 String value; 111 String value;
86 if (endOfName != nameValueEnd) 112 if (endOfName != nameValueEnd)
87 value = decodeString(queryString.substring(endOfName + 1, nameVa lueEnd - endOfName - 1)); 113 value = decodeString(queryString.substring(endOfName + 1, nameVa lueEnd - endOfName - 1));
88 if (value.isNull()) 114 if (value.isNull())
89 value = ""; 115 value = "";
90 m_params.append(std::make_pair(name, value)); 116 m_params.append(std::make_pair(name, value));
91 } 117 }
92 start = nameValueEnd + 1; 118 start = nameValueEnd + 1;
93 } 119 }
120 runUpdateSteps();
94 } 121 }
122
95 static String encodeString(const String& input) 123 static String encodeString(const String& input)
96 { 124 {
97 return encodeWithURLEscapeSequences(input).replace("%20", "+"); 125 return encodeWithURLEscapeSequences(input).replace("%20", "+");
98 } 126 }
99 127
100 String URLSearchParams::toString() const 128 String URLSearchParams::toString() const
101 { 129 {
102 StringBuilder result; 130 StringBuilder result;
103 for (size_t i = 0; i < m_params.size(); ++i) { 131 for (size_t i = 0; i < m_params.size(); ++i) {
104 if (i) 132 if (i)
105 result.append('&'); 133 result.append('&');
106 result.append(encodeString(m_params[i].first)); 134 result.append(encodeString(m_params[i].first));
107 result.append('='); 135 result.append('=');
108 result.append(encodeString(m_params[i].second)); 136 result.append(encodeString(m_params[i].second));
109 } 137 }
110 return result.toString(); 138 return result.toString();
111 } 139 }
112 140
113 void URLSearchParams::append(const String& name, const String& value) 141 void URLSearchParams::append(const String& name, const String& value)
114 { 142 {
115 m_params.append(std::make_pair(name, value)); 143 m_params.append(std::make_pair(name, value));
144 runUpdateSteps();
116 } 145 }
117 146
118 void URLSearchParams::deleteAllWithName(const String& name) 147 void URLSearchParams::deleteAllWithName(const String& name)
119 { 148 {
120 for (size_t i = 0; i < m_params.size();) { 149 for (size_t i = 0; i < m_params.size();) {
121 if (m_params[i].first == name) 150 if (m_params[i].first == name)
122 m_params.remove(i); 151 m_params.remove(i);
123 else 152 else
124 i++; 153 i++;
125 } 154 }
155 runUpdateSteps();
126 } 156 }
127 157
128 String URLSearchParams::get(const String& name) const 158 String URLSearchParams::get(const String& name) const
129 { 159 {
130 for (const auto& param : m_params) { 160 for (const auto& param : m_params) {
131 if (param.first == name) 161 if (param.first == name)
132 return param.second; 162 return param.second;
133 } 163 }
134 return String(); 164 return String();
135 } 165 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 } else { 197 } else {
168 m_params.remove(i); 198 m_params.remove(i);
169 } 199 }
170 } else { 200 } else {
171 i++; 201 i++;
172 } 202 }
173 } 203 }
174 // Otherwise, append a new name-value pair to the list. 204 // Otherwise, append a new name-value pair to the list.
175 if (!foundMatch) 205 if (!foundMatch)
176 append(name, value); 206 append(name, value);
207 else
208 runUpdateSteps();
177 } 209 }
178 210
179 PassRefPtr<EncodedFormData> URLSearchParams::encodeFormData() const 211 PassRefPtr<EncodedFormData> URLSearchParams::encodeFormData() const
180 { 212 {
181 Vector<char> encodedData; 213 Vector<char> encodedData;
182 for (const auto& param : m_params) 214 for (const auto& param : m_params)
183 FormDataEncoder::addKeyValuePairAsFormData(encodedData, param.first.utf8 (), param.second.utf8(), EncodedFormData::FormURLEncoded); 215 FormDataEncoder::addKeyValuePairAsFormData(encodedData, param.first.utf8 (), param.second.utf8(), EncodedFormData::FormURLEncoded);
184 return EncodedFormData::create(encodedData.data(), encodedData.size()); 216 return EncodedFormData::create(encodedData.data(), encodedData.size());
185 } 217 }
186 218
187 DEFINE_TRACE(URLSearchParams)
188 {
189 }
190
191 PairIterable<String, String>::IterationSource* URLSearchParams::startIteration(S criptState*, ExceptionState&) 219 PairIterable<String, String>::IterationSource* URLSearchParams::startIteration(S criptState*, ExceptionState&)
192 { 220 {
193 return new URLSearchParamsIterationSource(m_params); 221 return new URLSearchParamsIterationSource(m_params);
194 } 222 }
195 223
196 } // namespace blink 224 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/URLSearchParams.h ('k') | third_party/WebKit/Source/core/dom/URLUtils.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698