REGRESSION(PSON, r240660): Navigation over process boundary is flashy when using...
[WebKit-https.git] / Source / WebCore / loader / NavigationAction.cpp
index ed68e43..e4edbde 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -10,7 +10,7 @@
  * 2.  Redistributions in binary form must reproduce the above copyright
  *     notice, this list of conditions and the following disclaimer in the
  *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
  *     its contributors may be used to endorse or promote products derived
  *     from this software without specific prior written permission. 
  *
 #include "config.h"
 #include "NavigationAction.h"
 
-#include "Event.h"
+#include "Document.h"
 #include "FrameLoader.h"
+#include "FrameLoaderClient.h"
+#include "HistoryItem.h"
+#include "MouseEvent.h"
 
 namespace WebCore {
 
+NavigationAction::Requester::Requester(const Document& document)
+    : m_url { URL { document.url() } }
+    , m_origin { makeRefPtr(document.securityOrigin()) }
+    , m_pageIDAndFrameIDPair { document.frame() ? std::make_pair(document.frame()->loader().client().pageID().valueOr(0), document.frame()->loader().client().frameID().valueOr(0)) : std::make_pair<uint64_t, uint64_t>(0, 0) }
+{
+}
+
+NavigationAction::UIEventWithKeyStateData::UIEventWithKeyStateData(const UIEventWithKeyState& uiEvent)
+    : isTrusted { uiEvent.isTrusted() }
+    , shiftKey { uiEvent.shiftKey() }
+    , ctrlKey { uiEvent.ctrlKey() }
+    , altKey { uiEvent.altKey() }
+    , metaKey { uiEvent.metaKey() }
+{
+}
+
+NavigationAction::MouseEventData::MouseEventData(const MouseEvent& mouseEvent)
+    : UIEventWithKeyStateData { mouseEvent }
+    , absoluteLocation { mouseEvent.absoluteLocation() }
+    , locationInRootViewCoordinates { mouseEvent.locationInRootViewCoordinates() }
+    , button { mouseEvent.button() }
+    , syntheticClickType { mouseEvent.syntheticClickType() }
+    , buttonDown { mouseEvent.buttonDown() }
+{
+}
+
+NavigationAction::NavigationAction() = default;
+NavigationAction::~NavigationAction() = default;
+
+NavigationAction::NavigationAction(const NavigationAction&) = default;
+NavigationAction::NavigationAction(NavigationAction&&) = default;
+
+NavigationAction& NavigationAction::operator=(const NavigationAction&) = default;
+NavigationAction& NavigationAction::operator=(NavigationAction&&) = default;
+
+static bool shouldTreatAsSameOriginNavigation(const Document& document, const URL& url)
+{
+    return url.protocolIsAbout() || url.protocolIsData() || (url.protocolIsBlob() && document.securityOrigin().canRequest(url));
+}
+
+static Optional<NavigationAction::UIEventWithKeyStateData> keyStateDataForFirstEventWithKeyState(Event* event)
+{
+    if (UIEventWithKeyState* uiEvent = findEventWithKeyState(event))
+        return NavigationAction::UIEventWithKeyStateData { *uiEvent };
+    return WTF::nullopt;
+}
+
+static Optional<NavigationAction::MouseEventData> mouseEventDataForFirstMouseEvent(Event* event)
+{
+    for (Event* e = event; e; e = e->underlyingEvent()) {
+        if (e->isMouseEvent())
+            return NavigationAction::MouseEventData { static_cast<const MouseEvent&>(*e) };
+    }
+    return WTF::nullopt;
+}
+
+NavigationAction::NavigationAction(Document& requester, const ResourceRequest& resourceRequest, InitiatedByMainFrame initiatedByMainFrame, NavigationType type, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, Event* event, const AtomicString& downloadAttribute)
+    : m_requester { requester }
+    , m_resourceRequest { resourceRequest }
+    , m_type { type }
+    , m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy }
+    , m_initiatedByMainFrame { initiatedByMainFrame }
+    , m_keyStateEventData { keyStateDataForFirstEventWithKeyState(event) }
+    , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) }
+    , m_downloadAttribute { downloadAttribute }
+    , m_treatAsSameOriginNavigation { shouldTreatAsSameOriginNavigation(requester, resourceRequest.url()) }
+{
+}
+
 static NavigationType navigationType(FrameLoadType frameLoadType, bool isFormSubmission, bool haveEvent)
 {
     if (isFormSubmission)
-        return NavigationTypeFormSubmitted;
+        return NavigationType::FormSubmitted;
     if (haveEvent)
-        return NavigationTypeLinkClicked;
-    if (frameLoadType == FrameLoadTypeReload || frameLoadType == FrameLoadTypeReloadFromOrigin)
-        return NavigationTypeReload;
+        return NavigationType::LinkClicked;
+    if (isReload(frameLoadType))
+        return NavigationType::Reload;
     if (isBackForwardLoadType(frameLoadType))
-        return NavigationTypeBackForward;
-    return NavigationTypeOther;
-}
-
-NavigationAction::NavigationAction()
-    : m_type(NavigationTypeOther)
-{
+        return NavigationType::BackForward;
+    return NavigationType::Other;
 }
 
-NavigationAction::NavigationAction(const KURL& url, NavigationType type)
-    : m_URL(url)
-    , m_type(type)
+NavigationAction::NavigationAction(Document& requester, const ResourceRequest& resourceRequest, InitiatedByMainFrame initiatedByMainFrame, FrameLoadType frameLoadType, bool isFormSubmission, Event* event, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, const AtomicString& downloadAttribute)
+    : m_requester { requester }
+    , m_resourceRequest { resourceRequest }
+    , m_type { navigationType(frameLoadType, isFormSubmission, !!event) }
+    , m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy }
+    , m_initiatedByMainFrame { initiatedByMainFrame }
+    , m_keyStateEventData { keyStateDataForFirstEventWithKeyState(event) }
+    , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) }
+    , m_downloadAttribute { downloadAttribute }
+    , m_treatAsSameOriginNavigation { shouldTreatAsSameOriginNavigation(requester, resourceRequest.url()) }
 {
 }
 
-NavigationAction::NavigationAction(const KURL& url, FrameLoadType frameLoadType,
-        bool isFormSubmission)
-    : m_URL(url)
-    , m_type(navigationType(frameLoadType, isFormSubmission, 0))
+NavigationAction NavigationAction::copyWithShouldOpenExternalURLsPolicy(ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy) const
 {
+    NavigationAction result(*this);
+    result.m_shouldOpenExternalURLsPolicy = shouldOpenExternalURLsPolicy;
+    return result;
 }
 
-NavigationAction::NavigationAction(const KURL& url, NavigationType type, PassRefPtr<Event> event)
-    : m_URL(url)
-    , m_type(type)
-    , m_event(event)
+void NavigationAction::setTargetBackForwardItem(HistoryItem& item)
 {
+    m_targetBackForwardItemIdentifier = item.identifier();
 }
 
-NavigationAction::NavigationAction(const KURL& url, FrameLoadType frameLoadType,
-        bool isFormSubmission, PassRefPtr<Event> event)
-    : m_URL(url)
-    , m_type(navigationType(frameLoadType, isFormSubmission, event))
-    , m_event(event)
+void NavigationAction::setSourceBackForwardItem(HistoryItem* item)
 {
+    m_sourceBackForwardItemIdentifier = item ? makeOptional(item->identifier()) : WTF::nullopt;
 }
 
 }