Title: [221766] trunk
Revision
221766
Author
[email protected]
Date
2017-09-07 15:49:58 -0700 (Thu, 07 Sep 2017)

Log Message

[WK2] Add C API to retrieve the originating page of a WKDownload
https://bugs.webkit.org/show_bug.cgi?id=176557
<rdar://problem/34314776>

Reviewed by Alex Christensen.

Source/WebKit:

Add C API to retrieve the original page of a WKDownload. This is the C API equivalent to
_WKDownload.originatingWebView which already exists in ObjC. The pointer is weak so as
to not keep alive the page for the duration of the download.

* UIProcess/API/C/WKDownload.cpp:
(WKDownloadGetOriginatingPage):
* UIProcess/API/C/WKDownload.h:
* UIProcess/API/Cocoa/_WKDownload.mm:
(-[_WKDownload originatingWebView]):
* UIProcess/API/Cocoa/_WKDownloadInternal.h:
* UIProcess/Downloads/DownloadProxy.cpp:
(WebKit::DownloadProxy::originatingPage const):
(WebKit::DownloadProxy::setOriginatingPage):
* UIProcess/Downloads/DownloadProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::receivedPolicyDecision):
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::download):
(WebKit::WebProcessPool::resumeDownload):
(WebKit::WebProcessPool::createDownloadProxy):
* UIProcess/WebProcessPool.h:
* UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::handleDownloadRequest):
* UIProcess/mac/PageClientImplMac.mm:
(WebKit::PageClientImpl::handleDownloadRequest):

Tools:

Add layout test coverage for both the ObjC and C API.

* TestWebKitAPI/Tests/WebKit/mac/ContextMenuDownload.mm:
(TestWebKitAPI::decideDestinationWithSuggestedFilename):
(TestWebKitAPI::TEST):
* TestWebKitAPI/Tests/WebKitCocoa/Download.mm:
(-[RedirectedDownloadDelegate _downloadDidStart:]):
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WTF/wtf/WeakPtr.h (221765 => 221766)


--- trunk/Source/WTF/wtf/WeakPtr.h	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WTF/wtf/WeakPtr.h	2017-09-07 22:49:58 UTC (rev 221766)
@@ -92,6 +92,7 @@
     WTF_MAKE_FAST_ALLOCATED;
 public:
     WeakPtr() : m_ref(WeakReference<T>::create(nullptr)) { }
+    WeakPtr(std::nullptr_t) : m_ref(WeakReference<T>::create(nullptr)) { }
     WeakPtr(const WeakPtr& o) : m_ref(o.m_ref.copyRef()) { }
     template<typename U> WeakPtr(const WeakPtr<U>& o) : m_ref(o.m_ref.copyRef()) { }
 

Modified: trunk/Source/WebKit/ChangeLog (221765 => 221766)


--- trunk/Source/WebKit/ChangeLog	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/ChangeLog	2017-09-07 22:49:58 UTC (rev 221766)
@@ -1,3 +1,37 @@
+2017-09-07  Chris Dumez  <[email protected]>
+
+        [WK2] Add C API to retrieve the originating page of a WKDownload
+        https://bugs.webkit.org/show_bug.cgi?id=176557
+        <rdar://problem/34314776>
+
+        Reviewed by Alex Christensen.
+
+        Add C API to retrieve the original page of a WKDownload. This is the C API equivalent to
+        _WKDownload.originatingWebView which already exists in ObjC. The pointer is weak so as
+        to not keep alive the page for the duration of the download.
+
+        * UIProcess/API/C/WKDownload.cpp:
+        (WKDownloadGetOriginatingPage):
+        * UIProcess/API/C/WKDownload.h:
+        * UIProcess/API/Cocoa/_WKDownload.mm:
+        (-[_WKDownload originatingWebView]):
+        * UIProcess/API/Cocoa/_WKDownloadInternal.h:
+        * UIProcess/Downloads/DownloadProxy.cpp:
+        (WebKit::DownloadProxy::originatingPage const):
+        (WebKit::DownloadProxy::setOriginatingPage):
+        * UIProcess/Downloads/DownloadProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::receivedPolicyDecision):
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::download):
+        (WebKit::WebProcessPool::resumeDownload):
+        (WebKit::WebProcessPool::createDownloadProxy):
+        * UIProcess/WebProcessPool.h:
+        * UIProcess/ios/PageClientImplIOS.mm:
+        (WebKit::PageClientImpl::handleDownloadRequest):
+        * UIProcess/mac/PageClientImplMac.mm:
+        (WebKit::PageClientImpl::handleDownloadRequest):
+
 2017-09-07  Alex Christensen  <[email protected]>
 
         Clean up Geolocation request handling

