1/*
2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * Copyright (C) 2012 Motorola Mobility Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1.  Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 * 2.  Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
19 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "config.h"
28#include "core/dom/DOMURLUtils.h"
29
30#include "platform/weborigin/KnownPorts.h"
31
32namespace blink {
33
34void DOMURLUtils::setHref(const String& value)
35{
36    setInput(value);
37}
38
39void DOMURLUtils::setProtocol(const String& value)
40{
41    KURL kurl = url();
42    if (kurl.isNull())
43        return;
44    kurl.setProtocol(value);
45    setURL(kurl);
46}
47
48void DOMURLUtils::setUsername(const String& value)
49{
50    KURL kurl = url();
51    if (kurl.isNull())
52        return;
53    kurl.setUser(value);
54    setURL(kurl);
55}
56
57void DOMURLUtils::setPassword(const String& value)
58{
59    KURL kurl = url();
60    if (kurl.isNull())
61        return;
62    kurl.setPass(value);
63    setURL(kurl);
64}
65
66void DOMURLUtils::setHost(const String& value)
67{
68    if (value.isEmpty())
69        return;
70
71    KURL kurl = url();
72    if (!kurl.canSetHostOrPort())
73        return;
74
75    kurl.setHostAndPort(value);
76    setURL(kurl);
77}
78
79void DOMURLUtils::setHostname(const String& value)
80{
81    KURL kurl = url();
82    if (!kurl.canSetHostOrPort())
83        return;
84
85    // Before setting new value:
86    // Remove all leading U+002F SOLIDUS ("/") characters.
87    unsigned i = 0;
88    unsigned hostLength = value.length();
89    while (value[i] == '/')
90        i++;
91
92    if (i == hostLength)
93        return;
94
95    kurl.setHost(value.substring(i));
96
97    setURL(kurl);
98}
99
100void DOMURLUtils::setPort(const String& value)
101{
102    KURL kurl = url();
103    if (!kurl.canSetHostOrPort())
104        return;
105
106    kurl.setPort(value);
107    setURL(kurl);
108}
109
110void DOMURLUtils::setPathname(const String& value)
111{
112    KURL kurl = url();
113    if (!kurl.canSetPathname())
114        return;
115    kurl.setPath(value);
116    setURL(kurl);
117}
118
119void DOMURLUtils::setSearch(const String& value)
120{
121    KURL kurl = url();
122    if (!kurl.isValid())
123        return;
124
125    // FIXME: have KURL do this clearing of the query component
126    // instead, if practical. Will require addressing
127    // http://crbug.com/108690, for one.
128    if (value[0] == '?')
129        kurl.setQuery(value.length() == 1 ? String() : value.substring(1));
130    else
131        kurl.setQuery(value.isEmpty() ? String() : value);
132
133    setURL(kurl);
134}
135
136void DOMURLUtils::setHash(const String& value)
137{
138    KURL kurl = url();
139    if (kurl.isNull())
140        return;
141
142    // FIXME: have KURL handle the clearing of the fragment component
143    // on the same input.
144    if (value[0] == '#')
145        kurl.setFragmentIdentifier(value.length() == 1 ? String() : value.substring(1));
146    else
147        kurl.setFragmentIdentifier(value.isEmpty() ? String() : value);
148
149    setURL(kurl);
150}
151
152} // namespace blink
153