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