Chromium Code Reviews| Index: third_party/WebKit/Source/core/frame/Location.cpp |
| diff --git a/third_party/WebKit/Source/core/frame/Location.cpp b/third_party/WebKit/Source/core/frame/Location.cpp |
| index 44ee66158ca6d2d1ee27a680c3c4859315fc61e7..d030155cb7043e5f3ab4b6180a5122315cf081e1 100644 |
| --- a/third_party/WebKit/Source/core/frame/Location.cpp |
| +++ b/third_party/WebKit/Source/core/frame/Location.cpp |
| @@ -34,6 +34,7 @@ |
| #include "core/dom/DOMURLUtilsReadOnly.h" |
| #include "core/dom/Document.h" |
| #include "core/dom/ExceptionCode.h" |
| +#include "core/frame/DOMWindow.h" |
| #include "core/frame/LocalDOMWindow.h" |
| #include "core/frame/LocalFrame.h" |
| #include "core/loader/FrameLoader.h" |
| @@ -43,14 +44,14 @@ |
| namespace blink { |
| -Location::Location(Frame* frame) : m_frame(frame) {} |
| +Location::Location(DOMWindow* domWindow) : m_domWindow(domWindow) {} |
| DEFINE_TRACE(Location) { |
| - visitor->trace(m_frame); |
| + visitor->trace(m_domWindow); |
| } |
| inline const KURL& Location::url() const { |
| - const KURL& url = toLocalFrame(m_frame)->document()->url(); |
| + const KURL& url = document()->url(); |
| if (!url.isValid()) { |
| // Use "about:blank" while the page is still loading (before we have a |
| // frame). |
| @@ -61,59 +62,42 @@ inline const KURL& Location::url() const { |
| } |
| String Location::href() const { |
| - if (!m_frame) |
| - return String(); |
| - |
| return url().strippedForUseAsHref(); |
| } |
| String Location::protocol() const { |
| - if (!m_frame) |
| - return String(); |
| return DOMURLUtilsReadOnly::protocol(url()); |
| } |
| String Location::host() const { |
| - if (!m_frame) |
| - return String(); |
| return DOMURLUtilsReadOnly::host(url()); |
| } |
| String Location::hostname() const { |
| - if (!m_frame) |
| - return String(); |
| return DOMURLUtilsReadOnly::hostname(url()); |
| } |
| String Location::port() const { |
| - if (!m_frame) |
| - return String(); |
| return DOMURLUtilsReadOnly::port(url()); |
| } |
| String Location::pathname() const { |
| - if (!m_frame) |
| - return String(); |
| return DOMURLUtilsReadOnly::pathname(url()); |
| } |
| String Location::search() const { |
| - if (!m_frame) |
| - return String(); |
| return DOMURLUtilsReadOnly::search(url()); |
| } |
| String Location::origin() const { |
| - if (!m_frame) |
| - return String(); |
| return DOMURLUtilsReadOnly::origin(url()); |
| } |
| DOMStringList* Location::ancestorOrigins() const { |
| DOMStringList* origins = DOMStringList::create(); |
| - if (!m_frame) |
| + if (!isAttached()) |
| return origins; |
| - for (Frame* frame = m_frame->tree().parent(); frame; |
| + for (Frame* frame = m_domWindow->frame()->tree().parent(); frame; |
| frame = frame->tree().parent()) { |
| origins->append(frame->securityContext()->getSecurityOrigin()->toString()); |
| } |
| @@ -121,9 +105,6 @@ DOMStringList* Location::ancestorOrigins() const { |
| } |
| String Location::hash() const { |
| - if (!m_frame) |
| - return String(); |
| - |
| return DOMURLUtilsReadOnly::hash(url()); |
| } |
| @@ -131,8 +112,6 @@ void Location::setHref(LocalDOMWindow* currentWindow, |
| LocalDOMWindow* enteredWindow, |
| const String& url, |
| ExceptionState& exceptionState) { |
| - if (!m_frame) |
| - return; |
| setLocation(url, currentWindow, enteredWindow, &exceptionState); |
| } |
| @@ -140,9 +119,7 @@ void Location::setProtocol(LocalDOMWindow* currentWindow, |
| LocalDOMWindow* enteredWindow, |
| const String& protocol, |
| ExceptionState& exceptionState) { |
| - if (!m_frame) |
|
dcheng
2017/02/20 08:32:58
I opted to move these checks all into setLocation(
|
| - return; |
| - KURL url = toLocalFrame(m_frame)->document()->url(); |
| + KURL url = document()->url(); |
| if (!url.setProtocol(protocol)) { |
| exceptionState.throwDOMException( |
| SyntaxError, "'" + protocol + "' is an invalid protocol."); |
| @@ -155,9 +132,7 @@ void Location::setHost(LocalDOMWindow* currentWindow, |
| LocalDOMWindow* enteredWindow, |
| const String& host, |
| ExceptionState& exceptionState) { |
| - if (!m_frame) |
| - return; |
| - KURL url = toLocalFrame(m_frame)->document()->url(); |
| + KURL url = document()->url(); |
| url.setHostAndPort(host); |
| setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState); |
| } |
| @@ -166,9 +141,7 @@ void Location::setHostname(LocalDOMWindow* currentWindow, |
| LocalDOMWindow* enteredWindow, |
| const String& hostname, |
| ExceptionState& exceptionState) { |
| - if (!m_frame) |
| - return; |
| - KURL url = toLocalFrame(m_frame)->document()->url(); |
| + KURL url = document()->url(); |
| url.setHost(hostname); |
| setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState); |
| } |
| @@ -177,9 +150,7 @@ void Location::setPort(LocalDOMWindow* currentWindow, |
| LocalDOMWindow* enteredWindow, |
| const String& portString, |
| ExceptionState& exceptionState) { |
| - if (!m_frame) |
| - return; |
| - KURL url = toLocalFrame(m_frame)->document()->url(); |
| + KURL url = document()->url(); |
| url.setPort(portString); |
| setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState); |
| } |
| @@ -188,9 +159,7 @@ void Location::setPathname(LocalDOMWindow* currentWindow, |
| LocalDOMWindow* enteredWindow, |
| const String& pathname, |
| ExceptionState& exceptionState) { |
| - if (!m_frame) |
| - return; |
| - KURL url = toLocalFrame(m_frame)->document()->url(); |
| + KURL url = document()->url(); |
| url.setPath(pathname); |
| setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState); |
| } |
| @@ -199,9 +168,7 @@ void Location::setSearch(LocalDOMWindow* currentWindow, |
| LocalDOMWindow* enteredWindow, |
| const String& search, |
| ExceptionState& exceptionState) { |
| - if (!m_frame) |
| - return; |
| - KURL url = toLocalFrame(m_frame)->document()->url(); |
| + KURL url = document()->url(); |
| url.setQuery(search); |
| setLocation(url.getString(), currentWindow, enteredWindow, &exceptionState); |
| } |
| @@ -211,9 +178,7 @@ void Location::setHash(LocalDOMWindow* currentWindow, |
| const String& hash, |
| ExceptionState& exceptionState) { |
| TRACE_EVENT0("blink", "Location::setHash"); |
| - if (!m_frame) |
| - return; |
| - KURL url = toLocalFrame(m_frame)->document()->url(); |
| + KURL url = document()->url(); |
| String oldFragmentIdentifier = url.fragmentIdentifier(); |
| String newFragmentIdentifier = hash; |
| if (hash[0] == '#') |
| @@ -239,8 +204,6 @@ void Location::assign(LocalDOMWindow* currentWindow, |
| return; |
| } |
| - if (!m_frame) |
| - return; |
| setLocation(url, currentWindow, enteredWindow, &exceptionState); |
| } |
| @@ -248,22 +211,21 @@ void Location::replace(LocalDOMWindow* currentWindow, |
| LocalDOMWindow* enteredWindow, |
| const String& url, |
| ExceptionState& exceptionState) { |
| - if (!m_frame) |
| - return; |
| setLocation(url, currentWindow, enteredWindow, &exceptionState, |
| SetLocationPolicy::ReplaceThisFrame); |
| } |
| void Location::reload(LocalDOMWindow* currentWindow) { |
| - if (!m_frame) |
| + if (!isAttached()) |
| return; |
| - if (toLocalFrame(m_frame)->document()->url().protocolIsJavaScript()) |
| + if (document()->url().protocolIsJavaScript()) |
| return; |
| FrameLoadType reloadType = |
| RuntimeEnabledFeatures::fasterLocationReloadEnabled() |
| ? FrameLoadTypeReloadMainResource |
| : FrameLoadTypeReload; |
| - m_frame->reload(reloadType, ClientRedirectPolicy::ClientRedirect); |
| + m_domWindow->frame()->reload(reloadType, |
| + ClientRedirectPolicy::ClientRedirect); |
| } |
| void Location::setLocation(const String& url, |
| @@ -271,14 +233,13 @@ void Location::setLocation(const String& url, |
| LocalDOMWindow* enteredWindow, |
| ExceptionState* exceptionState, |
| SetLocationPolicy setLocationPolicy) { |
| - DCHECK(m_frame); |
| - if (!m_frame || !m_frame->host()) |
| + if (!isAttached()) |
| return; |
| if (!currentWindow->frame()) |
| return; |
| - if (!currentWindow->frame()->canNavigate(*m_frame)) { |
| + if (!currentWindow->frame()->canNavigate(*m_domWindow->frame())) { |
| if (exceptionState) { |
| exceptionState->throwSecurityError( |
| "The current window does not have permission to navigate the target " |
| @@ -301,8 +262,7 @@ void Location::setLocation(const String& url, |
| return; |
| } |
| - if (m_frame->domWindow()->isInsecureScriptAccess(*currentWindow, |
| - completedURL)) |
| + if (m_domWindow->isInsecureScriptAccess(*currentWindow, completedURL)) |
| return; |
| V8DOMActivityLogger* activityLogger = |
| @@ -315,9 +275,18 @@ void Location::setLocation(const String& url, |
| argv.push_back(completedURL); |
| activityLogger->logEvent("blinkSetAttribute", argv.size(), argv.data()); |
| } |
| - m_frame->navigate(*currentWindow->document(), completedURL, |
| - setLocationPolicy == SetLocationPolicy::ReplaceThisFrame, |
| - UserGestureStatus::None); |
| + m_domWindow->frame()->navigate( |
| + *currentWindow->document(), completedURL, |
| + setLocationPolicy == SetLocationPolicy::ReplaceThisFrame, |
| + UserGestureStatus::None); |
| +} |
| + |
| +Document* Location::document() const { |
| + return toLocalDOMWindow(m_domWindow)->document(); |
| +} |
| + |
| +bool Location::isAttached() const { |
| + return m_domWindow->frame() && m_domWindow->frame()->host(); |
| } |
| } // namespace blink |