Title: [256404] branches/safari-609-branch
Revision
256404
Author
alanc...@apple.com
Date
2020-02-11 16:59:37 -0800 (Tue, 11 Feb 2020)

Log Message

Cherry-pick r255845. rdar://problem/59298143

    _WKDownload should expose the originating FrameInfo.
    <rdar://problem/58022576> and https://bugs.webkit.org/show_bug.cgi?id=207185

    Patch by Brady Eidson <beid...@apple.com> on 2020-02-05
    Reviewed by Geoff Garen.

    Source/WebKit:

    Covered by new API test.

    For the cases where a navigation is converted into a download, include the relevant
    WKFrameInfo on the _WKDownload object.

    * UIProcess/API/APIFrameInfo.h:
    * UIProcess/API/Cocoa/_WKDownload.h:
    * UIProcess/API/Cocoa/_WKDownload.mm:
    (-[_WKDownload originatingFrameInfo]):
    * UIProcess/Downloads/DownloadProxy.cpp:
    (WebKit::generateDownloadID):
    (WebKit::DownloadProxy::DownloadProxy):
    (WebKit::DownloadProxy::create): Deleted.
    (WebKit::DownloadProxy::setOriginatingPage): Deleted.
    * UIProcess/Downloads/DownloadProxy.h:
    (WebKit::DownloadProxy::create):
    (WebKit::DownloadProxy::frameInfo):
    * UIProcess/Downloads/DownloadProxyMap.cpp:
    (WebKit::DownloadProxyMap::createDownloadProxy):
    * UIProcess/Downloads/DownloadProxyMap.h:
    * UIProcess/Network/NetworkProcessProxy.cpp:
    (WebKit::NetworkProcessProxy::createDownloadProxy):
    * UIProcess/Network/NetworkProcessProxy.h:
    * UIProcess/WebPageProxy.cpp:
    (WebKit::WebPageProxy::receivedPolicyDecision):
    * UIProcess/WebProcessPool.cpp:
    (WebKit::WebProcessPool::download):
    (WebKit::WebProcessPool::resumeDownload):
    (WebKit::WebProcessPool::createDownloadProxy):
    * UIProcess/WebProcessPool.h:

    Tools:

    * TestWebKitAPI/Tests/WebKitCocoa/Download.mm:
    (-[DownloadTestSchemeDelegate webView:decidePolicyForNavigationResponse:decisionHandler:]):
    (-[DownloadSecurityOriginDelegate _downloadDidStart:]):
    (loaded):
    * TestWebKitAPI/cocoa/HTTPServer.mm:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@255845 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-609-branch/Source/WebKit/ChangeLog (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/ChangeLog	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/ChangeLog	2020-02-12 00:59:37 UTC (rev 256404)
@@ -1,5 +1,96 @@
 2020-02-11  Alan Coon  <alanc...@apple.com>
 
+        Cherry-pick r255845. rdar://problem/59298143
+
+    _WKDownload should expose the originating FrameInfo.
+    <rdar://problem/58022576> and https://bugs.webkit.org/show_bug.cgi?id=207185
+    
+    Patch by Brady Eidson <beid...@apple.com> on 2020-02-05
+    Reviewed by Geoff Garen.
+    
+    Source/WebKit:
+    
+    Covered by new API test.
+    
+    For the cases where a navigation is converted into a download, include the relevant
+    WKFrameInfo on the _WKDownload object.
+    
+    * UIProcess/API/APIFrameInfo.h:
+    * UIProcess/API/Cocoa/_WKDownload.h:
+    * UIProcess/API/Cocoa/_WKDownload.mm:
+    (-[_WKDownload originatingFrameInfo]):
+    * UIProcess/Downloads/DownloadProxy.cpp:
+    (WebKit::generateDownloadID):
+    (WebKit::DownloadProxy::DownloadProxy):
+    (WebKit::DownloadProxy::create): Deleted.
+    (WebKit::DownloadProxy::setOriginatingPage): Deleted.
+    * UIProcess/Downloads/DownloadProxy.h:
+    (WebKit::DownloadProxy::create):
+    (WebKit::DownloadProxy::frameInfo):
+    * UIProcess/Downloads/DownloadProxyMap.cpp:
+    (WebKit::DownloadProxyMap::createDownloadProxy):
+    * UIProcess/Downloads/DownloadProxyMap.h:
+    * UIProcess/Network/NetworkProcessProxy.cpp:
+    (WebKit::NetworkProcessProxy::createDownloadProxy):
+    * UIProcess/Network/NetworkProcessProxy.h:
+    * UIProcess/WebPageProxy.cpp:
+    (WebKit::WebPageProxy::receivedPolicyDecision):
+    * UIProcess/WebProcessPool.cpp:
+    (WebKit::WebProcessPool::download):
+    (WebKit::WebProcessPool::resumeDownload):
+    (WebKit::WebProcessPool::createDownloadProxy):
+    * UIProcess/WebProcessPool.h:
+    
+    Tools:
+    
+    * TestWebKitAPI/Tests/WebKitCocoa/Download.mm:
+    (-[DownloadTestSchemeDelegate webView:decidePolicyForNavigationResponse:decisionHandler:]):
+    (-[DownloadSecurityOriginDelegate _downloadDidStart:]):
+    (loaded):
+    * TestWebKitAPI/cocoa/HTTPServer.mm:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@255845 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2020-02-05  Brady Eidson  <beid...@apple.com>
+
+            _WKDownload should expose the originating FrameInfo.
+            <rdar://problem/58022576> and https://bugs.webkit.org/show_bug.cgi?id=207185
+
+            Reviewed by Geoff Garen.
+
+            Covered by new API test.
+
+            For the cases where a navigation is converted into a download, include the relevant
+            WKFrameInfo on the _WKDownload object.
+
+            * UIProcess/API/APIFrameInfo.h:
+            * UIProcess/API/Cocoa/_WKDownload.h:
+            * UIProcess/API/Cocoa/_WKDownload.mm:
+            (-[_WKDownload originatingFrameInfo]):
+            * UIProcess/Downloads/DownloadProxy.cpp:
+            (WebKit::generateDownloadID):
+            (WebKit::DownloadProxy::DownloadProxy):
+            (WebKit::DownloadProxy::create): Deleted.
+            (WebKit::DownloadProxy::setOriginatingPage): Deleted.
+            * UIProcess/Downloads/DownloadProxy.h:
+            (WebKit::DownloadProxy::create):
+            (WebKit::DownloadProxy::frameInfo):
+            * UIProcess/Downloads/DownloadProxyMap.cpp:
+            (WebKit::DownloadProxyMap::createDownloadProxy):
+            * UIProcess/Downloads/DownloadProxyMap.h:
+            * UIProcess/Network/NetworkProcessProxy.cpp:
+            (WebKit::NetworkProcessProxy::createDownloadProxy):
+            * UIProcess/Network/NetworkProcessProxy.h:
+            * UIProcess/WebPageProxy.cpp:
+            (WebKit::WebPageProxy::receivedPolicyDecision):
+            * UIProcess/WebProcessPool.cpp:
+            (WebKit::WebProcessPool::download):
+            (WebKit::WebProcessPool::resumeDownload):
+            (WebKit::WebProcessPool::createDownloadProxy):
+            * UIProcess/WebProcessPool.h:
+
+2020-02-11  Alan Coon  <alanc...@apple.com>
+
         Cherry-pick r255595. rdar://problem/59298183
 
     Regression(r253224) WKUIDelegate.webViewDidClose may get called twice after calling _tryClose on the WKWebView

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/API/APIFrameInfo.h (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/API/APIFrameInfo.h	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/API/APIFrameInfo.h	2020-02-12 00:59:37 UTC (rev 256404)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "APIObject.h"
+#include "WebPageProxy.h"
 #include <WebCore/ResourceRequest.h>
 
 namespace WebCore {
@@ -34,7 +35,6 @@
 
 namespace WebKit {
 class WebFrameProxy;
-class WebPageProxy;
 struct FrameInfoData;
 }
 

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.h (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.h	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.h	2020-02-12 00:59:37 UTC (rev 256404)
@@ -27,6 +27,7 @@
 
 #import <Foundation/Foundation.h>
 
+@class WKFrameInfo;
 @class WKWebView;
 
 WK_CLASS_AVAILABLE(macos(10.10), ios(8.0))
@@ -41,5 +42,6 @@
 @property (nonatomic, readonly, copy) NSArray<NSURL *> *redirectChain WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
 @property (nonatomic, readonly) BOOL wasUserInitiated WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
 @property (nonatomic, readonly) NSData *resumeData WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
+@property (nonatomic, readonly) WKFrameInfo *originatingFrame WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 @end

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.mm (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.mm	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.mm	2020-02-12 00:59:37 UTC (rev 256404)
@@ -27,6 +27,7 @@
 #import "_WKDownloadInternal.h"
 
 #import "DownloadProxy.h"
+#import "WKFrameInfoInternal.h"
 #import "WKNSData.h"
 #import "WKWebViewInternal.h"
 #import <wtf/WeakObjCPtr.h>
@@ -83,6 +84,11 @@
     return WebKit::wrapper(_download->resumeData());
 }
 
+- (WKFrameInfo *)originatingFrame
+{
+    return WebKit::wrapper(&_download->frameInfo());
+}
+
 - (id)copyWithZone:(NSZone *)zone
 {
     return [self retain];

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp	2020-02-12 00:59:37 UTC (rev 256404)
@@ -28,9 +28,11 @@
 
 #include "APIData.h"
 #include "APIDownloadClient.h"
+#include "APIFrameInfo.h"
 #include "AuthenticationChallengeProxy.h"
 #include "DataReference.h"
 #include "DownloadProxyMap.h"
+#include "FrameInfoData.h"
 #include "NetworkProcessMessages.h"
 #include "NetworkProcessProxy.h"
 #include "WebPageProxy.h"
@@ -50,18 +52,15 @@
     static uint64_t uniqueDownloadID = 0;
     return ++uniqueDownloadID;
 }
-    
-Ref<DownloadProxy> DownloadProxy::create(DownloadProxyMap& downloadProxyMap, WebsiteDataStore& dataStore, WebProcessPool& processPool, const ResourceRequest& resourceRequest)
-{
-    return adoptRef(*new DownloadProxy(downloadProxyMap, dataStore, processPool, resourceRequest));
-}
 
-DownloadProxy::DownloadProxy(DownloadProxyMap& downloadProxyMap, WebsiteDataStore& dataStore, WebProcessPool& processPool, const ResourceRequest& resourceRequest)
+DownloadProxy::DownloadProxy(DownloadProxyMap& downloadProxyMap, WebsiteDataStore& dataStore, WebProcessPool& processPool, const ResourceRequest& resourceRequest, const FrameInfoData& frameInfoData, WebPageProxy* originatingPage)
     : m_downloadProxyMap(downloadProxyMap)
     , m_dataStore(&dataStore)
     , m_processPool(&processPool)
     , m_downloadID(generateDownloadID())
     , m_request(resourceRequest)
+    , m_originatingPage(makeWeakPtr(originatingPage))
+    , m_frameInfo(API::FrameInfo::create(FrameInfoData { frameInfoData }, originatingPage))
 {
 }
 
@@ -100,11 +99,6 @@
     return m_originatingPage.get();
 }
 
-void DownloadProxy::setOriginatingPage(WebPageProxy* page)
-{
-    m_originatingPage = makeWeakPtr(page);
-}
-
 #if PLATFORM(COCOA)
 void DownloadProxy::publishProgress(const URL& URL)
 {

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxy.h (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxy.h	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxy.h	2020-02-12 00:59:37 UTC (rev 256404)
@@ -36,6 +36,7 @@
 
 namespace API {
 class Data;
+class FrameInfo;
 }
 
 namespace WebCore {
@@ -54,9 +55,15 @@
 class WebProcessPool;
 class WebsiteDataStore;
 
+struct FrameInfoData;
+
 class DownloadProxy : public API::ObjectImpl<API::Object::Type::Download>, public IPC::MessageReceiver {
 public:
-    static Ref<DownloadProxy> create(DownloadProxyMap&, WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&);
+
+    template<typename... Args> static Ref<DownloadProxy> create(Args&&... args)
+    {
+        return adoptRef(*new DownloadProxy(std::forward<Args>(args)...));
+    }
     ~DownloadProxy();
 
     DownloadID downloadID() const { return m_downloadID; }
@@ -72,7 +79,6 @@
     void didReceiveSyncDownloadProxyMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&);
 
     WebPageProxy* originatingPage() const;
-    void setOriginatingPage(WebPageProxy*);
 
     void setRedirectChain(Vector<URL>&& redirectChain) { m_redirectChain = WTFMove(redirectChain); }
     const Vector<URL>& redirectChain() const { return m_redirectChain; }
@@ -98,8 +104,10 @@
     void publishProgress(const URL&);
 #endif
 
+    API::FrameInfo& frameInfo() { return m_frameInfo.get(); }
+
 private:
-    explicit DownloadProxy(DownloadProxyMap&, WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&);
+    explicit DownloadProxy(DownloadProxyMap&, WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy*);
 
     // IPC::MessageReceiver
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
@@ -132,6 +140,7 @@
     WeakPtr<WebPageProxy> m_originatingPage;
     Vector<URL> m_redirectChain;
     bool m_wasUserInitiated { true };
+    Ref<API::FrameInfo> m_frameInfo;
 };
 
 } // namespace WebKit

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp	2020-02-12 00:59:37 UTC (rev 256404)
@@ -80,9 +80,9 @@
         m_process->send(Messages::NetworkProcess::ApplicationWillEnterForeground(), 0);
 }
 
-DownloadProxy& DownloadProxyMap::createDownloadProxy(WebsiteDataStore& dataStore, WebProcessPool& processPool, const WebCore::ResourceRequest& resourceRequest)
+DownloadProxy& DownloadProxyMap::createDownloadProxy(WebsiteDataStore& dataStore, WebProcessPool& processPool, const WebCore::ResourceRequest& resourceRequest, const FrameInfoData& frameInfo, WebPageProxy* originatingPage)
 {
-    auto downloadProxy = DownloadProxy::create(*this, dataStore, processPool, resourceRequest);
+    auto downloadProxy = DownloadProxy::create(*this, dataStore, processPool, resourceRequest, frameInfo, originatingPage);
     m_downloads.set(downloadProxy->downloadID(), downloadProxy.copyRef());
 
     RELEASE_LOG(Loading, "Adding download %" PRIu64 " to UIProcess DownloadProxyMap", downloadProxy->downloadID().downloadID());

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h	2020-02-12 00:59:37 UTC (rev 256404)
@@ -44,6 +44,7 @@
 class DownloadProxy;
 class NetworkProcessProxy;
 class ProcessAssertion;
+class WebPageProxy;
 class WebProcessPool;
 class WebsiteDataStore;
 
@@ -55,7 +56,7 @@
     explicit DownloadProxyMap(NetworkProcessProxy&);
     ~DownloadProxyMap();
 
-    DownloadProxy& createDownloadProxy(WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&);
+    DownloadProxy& createDownloadProxy(WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy* originatingPage);
     void downloadFinished(DownloadProxy&);
 
     bool isEmpty() const { return m_downloads.isEmpty(); }

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-02-12 00:59:37 UTC (rev 256404)
@@ -182,12 +182,12 @@
     }
 }
 
-DownloadProxy& NetworkProcessProxy::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& resourceRequest)
+DownloadProxy& NetworkProcessProxy::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& resourceRequest, const FrameInfoData& frameInfo, WebPageProxy* originatingPage)
 {
     if (!m_downloadProxyMap)
         m_downloadProxyMap = makeUnique<DownloadProxyMap>(*this);
 
-    return m_downloadProxyMap->createDownloadProxy(dataStore, m_processPool, resourceRequest);
+    return m_downloadProxyMap->createDownloadProxy(dataStore, m_processPool, resourceRequest, frameInfo, originatingPage);
 }
 
 void NetworkProcessProxy::fetchWebsiteData(PAL::SessionID sessionID, OptionSet<WebsiteDataType> dataTypes, OptionSet<WebsiteDataFetchOption> fetchOptions, CompletionHandler<void (WebsiteData)>&& completionHandler)

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-02-12 00:59:37 UTC (rev 256404)
@@ -63,11 +63,14 @@
 
 class DownloadProxy;
 class DownloadProxyMap;
