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]];