| Index: Source/core/dom/DOMURLSearchParams.cpp
|
| diff --git a/Source/core/dom/DOMURLSearchParams.cpp b/Source/core/dom/DOMURLSearchParams.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f4d8a36b0b55761907da6c6ac6b2d2336a53e031
|
| --- /dev/null
|
| +++ b/Source/core/dom/DOMURLSearchParams.cpp
|
| @@ -0,0 +1,212 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "config.h"
|
| +#include "core/dom/DOMURLSearchParams.h"
|
| +
|
| +#include "core/dom/DOMURLUtils.h"
|
| +#include "platform/weborigin/KURL.h"
|
| +#include "wtf/text/StringBuilder.h"
|
| +#include "wtf/text/TextEncoding.h"
|
| +
|
| +namespace blink {
|
| +
|
| +DOMURLSearchParams::DOMURLSearchParams(const String& queryString, DOMURLUtils* urlObject)
|
| + : m_isUpdating(false)
|
| +{
|
| + ScriptWrappable::init(this);
|
| + if (!queryString.isEmpty())
|
| + setInput(queryString);
|
| + if (urlObject)
|
| + addURLObject(urlObject);
|
| +}
|
| +
|
| +DOMURLSearchParams::DOMURLSearchParams(DOMURLSearchParams* searchParams, DOMURLUtils* urlObject)
|
| + : m_isUpdating(false)
|
| +{
|
| + ScriptWrappable::init(this);
|
| + ASSERT(searchParams);
|
| + m_params = searchParams->m_params;
|
| + if (urlObject)
|
| + addURLObject(urlObject);
|
| +}
|
| +
|
| +DOMURLSearchParams::~DOMURLSearchParams()
|
| +{
|
| +}
|
| +
|
| +void DOMURLSearchParams::dropURLObject(DOMURLUtils* urlObject)
|
| +{
|
| + for (unsigned i = 0; i < m_urlObjects.size(); i++) {
|
| + if (m_urlObjects[i] == urlObject) {
|
| + m_urlObjects.remove(i);
|
| + return;
|
| + }
|
| + }
|
| +}
|
| +
|
| +void DOMURLSearchParams::addURLObject(DOMURLUtils* urlObject)
|
| +{
|
| +#if URLUTILS_SUPPORTS_SEARCHPARAMS
|
| + for (unsigned i = 0; i < m_urlObjects.size(); i++) {
|
| + if (m_urlObjects[i] == urlObject)
|
| + return;
|
| + }
|
| + m_urlObjects.append(urlObject);
|
| +#endif
|
| +}
|
| +
|
| +#if ENABLE(ASSERT)
|
| +bool DOMURLSearchParams::hasURLObject(DOMURLUtils* urlObject) const
|
| +{
|
| + return m_urlObjects.contains(urlObject);
|
| +}
|
| +#endif
|
| +
|
| +void DOMURLSearchParams::runUpdateSteps()
|
| +{
|
| + if (m_urlObjects.size()) {
|
| + m_isUpdating = true;
|
| + const String& query = toString();
|
| + for (unsigned i = 0; i < m_urlObjects.size(); i++)
|
| + m_urlObjects[i]->setQuery(query);
|
| + m_isUpdating = false;
|
| + }
|
| +}
|
| +
|
| +static String decodeString(String input)
|
| +{
|
| + return decodeURLEscapeSequences(input.replace('+', ' '));
|
| +}
|
| +
|
| +void DOMURLSearchParams::setInput(const String& queryString)
|
| +{
|
| + if (m_isUpdating)
|
| + return;
|
| +
|
| + m_params.clear();
|
| + unsigned start = 0;
|
| + unsigned queryStringLength = queryString.length();
|
| + while (start < queryStringLength) {
|
| + size_t nameStart = start;
|
| + size_t nameValueEnd = queryString.find('&', start);
|
| + if (nameValueEnd == kNotFound)
|
| + nameValueEnd = queryStringLength;
|
| +
|
| + if (nameValueEnd > start) {
|
| + size_t endOfName = queryString.find('=', start);
|
| +
|
| + if (endOfName == kNotFound || endOfName > nameValueEnd)
|
| + endOfName = nameValueEnd;
|
| +
|
| + String name = decodeString(queryString.substring(nameStart, endOfName - nameStart));
|
| + String value;
|
| + if (endOfName != nameValueEnd)
|
| + value = decodeString(queryString.substring(endOfName + 1, nameValueEnd - endOfName - 1));
|
| + if (value.isNull())
|
| + value = "";
|
| +
|
| + m_params.append(std::make_pair(name, value));
|
| + }
|
| + start = nameValueEnd + 1;
|
| + }
|
| + runUpdateSteps();
|
| +}
|
| +
|
| +static String encodeString(const String& input)
|
| +{
|
| + return encodeWithURLEscapeSequences(input).replace("%20", "+");
|
| +}
|
| +
|
| +String DOMURLSearchParams::toString() const
|
| +{
|
| + StringBuilder result;
|
| + for (unsigned i = 0; i < m_params.size(); ++i) {
|
| + if (i)
|
| + result.append('&');
|
| + result.append(encodeString(m_params[i].first));
|
| + result.append('=');
|
| + result.append(encodeString(m_params[i].second));
|
| + }
|
| + return result.toString();
|
| +}
|
| +
|
| +void DOMURLSearchParams::append(const String& name, const String& value)
|
| +{
|
| + m_params.append(std::make_pair(name, value));
|
| + runUpdateSteps();
|
| +}
|
| +
|
| +void DOMURLSearchParams::deleteAllWithName(const String& name)
|
| +{
|
| + for (unsigned i = 0; i < m_params.size();) {
|
| + if (m_params[i].first == name)
|
| + m_params.remove(i);
|
| + else
|
| + i++;
|
| + }
|
| + runUpdateSteps();
|
| +}
|
| +
|
| +String DOMURLSearchParams::get(const String& name) const
|
| +{
|
| + for (Vector<std::pair<String, String> >::const_iterator it = m_params.begin(); it != m_params.end(); ++it) {
|
| + if (it->first == name)
|
| + return it->second;
|
| + }
|
| + return String();
|
| +}
|
| +
|
| +Vector<String> DOMURLSearchParams::getAll(const String& name) const
|
| +{
|
| + Vector<String> result;
|
| + for (Vector<std::pair<String, String> >::const_iterator it = m_params.begin(); it != m_params.end(); ++it) {
|
| + if (it->first == name)
|
| + result.append(it->second);
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +bool DOMURLSearchParams::has(const String& name) const
|
| +{
|
| + for (Vector<std::pair<String, String> >::const_iterator it = m_params.begin(); it != m_params.end(); ++it) {
|
| + if (it->first == name)
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +void DOMURLSearchParams::set(const String& name, const String& value)
|
| +{
|
| + bool foundMatch = false;
|
| + for (unsigned i = 0; i < m_params.size();) {
|
| + // If there are any name-value whose name is 'name', set
|
| + // the value of the first such name-value pair to 'value'
|
| + // and remove the others.
|
| + if (m_params[i].first == name) {
|
| + if (!foundMatch) {
|
| + m_params[i++].second = value;
|
| + foundMatch = true;
|
| + } else {
|
| + m_params.remove(i);
|
| + }
|
| + } else {
|
| + i++;
|
| + }
|
| + }
|
| + // Otherwise, append a new name-value pair to the list.
|
| + if (!foundMatch)
|
| + append(name, value);
|
| + else
|
| + runUpdateSteps();
|
| +}
|
| +
|
| +void DOMURLSearchParams::trace(Visitor* visitor)
|
| +{
|
| +#if URLUTILS_SUPPORTS_SEARCHPARAMS
|
| + visitor->trace(m_urlObjects);
|
| +#endif
|
| +}
|
| +
|
| +} // namespace blink
|
|
|