+class WebPageProxy;
 class WebProcessPool;
 enum class ShouldGrandfatherStatistics : bool;
 enum class StorageAccessStatus : uint8_t;
 enum class WebsiteDataFetchOption;
 enum class WebsiteDataType;
+
+struct FrameInfoData;
 struct NetworkProcessCreationParameters;
 class WebUserContentControllerProxy;
 struct WebsiteData;
@@ -92,7 +95,7 @@
 
     void getNetworkProcessConnection(WebProcessProxy&, Messages::WebProcessProxy::GetNetworkProcessConnectionDelayedReply&&);
 
-    DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&);
+    DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy* originatingPage);
 
     void fetchWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, CompletionHandler<void(WebsiteData)>&&);
     void deleteWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, WallTime modifiedSince, CompletionHandler<void()>&& completionHandler);

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/WebPageProxy.cpp (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-02-12 00:59:37 UTC (rev 256404)
@@ -3122,7 +3122,7 @@
     DownloadID downloadID = { };
     if (action == PolicyAction::Download) {
         // Create a download proxy.
-        auto& download = m_process->processPool().createDownloadProxy(m_websiteDataStore, m_decidePolicyForResponseRequest, this);
+        auto& download = m_process->processPool().createDownloadProxy(m_websiteDataStore, m_decidePolicyForResponseRequest, this, navigation ? navigation->originatingFrameInfo() : FrameInfoData { });
         if (navigation) {
             download.setWasUserInitiated(navigation->wasUserInitiated());
             download.setRedirectChain(navigation->takeRedirectChain());

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.cpp (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.cpp	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.cpp	2020-02-12 00:59:37 UTC (rev 256404)
@@ -1341,7 +1341,7 @@
 
 DownloadProxy& WebProcessPool::download(WebsiteDataStore& dataStore, WebPageProxy* initiatingPage, const ResourceRequest& request, const String& suggestedFilename)
 {
-    auto& downloadProxy = createDownloadProxy(dataStore, request, initiatingPage);
+    auto& downloadProxy = createDownloadProxy(dataStore, request, initiatingPage, { });
     PAL::SessionID sessionID = dataStore.sessionID();
 
     if (initiatingPage)
@@ -1373,7 +1373,7 @@
 
 DownloadProxy& WebProcessPool::resumeDownload(WebsiteDataStore& dataStore, WebPageProxy* initiatingPage, const API::Data& resumeData, const String& path)
 {
-    auto& downloadProxy = createDownloadProxy(dataStore, ResourceRequest(), initiatingPage);
+    auto& downloadProxy = createDownloadProxy(dataStore, ResourceRequest(), initiatingPage, { });
     PAL::SessionID sessionID = dataStore.sessionID();
 
     SandboxExtension::Handle sandboxExtensionHandle;
@@ -1623,11 +1623,9 @@
     sendToAllProcesses(Messages::WebProcess::SetDefaultRequestTimeoutInterval(timeoutInterval));
 }
 
-DownloadProxy& WebProcessPool::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& request, WebPageProxy* originatingPage)
+DownloadProxy& WebProcessPool::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& request, WebPageProxy* originatingPage, const FrameInfoData& frameInfo)
 {
-    auto& downloadProxy = ensureNetworkProcess().createDownloadProxy(dataStore, request);
-    downloadProxy.setOriginatingPage(originatingPage);
-    return downloadProxy;
+    return ensureNetworkProcess().createDownloadProxy(dataStore, request, frameInfo, originatingPage);
 }
 
 void WebProcessPool::synthesizeAppIsBackground(bool background)

Modified: branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.h (256403 => 256404)


--- branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.h	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.h	2020-02-12 00:59:37 UTC (rev 256404)
@@ -300,7 +300,7 @@
     void setEnhancedAccessibility(bool);
     
     // Downloads.
-    DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, WebPageProxy* originatingPage);
+    DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, WebPageProxy* originatingPage, const FrameInfoData&);
     API::DownloadClient& downloadClient() { return m_downloadClient.get(); }
 
     API::LegacyContextHistoryClient& historyClient() { return *m_historyClient; }

Modified: branches/safari-609-branch/Tools/ChangeLog (256403 => 256404)


--- branches/safari-609-branch/Tools/ChangeLog	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Tools/ChangeLog	2020-02-12 00:59:37 UTC (rev 256404)
@@ -1,5 +1,71 @@
 2020-02-11  Alan Coon  <alanc...@apple.com>
 
+        Cherry-pick r255845. rdar://problem/59298143
+
+    _WKDownload should expose the originating FrameInfo.
+    <rdar://problem/58022576> and https://bugs.webkit.org/show_bug.cgi?id=207185
+    
+    Patch by Brady Eidson <beid...@apple.com> on 2020-02-05
+    Reviewed by Geoff Garen.
+    
+    Source/WebKit:
+    
+    Covered by new API test.
+    
+    For the cases where a navigation is converted into a download, include the relevant
+    WKFrameInfo on the _WKDownload object.
+    
+    * UIProcess/API/APIFrameInfo.h:
+    * UIProcess/API/Cocoa/_WKDownload.h:
+    * UIProcess/API/Cocoa/_WKDownload.mm:
+    (-[_WKDownload originatingFrameInfo]):
+    * UIProcess/Downloads/DownloadProxy.cpp:
+    (WebKit::generateDownloadID):
+    (WebKit::DownloadProxy::DownloadProxy):
+    (WebKit::DownloadProxy::create): Deleted.
+    (WebKit::DownloadProxy::setOriginatingPage): Deleted.
+    * UIProcess/Downloads/DownloadProxy.h:
+    (WebKit::DownloadProxy::create):
+    (WebKit::DownloadProxy::frameInfo):
+    * UIProcess/Downloads/DownloadProxyMap.cpp:
+    (WebKit::DownloadProxyMap::createDownloadProxy):
+    * UIProcess/Downloads/DownloadProxyMap.h:
+    * UIProcess/Network/NetworkProcessProxy.cpp:
+    (WebKit::NetworkProcessProxy::createDownloadProxy):
+    * UIProcess/Network/NetworkProcessProxy.h:
+    * UIProcess/WebPageProxy.cpp:
+    (WebKit::WebPageProxy::receivedPolicyDecision):
+    * UIProcess/WebProcessPool.cpp:
+    (WebKit::WebProcessPool::download):
+    (WebKit::WebProcessPool::resumeDownload):
+    (WebKit::WebProcessPool::createDownloadProxy):
+    * UIProcess/WebProcessPool.h:
+    
+    Tools:
+    
+    * TestWebKitAPI/Tests/WebKitCocoa/Download.mm:
+    (-[DownloadTestSchemeDelegate webView:decidePolicyForNavigationResponse:decisionHandler:]):
+    (-[DownloadSecurityOriginDelegate _downloadDidStart:]):
+    (loaded):
+    * TestWebKitAPI/cocoa/HTTPServer.mm:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@255845 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2020-02-05  Brady Eidson  <beid...@apple.com>
+
+            _WKDownload should expose the originating FrameInfo.
+            <rdar://problem/58022576> and https://bugs.webkit.org/show_bug.cgi?id=207185
+
+            Reviewed by Geoff Garen.
+
+            * TestWebKitAPI/Tests/WebKitCocoa/Download.mm:
+            (-[DownloadTestSchemeDelegate webView:decidePolicyForNavigationResponse:decisionHandler:]):
+            (-[DownloadSecurityOriginDelegate _downloadDidStart:]):
+            (loaded):
+            * TestWebKitAPI/cocoa/HTTPServer.mm:
+
+2020-02-11  Alan Coon  <alanc...@apple.com>
+
         Cherry-pick r255826. rdar://problem/59299115
 
     REGRESSION(r255595): page not closed after beforeunload handler returns true

Modified: branches/safari-609-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/Download.mm (256403 => 256404)


--- branches/safari-609-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/Download.mm	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/Download.mm	2020-02-12 00:59:37 UTC (rev 256404)
@@ -28,6 +28,7 @@
 
 #if PLATFORM(MAC) || PLATFORM(IOS)
 
+#import "HTTPServer.h"
 #import "PlatformUtilities.h"
 #import "TCPServer.h"
 #import "Test.h"
@@ -1147,4 +1148,70 @@
     Util::run(&isDone);
 }
 
