Changeset 255845 in webkit
- Timestamp:
- Feb 5, 2020, 1:05:33 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r255827 r255845 1 2020-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 1 39 2020-02-05 Wenson Hsieh <wenson_hsieh@apple.com> 2 40 -
trunk/Source/WebKit/UIProcess/API/APIFrameInfo.h
r252492 r255845 27 27 28 28 #include "APIObject.h" 29 #include "WebPageProxy.h" 29 30 #include <WebCore/ResourceRequest.h> 30 31 … … 35 36 namespace WebKit { 36 37 class WebFrameProxy; 37 class WebPageProxy;38 38 struct FrameInfoData; 39 39 } -
trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.h
r245294 r255845 28 28 #import <Foundation/Foundation.h> 29 29 30 @class WKFrameInfo; 30 31 @class WKWebView; 31 32 … … 42 43 @property (nonatomic, readonly) BOOL wasUserInitiated WK_API_AVAILABLE(macos(10.13.4), ios(11.3)); 43 44 @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)); 44 46 45 47 @end -
trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.mm
r243016 r255845 28 28 29 29 #import "DownloadProxy.h" 30 #import "WKFrameInfoInternal.h" 30 31 #import "WKNSData.h" 31 32 #import "WKWebViewInternal.h" … … 84 85 } 85 86 87 - (WKFrameInfo *)originatingFrame 88 { 89 return WebKit::wrapper(&_download->frameInfo()); 90 } 91 86 92 - (id)copyWithZone:(NSZone *)zone 87 93 { -
trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp
r252274 r255845 29 29 #include "APIData.h" 30 30 #include "APIDownloadClient.h" 31 #include "APIFrameInfo.h" 31 32 #include "AuthenticationChallengeProxy.h" 32 33 #include "DataReference.h" 33 34 #include "DownloadProxyMap.h" 35 #include "FrameInfoData.h" 34 36 #include "NetworkProcessMessages.h" 35 37 #include "NetworkProcessProxy.h" … … 51 53 return ++uniqueDownloadID; 52 54 } 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 56 DownloadProxy::DownloadProxy(DownloadProxyMap& downloadProxyMap, WebsiteDataStore& dataStore, WebProcessPool& processPool, const ResourceRequest& resourceRequest, const FrameInfoData& frameInfoData, WebPageProxy* originatingPage) 60 57 : m_downloadProxyMap(downloadProxyMap) 61 58 , m_dataStore(&dataStore) … … 63 60 , m_downloadID(generateDownloadID()) 64 61 , m_request(resourceRequest) 62 , m_originatingPage(makeWeakPtr(originatingPage)) 63 , m_frameInfo(API::FrameInfo::create(FrameInfoData { frameInfoData }, originatingPage)) 65 64 { 66 65 } … … 99 98 { 100 99 return m_originatingPage.get(); 101 }102 103 void DownloadProxy::setOriginatingPage(WebPageProxy* page)104 {105 m_originatingPage = makeWeakPtr(page);106 100 } 107 101 -
trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.h
r252274 r255845 37 37 namespace API { 38 38 class Data; 39 class FrameInfo; 39 40 } 40 41 … … 55 56 class WebsiteDataStore; 56 57 58 struct FrameInfoData; 59 57 60 class DownloadProxy : public API::ObjectImpl<API::Object::Type::Download>, public IPC::MessageReceiver { 58 61 public: 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 } 60 67 ~DownloadProxy(); 61 68 … … 73 80 74 81 WebPageProxy* originatingPage() const; 75 void setOriginatingPage(WebPageProxy*);76 82 77 83 void setRedirectChain(Vector<URL>&& redirectChain) { m_redirectChain = WTFMove(redirectChain); } … … 99 105 #endif 100 106 107 API::FrameInfo& frameInfo() { return m_frameInfo.get(); } 108 101 109 private: 102 explicit DownloadProxy(DownloadProxyMap&, WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest& );110 explicit DownloadProxy(DownloadProxyMap&, WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy*); 103 111 104 112 // IPC::MessageReceiver … … 133 141 Vector<URL> m_redirectChain; 134 142 bool m_wasUserInitiated { true }; 143 Ref<API::FrameInfo> m_frameInfo; 135 144 }; 136 145 -
trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp
r252274 r255845 81 81 } 82 82 83 DownloadProxy& DownloadProxyMap::createDownloadProxy(WebsiteDataStore& dataStore, WebProcessPool& processPool, const WebCore::ResourceRequest& resourceRequest )83 DownloadProxy& DownloadProxyMap::createDownloadProxy(WebsiteDataStore& dataStore, WebProcessPool& processPool, const WebCore::ResourceRequest& resourceRequest, const FrameInfoData& frameInfo, WebPageProxy* originatingPage) 84 84 { 85 auto downloadProxy = DownloadProxy::create(*this, dataStore, processPool, resourceRequest );85 auto downloadProxy = DownloadProxy::create(*this, dataStore, processPool, resourceRequest, frameInfo, originatingPage); 86 86 m_downloads.set(downloadProxy->downloadID(), downloadProxy.copyRef()); 87 87 -
trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h
r250292 r255845 45 45 class NetworkProcessProxy; 46 46 class ProcessAssertion; 47 class WebPageProxy; 47 48 class WebProcessPool; 48 49 class WebsiteDataStore; … … 56 57 ~DownloadProxyMap(); 57 58 58 DownloadProxy& createDownloadProxy(WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest& );59 DownloadProxy& createDownloadProxy(WebsiteDataStore&, WebProcessPool&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy* originatingPage); 59 60 void downloadFinished(DownloadProxy&); 60 61 -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r255681 r255845 183 183 } 184 184 185 DownloadProxy& NetworkProcessProxy::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& resourceRequest )185 DownloadProxy& NetworkProcessProxy::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& resourceRequest, const FrameInfoData& frameInfo, WebPageProxy* originatingPage) 186 186 { 187 187 if (!m_downloadProxyMap) 188 188 m_downloadProxyMap = makeUnique<DownloadProxyMap>(*this); 189 189 190 return m_downloadProxyMap->createDownloadProxy(dataStore, m_processPool, resourceRequest );190 return m_downloadProxyMap->createDownloadProxy(dataStore, m_processPool, resourceRequest, frameInfo, originatingPage); 191 191 } 192 192 -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h
r255681 r255845 64 64 class DownloadProxy; 65 65 class DownloadProxyMap; 66 class WebPageProxy; 66 67 class WebProcessPool; 67 68 class WebUserContentControllerProxy; … … 72 73 enum class WebsiteDataType; 73 74 75 struct FrameInfoData; 74 76 struct NetworkProcessCreationParameters; 75 77 struct ResourceLoadInfo; … … 96 98 void getNetworkProcessConnection(WebProcessProxy&, Messages::WebProcessProxy::GetNetworkProcessConnectionDelayedReply&&); 97 99 98 DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest& );100 DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, const FrameInfoData&, WebPageProxy* originatingPage); 99 101 100 102 void fetchWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, CompletionHandler<void(WebsiteData)>&&); -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r255677 r255845 3148 3148 if (action == PolicyAction::Download) { 3149 3149 // 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 { }); 3151 3151 if (navigation) { 3152 3152 download.setWasUserInitiated(navigation->wasUserInitiated()); -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r255814 r255845 1346 1346 DownloadProxy& WebProcessPool::download(WebsiteDataStore& dataStore, WebPageProxy* initiatingPage, const ResourceRequest& request, const String& suggestedFilename) 1347 1347 { 1348 auto& downloadProxy = createDownloadProxy(dataStore, request, initiatingPage );1348 auto& downloadProxy = createDownloadProxy(dataStore, request, initiatingPage, { }); 1349 1349 PAL::SessionID sessionID = dataStore.sessionID(); 1350 1350 … … 1378 1378 DownloadProxy& WebProcessPool::resumeDownload(WebsiteDataStore& dataStore, WebPageProxy* initiatingPage, const API::Data& resumeData, const String& path) 1379 1379 { 1380 auto& downloadProxy = createDownloadProxy(dataStore, ResourceRequest(), initiatingPage );1380 auto& downloadProxy = createDownloadProxy(dataStore, ResourceRequest(), initiatingPage, { }); 1381 1381 PAL::SessionID sessionID = dataStore.sessionID(); 1382 1382 … … 1628 1628 } 1629 1629 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; 1630 DownloadProxy& WebProcessPool::createDownloadProxy(WebsiteDataStore& dataStore, const ResourceRequest& request, WebPageProxy* originatingPage, const FrameInfoData& frameInfo) 1631 { 1632 return ensureNetworkProcess().createDownloadProxy(dataStore, request, frameInfo, originatingPage); 1635 1633 } 1636 1634 -
trunk/Source/WebKit/UIProcess/WebProcessPool.h
r255681 r255845 301 301 302 302 // Downloads. 303 DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, WebPageProxy* originatingPage );303 DownloadProxy& createDownloadProxy(WebsiteDataStore&, const WebCore::ResourceRequest&, WebPageProxy* originatingPage, const FrameInfoData&); 304 304 API::DownloadClient& downloadClient() { return m_downloadClient.get(); } 305 305 -
trunk/Tools/ChangeLog
r255831 r255845 1 2020-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 1 14 2020-02-05 Xabier Rodriguez Calvar <calvaris@igalia.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Download.mm
r255533 r255845 29 29 #if PLATFORM(MAC) || PLATFORM(IOS) 30 30 31 #import "HTTPServer.h" 31 32 #import "PlatformUtilities.h" 32 33 #import "TCPServer.h" … … 1148 1149 } 1149 1150 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 1185 static const char* documentText = R"DOCDOCDOC( 1186 <script> 1187 function 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 1197 TEST(_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 } 1150 1217 #endif // PLATFORM(MAC) || PLATFORM(IOS) -
trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.mm
r254367 r255845 29 29 #if HAVE(NETWORK_FRAMEWORK) 30 30 31 #import "Utilities.h" 31 32 #import <wtf/text/StringBuilder.h> 32 33 #import <wtf/text/WTFString.h> … … 50 51 respondToRequests(connection); 51 52 }); 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 }); 52 59 nw_listener_start(m_listener.get()); 60 Util::run(&ready); 53 61 } 54 62
Note:
See TracChangeset
for help on using the changeset viewer.