Changeset 255845 in webkit


Ignore:
Timestamp:
Feb 5, 2020 1:05:33 PM (4 years ago)
Author:
achristensen@apple.com
Message:

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

Patch by Brady Eidson <beidson@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:
Location:
trunk
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r255827 r255845  
     12020-02-05  Brady Eidson  <beidson@apple.com>
     2
     3        _WKDownload should expose the originating FrameInfo.
     4        <rdar://problem/58022576> and https://bugs.webkit.org/show_bug.cgi?id=207185
     5
     6        Reviewed by Geoff Garen.
     7
     8        Covered by new API test.
     9       
     10        For the cases where a navigation is converted into a download, include the relevant
     11        WKFrameInfo on the _WKDownload object.
     12
     13        * UIProcess/API/APIFrameInfo.h:
     14        * UIProcess/API/Cocoa/_WKDownload.h:
     15        * UIProcess/API/Cocoa/_WKDownload.mm:
     16        (-[_WKDownload originatingFrameInfo]):
     17        * UIProcess/Downloads/DownloadProxy.cpp:
     18        (WebKit::generateDownloadID):
     19        (WebKit::DownloadProxy::DownloadProxy):
     20        (WebKit::DownloadProxy::create): Deleted.
     21        (WebKit::DownloadProxy::setOriginatingPage): Deleted.
     22        * UIProcess/Downloads/DownloadProxy.h:
     23        (WebKit::DownloadProxy::create):
     24        (WebKit::DownloadProxy::frameInfo):
     25        * UIProcess/Downloads/DownloadProxyMap.cpp:
     26        (WebKit::DownloadProxyMap::createDownloadProxy):
     27        * UIProcess/Downloads/DownloadProxyMap.h:
     28        * UIProcess/Network/NetworkProcessProxy.cpp:
     29        (WebKit::NetworkProcessProxy::createDownloadProxy):
     30        * UIProcess/Network/NetworkProcessProxy.h:
     31        * UIProcess/WebPageProxy.cpp:
     32        (WebKit::WebPageProxy::receivedPolicyDecision):
     33        * UIProcess/WebProcessPool.cpp:
     34        (WebKit::WebProcessPool::download):
     35        (WebKit::WebProcessPool::resumeDownload):
     36        (WebKit::WebProcessPool::createDownloadProxy):
     37        * UIProcess/WebProcessPool.h:
     38
    1392020-02-05  Wenson Hsieh  <wenson_hsieh@apple.com>
    240
  • trunk/Source/WebKit/UIProcess/API/APIFrameInfo.h

    r252492 r255845  
    2727
    2828#include "APIObject.h"
     29#include "WebPageProxy.h"
    2930#include <WebCore/ResourceRequest.h>
    3031
     
    3536namespace WebKit {
    3637class WebFrameProxy;
    37 class WebPageProxy;
    3838struct FrameInfoData;
    3939}
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.h

    r245294 r255845  
    2828#import <Foundation/Foundation.h>
    2929
     30@class WKFrameInfo;
    3031@class WKWebView;
    3132
     
    4243@property (nonatomic, readonly) BOOL wasUserInitiated WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
    4344@property (nonatomic, readonly) NSData *resumeData WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
     45@property (nonatomic, readonly) WKFrameInfo *originatingFrame WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    4446
    4547@end
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.mm

    r243016 r255845  
    2828
    2929#import "DownloadProxy.h"
     30#import "WKFrameInfoInternal.h"
    3031#import "WKNSData.h"
    3132#import "WKWebViewInternal.h"
     
    8485}
    8586
     87- (WKFrameInfo *)originatingFrame
     88{
     89    return WebKit::wrapper(&_download->frameInfo());
     90}
     91
    8692- (id)copyWithZone:(NSZone *)zone
    8793{
  • trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp

    r252274 r255845  
    2929#include "APIData.h"
    3030#include "APIDownloadClient.h"
     31#include "APIFrameInfo.h"
    3132#include "AuthenticationChallengeProxy.h"
    3233#include "DataReference.h"
    3334#include "DownloadProxyMap.h"
     35#include "FrameInfoData.h"
    3436#include "NetworkProcessMessages.h"
    3537#include "NetworkProcessProxy.h"
     
    5153    return ++uniqueDownloadID;
    5254}
    53    
    54 Ref<DownloadProxy> DownloadProxy::create(DownloadProxyMap& downloadProxyMap, WebsiteDataStore& dataStore, WebProcessPool& processPool, const ResourceRequest& resourceRequest)
    55 {
    56     return adoptRef(*new DownloadProxy(downloadProxyMap, dataStore, processPool, resourceRequest));
    57 }
    58 
    59 DownloadProxy::DownloadProxy(DownloadProxyMap& downloadProxyMap, WebsiteDataStore& dataStore, WebProcessPool& processPool, const ResourceRequest& resourceRequest)
     55
     56DownloadProxy::DownloadProxy(DownloadProxyMap& downloadProxyMap, WebsiteDataStore& dataStore, WebProcessPool& processPool, const ResourceRequest& resourceRequest, const FrameInfoData& frameInfoData, WebPageProxy* originatingPage)
    6057    : m_downloadProxyMap(downloadProxyMap)
    6158    , m_dataStore(&dataStore)
     
    6360    , m_downloadID(generateDownloadID())
    6461    , m_request(resourceRequest)
     62    , m_originatingPage(makeWeakPtr(originatingPage))
     63    , m_frameInfo(API::FrameInfo::create(FrameInfoData { frameInfoData }, originatingPage))
    6564{
    6665}
     
    9998{
    10099    return m_originatingPage.get();
    101 }
    102 
    103 void DownloadProxy::setOriginatingPage(WebPageProxy* page)
    104 {
    105     m_originatingPage = makeWeakPtr(page);
    106100}
    107101
  • trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.h

    r252274 r255845  
    3737namespace API {
    3838class Data;
     39class FrameInfo;
    3940}
    4041
     
    5556class WebsiteDataStore;
    5657
     58struct FrameInfoData;
     59
    5760class DownloadProxy : public API::ObjectImpl<API::Object::Type::Download>, public IPC::MessageReceiver {
    5861public:
    59     static Ref<DownloadProxy> create(DownloadProxyMap&, WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&);
     62
     63    template<typename... Args> static Ref<DownloadProxy> create(Args&&... args)
     64    {
     65        return adoptRef(*new DownloadProxy(std::forward<Args>(args)...));
     66    }
    6067    ~DownloadProxy();
    6168
     
    7380
    7481    WebPageProxy* originatingPage() const;
    75     void setOriginatingPage(WebPageProxy*);
    7682
    7783    void setRedirectChain(Vector<URL>&& redirectChain) { m_redirectChain = WTFMove(redirectChain); }
     
    99105#endif
    100106
     107    API::FrameInfo& frameInfo() { return m_frameInfo.get(); }
     108
    101109private:
    102     explicit DownloadProxy(DownloadProxyMap&, WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&);
     110    explicit DownloadProxy(DownloadProxyMap&, WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy*);
    103111
    104112    // IPC::MessageReceiver
     
    133141    Vector<URL> m_redirectChain;
    134142    bool m_wasUserInitiated { true };
     143    Ref<API::FrameInfo> m_frameInfo;
    135144};
    136145
  • trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp

    r252274 r255845  
    8181}
    8282
    83 DownloadProxy& DownloadProxyMap::createDownloadProxy(WebsiteDataStore& dataStore, WebProcessPool& processPool, const WebCore::ResourceRequest& resourceRequest)
     83DownloadProxy& DownloadProxyMap::createDownloadProxy(WebsiteDataStore& dataStore, WebProcessPool& processPool, const WebCore::ResourceRequest& resourceRequest, const FrameInfoData& frameInfo, WebPageProxy* originatingPage)
    8484{
    85     auto downloadProxy = DownloadProxy::create(*this, dataStore, processPool, resourceRequest);
     85    auto downloadProxy = DownloadProxy::create(*this, dataStore, processPool, resourceRequest, frameInfo, originatingPage);
    8686    m_downloads.set(downloadProxy->downloadID(), downloadProxy.copyRef());
    8787
  • trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h

    r250292 r255845  
    4545class NetworkProcessProxy;
    4646class ProcessAssertion;
     47class WebPageProxy;
    4748class WebProcessPool;
    4849class WebsiteDataStore;
     
    5657    ~DownloadProxyMap();
    5758
    58     DownloadProxy& createDownloadProxy(WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&);
     59    DownloadProxy& createDownloadProxy(WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy* originatingPage);
    5960    void downloadFinished(DownloadProxy&);
    6061
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r255681 r255845  
    183183}
    184184
    185 DownloadProxy& NetworkProcessProxy::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& resourceRequest)
     185DownloadProxy& NetworkProcessProxy::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& resourceRequest, const FrameInfoData& frameInfo, WebPageProxy* originatingPage)
    186186{
    187187    if (!m_downloadProxyMap)
    188188        m_downloadProxyMap = makeUnique<DownloadProxyMap>(*this);
    189189
    190     return m_downloadProxyMap->createDownloadProxy(dataStore, m_processPool, resourceRequest);
     190    return m_downloadProxyMap->createDownloadProxy(dataStore, m_processPool, resourceRequest, frameInfo, originatingPage);
    191191}
    192192
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h

    r255681 r255845  
    6464class DownloadProxy;
    6565class DownloadProxyMap;
     66class WebPageProxy;
    6667class WebProcessPool;
    6768class WebUserContentControllerProxy;
     
    7273enum class WebsiteDataType;
    7374
     75struct FrameInfoData;
    7476struct NetworkProcessCreationParameters;
    7577struct ResourceLoadInfo;
     
    9698    void getNetworkProcessConnection(WebProcessProxy&, Messages::WebProcessProxy::GetNetworkProcessConnectionDelayedReply&&);
    9799
    98     DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&);
     100    DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy* originatingPage);
    99101
    100102    void fetchWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, CompletionHandler<void(WebsiteData)>&&);
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r255677 r255845  
    31483148    if (action == PolicyAction::Download) {
    31493149        // Create a download proxy.
    3150         auto& download = m_process->processPool().createDownloadProxy(m_websiteDataStore, m_decidePolicyForResponseRequest, this);
     3150        auto& download = m_process->processPool().createDownloadProxy(m_websiteDataStore, m_decidePolicyForResponseRequest, this, navigation ? navigation->originatingFrameInfo() : FrameInfoData { });
    31513151        if (navigation) {
    31523152            download.setWasUserInitiated(navigation->wasUserInitiated());
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r255814 r255845  
    13461346DownloadProxy& WebProcessPool::download(WebsiteDataStore& dataStore, WebPageProxy* initiatingPage, const ResourceRequest& request, const String& suggestedFilename)
    13471347{
    1348     auto& downloadProxy = createDownloadProxy(dataStore, request, initiatingPage);
     1348    auto& downloadProxy = createDownloadProxy(dataStore, request, initiatingPage, { });
    13491349    PAL::SessionID sessionID = dataStore.sessionID();
    13501350
     
    13781378DownloadProxy& WebProcessPool::resumeDownload(WebsiteDataStore& dataStore, WebPageProxy* initiatingPage, const API::Data& resumeData, const String& path)
    13791379{
    1380     auto& downloadProxy = createDownloadProxy(dataStore, ResourceRequest(), initiatingPage);
     1380    auto& downloadProxy = createDownloadProxy(dataStore, ResourceRequest(), initiatingPage, { });
    13811381    PAL::SessionID sessionID = dataStore.sessionID();
    13821382
     
    16281628}
    16291629
    1630 DownloadProxy& WebProcessPool::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& request, WebPageProxy* originatingPage)
    1631 {
    1632     auto& downloadProxy = ensureNetworkProcess().createDownloadProxy(dataStore, request);
    1633     downloadProxy.setOriginatingPage(originatingPage);
    1634     return downloadProxy;
     1630DownloadProxy& WebProcessPool::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& request, WebPageProxy* originatingPage, const FrameInfoData& frameInfo)
     1631{
     1632    return ensureNetworkProcess().createDownloadProxy(dataStore, request, frameInfo, originatingPage);
    16351633}
    16361634
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r255681 r255845  
    301301   
    302302    // Downloads.
    303     DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, WebPageProxy* originatingPage);
     303    DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, WebPageProxy* originatingPage, const FrameInfoData&);
    304304    API::DownloadClient& downloadClient() { return m_downloadClient.get(); }
    305305
  • trunk/Tools/ChangeLog

    r255831 r255845  
     12020-02-05  Brady Eidson  <beidson@apple.com>
     2
     3        _WKDownload should expose the originating FrameInfo.
     4        <rdar://problem/58022576> and https://bugs.webkit.org/show_bug.cgi?id=207185
     5
     6        Reviewed by Geoff Garen.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/Download.mm:
     9        (-[DownloadTestSchemeDelegate webView:decidePolicyForNavigationResponse:decisionHandler:]):
     10        (-[DownloadSecurityOriginDelegate _downloadDidStart:]):
     11        (loaded):
     12        * TestWebKitAPI/cocoa/HTTPServer.mm:
     13
    1142020-02-05  Xabier Rodriguez Calvar  <calvaris@igalia.com>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Download.mm

    r255533 r255845  
    2929#if PLATFORM(MAC) || PLATFORM(IOS)
    3030
     31#import "HTTPServer.h"
    3132#import "PlatformUtilities.h"
    3233#import "TCPServer.h"
     
    11481149}
    11491150
     1151@interface DownloadTestSchemeDelegate : NSObject <WKNavigationDelegate>
     1152@end
     1153
     1154@implementation DownloadTestSchemeDelegate
     1155- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
     1156{
     1157    if ([navigationResponse.response.URL.absoluteString hasSuffix:@"/download"])
     1158        decisionHandler(_WKNavigationResponsePolicyBecomeDownload);
     1159    else
     1160        decisionHandler(WKNavigationResponsePolicyAllow);
     1161}
     1162@end
     1163
     1164@interface DownloadSecurityOriginDelegate : NSObject <_WKDownloadDelegate>
     1165@end
     1166
     1167@implementation DownloadSecurityOriginDelegate {
     1168@public
     1169    uint16_t _serverPort;
     1170    WKWebView *_webView;
     1171}
     1172
     1173- (void)_downloadDidStart:(_WKDownload *)download
     1174{
     1175    EXPECT_TRUE([download.originatingFrame.securityOrigin.protocol isEqualToString:@"http"]);
     1176    EXPECT_TRUE([download.originatingFrame.securityOrigin.host isEqualToString:@"127.0.0.1"]);
     1177    EXPECT_EQ(download.originatingFrame.securityOrigin.port, _serverPort);
     1178    EXPECT_FALSE(download.originatingFrame.mainFrame);
     1179    EXPECT_EQ(download.originatingFrame.webView, _webView);
     1180    isDone = true;
     1181}
     1182
     1183@end
     1184
     1185static const char* documentText = R"DOCDOCDOC(
     1186<script>
     1187function loaded()
     1188{
     1189    document.getElementById("thelink").click();
     1190}
     1191</script>
     1192<body onload="loaded();">
     1193<a id="thelink" href="download">Click me</a>
     1194</body>
     1195)DOCDOCDOC";
     1196
     1197TEST(_WKDownload, SubframeSecurityOrigin)
     1198{
     1199    auto navigationDelegate = adoptNS([[DownloadTestSchemeDelegate alloc] init]);
     1200    auto downloadDelegate = adoptNS([[DownloadSecurityOriginDelegate alloc] init]);
     1201
     1202    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
     1203    [webView setNavigationDelegate:navigationDelegate.get()];
     1204    [[[webView configuration] processPool] _setDownloadDelegate:downloadDelegate.get()];
     1205
     1206    TestWebKitAPI::HTTPServer server({
     1207        { "/page", { documentText } },
     1208        { "/download", { documentText } },
     1209    });
     1210    downloadDelegate->_serverPort = server.port();
     1211    downloadDelegate->_webView = webView.get();
     1212
     1213    isDone = false;
     1214    [webView loadHTMLString:[NSString stringWithFormat:@"<body><iframe src='http://127.0.0.1:%d/page'></iframe></body>", server.port()] baseURL:nil];
     1215    TestWebKitAPI::Util::run(&isDone);
     1216}
    11501217#endif // PLATFORM(MAC) || PLATFORM(IOS)
  • trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.mm

    r254367 r255845  
    2929#if HAVE(NETWORK_FRAMEWORK)
    3030
     31#import "Utilities.h"
    3132#import <wtf/text/StringBuilder.h>
    3233#import <wtf/text/WTFString.h>
     
    5051        respondToRequests(connection);
    5152    });
     53    __block bool ready = false;
     54    nw_listener_set_state_changed_handler(m_listener.get(), ^(nw_listener_state_t state, nw_error_t error) {
     55        ASSERT_UNUSED(error, !error);
     56        if (state == nw_listener_state_ready)
     57            ready = true;
     58    });
    5259    nw_listener_start(m_listener.get());
     60    Util::run(&ready);
    5361}
    5462
Note: See TracChangeset for help on using the changeset viewer.