c252b20a18a113b9ed0db3a78425c313c69d5314
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / frame / Location.cpp
1 /*
2  * Copyright (C) 2008, 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "config.h"
30 #include "core/frame/Location.h"
31
32 #include "bindings/v8/ExceptionState.h"
33 #include "core/dom/DOMURLUtilsReadOnly.h"
34 #include "core/dom/Document.h"
35 #include "core/dom/ExceptionCode.h"
36 #include "core/frame/DOMWindow.h"
37 #include "core/frame/LocalFrame.h"
38 #include "core/loader/FrameLoader.h"
39 #include "platform/weborigin/KURL.h"
40 #include "platform/weborigin/SecurityOrigin.h"
41
42 namespace WebCore {
43
44 Location::Location(LocalFrame* frame)
45     : DOMWindowProperty(frame)
46 {
47     ScriptWrappable::init(this);
48 }
49
50 inline const KURL& Location::url() const
51 {
52     ASSERT(m_frame);
53
54     const KURL& url = m_frame->document()->url();
55     if (!url.isValid())
56         return blankURL(); // Use "about:blank" while the page is still loading (before we have a frame).
57
58     return url;
59 }
60
61 String Location::href() const
62 {
63     if (!m_frame)
64         return String();
65
66     return url().string();
67 }
68
69 String Location::protocol() const
70 {
71     if (!m_frame)
72         return String();
73     return DOMURLUtilsReadOnly::protocol(url());
74 }
75
76 String Location::host() const
77 {
78     if (!m_frame)
79         return String();
80     return DOMURLUtilsReadOnly::host(url());
81 }
82
83 String Location::hostname() const
84 {
85     if (!m_frame)
86         return String();
87     return DOMURLUtilsReadOnly::hostname(url());
88 }
89
90 String Location::port() const
91 {
92     if (!m_frame)
93         return String();
94     return DOMURLUtilsReadOnly::port(url());
95 }
96
97 String Location::pathname() const
98 {
99     if (!m_frame)
100         return String();
101     return DOMURLUtilsReadOnly::pathname(url());
102 }
103
104 String Location::search() const
105 {
106     if (!m_frame)
107         return String();
108     return DOMURLUtilsReadOnly::search(url());
109 }
110
111 String Location::origin() const
112 {
113     if (!m_frame)
114         return String();
115     return DOMURLUtilsReadOnly::origin(url());
116 }
117
118 PassRefPtrWillBeRawPtr<DOMStringList> Location::ancestorOrigins() const
119 {
120     RefPtrWillBeRawPtr<DOMStringList> origins = DOMStringList::create();
121     if (!m_frame)
122         return origins.release();
123     for (LocalFrame* frame = m_frame->tree().parent(); frame; frame = frame->tree().parent())
124         origins->append(frame->document()->securityOrigin()->toString());
125     return origins.release();
126 }
127
128 String Location::hash() const
129 {
130     if (!m_frame)
131         return String();
132
133     return DOMURLUtilsReadOnly::hash(url());
134 }
135
136 void Location::setHref(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& url)
137 {
138     if (!m_frame)
139         return;
140     setLocation(url, callingWindow, enteredWindow);
141 }
142
143 void Location::setProtocol(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& protocol, ExceptionState& exceptionState)
144 {
145     if (!m_frame)
146         return;
147     KURL url = m_frame->document()->url();
148     if (!url.setProtocol(protocol)) {
149         exceptionState.throwDOMException(SyntaxError, "'" + protocol + "' is an invalid protocol.");
150         return;
151     }
152     setLocation(url.string(), callingWindow, enteredWindow);
153 }
154
155 void Location::setHost(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& host)
156 {
157     if (!m_frame)
158         return;
159     KURL url = m_frame->document()->url();
160     url.setHostAndPort(host);
161     setLocation(url.string(), callingWindow, enteredWindow);
162 }
163
164 void Location::setHostname(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& hostname)
165 {
166     if (!m_frame)
167         return;
168     KURL url = m_frame->document()->url();
169     url.setHost(hostname);
170     setLocation(url.string(), callingWindow, enteredWindow);
171 }
172
173 void Location::setPort(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& portString)
174 {
175     if (!m_frame)
176         return;
177     KURL url = m_frame->document()->url();
178     url.setPort(portString);
179     setLocation(url.string(), callingWindow, enteredWindow);
180 }
181
182 void Location::setPathname(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& pathname)
183 {
184     if (!m_frame)
185         return;
186     KURL url = m_frame->document()->url();
187     url.setPath(pathname);
188     setLocation(url.string(), callingWindow, enteredWindow);
189 }
190
191 void Location::setSearch(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& search)
192 {
193     if (!m_frame)
194         return;
195     KURL url = m_frame->document()->url();
196     url.setQuery(search);
197     setLocation(url.string(), callingWindow, enteredWindow);
198 }
199
200 void Location::setHash(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& hash)
201 {
202     if (!m_frame)
203         return;
204     KURL url = m_frame->document()->url();
205     String oldFragmentIdentifier = url.fragmentIdentifier();
206     String newFragmentIdentifier = hash;
207     if (hash[0] == '#')
208         newFragmentIdentifier = hash.substring(1);
209     url.setFragmentIdentifier(newFragmentIdentifier);
210     // Note that by parsing the URL and *then* comparing fragments, we are
211     // comparing fragments post-canonicalization, and so this handles the
212     // cases where fragment identifiers are ignored or invalid.
213     if (equalIgnoringNullity(oldFragmentIdentifier, url.fragmentIdentifier()))
214         return;
215     setLocation(url.string(), callingWindow, enteredWindow);
216 }
217
218 void Location::assign(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& url)
219 {
220     if (!m_frame)
221         return;
222     setLocation(url, callingWindow, enteredWindow);
223 }
224
225 void Location::replace(DOMWindow* callingWindow, DOMWindow* enteredWindow, const String& url)
226 {
227     if (!m_frame)
228         return;
229     // Note: We call DOMWindow::setLocation directly here because replace() always operates on the current frame.
230     m_frame->domWindow()->setLocation(url, callingWindow, enteredWindow, LockHistoryAndBackForwardList);
231 }
232
233 void Location::reload(DOMWindow* callingWindow)
234 {
235     if (!m_frame)
236         return;
237     if (protocolIsJavaScript(m_frame->document()->url()))
238         return;
239     m_frame->navigationScheduler().scheduleRefresh();
240 }
241
242 void Location::setLocation(const String& url, DOMWindow* callingWindow, DOMWindow* enteredWindow)
243 {
244     ASSERT(m_frame);
245     LocalFrame* frame = m_frame->loader().findFrameForNavigation(nullAtom, callingWindow->document());
246     if (!frame)
247         return;
248     frame->domWindow()->setLocation(url, callingWindow, enteredWindow);
249 }
250
251 } // namespace WebCore