Changeset 219013 in webkit


Ignore:
Timestamp:
Jun 30, 2017 2:35:23 PM (7 years ago)
Author:
dbates@webkit.org
Message:

API::FrameInfo should know the web page that contains the frame; add API property webView to WKFrameInfo
https://bugs.webkit.org/show_bug.cgi?id=165160
<rdar://problem/29451999>

Reviewed by Brady Eidson.

Source/WebCore:

Pass the document that is requesting the load to the loader.

  • inspector/InspectorFrontendClientLocal.cpp:

(WebCore::InspectorFrontendClientLocal::openInNewTab): Pass the document when instantiating the FrameLoadRequest.
Also use C++11 brace initialization to instantiate ResourceRequest.

  • inspector/InspectorPageAgent.cpp:

(WebCore::InspectorPageAgent::navigate): Pass the document when instantiating the FrameLoadRequest.

  • loader/FrameLoadRequest.cpp:

(WebCore::FrameLoadRequest::FrameLoadRequest): Moved from FrameLoadRequest.h.
(WebCore::FrameLoadRequest::requester): Added.
(WebCore::FrameLoadRequest::requesterSecurityOrigin): Added.

  • loader/FrameLoadRequest.h:

(WebCore::FrameLoadRequest::FrameLoadRequest): Marked as WEBCORE_EXPORT and modified to take
the document that requested the load.
(WebCore::FrameLoadRequest::requester): Deleted; made out-of-line/moved to FrameLoadRequest.cpp.

  • loader/FrameLoader.cpp:

(WebCore::FrameLoader::urlSelected): Pass the document when instantiating the FrameLoadRequest. Also use C++11
brace initialization to instantiate ResourceRequest.
(WebCore::FrameLoader::loadURLIntoChildFrame): Pass the document when instantiating the FrameLoadRequest.
(WebCore::FrameLoader::loadFrameRequest): Substitute FrameLoadRequest::requesterSecurityOrigin() for
FrameLoadRequest::requester() as the former replaces the latter.
(WebCore::FrameLoader::loadURL): Pass the document when instantiating the NavigationAction.
(WebCore::FrameLoader::load): Ditto.
(WebCore::FrameLoader::loadWithDocumentLoader): Pass the document when instantiating the NavigationAction.
Also use C++11 brace initialization syntax to instantiate the NavigationAction.
(WebCore::FrameLoader::reload): Ditto.
(WebCore::FrameLoader::loadPostRequest): Ditto.
(WebCore::FrameLoader::continueLoadAfterNewWindowPolicy): Pass the document when instantiating the NavigationAction.
(WebCore::FrameLoader::loadDifferentDocumentItem): Pass the document when instantiating the NavigationAction.
Also use C++11 brace initialization syntax to instantiate the NavigationAction.
(WebCore::createWindow): Pass the document when instantiating the NavigationAction.

  • loader/NavigationAction.cpp:

(WebCore::NavigationAction::NavigationAction): Modified to take the source document.

  • loader/NavigationAction.h:

(WebCore::NavigationAction::isEmpty): Consider a NavigationAction empty if does not have a source document
or the associated ResourceRequest has an empty URL.
(WebCore::NavigationAction::sourceDocument): Added.
(WebCore::NavigationAction::NavigationAction): Deleted; made out-of-line/moved to NavigationAction.cpp to
avoid the need to include the header Document.h.

  • loader/NavigationScheduler.cpp:

(WebCore::ScheduledURLNavigation::ScheduledURLNavigation): Store the document that scheduled the navigation.
Also use C++11 brace initialization to instantiate in the member initialization list.
(WebCore::ScheduledURLNavigation::initiatingDocument): Added. Retrieves the document that scheduled the navigation.
(WebCore::NavigationScheduler::scheduleLocationChange): Pass the document when instantiating the FrameLoadRequest.

  • loader/PolicyChecker.cpp:

(WebCore::PolicyChecker::checkNavigationPolicy): Pass the document when instantiating the NavigationAction.
Also use C++11 brace initialization syntax to instantiate the NavigationAction.

  • page/ContextMenuController.cpp:

(WebCore::openNewWindow):
(WebCore::ContextMenuController::contextMenuItemSelected): Pass the document when instantiating the FrameLoadRequest.
Also use C++11 brace initialization syntax to instantiate the FrameLoadRequest.

  • page/DOMWindow.cpp:

(WebCore::DOMWindow::createWindow): Pass the document when instantiating the FrameLoadRequest.

Source/WebKit/ios:

Pass the document that is requesting the load to the loader.

  • WebView/WebPDFViewPlaceholder.mm:

(-[WebPDFViewPlaceholder simulateClickOnLinkToURL:]):

Source/WebKit/mac:

Pass the document that is requesting the load to the loader.

  • WebView/WebPDFView.mm:

(-[WebPDFView PDFViewWillClickOnLink:withURL:]):

Source/WebKit/win:

Pass the document that is requesting the load to the loader.

  • Plugins/PluginView.cpp:

(WebCore::PluginView::start):
(WebCore::PluginView::getURLNotify):
(WebCore::PluginView::getURL):
(WebCore::PluginView::handlePost):

Source/WebKit2:

Expose a property on WKFrameInfo to retrieve the WKWebView of the web page that contains the
frame. This will allow an embedding client to know the web view that initiated the navigation
request as well as differentiate between a navigation initiated by web content from one
initiated via API.

The majority of this change is passing the document D that initiated the targeted navigation
or called window.open() through the loading machinery to the FrameLoaderClient. The changes
to pass this information to the FrameLoaderClient when creating a new window are straightforward.
For targeted navigation, the WebKit2 FrameLoaderClient implementation now computes the info
for the originating frame regardless of the navigation type (NavigationAction::type()).
(Currently we only compute the originating frame for hyperlink activated navigations,
form submissions, and form resubmissions). The WebProcess computes the page ID of the page
that contains the originating frame and sends that to the UIProcess so that it can create
an API::FrameInfo for the originating frame and associate the page that contains the frame,
if the navigation was triggered by web content. If the navigation was triggered by API
(e.g. -[WKWebView goBack]) then the created API::FrameInfo does not have an associated page
so that an embedding client can distinguish between a navigation initiated by web content
from a navigation that it initiated via API depending on whether API::FrameInfo::page() is
nullptr. We expose property webView on the Mac and iOS API class WKFrameInfo to return the
WKWebView corresponding to API::FrameInfo::page().

A small change that this patch makes is to have the WebProcess compute the originating frame
info (call WebFrame::info()) and send it over to the UIProcess as opposed to sending the frame
ID of the originating frame and having the UIProcess compute the frame info from it. We do this
because the UIProcess may not be able to compute the frame info for the originating frame if
the window that it was contained in was closed between the time the WebProcess sent the frame
ID to the UIProcess and the UIProcess received it.

  • UIProcess/API/APIFrameInfo.cpp:

(API::FrameInfo::create):
(API::FrameInfo::FrameInfo):
(API::FrameInfo::clearPage):

  • UIProcess/API/APIFrameInfo.h:
  • UIProcess/API/APIUIClient.h:

(API::UIClient::createNewPage):
(API::UIClient::createNewPageAsync):

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageUIClient):

  • UIProcess/API/Cocoa/WKFrameInfo.h:
  • UIProcess/API/Cocoa/WKFrameInfo.mm:

(-[WKFrameInfo description]):
(-[WKFrameInfo webView]):

  • UIProcess/API/Cocoa/WKUserContentController.mm:
  • UIProcess/Cocoa/UIDelegate.h:
  • UIProcess/Cocoa/UIDelegate.mm:

(WebKit::UIDelegate::UIClient::createNewPageCommon):
(WebKit::UIDelegate::UIClient::createNewPage):
(WebKit::UIDelegate::UIClient::createNewPageAsync):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationAction):
(WebKit::WebPageProxy::createNewPage):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in:
  • WebProcess/Plugins/PluginView.cpp:

(WebKit::PluginView::loadURL):

  • WebProcess/WebCoreSupport/WebChromeClient.cpp:

(WebKit::WebChromeClient::createWindow):

  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchCreatePage):
(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):

  • WebProcess/WebPage/WebInspector.cpp:

(WebKit::WebInspector::openInNewTab):

Tools:

Add tests to ensure that -[WKFrameInfo webView] is computed correctly for the source and target frame
for navigations and window creation.

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKit2Cocoa/DecidePolicyForNavigationAction.mm: Added. Derived from file ShouldOpenExternalURLsInNewWindowActions.mm.

(-[DecidePolicyForNavigationActionController webView:decidePolicyForNavigationAction:decisionHandler:]):
(-[DecidePolicyForNavigationActionController webView:didFinishNavigation:]):
(-[DecidePolicyForNavigationActionController webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:]):
(TEST):

