Index: Source/core/dom/DOMURLUtils.cpp |
diff --git a/Source/core/dom/DOMURLUtils.cpp b/Source/core/dom/DOMURLUtils.cpp |
index a3940bb17a5eedd78cfd3d168fbf4fccb1bab973..7b983e388fa4b1772ae075c481332e8760b69203 100644 |
--- a/Source/core/dom/DOMURLUtils.cpp |
+++ b/Source/core/dom/DOMURLUtils.cpp |
@@ -27,10 +27,24 @@ |
#include "config.h" |
#include "core/dom/DOMURLUtils.h" |
+#include "bindings/core/v8/ExceptionState.h" |
+#if !URLUTILS_SUPPORTS_SEARCHPARAMS |
+#include "core/dom/ExceptionCode.h" |
+#endif |
#include "platform/weborigin/KnownPorts.h" |
+#include "wtf/PassOwnPtr.h" |
namespace blink { |
+DOMURLUtils::~DOMURLUtils() |
+{ |
+} |
+ |
+void DOMURLUtils::update() |
+{ |
+ updateSearchParams(url().query()); |
+} |
+ |
void DOMURLUtils::setHref(const String& value) |
{ |
setInput(value); |
@@ -118,6 +132,16 @@ void DOMURLUtils::setPathname(const String& value) |
void DOMURLUtils::setSearch(const String& value) |
{ |
+ setQuery(value); |
+ |
+ if (!value.isEmpty() && value[0] == '?') |
+ updateSearchParams(value.substring(1)); |
+ else |
+ updateSearchParams(value); |
+} |
+ |
+void DOMURLUtils::setQuery(const String& value) |
+{ |
KURL kurl = url(); |
if (!kurl.isValid()) |
return; |
@@ -139,4 +163,67 @@ void DOMURLUtils::setHash(const String& value) |
setURL(kurl); |
} |
+DOMURLSearchParams* DOMURLUtils::searchParams() |
+{ |
+#if URLUTILS_SUPPORTS_SEARCHPARAMS |
+ if (!m_searchParams) |
+ createSearchParams(url().query()); |
+ return m_searchParams.get(); |
+#else |
+ // To make testing a bit more regular, return an object. |
+ return DOMURLSearchParams::create(url().query()); |
+#endif |
+} |
+ |
+void DOMURLUtils::createSearchParams(const String& queryString) |
+{ |
+#if URLUTILS_SUPPORTS_SEARCHPARAMS |
+ if (!m_searchParams) |
+ m_searchParams = DOMURLSearchParams::create(queryString, this); |
+ else |
+ updateSearchParams(queryString); |
+#endif |
+} |
+ |
+void DOMURLUtils::updateSearchParams(const String& queryString) |
+{ |
+#if URLUTILS_SUPPORTS_SEARCHPARAMS |
+ if (!m_searchParams) |
+ return; |
+ |
+ ASSERT(m_searchParams->hasURLObject(this)); |
+ m_searchParams->setInput(queryString); |
+#endif |
+} |
+ |
+void DOMURLUtils::setSearchParams(DOMURLSearchParams* searchParams, ExceptionState& exceptionState) |
+{ |
+#if URLUTILS_SUPPORTS_SEARCHPARAMS |
+ if (!searchParams) { |
+ exceptionState.throwTypeError("Value is not an URLSearchParams object."); |
+ return; |
+ } |
+ // Remove ourselves from current query object's list of URL objects. |
+ if (m_searchParams) |
+ m_searchParams->dropURLObject(this); |
+ |
+ searchParams->addURLObject(this); |
+ m_searchParams = searchParams; |
+ |
+ const String& query = searchParams->toString(); |
+ setQuery(query); |
+ // NOTE: the spec currently has an idempotent 'update step' after setting |
+ // the query. Left out here. |
+#else |
+ exceptionState.throwDOMException(NotSupportedError, "Updating searchParams is not supported."); |
+#endif |
+} |
+ |
+void DOMURLUtils::trace(Visitor* visitor) |
+{ |
+#if URLUTILS_SUPPORTS_SEARCHPARAMS |
+ visitor->trace(m_searchParams); |
+#endif |
+} |
+ |
} // namespace blink |