REGRESSION(PSON, r240660): Navigation over process boundary is flashy when using...
[WebKit-https.git] / Source / WebCore / loader / NavigationAction.cpp
index 8b029d4..e4edbde 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2017 Apple 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
 #include "NavigationAction.h"
 
 #include "Document.h"
-#include "Event.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;
 
@@ -44,13 +72,37 @@ NavigationAction::NavigationAction(NavigationAction&&) = default;
 NavigationAction& NavigationAction::operator=(const NavigationAction&) = default;
 NavigationAction& NavigationAction::operator=(NavigationAction&&) = default;
 
-NavigationAction::NavigationAction(Document& source, const ResourceRequest& resourceRequest, NavigationType type, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, Event* event, const AtomicString& downloadAttribute)
-    : m_sourceDocument { makeRefPtr(source) }
+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_event { event }
+    , m_initiatedByMainFrame { initiatedByMainFrame }
+    , m_keyStateEventData { keyStateDataForFirstEventWithKeyState(event) }
+    , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) }
     , m_downloadAttribute { downloadAttribute }
+    , m_treatAsSameOriginNavigation { shouldTreatAsSameOriginNavigation(requester, resourceRequest.url()) }
 {
 }
 
@@ -67,13 +119,16 @@ static NavigationType navigationType(FrameLoadType frameLoadType, bool isFormSub
     return NavigationType::Other;
 }
 
-NavigationAction::NavigationAction(Document& source, const ResourceRequest& resourceRequest, FrameLoadType frameLoadType, bool isFormSubmission, Event* event, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, const AtomicString& downloadAttribute)
-    : m_sourceDocument { makeRefPtr(source) }
+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_event { event }
+    , m_initiatedByMainFrame { initiatedByMainFrame }
+    , m_keyStateEventData { keyStateDataForFirstEventWithKeyState(event) }
+    , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) }
     , m_downloadAttribute { downloadAttribute }
+    , m_treatAsSameOriginNavigation { shouldTreatAsSameOriginNavigation(requester, resourceRequest.url()) }
 {
 }
 
@@ -84,4 +139,14 @@ NavigationAction NavigationAction::copyWithShouldOpenExternalURLsPolicy(ShouldOp
     return result;
 }
 
+void NavigationAction::setTargetBackForwardItem(HistoryItem& item)
+{
+    m_targetBackForwardItemIdentifier = item.identifier();
+}
+
+void NavigationAction::setSourceBackForwardItem(HistoryItem* item)
+{
+    m_sourceBackForwardItemIdentifier = item ? makeOptional(item->identifier()) : WTF::nullopt;
+}
+
 }