Location:
trunk
Files:
1 added
37 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r219012 r219013  
     12017-06-30  Daniel Bates  <dabates@apple.com>
     2
     3        API::FrameInfo should know the web page that contains the frame; add API property webView to WKFrameInfo
     4        https://bugs.webkit.org/show_bug.cgi?id=165160
     5        <rdar://problem/29451999>
     6
     7        Reviewed by Brady Eidson.
     8
     9        Pass the document that is requesting the load to the loader.
     10
     11        * inspector/InspectorFrontendClientLocal.cpp:
     12        (WebCore::InspectorFrontendClientLocal::openInNewTab): Pass the document when instantiating the FrameLoadRequest.
     13        Also use C++11 brace initialization to instantiate ResourceRequest.
     14        * inspector/InspectorPageAgent.cpp:
     15        (WebCore::InspectorPageAgent::navigate): Pass the document when instantiating the FrameLoadRequest.
     16        * loader/FrameLoadRequest.cpp:
     17        (WebCore::FrameLoadRequest::FrameLoadRequest): Moved from FrameLoadRequest.h.
     18        (WebCore::FrameLoadRequest::requester): Added.
     19        (WebCore::FrameLoadRequest::requesterSecurityOrigin): Added.
     20        * loader/FrameLoadRequest.h:
     21        (WebCore::FrameLoadRequest::FrameLoadRequest): Marked as WEBCORE_EXPORT and modified to take
     22        the document that requested the load.
     23        (WebCore::FrameLoadRequest::requester): Deleted; made out-of-line/moved to FrameLoadRequest.cpp.
     24        * loader/FrameLoader.cpp:
     25        (WebCore::FrameLoader::urlSelected): Pass the document when instantiating the FrameLoadRequest. Also use C++11
     26        brace initialization to instantiate ResourceRequest.
     27        (WebCore::FrameLoader::loadURLIntoChildFrame): Pass the document when instantiating the FrameLoadRequest.
     28        (WebCore::FrameLoader::loadFrameRequest): Substitute FrameLoadRequest::requesterSecurityOrigin() for
     29        FrameLoadRequest::requester() as the former replaces the latter.
     30        (WebCore::FrameLoader::loadURL): Pass the document when instantiating the NavigationAction.
     31        (WebCore::FrameLoader::load): Ditto.
     32        (WebCore::FrameLoader::loadWithDocumentLoader): Pass the document when instantiating the NavigationAction.
     33        Also use C++11 brace initialization syntax to instantiate the NavigationAction.
     34        (WebCore::FrameLoader::reload): Ditto.
     35        (WebCore::FrameLoader::loadPostRequest): Ditto.
     36        (WebCore::FrameLoader::continueLoadAfterNewWindowPolicy): Pass the document when instantiating the NavigationAction.
     37        (WebCore::FrameLoader::loadDifferentDocumentItem): Pass the document when instantiating the NavigationAction.
     38        Also use C++11 brace initialization syntax to instantiate the NavigationAction.
     39        (WebCore::createWindow): Pass the document when instantiating the NavigationAction.
     40        * loader/NavigationAction.cpp:
     41        (WebCore::NavigationAction::NavigationAction): Modified to take the source document.
     42        * loader/NavigationAction.h:
     43        (WebCore::NavigationAction::isEmpty): Consider a NavigationAction empty if does not have a source document
     44        or the associated ResourceRequest has an empty URL.
     45        (WebCore::NavigationAction::sourceDocument): Added.
     46        (WebCore::NavigationAction::NavigationAction): Deleted; made out-of-line/moved to NavigationAction.cpp to
     47        avoid the need to include the header Document.h.
     48        * loader/NavigationScheduler.cpp:
     49        (WebCore::ScheduledURLNavigation::ScheduledURLNavigation): Store the document that scheduled the navigation.
     50        Also use C++11 brace initialization to instantiate in the member initialization list.
     51        (WebCore::ScheduledURLNavigation::initiatingDocument): Added. Retrieves the document that scheduled the navigation.
     52        (WebCore::NavigationScheduler::scheduleLocationChange): Pass the document when instantiating the FrameLoadRequest.
     53        * loader/PolicyChecker.cpp:
     54        (WebCore::PolicyChecker::checkNavigationPolicy): Pass the document when instantiating the NavigationAction.
     55        Also use C++11 brace initialization syntax to instantiate the NavigationAction.
     56        * page/ContextMenuController.cpp:
     57        (WebCore::openNewWindow):
     58        (WebCore::ContextMenuController::contextMenuItemSelected): Pass the document when instantiating the FrameLoadRequest.
     59        Also use C++11 brace initialization syntax to instantiate the FrameLoadRequest.
     60        * page/DOMWindow.cpp:
     61        (WebCore::DOMWindow::createWindow): Pass the document when instantiating the FrameLoadRequest.
     62
    1632017-06-29  Jer Noble  <jer.noble@apple.com>
    264
  • trunk/Source/WebCore/inspector/InspectorFrontendClientLocal.cpp

    r218713 r219013  
    228228    UserGestureIndicator indicator { ProcessingUserGesture };
    229229    Frame& mainFrame = m_inspectedPageController->inspectedPage().mainFrame();
    230     FrameLoadRequest frameLoadRequest { mainFrame.document()->securityOrigin(), ResourceRequest(), ASCIILiteral("_blank"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     230    FrameLoadRequest frameLoadRequest { *mainFrame.document(), mainFrame.document()->securityOrigin(), { }, ASCIILiteral("_blank"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    231231
    232232    bool created;
     
    240240    // FIXME: Why do we compute the absolute URL with respect to |frame| instead of |mainFrame|?
    241241    ResourceRequest resourceRequest { frame->document()->completeURL(url) };
    242     FrameLoadRequest frameLoadRequest2 { mainFrame.document()->securityOrigin(), resourceRequest, ASCIILiteral("_self"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     242    FrameLoadRequest frameLoadRequest2 { *mainFrame.document(), mainFrame.document()->securityOrigin(), resourceRequest, ASCIILiteral("_self"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    243243    frame->loader().changeLocation(WTFMove(frameLoadRequest2));
    244244}
  • trunk/Source/WebCore/inspector/InspectorPageAgent.cpp

    r218713 r219013  
    424424
    425425    ResourceRequest resourceRequest { frame.document()->completeURL(url) };
    426     FrameLoadRequest frameLoadRequest { frame.document()->securityOrigin(), resourceRequest, ASCIILiteral("_self"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     426    FrameLoadRequest frameLoadRequest { *frame.document(), frame.document()->securityOrigin(), resourceRequest, ASCIILiteral("_self"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    427427    frame.loader().changeLocation(WTFMove(frameLoadRequest));
    428428}
  • trunk/Source/WebCore/loader/FrameLoadRequest.cpp

    r218649 r219013  
    3434#include "Document.h"
    3535#include "Frame.h"
     36#include "SecurityOrigin.h"
    3637
    3738namespace WebCore {
    3839
     40FrameLoadRequest::FrameLoadRequest(Document& requester, SecurityOrigin& requesterSecurityOrigin, const ResourceRequest& resourceRequest, const String& frameName, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, AllowNavigationToInvalidURL allowNavigationToInvalidURL, NewFrameOpenerPolicy newFrameOpenerPolicy, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL, const AtomicString& downloadAttribute)
     41    : m_requester { makeRef(requester) }
     42    , m_requesterSecurityOrigin { makeRef(requesterSecurityOrigin) }
     43    , m_resourceRequest { resourceRequest }
     44    , m_frameName { frameName }
     45    , m_lockHistory { lockHistory }
     46    , m_lockBackForwardList { lockBackForwardList }
     47    , m_shouldSendReferrer { shouldSendReferrer }
     48    , m_allowNavigationToInvalidURL { allowNavigationToInvalidURL }
     49    , m_newFrameOpenerPolicy { newFrameOpenerPolicy }
     50    , m_shouldReplaceDocumentIfJavaScriptURL { shouldReplaceDocumentIfJavaScriptURL }
     51    , m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy }
     52    , m_downloadAttribute { downloadAttribute }
     53{
     54}
     55
    3956FrameLoadRequest::FrameLoadRequest(Frame& frame, const ResourceRequest& resourceRequest, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, const SubstituteData& substituteData)
    40     : m_requester { makeRef(frame.document()->securityOrigin()) }
     57    : m_requester { makeRef(*frame.document()) }
     58    , m_requesterSecurityOrigin { makeRef(frame.document()->securityOrigin()) }
    4159    , m_resourceRequest { resourceRequest }
    4260    , m_substituteData { substituteData }
     
    5169}
    5270
     71FrameLoadRequest::~FrameLoadRequest() = default;
     72
     73Document& FrameLoadRequest::requester()
     74{
     75    return m_requester.get();
     76}
     77
     78const SecurityOrigin& FrameLoadRequest::requesterSecurityOrigin() const
     79{
     80    return m_requesterSecurityOrigin.get();
     81}
     82
    5383} // namespace WebCore
  • trunk/Source/WebCore/loader/FrameLoadRequest.h

    r218713 r219013  
    2828#include "FrameLoaderTypes.h"
    2929#include "ResourceRequest.h"
    30 #include "SecurityOrigin.h"
    3130#include "SubstituteData.h"
     31#include <wtf/Forward.h>
    3232
    3333namespace WebCore {
    3434
     35class Document;
    3536class Frame;
     37class SecurityOrigin;
    3638
    3739class FrameLoadRequest {
    3840public:
    39     FrameLoadRequest(SecurityOrigin& requester, const ResourceRequest& resourceRequest, const String& frameName, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, AllowNavigationToInvalidURL allowNavigationToInvalidURL, NewFrameOpenerPolicy newFrameOpenerPolicy, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL = ReplaceDocumentIfJavaScriptURL, const AtomicString& downloadAttribute = { })
    40         : m_requester { makeRef(requester) }
    41         , m_resourceRequest { resourceRequest }
    42         , m_frameName { frameName }
    43         , m_lockHistory { lockHistory }
    44         , m_lockBackForwardList { lockBackForwardList }
    45         , m_shouldSendReferrer { shouldSendReferrer }
    46         , m_allowNavigationToInvalidURL { allowNavigationToInvalidURL }
    47         , m_newFrameOpenerPolicy { newFrameOpenerPolicy }
    48         , m_shouldReplaceDocumentIfJavaScriptURL { shouldReplaceDocumentIfJavaScriptURL }
    49         , m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy }
    50         , m_downloadAttribute { downloadAttribute }
    51     {
    52     }
     41    WEBCORE_EXPORT FrameLoadRequest(Document&, SecurityOrigin&, const ResourceRequest&, const String& frameName, LockHistory, LockBackForwardList, ShouldSendReferrer, AllowNavigationToInvalidURL, NewFrameOpenerPolicy, ShouldOpenExternalURLsPolicy, ShouldReplaceDocumentIfJavaScriptURL = ReplaceDocumentIfJavaScriptURL, const AtomicString& downloadAttribute = { });
    5342    WEBCORE_EXPORT FrameLoadRequest(Frame&, const ResourceRequest&, ShouldOpenExternalURLsPolicy, const SubstituteData& = SubstituteData());
     43
     44    WEBCORE_EXPORT ~FrameLoadRequest();
    5445
    5546    FrameLoadRequest(FrameLoadRequest&&) = default;
     
    5849    bool isEmpty() const { return m_resourceRequest.isEmpty(); }
    5950
    60     const SecurityOrigin& requester() const { return m_requester.get(); }
     51    Document& requester();
     52    const SecurityOrigin& requesterSecurityOrigin() const;
    6153
    6254    ResourceRequest& resourceRequest() { return m_resourceRequest; }
     
    8981
    9082private:
    91     Ref<SecurityOrigin> m_requester;
     83    Ref<Document> m_requester;
     84    Ref<SecurityOrigin> m_requesterSecurityOrigin;
    9285    ResourceRequest m_resourceRequest;
    9386    String m_frameName;
  • trunk/Source/WebCore/loader/FrameLoader.cpp

    r219008 r219013  
    364364{
    365365    NewFrameOpenerPolicy newFrameOpenerPolicy = openerPolicy.value_or(shouldSendReferrer == NeverSendReferrer ? NewFrameOpenerPolicy::Suppress : NewFrameOpenerPolicy::Allow);
    366     urlSelected(FrameLoadRequest(m_frame.document()->securityOrigin(), ResourceRequest(url), passedTarget, lockHistory, lockBackForwardList, shouldSendReferrer, AllowNavigationToInvalidURL::Yes, newFrameOpenerPolicy, shouldOpenExternalURLsPolicy, DoNotReplaceDocumentIfJavaScriptURL, downloadAttribute), triggeringEvent);
     366    urlSelected(FrameLoadRequest(*m_frame.document(), m_frame.document()->securityOrigin(), { url }, passedTarget, lockHistory, lockBackForwardList, shouldSendReferrer, AllowNavigationToInvalidURL::Yes, newFrameOpenerPolicy, shouldOpenExternalURLsPolicy, DoNotReplaceDocumentIfJavaScriptURL, downloadAttribute), triggeringEvent);
    367367}
    368368
     
    924924    }
    925925
    926     FrameLoadRequest frameLoadRequest { m_frame.document()->securityOrigin(), { url }, ASCIILiteral("_self"), LockHistory::No, LockBackForwardList::Yes, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     926    FrameLoadRequest frameLoadRequest { *m_frame.document(), m_frame.document()->securityOrigin(), { url }, ASCIILiteral("_self"), LockHistory::No, LockBackForwardList::Yes, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    927927    childFrame->loader().loadURL(WTFMove(frameLoadRequest), referer, FrameLoadType::RedirectWithLockedBackForwardList, nullptr, nullptr);
    928928}
     
    11661166
    11671167    ASSERT(m_frame.document());
    1168     if (!request.requester().canDisplay(url)) {
     1168    if (!request.requesterSecurityOrigin().canDisplay(url)) {
    11691169        reportLocalLoadFailed(&m_frame, url.stringCenterEllipsizedToLength());
    11701170        return;
     
    12591259        return;
    12601260
    1261     NavigationAction action(request, newLoadType, isFormSubmission, event, frameLoadRequest.shouldOpenExternalURLsPolicy(), frameLoadRequest.downloadAttribute());
     1261    NavigationAction action { frameLoadRequest.requester(), request, newLoadType, isFormSubmission, event, frameLoadRequest.shouldOpenExternalURLsPolicy(), frameLoadRequest.downloadAttribute() };
    12621262
    12631263    if (!targetFrame && !frameName.isEmpty()) {
     
    13321332
    13331333    if (request.shouldCheckNewWindowPolicy()) {
    1334         NavigationAction action(request.resourceRequest(), NavigationType::Other, request.shouldOpenExternalURLsPolicy());
     1334        NavigationAction action { request.requester(), request.resourceRequest(), NavigationType::Other, request.shouldOpenExternalURLsPolicy() };
    13351335        policyChecker().checkNewWindowPolicy(action, request.resourceRequest(), nullptr, request.frameName(), [this] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, bool shouldContinue) {
    13361336            continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress);
     
    14371437    if (shouldPerformFragmentNavigation(isFormSubmission, httpMethod, policyChecker().loadType(), newURL)) {
    14381438        RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader;
    1439         NavigationAction action(loader->request(), policyChecker().loadType(), isFormSubmission);
     1439        NavigationAction action { *m_frame.document(), loader->request(), policyChecker().loadType(), isFormSubmission };
    14401440
    14411441        oldDocumentLoader->setTriggeringAction(action);
     
    14541454    setPolicyDocumentLoader(loader);
    14551455    if (loader->triggeringAction().isEmpty())
    1456         loader->setTriggeringAction(NavigationAction(loader->request(), policyChecker().loadType(), isFormSubmission));
     1456        loader->setTriggeringAction({ *m_frame.document(), loader->request(), policyChecker().loadType(), isFormSubmission });
    14571457
    14581458    if (Element* ownerElement = m_frame.ownerElement()) {
     
    15931593    // If we're about to re-post, set up action so the application can warn the user.
    15941594    if (request.httpMethod() == "POST")
    1595         loader->setTriggeringAction(NavigationAction(request, NavigationType::FormResubmitted));
     1595        loader->setTriggeringAction({ *m_frame.document(), request, NavigationType::FormResubmitted });
    15961596
    15971597    loader->setOverrideEncoding(m_documentLoader->overrideEncoding());
     
    27172717        document->contentSecurityPolicy()->upgradeInsecureRequestIfNeeded(workingResourceRequest, ContentSecurityPolicy::InsecureRequestType::Load);
    27182718
    2719     NavigationAction action(workingResourceRequest, loadType, true, event, request.shouldOpenExternalURLsPolicy(), request.downloadAttribute());
     2719    NavigationAction action { request.requester(), workingResourceRequest, loadType, true, event, request.shouldOpenExternalURLsPolicy(), request.downloadAttribute() };
    27202720
    27212721    if (!frameName.isEmpty()) {
     
    31733173    }
    31743174
    3175     NavigationAction newAction { request, NavigationType::Other, action.shouldOpenExternalURLsPolicy() };
     3175    NavigationAction newAction { *frame->document(), request, NavigationType::Other, action.shouldOpenExternalURLsPolicy() };
    31763176    mainFrame->loader().loadWithNavigationAction(request, newAction, LockHistory::No, FrameLoadType::Standard, formState, allowNavigationToInvalidURL);
    31773177}
     
    33593359        auto documentLoader = cachedPage->documentLoader();
    33603360        m_client.updateCachedDocumentLoader(*documentLoader);
    3361         documentLoader->setTriggeringAction(NavigationAction(documentLoader->request(), loadType, false));
     3361        documentLoader->setTriggeringAction({ *m_frame.document(), documentLoader->request(), loadType, false });
    33623362        documentLoader->setLastCheckedRequest(ResourceRequest());
    33633363        loadWithDocumentLoader(documentLoader, loadType, 0, AllowNavigationToInvalidURL::Yes);
     
    34073407        if (cacheLoadPolicy == MayAttemptCacheOnlyLoadForFormSubmissionItem) {
    34083408            request.setCachePolicy(ReturnCacheDataDontLoad);
    3409             action = NavigationAction(request, loadType, isFormSubmission, event, shouldOpenExternalURLsPolicy);
     3409            action = { *m_frame.document(), request, loadType, isFormSubmission, event, shouldOpenExternalURLsPolicy };
    34103410        } else {
    34113411            request.setCachePolicy(ReturnCacheDataElseLoad);
    3412             action = NavigationAction(request, NavigationType::FormResubmitted, shouldOpenExternalURLsPolicy, event);
     3412            action = { *m_frame.document(), request, NavigationType::FormResubmitted, shouldOpenExternalURLsPolicy, event };
    34133413        }
    34143414    } else {
     
    34443444        ResourceRequest requestForOriginalURL(request);
    34453445        requestForOriginalURL.setURL(itemOriginalURL);
    3446         action = NavigationAction(requestForOriginalURL, loadType, isFormSubmission, event, shouldOpenExternalURLsPolicy);
     3446        action = { *m_frame.document(), requestForOriginalURL, loadType, isFormSubmission, event, shouldOpenExternalURLsPolicy };
    34473447    }
    34483448
     
    36983698
    36993699    ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy = shouldOpenExternalURLsPolicyToApply(openerFrame, request.shouldOpenExternalURLsPolicy());
    3700     NavigationAction action { request.resourceRequest(), NavigationType::Other, shouldOpenExternalURLsPolicy };
     3700    NavigationAction action { request.requester(), request.resourceRequest(), NavigationType::Other, shouldOpenExternalURLsPolicy };
    37013701    Page* page = oldPage->chrome().createWindow(openerFrame, request, features, action);
    37023702    if (!page)
  • trunk/Source/WebCore/loader/NavigationAction.cpp

    r218599 r219013  
    3030#include "NavigationAction.h"
    3131
     32#include "Document.h"
    3233#include "Event.h"
    3334#include "FrameLoader.h"
     
    3536namespace WebCore {
    3637
     38NavigationAction::NavigationAction() = default;
    3739NavigationAction::~NavigationAction() = default;
    3840
     
    4345NavigationAction& NavigationAction::operator=(NavigationAction&&) = default;
    4446
    45 NavigationAction::NavigationAction(const ResourceRequest& resourceRequest, NavigationType type, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, Event* event, const AtomicString& downloadAttribute)
    46     : m_resourceRequest { resourceRequest }
     47NavigationAction::NavigationAction(Document& source, const ResourceRequest& resourceRequest, NavigationType type, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, Event* event, const AtomicString& downloadAttribute)
     48    : m_sourceDocument { makeRefPtr(source) }
     49    , m_resourceRequest { resourceRequest }
    4750    , m_type { type }
    4851    , m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy }
     
    6568}
    6669
    67 NavigationAction::NavigationAction(const ResourceRequest& resourceRequest, FrameLoadType frameLoadType, bool isFormSubmission, Event* event, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, const AtomicString& downloadAttribute)
    68     : m_resourceRequest { resourceRequest }
     70NavigationAction::NavigationAction(Document& source, const ResourceRequest& resourceRequest, FrameLoadType frameLoadType, bool isFormSubmission, Event* event, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, const AtomicString& downloadAttribute)
     71    : m_sourceDocument { makeRefPtr(source) }
     72    , m_resourceRequest { resourceRequest }
    6973    , m_type { navigationType(frameLoadType, isFormSubmission, !!event) }
    7074    , m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy }
  • trunk/Source/WebCore/loader/NavigationAction.h

    r218599 r219013  
    3636namespace WebCore {
    3737
     38class Document;
    3839class Event;
    3940
    4041class NavigationAction {
    4142public:
    42     WEBCORE_EXPORT explicit NavigationAction(const ResourceRequest& = { }, NavigationType = NavigationType::Other, ShouldOpenExternalURLsPolicy = ShouldOpenExternalURLsPolicy::ShouldNotAllow, Event* = nullptr, const AtomicString& downloadAttribute = nullAtom);
    43     NavigationAction(const ResourceRequest&, FrameLoadType, bool isFormSubmission, Event* = nullptr, ShouldOpenExternalURLsPolicy = ShouldOpenExternalURLsPolicy::ShouldNotAllow, const AtomicString& downloadAttribute = nullAtom);
     43    NavigationAction();
     44    WEBCORE_EXPORT NavigationAction(Document&, const ResourceRequest&, NavigationType = NavigationType::Other, ShouldOpenExternalURLsPolicy = ShouldOpenExternalURLsPolicy::ShouldNotAllow, Event* = nullptr, const AtomicString& downloadAttribute = nullAtom);
     45    NavigationAction(Document&, const ResourceRequest&, FrameLoadType, bool isFormSubmission, Event* = nullptr, ShouldOpenExternalURLsPolicy = ShouldOpenExternalURLsPolicy::ShouldNotAllow, const AtomicString& downloadAttribute = nullAtom);
    4446
    4547    WEBCORE_EXPORT ~NavigationAction();
    4648
    4749    WEBCORE_EXPORT NavigationAction(const NavigationAction&);
     50    NavigationAction& operator=(const NavigationAction&);
     51
    4852    NavigationAction(NavigationAction&&);
    49 
    50     NavigationAction& operator=(const NavigationAction&);
    5153    NavigationAction& operator=(NavigationAction&&);
    5254
    5355    NavigationAction copyWithShouldOpenExternalURLsPolicy(ShouldOpenExternalURLsPolicy) const;
    5456
    55     bool isEmpty() const { return m_resourceRequest.url().isEmpty(); }
     57    bool isEmpty() const { return !m_sourceDocument || m_resourceRequest.url().isEmpty(); }
    5658
    5759    URL url() const { return m_resourceRequest.url(); }
     
    6062    NavigationType type() const { return m_type; }
    6163    const Event* event() const { return m_event.get(); }
     64
     65    const Document* sourceDocument() const { return m_sourceDocument.get(); }
    6266
    6367    bool processingUserGesture() const { return m_userGestureToken ? m_userGestureToken->processingUserGesture() : false; }
     
    6973
    7074private:
     75    RefPtr<Document> m_sourceDocument;
    7176    ResourceRequest m_resourceRequest;
    7277    NavigationType m_type;
  • trunk/Source/WebCore/loader/NavigationScheduler.cpp

    r219008 r219013  
    11/*
    2  * Copyright (C) 2006-2016 Apple Inc. All rights reserved.
     2 * Copyright (C) 2006-2017 Apple Inc. All rights reserved.
    33 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
    44 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
     
    114114    ScheduledURLNavigation(Document& initiatingDocument, double delay, SecurityOrigin* securityOrigin, const URL& url, const String& referrer, LockHistory lockHistory, LockBackForwardList lockBackForwardList, bool duringLoad, bool isLocationChange)
    115115        : ScheduledNavigation(delay, lockHistory, lockBackForwardList, duringLoad, isLocationChange, initiatingDocument.shouldOpenExternalURLsPolicyToPropagate())
    116         , m_securityOrigin(securityOrigin)
    117         , m_url(url)
    118         , m_referrer(referrer)
    119     {
    120     }
    121 
    122     void fire(Frame& frame) override
    123     {
    124         UserGestureIndicator gestureIndicator(userGestureToForward());
    125 
    126         ResourceRequest resourceRequest(m_url, m_referrer, UseProtocolCachePolicy);
    127         FrameLoadRequest frameRequest(*m_securityOrigin, resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs());
    128 
    129         frame.loader().changeLocation(WTFMove(frameRequest));
     116        , m_initiatingDocument { makeRef(initiatingDocument) }
     117        , m_securityOrigin{ makeRefPtr(securityOrigin) }
     118        , m_url { url }
     119        , m_referrer { referrer }
     120    {
     121    }
     122
     123    void fire(Frame& frame) override
     124    {
     125        UserGestureIndicator gestureIndicator { userGestureToForward() };
     126
     127        ResourceRequest resourceRequest { m_url, m_referrer, UseProtocolCachePolicy };
     128        FrameLoadRequest frameLoadRequest { m_initiatingDocument.get(), *m_securityOrigin, resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs() };
     129
     130        frame.loader().changeLocation(WTFMove(frameLoadRequest));
    130131    }
    131132
     
    154155    }
    155156
     157    Document& initiatingDocument() { return m_initiatingDocument.get(); }
    156158    SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); }
    157159    const URL& url() const { return m_url; }
     
    159161
    160162private:
     163    Ref<Document> m_initiatingDocument;
    161164    RefPtr<SecurityOrigin> m_securityOrigin;
    162165    URL m_url;
     
    180183    void fire(Frame& frame) override
    181184    {
    182         UserGestureIndicator gestureIndicator(userGestureToForward());
     185        UserGestureIndicator gestureIndicator { userGestureToForward() };
     186
    183187        bool refresh = equalIgnoringFragmentIdentifier(frame.document()->url(), url());
    184         ResourceRequest resourceRequest(url(), referrer(), refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy);
    185         FrameLoadRequest frameRequest(*securityOrigin(), resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs());
    186 
    187         frame.loader().changeLocation(WTFMove(frameRequest));
     188        ResourceRequest resourceRequest { url(), referrer(), refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy };
     189        FrameLoadRequest frameLoadRequest { initiatingDocument(), *securityOrigin(), resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs() };
     190
     191        frame.loader().changeLocation(WTFMove(frameLoadRequest));
    188192    }
    189193};
     
    196200    void fire(Frame& frame) override
    197201    {
    198         UserGestureIndicator gestureIndicator(userGestureToForward());
    199 
    200         ResourceRequest resourceRequest(url(), referrer(), UseProtocolCachePolicy);
    201         FrameLoadRequest frameRequest(*securityOrigin(), resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs());
    202         frame.loader().changeLocation(WTFMove(frameRequest));
     202        UserGestureIndicator gestureIndicator { userGestureToForward() };
     203
     204        ResourceRequest resourceRequest { url(), referrer(), UseProtocolCachePolicy };
     205        FrameLoadRequest frameLoadRequest { initiatingDocument(), *securityOrigin(), resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs() };
     206        frame.loader().changeLocation(WTFMove(frameLoadRequest));
    203207    }
    204208};
     
    213217    void fire(Frame& frame) override
    214218    {
    215         UserGestureIndicator gestureIndicator(userGestureToForward());
    216 
    217         ResourceRequest resourceRequest(url(), referrer(), ReloadIgnoringCacheData);
    218         FrameLoadRequest frameRequest(*securityOrigin(), resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs());
    219         frame.loader().changeLocation(WTFMove(frameRequest));
     219        UserGestureIndicator gestureIndicator { userGestureToForward() };
     220
     221        ResourceRequest resourceRequest { url(), referrer(), ReloadIgnoringCacheData };
     222        FrameLoadRequest frameLoadRequest { initiatingDocument(), *securityOrigin(), resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs() };
     223        frame.loader().changeLocation(WTFMove(frameLoadRequest));
    220224    }
    221225};
     
    268272        if (!requestingDocument.canNavigate(&frame))
    269273            return;
    270         FrameLoadRequest frameLoadRequest { requestingDocument.securityOrigin(), { }, { }, lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs() };
     274        FrameLoadRequest frameLoadRequest { requestingDocument, requestingDocument.securityOrigin(), { }, { }, lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs() };
    271275        m_submission->populateFrameLoadRequest(frameLoadRequest);
    272276        frame.loader().loadFrameRequest(WTFMove(frameLoadRequest), m_submission->event(), &m_submission->state());
     
    312316    void fire(Frame& frame) override
    313317    {
    314         UserGestureIndicator gestureIndicator(userGestureToForward());
    315 
    316         ResourceResponse replacementResponse(m_originDocument.url(), ASCIILiteral("text/plain"), 0, ASCIILiteral("UTF-8"));
    317         SubstituteData replacementData(SharedBuffer::create(), m_originDocument.url(), replacementResponse, SubstituteData::SessionHistoryVisibility::Hidden);
    318 
    319         ResourceRequest resourceRequest(m_originDocument.url(), emptyString(), ReloadIgnoringCacheData);
    320         FrameLoadRequest frameLoadRequest { m_originDocument.securityOrigin(), resourceRequest, { }, lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs() };
     318        UserGestureIndicator gestureIndicator { userGestureToForward() };
     319
     320        ResourceResponse replacementResponse { m_originDocument.url(), ASCIILiteral("text/plain"), 0, ASCIILiteral("UTF-8") };
     321        SubstituteData replacementData { SharedBuffer::create(), m_originDocument.url(), replacementResponse, SubstituteData::SessionHistoryVisibility::Hidden };
     322
     323        ResourceRequest resourceRequest { m_originDocument.url(), emptyString(), ReloadIgnoringCacheData };
     324        FrameLoadRequest frameLoadRequest { m_originDocument, m_originDocument.securityOrigin(), resourceRequest, { }, lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs() };
    321325        frameLoadRequest.setSubstituteData(replacementData);
    322326        frame.loader().load(WTFMove(frameLoadRequest));
     
    417421    if (url.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier(m_frame.document()->url(), url)) {
    418422        ResourceRequest resourceRequest { m_frame.document()->completeURL(url), referrer, UseProtocolCachePolicy };
    419         FrameLoadRequest frameLoadRequest { securityOrigin, resourceRequest, ASCIILiteral("_self"), lockHistory, lockBackForwardList, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, initiatingDocument.shouldOpenExternalURLsPolicyToPropagate() };
     423        FrameLoadRequest frameLoadRequest { initiatingDocument, securityOrigin, resourceRequest, ASCIILiteral("_self"), lockHistory, lockBackForwardList, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, initiatingDocument.shouldOpenExternalURLsPolicyToPropagate() };
    420424        loader.changeLocation(WTFMove(frameLoadRequest));
    421425        return;
  • trunk/Source/WebCore/loader/PolicyChecker.cpp

    r218599 r219013  
    8585    NavigationAction action = loader->triggeringAction();
    8686    if (action.isEmpty()) {
    87         action = NavigationAction(request, NavigationType::Other, loader->shouldOpenExternalURLsPolicyToPropagate());
     87        action = NavigationAction { *m_frame.document(), request, NavigationType::Other, loader->shouldOpenExternalURLsPolicyToPropagate() };
    8888        loader->setTriggeringAction(action);
    8989    }
  • trunk/Source/WebCore/page/ContextMenuController.cpp

    r218713 r219013  
    190190        return;
    191191
    192     FrameLoadRequest frameLoadRequest { frame.document()->securityOrigin(), ResourceRequest(urlToLoad, frame.loader().outgoingReferrer()), { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress, shouldOpenExternalURLsPolicy };
    193 
    194     Page* newPage = oldPage->chrome().createWindow(frame, frameLoadRequest, { }, NavigationAction(frameLoadRequest.resourceRequest()));
     192    FrameLoadRequest frameLoadRequest { *frame.document(), frame.document()->securityOrigin(), ResourceRequest(urlToLoad, frame.loader().outgoingReferrer()), { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress, shouldOpenExternalURLsPolicy };
     193
     194    Page* newPage = oldPage->chrome().createWindow(frame, frameLoadRequest, { }, { *frame.document(), frameLoadRequest.resourceRequest() });
    195195    if (!newPage)
    196196        return;
     
    396396        if (Frame* targetFrame = m_context.hitTestResult().targetFrame()) {
    397397            ResourceRequest resourceRequest { m_context.hitTestResult().absoluteLinkURL(), frame->loader().outgoingReferrer() };
    398             FrameLoadRequest frameLoadRequest { frame->document()->securityOrigin(), resourceRequest, { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress, targetFrame->isMainFrame() ? ShouldOpenExternalURLsPolicy::ShouldAllow : ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     398            FrameLoadRequest frameLoadRequest { *frame->document(), frame->document()->securityOrigin(), resourceRequest, { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress, targetFrame->isMainFrame() ? ShouldOpenExternalURLsPolicy::ShouldAllow : ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    399399            targetFrame->loader().loadFrameRequest(WTFMove(frameLoadRequest), nullptr, nullptr);
    400400        } else
  • trunk/Source/WebCore/page/DOMWindow.cpp

    r218713 r219013  
    22002200    ResourceRequest resourceRequest { completedURL, referrer };
    22012201    FrameLoader::addHTTPOriginIfNeeded(resourceRequest, firstFrame.loader().outgoingOrigin());
    2202     FrameLoadRequest frameLoadRequest { activeDocument->securityOrigin(), resourceRequest, frameName, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, activeDocument->shouldOpenExternalURLsPolicyToPropagate() };
     2202    FrameLoadRequest frameLoadRequest { *activeDocument, activeDocument->securityOrigin(), resourceRequest, frameName, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, activeDocument->shouldOpenExternalURLsPolicyToPropagate() };
    22032203
    22042204    // We pass the opener frame for the lookupFrame in case the active frame is different from
     
    22212221    if (created) {
    22222222        ResourceRequest resourceRequest { completedURL, referrer, UseProtocolCachePolicy };
    2223         FrameLoadRequest frameLoadRequest { activeWindow.document()->securityOrigin(), resourceRequest, ASCIILiteral("_self"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, activeDocument->shouldOpenExternalURLsPolicyToPropagate() };
     2223        FrameLoadRequest frameLoadRequest { *activeWindow.document(), activeWindow.document()->securityOrigin(), resourceRequest, ASCIILiteral("_self"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, activeDocument->shouldOpenExternalURLsPolicyToPropagate() };
    22242224        newFrame->loader().changeLocation(WTFMove(frameLoadRequest));
    22252225    } else if (!urlString.isEmpty()) {
    22262226        LockHistory lockHistory = ScriptController::processingUserGesture() ? LockHistory::No : LockHistory::Yes;
    2227         newFrame->navigationScheduler().scheduleLocationChange(*activeWindow.document(), activeWindow.document()->securityOrigin(), completedURL, referrer, lockHistory, LockBackForwardList::No);
     2227        newFrame->navigationScheduler().scheduleLocationChange(*activeDocument, activeDocument->securityOrigin(), completedURL, referrer, lockHistory, LockBackForwardList::No);
    22282228    }
    22292229
  • trunk/Source/WebKit/ios/ChangeLog

    r218713 r219013  
     12017-06-30  Daniel Bates  <dabates@apple.com>
     2
     3        API::FrameInfo should know the web page that contains the frame; add API property webView to WKFrameInfo
     4        https://bugs.webkit.org/show_bug.cgi?id=165160
     5        <rdar://problem/29451999>
     6
     7        Reviewed by Brady Eidson.
     8
     9        Pass the document that is requesting the load to the loader.
     10
     11        * WebView/WebPDFViewPlaceholder.mm:
     12        (-[WebPDFViewPlaceholder simulateClickOnLinkToURL:]):
     13
    1142017-06-22  Daniel Bates  <dabates@apple.com>
    215
  • trunk/Source/WebKit/ios/WebView/WebPDFViewPlaceholder.mm

    r218713 r219013  
    488488    // Call to the frame loader because this is where our security checks are made.
    489489    Frame* frame = core([_dataSource webFrame]);
    490     FrameLoadRequest frameLoadRequest { frame->document()->securityOrigin(), { URL }, { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     490    FrameLoadRequest frameLoadRequest { *frame->document(), frame->document()->securityOrigin(), { URL }, { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    491491    frame->loader().loadFrameRequest(WTFMove(frameLoadRequest), event.get(), nullptr);
    492492}
  • trunk/Source/WebKit/mac/ChangeLog

    r219012 r219013  
     12017-06-30  Daniel Bates  <dabates@apple.com>
     2
     3        API::FrameInfo should know the web page that contains the frame; add API property webView to WKFrameInfo
     4        https://bugs.webkit.org/show_bug.cgi?id=165160
     5        <rdar://problem/29451999>
     6
     7        Reviewed by Brady Eidson.
     8
     9        Pass the document that is requesting the load to the loader.
     10
     11        * WebView/WebPDFView.mm:
     12        (-[WebPDFView PDFViewWillClickOnLink:withURL:]):
     13
    1142017-06-29  Jer Noble  <jer.noble@apple.com>
    215
  • trunk/Source/WebKit/mac/WebView/WebPDFView.mm

    r218713 r219013  
    10391039    // Call to the frame loader because this is where our security checks are made.
    10401040    Frame* frame = core([dataSource webFrame]);
    1041     FrameLoadRequest frameLoadRequest { frame->document()->securityOrigin(), { URL }, { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     1041    FrameLoadRequest frameLoadRequest { *frame->document(), frame->document()->securityOrigin(), { URL }, { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    10421042    frame->loader().loadFrameRequest(WTFMove(frameLoadRequest), event.get(), nullptr);
    10431043}
  • trunk/Source/WebKit/win/ChangeLog

    r218837 r219013  
     12017-06-30  Daniel Bates  <dabates@apple.com>
     2
     3        API::FrameInfo should know the web page that contains the frame; add API property webView to WKFrameInfo
     4        https://bugs.webkit.org/show_bug.cgi?id=165160
     5        <rdar://problem/29451999>
     6
     7        Reviewed by Brady Eidson.
     8
     9        Pass the document that is requesting the load to the loader.
     10
     11        * Plugins/PluginView.cpp:
     12        (WebCore::PluginView::start):
     13        (WebCore::PluginView::getURLNotify):
     14        (WebCore::PluginView::getURL):
     15        (WebCore::PluginView::handlePost):
     16
    1172017-06-27  Wenson Hsieh  <wenson_hsieh@apple.com>
    218
  • trunk/Source/WebKit/win/Plugins/PluginView.cpp

    r218713 r219013  
    256256
    257257    if (!m_url.isEmpty() && !m_loadManually) {
    258         FrameLoadRequest frameLoadRequest { m_parentFrame->document()->securityOrigin(), { }, { }, LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     258        FrameLoadRequest frameLoadRequest { *m_parentFrame->document(), m_parentFrame->document()->securityOrigin(), { }, { }, LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    259259        frameLoadRequest.resourceRequest().setHTTPMethod("GET");
    260260        frameLoadRequest.resourceRequest().setURL(m_url);
     
    535535NPError PluginView::getURLNotify(const char* url, const char* target, void* notifyData)
    536536{
    537     FrameLoadRequest frameLoadRequest { m_parentFrame->document()->securityOrigin(), { }, target, LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     537    FrameLoadRequest frameLoadRequest { *m_parentFrame->document(), m_parentFrame->document()->securityOrigin(), { }, target, LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    538538
    539539    frameLoadRequest.resourceRequest().setHTTPMethod("GET");
     
    545545NPError PluginView::getURL(const char* url, const char* target)
    546546{
    547     FrameLoadRequest frameLoadRequest { m_parentFrame->document()->securityOrigin(), { }, target, LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     547    FrameLoadRequest frameLoadRequest { *m_parentFrame->document(), m_parentFrame->document()->securityOrigin(), { }, target, LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    548548
    549549    frameLoadRequest.resourceRequest().setHTTPMethod("GET");
     
    10881088    }
    10891089
    1090     FrameLoadRequest frameLoadRequest { m_parentFrame->document()->securityOrigin(), { }, target, LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     1090    FrameLoadRequest frameLoadRequest { *m_parentFrame->document(), m_parentFrame->document()->securityOrigin(), { }, target, LockHistory::No, LockBackForwardList::No, ShouldSendReferrer::MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    10911091    frameLoadRequest.resourceRequest().setHTTPMethod("POST");
    10921092    frameLoadRequest.resourceRequest().setURL(makeURL(m_parentFrame->document()->baseURL(), url));
  • trunk/Source/WebKit2/ChangeLog

    r219012 r219013  
     12017-06-30  Daniel Bates  <dabates@apple.com>
     2
     3        API::FrameInfo should know the web page that contains the frame; add API property webView to WKFrameInfo
     4        https://bugs.webkit.org/show_bug.cgi?id=165160
     5        <rdar://problem/29451999>
     6
     7        Reviewed by Brady Eidson.
     8
     9        Expose a property on WKFrameInfo to retrieve the WKWebView of the web page that contains the
     10        frame. This will allow an embedding client to know the web view that initiated the navigation
     11        request as well as differentiate between a navigation initiated by web content from one
     12        initiated via API.
     13
     14        The majority of this change is passing the document D that initiated the targeted navigation
     15        or called window.open() through the loading machinery to the FrameLoaderClient. The changes
     16        to pass this information to the FrameLoaderClient when creating a new window are straightforward.
     17        For targeted navigation, the WebKit2 FrameLoaderClient implementation now computes the info
     18        for the originating frame regardless of the navigation type (NavigationAction::type()).
     19        (Currently we only compute the originating frame for hyperlink activated navigations,
     20        form submissions, and form resubmissions). The WebProcess computes the page ID of the page
     21        that contains the originating frame and sends that to the UIProcess so that it can create
     22        an API::FrameInfo for the originating frame and associate the page that contains the frame,
     23        if the navigation was triggered by web content. If the navigation was triggered by API
     24        (e.g. -[WKWebView goBack]) then the created API::FrameInfo does not have an associated page
     25        so that an embedding client can distinguish between a navigation initiated by web content
     26        from a navigation that it initiated via API depending on whether API::FrameInfo::page() is
     27        nullptr. We expose property webView on the Mac and iOS API class WKFrameInfo to return the
     28        WKWebView corresponding to API::FrameInfo::page().
     29
     30        A small change that this patch makes is to have the WebProcess compute the originating frame
     31        info (call WebFrame::info()) and send it over to the UIProcess as opposed to sending the frame
     32        ID of the originating frame and having the UIProcess compute the frame info from it. We do this
     33        because the UIProcess may not be able to compute the frame info for the originating frame if
     34        the window that it was contained in was closed between the time the WebProcess sent the frame
     35        ID to the UIProcess and the UIProcess received it.
     36
     37        * UIProcess/API/APIFrameInfo.cpp:
     38        (API::FrameInfo::create):
     39        (API::FrameInfo::FrameInfo):
     40        (API::FrameInfo::clearPage):
     41        * UIProcess/API/APIFrameInfo.h:
     42        * UIProcess/API/APIUIClient.h:
     43        (API::UIClient::createNewPage):
     44        (API::UIClient::createNewPageAsync):
     45        * UIProcess/API/C/WKPage.cpp:
     46        (WKPageSetPageUIClient):
     47        * UIProcess/API/Cocoa/WKFrameInfo.h:
     48        * UIProcess/API/Cocoa/WKFrameInfo.mm:
     49        (-[WKFrameInfo description]):
     50        (-[WKFrameInfo webView]):
     51        * UIProcess/API/Cocoa/WKUserContentController.mm:
     52        * UIProcess/Cocoa/UIDelegate.h:
     53        * UIProcess/Cocoa/UIDelegate.mm:
     54        (WebKit::UIDelegate::UIClient::createNewPageCommon):
     55        (WebKit::UIDelegate::UIClient::createNewPage):
     56        (WebKit::UIDelegate::UIClient::createNewPageAsync):
     57        * UIProcess/WebPageProxy.cpp:
     58        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     59        (WebKit::WebPageProxy::createNewPage):
     60        * UIProcess/WebPageProxy.h:
     61        * UIProcess/WebPageProxy.messages.in:
     62        * WebProcess/Plugins/PluginView.cpp:
     63        (WebKit::PluginView::loadURL):
     64        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
     65        (WebKit::WebChromeClient::createWindow):
     66        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     67        (WebKit::WebFrameLoaderClient::dispatchCreatePage):
     68        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
     69        * WebProcess/WebPage/WebInspector.cpp:
     70        (WebKit::WebInspector::openInNewTab):
     71
    1722017-06-29  Jer Noble  <jer.noble@apple.com>
    273
  • trunk/Source/WebKit2/UIProcess/API/APIFrameInfo.cpp

    r216764 r219013  
    3030#include "FrameInfoData.h"
    3131#include "WebFrameProxy.h"
     32#include "WebPageProxy.h"
    3233
    3334namespace API {
    3435
    35 Ref<FrameInfo> FrameInfo::create(const WebKit::FrameInfoData& frameInfoData)
     36Ref<FrameInfo> FrameInfo::create(const WebKit::FrameInfoData& frameInfoData, WebKit::WebPageProxy* page)
    3637{
    37     return adoptRef(*new FrameInfo(frameInfoData));
     38    return adoptRef(*new FrameInfo(frameInfoData, page));
    3839}
    3940
     
    4849    frameInfoData.frameID = frame.frameID();
    4950
    50     return create(frameInfoData);
     51    return create(frameInfoData, frame.page());
    5152}
    5253
    53 FrameInfo::FrameInfo(const WebKit::FrameInfoData& frameInfoData)
    54     : m_isMainFrame(frameInfoData.isMainFrame)
    55     , m_request(frameInfoData.request)
    56     , m_securityOrigin(SecurityOrigin::create(frameInfoData.securityOrigin.securityOrigin()))
    57     , m_handle(API::FrameHandle::create(frameInfoData.frameID))
     54FrameInfo::FrameInfo(const WebKit::FrameInfoData& frameInfoData, WebKit::WebPageProxy* page)
     55    : m_isMainFrame { frameInfoData.isMainFrame }
     56    , m_request { frameInfoData.request }
     57    , m_securityOrigin { SecurityOrigin::create(frameInfoData.securityOrigin.securityOrigin()) }
     58    , m_handle { API::FrameHandle::create(frameInfoData.frameID) }
     59    , m_page { makeRefPtr(page) }
    5860{
    5961}
     
    6365}
    6466
     67void FrameInfo::clearPage()
     68{
     69    m_page = nullptr;
     70}
     71
    6572} // namespace API
  • trunk/Source/WebKit2/UIProcess/API/APIFrameInfo.h

    r205150 r219013  
    3535namespace WebKit {
    3636class WebFrameProxy;
     37class WebPageProxy;
    3738struct FrameInfoData;
    3839}
     
    4546class FrameInfo final : public ObjectImpl<Object::Type::FrameInfo> {
    4647public:
    47     static Ref<FrameInfo> create(const WebKit::FrameInfoData&);
     48    static Ref<FrameInfo> create(const WebKit::FrameInfoData&, WebKit::WebPageProxy*);
    4849    static Ref<FrameInfo> create(const WebKit::WebFrameProxy&, const WebCore::SecurityOrigin&);
    4950    virtual ~FrameInfo();
     
    5354    SecurityOrigin& securityOrigin() { return m_securityOrigin.get(); }
    5455    API::FrameHandle& handle() { return m_handle.get(); }
     56    WebKit::WebPageProxy* page() { return m_page.get(); }
     57
     58    void clearPage();
    5559
    5660private:
    57     FrameInfo(const WebKit::FrameInfoData&);
     61    FrameInfo(const WebKit::FrameInfoData&, WebKit::WebPageProxy*);
    5862
    5963    bool m_isMainFrame;
     
    6165    Ref<SecurityOrigin> m_securityOrigin;
    6266    Ref<FrameHandle> m_handle;
     67    RefPtr<WebKit::WebPageProxy> m_page;
    6368};
    6469
  • trunk/Source/WebKit2/UIProcess/API/APIUIClient.h

    r218457 r219013  
    7373    virtual ~UIClient() { }
    7474
    75     virtual RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&) { return nullptr; }
    76     virtual bool createNewPageAsync(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler) { return false; }
     75    virtual RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&) { return nullptr; }
     76    virtual bool createNewPageAsync(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler) { return false; }
    7777    virtual void showPage(WebKit::WebPageProxy*) { }
    7878    virtual void fullscreenMayReturnToInline(WebKit::WebPageProxy*) { }
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r218457 r219013  
    17051705
    17061706    private:
    1707         RefPtr<WebPageProxy> createNewPage(WebPageProxy* page, WebFrameProxy* initiatingFrame, const SecurityOriginData& securityOriginData, const ResourceRequest& resourceRequest, const WindowFeatures& windowFeatures, const NavigationActionData& navigationActionData) override
     1707        RefPtr<WebPageProxy> createNewPage(WebPageProxy* page, API::FrameInfo& sourceFrameInfo, const ResourceRequest& resourceRequest, const WindowFeatures& windowFeatures, const NavigationActionData& navigationActionData) override
    17081708        {
    17091709            if (m_client.createNewPage) {
     
    17111711                configuration->setRelatedPage(page);
    17121712
    1713                 auto sourceFrameInfo = API::FrameInfo::create(*initiatingFrame, securityOriginData.securityOrigin());
    1714 
    17151713                auto userInitiatedActivity = page->process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    1716                 bool shouldOpenAppLinks = !hostsAreEqual(WebCore::URL(WebCore::ParsedURLString, initiatingFrame->url()), resourceRequest.url());
    1717                 auto apiNavigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.ptr(), nullptr, resourceRequest, WebCore::URL(), shouldOpenAppLinks, userInitiatedActivity);
     1714                bool shouldOpenAppLinks = !hostsAreEqual(sourceFrameInfo.request().url(), resourceRequest.url());
     1715                auto apiNavigationAction = API::NavigationAction::create(navigationActionData, &sourceFrameInfo, nullptr, resourceRequest, WebCore::URL(), shouldOpenAppLinks, userInitiatedActivity);
    17181716
    17191717                auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures);
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKFrameInfo.h

    r202789 r219013  
    11/*
    2  * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
     2 * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3030#import <Foundation/Foundation.h>
    3131#import <WebKit/WKSecurityOrigin.h>
     32#import <WebKit/WKWebView.h>
    3233
    3334/*! A WKFrameInfo object contains information about a frame on a webpage.
     
    5455@property (nonatomic, readonly) WKSecurityOrigin *securityOrigin WK_API_AVAILABLE(macosx(10.11), ios(9.0));
    5556
     57/*! @abstract The web view of the webpage that contains this frame.
     58 */
     59@property (nonatomic, readonly, weak) WKWebView *webView WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     60
    5661@end
    5762
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKFrameInfo.mm

    r191136 r219013  
    3030
    3131#import "WKSecurityOriginInternal.h"
     32#import "WKWebViewInternal.h"
    3233#import "_WKFrameHandleInternal.h"
    3334
     
    4344- (NSString *)description
    4445{
    45     return [NSString stringWithFormat:@"<%@: %p; isMainFrame = %s; request = %@>", NSStringFromClass(self.class), self, self.mainFrame ? "YES" : "NO", self.request];
     46    return [NSString stringWithFormat:@"<%@: %p; webView = %p; isMainFrame = %s; request = %@>", NSStringFromClass(self.class), self, self.webView, self.mainFrame ? "YES" : "NO", self.request];
    4647}
    4748
     
    5960{
    6061    return wrapper(_frameInfo->securityOrigin());
     62}
     63
     64- (WKWebView *)webView
     65{
     66    if (WebKit::WebPageProxy* page = _frameInfo->page())
     67        return [[fromWebPageProxy(*page) retain] autorelease];
     68    return nil;
    6169}
    6270
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentController.mm

    r218299 r219013  
    126126    {
    127127        @autoreleasepool {
    128             RetainPtr<WKFrameInfo> frameInfo = wrapper(API::FrameInfo::create(frameInfoData));
     128            RetainPtr<WKFrameInfo> frameInfo = wrapper(API::FrameInfo::create(frameInfoData, &page));
    129129            id body = API::SerializedScriptValue::deserialize(serializedScriptValue, 0);
    130130            auto message = adoptNS([[WKScriptMessage alloc] _initWithBody:body webView:fromWebPageProxy(page) frameInfo:frameInfo.get() name:m_name.get()]);
  • trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.h

    r218457 r219013  
    3939@protocol WKUIDelegate;
    4040
     41namespace API {
     42class FrameInfo;
     43}
     44
    4145namespace WebKit {
    4246
     
    7680    private:
    7781        // API::UIClient
    78         RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&) override;
    79         bool createNewPageAsync(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler) override;
    80         RefPtr<WebKit::WebPageProxy> createNewPageCommon(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler);
     82        RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&) override;
     83        bool createNewPageAsync(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler) override;
     84        RefPtr<WebKit::WebPageProxy> createNewPageCommon(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler);
    8185
    8286        void close(WebKit::WebPageProxy*) override;
  • trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.mm

    r218457 r219013  
    2929#if WK_API_ENABLED
    3030
     31#import "APIFrameInfo.h"
    3132#import "CompletionHandlerCallChecker.h"
    3233#import "NavigationActionData.h"
     
    174175}
    175176
    176 RefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPageCommon(WebKit::WebPageProxy* page, WebKit::WebFrameProxy* initiatingFrame, const WebCore::SecurityOriginData& securityOriginData, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler)
     177RefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPageCommon(WebKit::WebPageProxy* page, API::FrameInfo& sourceFrameInfo, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler)
    177178{
    178179    auto delegate = m_uiDelegate.m_delegate.get();
     
    182183    [configuration _setRelatedWebView:m_uiDelegate.m_webView];
    183184
    184     auto sourceFrameInfo = API::FrameInfo::create(*initiatingFrame, securityOriginData.securityOrigin());
    185 
    186185    auto userInitiatedActivity = page->process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    187     bool shouldOpenAppLinks = !hostsAreEqual(WebCore::URL(WebCore::ParsedURLString, initiatingFrame->url()), request.url());
    188     auto apiNavigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.ptr(), nullptr, request, WebCore::URL(), shouldOpenAppLinks, userInitiatedActivity);
     186    bool shouldOpenAppLinks = !hostsAreEqual(sourceFrameInfo.request().url(), request.url());
     187    auto apiNavigationAction = API::NavigationAction::create(navigationActionData, &sourceFrameInfo, nullptr, request, WebCore::URL(), shouldOpenAppLinks, userInitiatedActivity);
    189188
    190189    auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures);
     
    223222}
    224223
    225 RefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy* page, WebKit::WebFrameProxy* initiatingFrame, const WebCore::SecurityOriginData& securityOriginData, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData)
     224RefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy* page, API::FrameInfo& originatingFrameInfo, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData)
    226225{
    227226    if (!m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures)
     
    232231        return nullptr;
    233232
    234     return createNewPageCommon(page, initiatingFrame, securityOriginData, request, windowFeatures, navigationActionData, nullptr);
    235 }
    236 
    237 bool UIDelegate::UIClient::createNewPageAsync(WebKit::WebPageProxy* page, WebKit::WebFrameProxy* initiatingFrame, const WebCore::SecurityOriginData& securityOriginData, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler)
     233    return createNewPageCommon(page, originatingFrameInfo, request, windowFeatures, navigationActionData, nullptr);
     234}
     235
     236bool UIDelegate::UIClient::createNewPageAsync(WebKit::WebPageProxy* page, API::FrameInfo& originatingFrameInfo, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler)
    238237{
    239238    if (!m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeaturesAsync)
     
    244243        return false;
    245244
    246     createNewPageCommon(page, initiatingFrame, securityOriginData, request, windowFeatures, navigationActionData, WTFMove(completionHandler));
     245    createNewPageCommon(page, originatingFrameInfo, request, windowFeatures, navigationActionData, WTFMove(completionHandler));
    247246
    248247    return true;
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r218985 r219013  
    5858#include "DrawingAreaProxyMessages.h"
    5959#include "EventDispatcherMessages.h"
     60#include "FrameInfoData.h"
    6061#include "LoadParameters.h"
    6162#include "Logging.h"
     
    35993600}
    36003601
    3601 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, uint64_t originatingFrameID, const SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, const UserData& userData, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&& reply)
     3602void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, const UserData& userData, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&& reply)
    36023603{
    36033604    PageClientProtector protector(m_pageClient);
     
    36053606    auto transaction = m_pageLoadState.transaction();
    36063607
    3607     if (request.url() != m_pageLoadState.pendingAPIRequestURL())
     3608    bool fromAPI = request.url() == m_pageLoadState.pendingAPIRequestURL();
     3609    if (!fromAPI)
    36083610        m_pageLoadState.clearPendingAPIRequestURL(transaction);
    36093611
     
    36123614    MESSAGE_CHECK_URL(request.url());
    36133615    MESSAGE_CHECK_URL(originalRequest.url());
    3614 
    3615     WebFrameProxy* originatingFrame = m_process->webFrame(originatingFrameID);
    36163616   
    36173617    m_newNavigationID = 0;
     
    36363636    m_navigationActionPolicyReply = WTFMove(reply);
    36373637
     3638    WebFrameProxy* originatingFrame = m_process->webFrame(originatingFrameInfoData.frameID);
     3639
    36383640    if (m_navigationClient) {
    3639         RefPtr<API::FrameInfo> destinationFrameInfo;
     3641        RefPtr<API::FrameInfo> destinationFrameInfo = API::FrameInfo::create(*frame, frameSecurityOrigin.securityOrigin());
    36403642        RefPtr<API::FrameInfo> sourceFrameInfo;
    3641 
    3642         if (frame)
    3643             destinationFrameInfo = API::FrameInfo::create(*frame, frameSecurityOrigin.securityOrigin());
    3644 
    36453643        if (originatingFrame == frame)
    36463644            sourceFrameInfo = destinationFrameInfo;
    3647         else if (originatingFrame)
    3648             sourceFrameInfo = API::FrameInfo::create(*originatingFrame, originatingFrameSecurityOrigin.securityOrigin());
     3645        else
     3646            sourceFrameInfo = API::FrameInfo::create(originatingFrameInfoData, m_process->webPage(originatingPageID));
     3647        if (fromAPI) {
     3648            sourceFrameInfo->clearPage();
     3649            destinationFrameInfo->clearPage();
     3650        }
    36493651
    36503652        auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
     
    38173819// UIClient
    38183820
    3819 void WebPageProxy::createNewPage(uint64_t frameID, const SecurityOriginData& securityOriginData, const ResourceRequest& request, const WindowFeatures& windowFeatures, const NavigationActionData& navigationActionData, RefPtr<Messages::WebPageProxy::CreateNewPage::DelayedReply> reply)
    3820 {
    3821     WebFrameProxy* frame = m_process->webFrame(frameID);
    3822     MESSAGE_CHECK(frame);
     3821void WebPageProxy::createNewPage(const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const ResourceRequest& request, const WindowFeatures& windowFeatures, const NavigationActionData& navigationActionData, RefPtr<Messages::WebPageProxy::CreateNewPage::DelayedReply> reply)
     3822{
     3823    MESSAGE_CHECK(m_process->webFrame(originatingFrameInfoData.frameID));
     3824    auto originatingFrameInfo = API::FrameInfo::create(originatingFrameInfoData, m_process->webPage(originatingPageID));
    38233825
    38243826    auto mainFrameURL = m_mainFrame->url();
     
    38373839    };
    38383840
    3839     if (m_uiClient->createNewPageAsync(this, frame, securityOriginData, request, windowFeatures, navigationActionData, [completionHandler](RefPtr<WebPageProxy> newPage) { completionHandler(newPage); }))
    3840         return;
    3841 
    3842     RefPtr<WebPageProxy> newPage = m_uiClient->createNewPage(this, frame, securityOriginData, request, windowFeatures, navigationActionData);
     3841    if (m_uiClient->createNewPageAsync(this, originatingFrameInfo, request, windowFeatures, navigationActionData, [completionHandler](RefPtr<WebPageProxy> newPage) { completionHandler(newPage); }))
     3842        return;
     3843
     3844    RefPtr<WebPageProxy> newPage = m_uiClient->createNewPage(this, originatingFrameInfo, request, windowFeatures, navigationActionData);
    38433845    completionHandler(WTFMove(newPage));
    38443846}
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r218985 r219013  
    219219struct EditingRange;
    220220struct EditorState;
     221struct FrameInfoData;
    221222struct InteractionInformationRequest;
    222223struct LoadParameters;
     
    12741275    void didDestroyNavigation(uint64_t navigationID);
    12751276
    1276     void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, uint64_t originatingFrameID, const WebCore::SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&&);
     1277    void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&&);
    12771278    void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const NavigationActionData&, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, const UserData&);
    12781279    void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&);
     
    12891290
    12901291    // UI client
    1291     void createNewPage(uint64_t frameID, const WebCore::SecurityOriginData&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const NavigationActionData&, RefPtr<Messages::WebPageProxy::CreateNewPage::DelayedReply>);
     1292    void createNewPage(const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const NavigationActionData&, RefPtr<Messages::WebPageProxy::CreateNewPage::DelayedReply>);
    12921293    void showPage();
    12931294    void runJavaScriptAlert(uint64_t frameID, const WebCore::SecurityOriginData&, const String&, Ref<Messages::WebPageProxy::RunJavaScriptAlert::DelayedReply>&&);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r218985 r219013  
    2323messages -> WebPageProxy {
    2424    # UI messages
    25     CreateNewPage(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, WebCore::ResourceRequest request, struct WebCore::WindowFeatures windowFeatures, struct WebKit::NavigationActionData navigationActionData) -> (uint64_t newPageID, struct WebKit::WebPageCreationParameters newPageParameters) Delayed
     25    CreateNewPage(struct WebKit::FrameInfoData originatingFrameInfoData, uint64_t originatingPageID, WebCore::ResourceRequest request, struct WebCore::WindowFeatures windowFeatures, struct WebKit::NavigationActionData navigationActionData) -> (uint64_t newPageID, struct WebKit::WebPageCreationParameters newPageParameters) Delayed
    2626    ShowPage()
    2727    ClosePage(bool stopResponsivenessTimer)
     
    101101    # Policy messages
    102102    DecidePolicyForResponseSync(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, WebCore::ResourceResponse response, WebCore::ResourceRequest request, bool canShowMIMEType, uint64_t listenerID, WebKit::UserData userData) -> (uint64_t policyAction, WebKit::DownloadID downloadID) Delayed
    103     DecidePolicyForNavigationAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, struct WebKit::NavigationActionData navigationActionData, uint64_t originatingFrameID, struct WebCore::SecurityOriginData originatingFrameSecurityOrigin, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::UserData userData) -> (uint64_t newNavigationID, uint64_t policyAction, WebKit::DownloadID downloadID, struct WebKit::WebsitePolicies websitePolicies) Delayed
     103    DecidePolicyForNavigationAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, struct WebKit::NavigationActionData navigationActionData, struct WebKit::FrameInfoData originatingFrameInfoData, uint64_t originatingPageID, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::UserData userData) -> (uint64_t newNavigationID, uint64_t policyAction, WebKit::DownloadID downloadID, struct WebKit::WebsitePolicies websitePolicies) Delayed
    104104    DecidePolicyForNewWindowAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, struct WebKit::NavigationActionData navigationActionData, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::UserData userData)
    105105    UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::UserData userData)
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp

    r218713 r219013  
    13891389void PluginView::loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups)
    13901390{
    1391     FrameLoadRequest frameLoadRequest { m_pluginElement->document().securityOrigin(), { }, target, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     1391    FrameLoadRequest frameLoadRequest { m_pluginElement->document(), m_pluginElement->document().securityOrigin(), { }, target, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    13921392    frameLoadRequest.resourceRequest().setHTTPMethod(method);
    13931393    frameLoadRequest.resourceRequest().setURL(m_pluginElement->document().completeURL(urlString));
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp

    r218625 r219013  
    3232#include "DrawingArea.h"
    3333#include "FindController.h"
     34#include "FrameInfoData.h"
    3435#include "HangDetectionDisabler.h"
    3536#include "InjectedBundleNavigationAction.h"
     
    235236    auto& webProcess = WebProcess::singleton();
    236237
    237     WebFrame* webFrame = WebFrame::fromCoreFrame(frame);
    238 
    239238    NavigationActionData navigationActionData;
    240239    navigationActionData.navigationType = navigationAction.type();
     
    247246    navigationActionData.downloadAttribute = navigationAction.downloadAttribute();
    248247
     248    WebFrame* webFrame = WebFrame::fromCoreFrame(frame);
     249
    249250    uint64_t newPageID = 0;
    250251    WebPageCreationParameters parameters;
    251     if (!webProcess.parentProcessConnection()->sendSync(Messages::WebPageProxy::CreateNewPage(webFrame->frameID(), SecurityOriginData::fromFrame(&frame), request.resourceRequest(), windowFeatures, navigationActionData), Messages::WebPageProxy::CreateNewPage::Reply(newPageID, parameters), m_page.pageID()))
     252    if (!webProcess.parentProcessConnection()->sendSync(Messages::WebPageProxy::CreateNewPage(webFrame->info(), webFrame->page()->pageID(), request.resourceRequest(), windowFeatures, navigationActionData), Messages::WebPageProxy::CreateNewPage::Reply(newPageID, parameters), m_page.pageID()))
    252253        return nullptr;
    253254
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r218985 r219013  
    3131#include "DrawingArea.h"
    3232#include "FindController.h"
     33#include "FrameInfoData.h"
    3334#include "InjectedBundle.h"
    3435#include "InjectedBundleBackForwardListItem.h"
     
    658659
    659660    // Just call through to the chrome client.
    660     FrameLoadRequest frameLoadRequest { m_frame->coreFrame()->document()->securityOrigin(), navigationAction.resourceRequest(), { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, navigationAction.shouldOpenExternalURLsPolicy() };
     661    FrameLoadRequest frameLoadRequest { *m_frame->coreFrame()->document(), m_frame->coreFrame()->document()->securityOrigin(), navigationAction.resourceRequest(), { }, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, navigationAction.shouldOpenExternalURLsPolicy() };
    661662    Page* newPage = webPage->corePage()->chrome().createWindow(*m_frame->coreFrame(), frameLoadRequest, { }, navigationAction);
    662663    if (!newPage)
     
    780781    DownloadID downloadID;
    781782
    782     RefPtr<WebFrame> originatingFrame;
    783     switch (action->navigationType()) {
    784     case NavigationType::LinkClicked:
    785         if (EventTarget* target = navigationAction.event()->target()) {
    786             if (Node* node = target->toNode()) {
    787                 if (Frame* frame = node->document().frame())
    788                     originatingFrame = WebFrame::fromCoreFrame(*frame);
    789             }
    790         }
    791         break;
    792     case NavigationType::FormSubmitted:
    793     case NavigationType::FormResubmitted:
    794         if (formState)
    795             originatingFrame = WebFrame::fromCoreFrame(*formState->sourceDocument().frame());
    796         break;
    797     case NavigationType::BackForward:
    798     case NavigationType::Reload:
    799     case NavigationType::Other:
    800         break;
    801     }
     783    ASSERT(navigationAction.sourceDocument());
     784    RefPtr<WebFrame> originatingFrame = WebFrame::fromCoreFrame(*navigationAction.sourceDocument()->frame());
    802785
    803786    NavigationActionData navigationActionData;
     
    823806    // Notify the UIProcess.
    824807    Ref<WebFrame> protect(*m_frame);
    825     WebCore::Frame* originatingCoreFrame = originatingFrame ? originatingFrame->coreFrame() : nullptr;
    826808    WebsitePolicies websitePolicies;
    827     if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrame ? originatingFrame->frameID() : 0, SecurityOriginData::fromFrame(originatingCoreFrame), navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(newNavigationID, policyAction, downloadID, websitePolicies))) {
     809    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrame ? originatingFrame->info() : FrameInfoData(), originatingFrame && originatingFrame->page() ? originatingFrame->page()->pageID() : 0, navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(newNavigationID, policyAction, downloadID, websitePolicies))) {
    828810        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
    829811        return;
  • trunk/Source/WebKit2/WebProcess/WebPage/WebInspector.cpp

    r218713 r219013  
    147147
    148148    Frame& inspectedMainFrame = inspectedPage->mainFrame();
    149     FrameLoadRequest frameLoadRequest { inspectedMainFrame.document()->securityOrigin(), { urlString }, ASCIILiteral("_blank"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    150 
    151     Page* newPage = inspectedPage->chrome().createWindow(inspectedMainFrame, frameLoadRequest, { }, NavigationAction(frameLoadRequest.resourceRequest(), NavigationType::LinkClicked));
     149    FrameLoadRequest frameLoadRequest { *inspectedMainFrame.document(), inspectedMainFrame.document()->securityOrigin(), { urlString }, ASCIILiteral("_blank"), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     150
     151    NavigationAction action { *inspectedMainFrame.document(), frameLoadRequest.resourceRequest(), NavigationType::LinkClicked };
     152    Page* newPage = inspectedPage->chrome().createWindow(inspectedMainFrame, frameLoadRequest, { }, action);
    152153    if (!newPage)
    153154        return;
  • trunk/Tools/ChangeLog

    r219012 r219013  
     12017-06-30  Daniel Bates  <dabates@apple.com>
     2
     3        API::FrameInfo should know the web page that contains the frame; add API property webView to WKFrameInfo
     4        https://bugs.webkit.org/show_bug.cgi?id=165160
     5        <rdar://problem/29451999>
     6
     7        Reviewed by Brady Eidson.
     8
     9        Add tests to ensure that -[WKFrameInfo webView] is computed correctly for the source and target frame
     10        for navigations and window creation.
     11
     12        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     13        * TestWebKitAPI/Tests/WebKit2Cocoa/DecidePolicyForNavigationAction.mm: Added. Derived from file ShouldOpenExternalURLsInNewWindowActions.mm.
     14        (-[DecidePolicyForNavigationActionController webView:decidePolicyForNavigationAction:decisionHandler:]):
     15        (-[DecidePolicyForNavigationActionController webView:didFinishNavigation:]):
     16        (-[DecidePolicyForNavigationActionController webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:]):
     17        (TEST):
     18
    1192017-06-29  Jer Noble  <jer.noble@apple.com>
    220
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r218998 r219013  
    623623                CEBCA13A1E3A807A00C73293 /* page-without-csp.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = CEBCA1371E3A803400C73293 /* page-without-csp.html */; };
    624624                CEBCA13B1E3A807A00C73293 /* page-without-csp-iframe.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = CEBCA1361E3A803400C73293 /* page-without-csp-iframe.html */; };
     625                CEC16EA51EE863C000DE479A /* DecidePolicyForNavigationAction.mm in Sources */ = {isa = PBXBuildFile; fileRef = CEC16EA41EE863BF00DE479A /* DecidePolicyForNavigationAction.mm */; };
    625626                D34E08761E4E42E1005FF14A /* WKWebViewGetContents.mm in Sources */ = {isa = PBXBuildFile; fileRef = D3BE5E341E4CE85E00FD563A /* WKWebViewGetContents.mm */; };
    626627                E1220DCA155B28AA0013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = E1220DC9155B287D0013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.html */; };
     
    15891590                CEBCA1361E3A803400C73293 /* page-without-csp-iframe.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "page-without-csp-iframe.html"; sourceTree = "<group>"; };
    15901591                CEBCA1371E3A803400C73293 /* page-without-csp.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "page-without-csp.html"; sourceTree = "<group>"; };
     1592                CEC16EA41EE863BF00DE479A /* DecidePolicyForNavigationAction.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DecidePolicyForNavigationAction.mm; sourceTree = "<group>"; };
    15911593                D3BE5E341E4CE85E00FD563A /* WKWebViewGetContents.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewGetContents.mm; sourceTree = "<group>"; };
    15921594                DC69AA621CF77C6500C6272F /* ScopedLambda.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScopedLambda.cpp; sourceTree = "<group>"; };
     
    18201822                                5C2936911D5BF63E00DEAB1E /* CookieAcceptPolicy.mm */,
    18211823                                2DC4CF761D2D9DD800ECCC94 /* DataDetection.mm */,
     1824                                CEC16EA41EE863BF00DE479A /* DecidePolicyForNavigationAction.mm */,
    18221825                                2DC60E221E79F88C00FA6C7D /* DoAfterNextPresentationUpdateAfterCrash.mm */,
    18231826                                A1A4FE5D18DD3DB700B5EA8A /* Download.mm */,
     
    29912994                                7C83E04D1D0A641800FEBCF3 /* DFACombiner.cpp in Sources */,
    29922995                                7C83E04E1D0A641800FEBCF3 /* DFAMinimizer.cpp in Sources */,
     2996                                CEC16EA51EE863C000DE479A /* DecidePolicyForNavigationAction.mm in Sources */,
    29932997                                7CCE7EE91A411AE600447C4C /* DidAssociateFormControls.cpp in Sources */,
    29942998                                7CCE7EEA1A411AE600447C4C /* DidNotHandleKeyDown.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.