Modified: trunk/Source/WebKit/UIProcess/API/C/WKDownload.cpp (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/API/C/WKDownload.cpp	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/API/C/WKDownload.cpp	2017-09-07 22:49:58 UTC (rev 221766)
@@ -30,6 +30,7 @@
 #include "APIURLRequest.h"
 #include "DownloadProxy.h"
 #include "WKAPICast.h"
+#include "WebPageProxy.h"
 
 using namespace WebKit;
 
@@ -57,3 +58,8 @@
 {
     return toImpl(download)->cancel();
 }
+
+WKPageRef WKDownloadGetOriginatingPage(WKDownloadRef download)
+{
+    return toAPI(toImpl(download)->originatingPage());
+}

Modified: trunk/Source/WebKit/UIProcess/API/C/WKDownload.h (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/API/C/WKDownload.h	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/API/C/WKDownload.h	2017-09-07 22:49:58 UTC (rev 221766)
@@ -42,6 +42,7 @@
 WK_EXPORT WKURLRequestRef WKDownloadCopyRequest(WKDownloadRef download);
 WK_EXPORT WKDataRef WKDownloadGetResumeData(WKDownloadRef download);
 WK_EXPORT void WKDownloadCancel(WKDownloadRef download);
+WK_EXPORT WKPageRef WKDownloadGetOriginatingPage(WKDownloadRef download);
 
 #ifdef __cplusplus
 }

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.mm (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.mm	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownload.mm	2017-09-07 22:49:58 UTC (rev 221766)
@@ -29,11 +29,11 @@
 #if WK_API_ENABLED
 
 #import "DownloadProxy.h"
+#import "WKWebViewInternal.h"
 #import "WeakObjCPtr.h"
 
 @implementation _WKDownload {
     API::ObjectStorage<WebKit::DownloadProxy> _download;
-    WebKit::WeakObjCPtr<WKWebView> _originatingWebView;
 }
 
 - (void)dealloc
@@ -55,12 +55,10 @@
 
 - (WKWebView *)originatingWebView
 {
-    return _originatingWebView.getAutoreleased();
-}
+    if (auto* originatingPage = _download->originatingPage())
+        return [[fromWebPageProxy(*originatingPage) retain] autorelease];
+    return nil;
 
-- (void)setOriginatingWebView:(WKWebView *)originatingWebView
-{
-    _originatingWebView = originatingWebView;
 }
 
 #pragma mark WKObject protocol implementation

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownloadInternal.h (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownloadInternal.h	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKDownloadInternal.h	2017-09-07 22:49:58 UTC (rev 221766)
@@ -30,7 +30,6 @@
 #import "WKObject.h"
 
 @interface _WKDownload () <WKObject>
-@property (nonatomic, weak) WKWebView *originatingWebView;
 @end
 
 #endif // WK_API_ENABLED

Modified: trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp	2017-09-07 22:49:58 UTC (rev 221766)
@@ -92,6 +92,16 @@
     m_processPool->downloadClient().processDidCrash(m_processPool.get(), this);
 }
 
+WebPageProxy* DownloadProxy::originatingPage() const
+{
+    return m_originatingPage.get();
+}
+
+void DownloadProxy::setOriginatingPage(WebPageProxy* page)
+{
+    m_originatingPage = page ? page->createWeakPtr() : nullptr;
+}
+
 void DownloadProxy::didStart(const ResourceRequest& request, const String& suggestedFilename)
 {
     m_request = request;

Modified: trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.h (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.h	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/Downloads/DownloadProxy.h	2017-09-07 22:49:58 UTC (rev 221766)
@@ -33,6 +33,7 @@
 #include <WebCore/ResourceRequest.h>
 #include <wtf/Forward.h>
 #include <wtf/Ref.h>
+#include <wtf/WeakPtr.h>
 
 namespace API {
 class Data;
@@ -69,6 +70,9 @@
     void didReceiveDownloadProxyMessage(IPC::Connection&, IPC::Decoder&);
     void didReceiveSyncDownloadProxyMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&);
 
+    WebPageProxy* originatingPage() const;
+    void setOriginatingPage(WebPageProxy*);
+
 private:
     explicit DownloadProxy(DownloadProxyMap&, WebProcessPool&, const WebCore::ResourceRequest&);
 
@@ -103,6 +107,8 @@
     RefPtr<API::Data> m_resumeData;
     WebCore::ResourceRequest m_request;
     String m_suggestedFilename;
+
+    WeakPtr<WebPageProxy> m_originatingPage;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2017-09-07 22:49:58 UTC (rev 221766)
@@ -2277,7 +2277,7 @@
     DownloadID downloadID = { };
     if (action == PolicyDownload) {
         // Create a download proxy.
-        DownloadProxy* download = m_process->processPool().createDownloadProxy(m_decidePolicyForResponseRequest);
+        auto* download = m_process->processPool().createDownloadProxy(m_decidePolicyForResponseRequest, this);
         downloadID = download->downloadID();
         handleDownloadRequest(download);
         m_decidePolicyForResponseRequest = { };

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2017-09-07 22:49:58 UTC (rev 221766)
@@ -995,7 +995,7 @@
 
 DownloadProxy* WebProcessPool::download(WebPageProxy* initiatingPage, const ResourceRequest& request, const String& suggestedFilename)
 {
-    DownloadProxy* downloadProxy = createDownloadProxy(request);
+    auto* downloadProxy = createDownloadProxy(request, initiatingPage);
     PAL::SessionID sessionID = initiatingPage ? initiatingPage->sessionID() : PAL::SessionID::defaultSessionID();
 
     if (initiatingPage)
@@ -1018,7 +1018,7 @@
 
 DownloadProxy* WebProcessPool::resumeDownload(const API::Data* resumeData, const String& path)
 {
-    DownloadProxy* downloadProxy = createDownloadProxy(ResourceRequest());
+    auto* downloadProxy = createDownloadProxy(ResourceRequest(), nullptr);
 
     SandboxExtension::Handle sandboxExtensionHandle;
     if (!path.isEmpty())
@@ -1206,9 +1206,11 @@
     sendToAllProcesses(Messages::WebProcess::SetDefaultRequestTimeoutInterval(timeoutInterval));
 }
 
-DownloadProxy* WebProcessPool::createDownloadProxy(const ResourceRequest& request)
+DownloadProxy* WebProcessPool::createDownloadProxy(const ResourceRequest& request, WebPageProxy* originatingPage)
 {
-    return ensureNetworkProcess().createDownloadProxy(request);
+    auto downloadProxy = ensureNetworkProcess().createDownloadProxy(request);
+    downloadProxy->setOriginatingPage(originatingPage);
+    return downloadProxy;
 }
 
 void WebProcessPool::addMessageReceiver(IPC::StringReference messageReceiverName, IPC::MessageReceiver& messageReceiver)

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2017-09-07 22:49:58 UTC (rev 221766)
@@ -232,7 +232,7 @@
     void setEnhancedAccessibility(bool);
     
     // Downloads.
-    DownloadProxy* createDownloadProxy(const WebCore::ResourceRequest&);
+    DownloadProxy* createDownloadProxy(const WebCore::ResourceRequest&, WebPageProxy* originatingPage);
     API::DownloadClient& downloadClient() { return *m_downloadClient; }
 
     API::LegacyContextHistoryClient& historyClient() { return *m_historyClient; }

Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm	2017-09-07 22:49:58 UTC (rev 221766)
@@ -260,11 +260,8 @@
     [m_contentView _didCommitLoadForMainFrame];
 }
 
-void PageClientImpl::handleDownloadRequest(DownloadProxy* download)
+void PageClientImpl::handleDownloadRequest(DownloadProxy*)
 {
-    ASSERT_ARG(download, download);
-    ASSERT([download->wrapper() isKindOfClass:[_WKDownload class]]);
-    [static_cast<_WKDownload *>(download->wrapper()) setOriginatingWebView:m_webView];
 }
 
 void PageClientImpl::didChangeContentSize(const WebCore::IntSize&)

Modified: trunk/Source/WebKit/UIProcess/mac/PageClientImplMac.mm (221765 => 221766)


--- trunk/Source/WebKit/UIProcess/mac/PageClientImplMac.mm	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Source/WebKit/UIProcess/mac/PageClientImplMac.mm	2017-09-07 22:49:58 UTC (rev 221766)
@@ -273,13 +273,8 @@
 {
 }
 
-void PageClientImpl::handleDownloadRequest(DownloadProxy* download)
+void PageClientImpl::handleDownloadRequest(DownloadProxy*)
 {
-    ASSERT_ARG(download, download);
-#if WK_API_ENABLED
-    ASSERT([download->wrapper() isKindOfClass:[_WKDownload class]]);
-    [static_cast<_WKDownload *>(download->wrapper()) setOriginatingWebView:m_webView];
-#endif
 }
 
 void PageClientImpl::didChangeContentSize(const WebCore::IntSize& newSize)

Modified: trunk/Tools/ChangeLog (221765 => 221766)


--- trunk/Tools/ChangeLog	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Tools/ChangeLog	2017-09-07 22:49:58 UTC (rev 221766)
@@ -1,3 +1,20 @@
+2017-09-07  Chris Dumez  <[email protected]>
+
+        [WK2] Add C API to retrieve the originating page of a WKDownload
+        https://bugs.webkit.org/show_bug.cgi?id=176557
+        <rdar://problem/34314776>
+
+        Reviewed by Alex Christensen.
+
+        Add layout test coverage for both the ObjC and C API.
+
+        * TestWebKitAPI/Tests/WebKit/mac/ContextMenuDownload.mm:
+        (TestWebKitAPI::decideDestinationWithSuggestedFilename):
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/Tests/WebKitCocoa/Download.mm:
+        (-[RedirectedDownloadDelegate _downloadDidStart:]):
+        (TEST):
+
 2017-09-07  Filip Pizlo  <[email protected]>
 
         WSL Node.prototype.visit should probably do memoization

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/mac/ContextMenuDownload.mm (221765 => 221766)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/mac/ContextMenuDownload.mm	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/mac/ContextMenuDownload.mm	2017-09-07 22:49:58 UTC (rev 221766)
@@ -33,11 +33,13 @@
 #include <WebKit/WKPageContextMenuClient.h>
 #include <WebKit/WKPreferencesPrivate.h>
 #include <WebKit/WKRetainPtr.h>
+#include <WebKit/_WKDownload.h>
 
 namespace TestWebKitAPI {
 
 static bool didFinishLoad;
 static bool didDecideDownloadDestination;
+static WKPageRef expectedOriginatingPage;
 
 static void didFinishLoadForFrame(WKPageRef, WKFrameRef, WKTypeRef, const void*)
 {
@@ -68,6 +70,8 @@
     WKDownloadCancel(download);
     didDecideDownloadDestination = true;
 
+    EXPECT_EQ(expectedOriginatingPage, WKDownloadGetOriginatingPage(download));
+
     return Util::toWK("/tmp/WebKitAPITest/ContextMenuDownload").leakRef();
 }
 
@@ -100,6 +104,7 @@
 
     WKRetainPtr<WKURLRef> url(AdoptWK, Util::createURLForResource("link-with-download-attribute", "html"));
 
+    expectedOriginatingPage = webView.page();
     WKPageLoadURL(webView.page(), url.get());
     Util::run(&didFinishLoad);
 
@@ -146,6 +151,7 @@
 
     WKRetainPtr<WKURLRef> url(AdoptWK, Util::createURLForResource("link-with-download-attribute-with-slashes", "html"));
 
+    expectedOriginatingPage = webView.page();
     WKPageLoadURL(webView.page(), url.get());
     Util::run(&didFinishLoad);
 

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Download.mm (221765 => 221766)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Download.mm	2017-09-07 22:22:38 UTC (rev 221765)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Download.mm	2017-09-07 22:49:58 UTC (rev 221766)
@@ -49,6 +49,7 @@
 static bool hasReceivedRedirect;
 static bool hasReceivedResponse;
 static NSURL *sourceURL = [[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
+static WKWebView* expectedOriginatingWebView;
 
 @interface DownloadDelegate : NSObject <_WKDownloadDelegate>
 @end
@@ -449,6 +450,12 @@
     String _destinationPath;
 }
 
+- (void)_downloadDidStart:(_WKDownload *)download
+{
+    EXPECT_NOT_NULL(download);
+    EXPECT_EQ(expectedOriginatingWebView, download.originatingWebView);
+}
+
 - (NSString *)_download:(_WKDownload *)download decideDestinationWithSuggestedFilename:(NSString *)filename allowOverwrite:(BOOL *)allowOverwrite
 {
     WebCore::PlatformFileHandle fileHandle;
@@ -492,6 +499,7 @@
 
     [webView synchronouslyLoadHTMLString:@"<a style='display: block; height: 100%; width: 100%' href=''>test</a>"];
 
+    expectedOriginatingWebView = webView.get();
     NSPoint clickPoint = NSMakePoint(100, 100);
     [[webView hitTest:clickPoint] mouseDown:[NSEvent mouseEventWithType:NSEventTypeRightMouseDown location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
     [[webView hitTest:clickPoint] mouseUp:[NSEvent mouseEventWithType:NSEventTypeRightMouseUp location:clickPoint modifierFlags:0 timestamp:0 windowNumber:[window windowNumber] context:nil eventNumber:0 clickCount:1 pressure:1]];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to