+@interface DownloadTestSchemeDelegate : NSObject <WKNavigationDelegate>
+@end
+
+@implementation DownloadTestSchemeDelegate
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
+{
+    if ([navigationResponse.response.URL.absoluteString hasSuffix:@"/download"])
+        decisionHandler(_WKNavigationResponsePolicyBecomeDownload);
+    else
+        decisionHandler(WKNavigationResponsePolicyAllow);
+}
+@end
+
+@interface DownloadSecurityOriginDelegate : NSObject <_WKDownloadDelegate>
+@end
+
+@implementation DownloadSecurityOriginDelegate {
+@public
+    uint16_t _serverPort;
+    WKWebView *_webView;
+}
+
+- (void)_downloadDidStart:(_WKDownload *)download
+{
+    EXPECT_TRUE([download.originatingFrame.securityOrigin.protocol isEqualToString:@"http"]);
+    EXPECT_TRUE([download.originatingFrame.securityOrigin.host isEqualToString:@"127.0.0.1"]);
+    EXPECT_EQ(download.originatingFrame.securityOrigin.port, _serverPort);
+    EXPECT_FALSE(download.originatingFrame.mainFrame);
+    EXPECT_EQ(download.originatingFrame.webView, _webView);
+    isDone = true;
+}
+
+@end
+
+static const char* documentText = R"DOCDOCDOC(
+<script>
+function loaded()
+{
+    document.getElementById("thelink").click();
+}
+</script>
+<body _onload_="loaded();">
+<a id="thelink" href="" me</a>
+</body>
+)DOCDOCDOC";
+
+TEST(_WKDownload, SubframeSecurityOrigin)
+{
+    auto navigationDelegate = adoptNS([[DownloadTestSchemeDelegate alloc] init]);
+    auto downloadDelegate = adoptNS([[DownloadSecurityOriginDelegate alloc] init]);
+
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    [webView setNavigationDelegate:navigationDelegate.get()];
+    [[[webView configuration] processPool] _setDownloadDelegate:downloadDelegate.get()];
+
+    TestWebKitAPI::HTTPServer server({
+        { "/page", { documentText } },
+        { "/download", { documentText } },
+    });
+    downloadDelegate->_serverPort = server.port();
+    downloadDelegate->_webView = webView.get();
+
+    isDone = false;
+    [webView loadHTMLString:[NSString stringWithFormat:@"<body><iframe src=''></iframe></body>", server.port()] baseURL:nil];
+    TestWebKitAPI::Util::run(&isDone);
+}
 #endif // PLATFORM(MAC) || PLATFORM(IOS)

Modified: branches/safari-609-branch/Tools/TestWebKitAPI/cocoa/HTTPServer.mm (256403 => 256404)


--- branches/safari-609-branch/Tools/TestWebKitAPI/cocoa/HTTPServer.mm	2020-02-12 00:59:33 UTC (rev 256403)
+++ branches/safari-609-branch/Tools/TestWebKitAPI/cocoa/HTTPServer.mm	2020-02-12 00:59:37 UTC (rev 256404)
@@ -28,6 +28,7 @@
 
 #if HAVE(NETWORK_FRAMEWORK)
 
+#import "Utilities.h"
 #import <wtf/text/StringBuilder.h>
 #import <wtf/text/WTFString.h>
 
@@ -49,7 +50,14 @@
         nw_connection_start(connection);
         respondToRequests(connection);
     });
+    __block bool ready = false;
+    nw_listener_set_state_changed_handler(m_listener.get(), ^(nw_listener_state_t state, nw_error_t error) {
+        ASSERT_UNUSED(error, !error);
+        if (state == nw_listener_state_ready)
+            ready = true;
+    });
     nw_listener_start(m_listener.get());
+    Util::run(&ready);
 }
 
 void HTTPServer::respondToRequests(nw_connection_t connection)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to