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 "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 Loading... |
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 Loading... |
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 |
OLD | NEW |