Diff
Modified: trunk/Source/WebKit/ChangeLog (258573 => 258574)
--- trunk/Source/WebKit/ChangeLog 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Source/WebKit/ChangeLog 2020-03-17 19:46:46 UTC (rev 258574)
@@ -1,3 +1,26 @@
+2020-03-17 Alex Christensen <[email protected]>
+
+ Add WKUIDelegatePrivate SPI _webView:printFrame:completionHandler:
+ https://bugs.webkit.org/show_bug.cgi?id=209192
+ <rdar://problem/51313336>
+
+ Reviewed by Geoff Garen.
+
+ This is just like the existing _webView:printFrame: but you tell it when you're done instead of just returning.
+ Covered by API tests.
+
+ * UIProcess/API/APIUIClient.h:
+ (API::UIClient::printFrame):
+ * UIProcess/API/C/WKPage.cpp:
+ (WKPageSetPageUIClient):
+ * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
+ * UIProcess/Cocoa/UIDelegate.h:
+ * UIProcess/Cocoa/UIDelegate.mm:
+ (WebKit::UIDelegate::setDelegate):
+ (WebKit::UIDelegate::UIClient::printFrame):
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::printFrame):
+
2020-03-17 David Kilzer <[email protected]>
REGRESSION (r258334): WebPasteboardProxy::setPasteboardBufferForType should allow zero-size buffers
Modified: trunk/Source/WebKit/UIProcess/API/APIUIClient.h (258573 => 258574)
--- trunk/Source/WebKit/UIProcess/API/APIUIClient.h 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Source/WebKit/UIProcess/API/APIUIClient.h 2020-03-17 19:46:46 UTC (rev 258574)
@@ -148,7 +148,7 @@
virtual float footerHeight(WebKit::WebPageProxy&, WebKit::WebFrameProxy&) { return 0; }
virtual void drawHeader(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, WebCore::FloatRect&&) { }
virtual void drawFooter(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, WebCore::FloatRect&&) { }
- virtual void printFrame(WebKit::WebPageProxy&, WebKit::WebFrameProxy&) { }
+ virtual void printFrame(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, CompletionHandler<void()>&& completionHandler) { completionHandler(); }
virtual bool canRunModal() const { return false; }
virtual void runModal(WebKit::WebPageProxy&) { }
Modified: trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp (258573 => 258574)
--- trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp 2020-03-17 19:46:46 UTC (rev 258574)
@@ -1954,12 +1954,11 @@
m_client.drawFooter(toAPI(&page), toAPI(&frame), toAPI(rect), m_client.base.clientInfo);
}
- void printFrame(WebPageProxy& page, WebFrameProxy& frame) final
+ void printFrame(WebPageProxy& page, WebFrameProxy& frame, CompletionHandler<void()>&& completionHandler) final
{
- if (!m_client.printFrame)
- return;
-
- m_client.printFrame(toAPI(&page), toAPI(&frame), m_client.base.clientInfo);
+ if (m_client.printFrame)
+ m_client.printFrame(toAPI(&page), toAPI(&frame), m_client.base.clientInfo);
+ completionHandler();
}
bool canRunModal() const final
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (258573 => 258574)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h 2020-03-17 19:46:46 UTC (rev 258574)
@@ -100,6 +100,7 @@
- (void)_webView:(WKWebView *)webView decideWebApplicationCacheQuotaForSecurityOrigin:(WKSecurityOrigin *)securityOrigin currentQuota:(unsigned long long)currentQuota totalBytesNeeded:(unsigned long long)totalBytesNeeded decisionHandler:(void (^)(unsigned long long newQuota))decisionHandler;
- (void)_webView:(WKWebView *)webView printFrame:(_WKFrameHandle *)frame;
+- (void)_webView:(WKWebView *)webView printFrame:(_WKFrameHandle *)frame completionHandler:(void (^)(void))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
- (void)_webViewClose:(WKWebView *)webView;
- (void)_webViewFullscreenMayReturnToInline:(WKWebView *)webView;
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h (258573 => 258574)
--- trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h 2020-03-17 19:46:46 UTC (rev 258574)
@@ -133,7 +133,7 @@
void decidePolicyForUserMediaPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, UserMediaPermissionRequestProxy&) final;
void checkUserMediaPermissionForOrigin(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, UserMediaPermissionCheckProxy&) final;
void mediaCaptureStateDidChange(WebCore::MediaProducer::MediaStateFlags) final;
- void printFrame(WebPageProxy&, WebFrameProxy&) final;
+ void printFrame(WebPageProxy&, WebFrameProxy&, CompletionHandler<void()>&&) final;
#if PLATFORM(IOS_FAMILY)
#if HAVE(APP_LINKS)
bool shouldIncludeAppLinkActionsForElement(_WKActivatedElementInfo *) final;
@@ -206,6 +206,7 @@
bool webViewDecideDatabaseQuotaForSecurityOriginDatabaseNameDisplayNameCurrentQuotaCurrentOriginUsageCurrentDatabaseUsageExpectedUsageDecisionHandler : 1;
bool webViewDecideWebApplicationCacheQuotaForSecurityOriginCurrentQuotaTotalBytesNeeded : 1;
bool webViewPrintFrame : 1;
+ bool webViewPrintFrameCompletionHandler : 1;
bool webViewDidClose : 1;
bool webViewClose : 1;
bool webViewFullscreenMayReturnToInline : 1;
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm (258573 => 258574)
--- trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm 2020-03-17 19:46:46 UTC (rev 258574)
@@ -139,6 +139,7 @@
m_delegateMethods.webViewDecideDatabaseQuotaForSecurityOriginDatabaseNameDisplayNameCurrentQuotaCurrentOriginUsageCurrentDatabaseUsageExpectedUsageDecisionHandler = [delegate respondsToSelector:@selector(_webView:decideDatabaseQuotaForSecurityOrigin:databaseName:displayName:currentQuota:currentOriginUsage:currentDatabaseUsage:expectedUsage:decisionHandler:)];
m_delegateMethods.webViewDecideWebApplicationCacheQuotaForSecurityOriginCurrentQuotaTotalBytesNeeded = [delegate respondsToSelector:@selector(_webView:decideWebApplicationCacheQuotaForSecurityOrigin:currentQuota:totalBytesNeeded:decisionHandler:)];
m_delegateMethods.webViewPrintFrame = [delegate respondsToSelector:@selector(_webView:printFrame:)];
+ m_delegateMethods.webViewPrintFrameCompletionHandler = [delegate respondsToSelector:@selector(_webView:printFrame:completionHandler:)];
m_delegateMethods.webViewDidClose = [delegate respondsToSelector:@selector(webViewDidClose:)];
m_delegateMethods.webViewClose = [delegate respondsToSelector:@selector(_webViewClose:)];
m_delegateMethods.webViewFullscreenMayReturnToInline = [delegate respondsToSelector:@selector(_webViewFullscreenMayReturnToInline:)];
@@ -1076,16 +1077,25 @@
}).get()];
}
-void UIDelegate::UIClient::printFrame(WebPageProxy&, WebFrameProxy& webFrameProxy)
+void UIDelegate::UIClient::printFrame(WebPageProxy&, WebFrameProxy& webFrameProxy, CompletionHandler<void()>&& completionHandler)
{
- if (!m_uiDelegate.m_delegateMethods.webViewPrintFrame)
- return;
-
auto delegate = m_uiDelegate.m_delegate.get();
if (!delegate)
+ return completionHandler();
+
+ auto handle = API::FrameHandle::create(webFrameProxy.frameID());
+ if (m_uiDelegate.m_delegateMethods.webViewPrintFrameCompletionHandler) {
+ auto checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:printFrame:completionHandler:));
+ [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView printFrame:wrapper(handle) completionHandler:makeBlockPtr([checker = WTFMove(checker), completionHandler = WTFMove(completionHandler)] () mutable {
+ if (checker->completionHandlerHasBeenCalled())
+ return;
+ checker->didCallCompletionHandler();
+ completionHandler();
+ }).get()];
return;
-
- [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView printFrame:wrapper(API::FrameHandle::create(webFrameProxy.frameID()))];
+ } else if (m_uiDelegate.m_delegateMethods.webViewPrintFrame)
+ [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView printFrame:wrapper(handle)];
+ completionHandler();
}
void UIDelegate::UIClient::close(WebPageProxy*)
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (258573 => 258574)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2020-03-17 19:46:46 UTC (rev 258574)
@@ -5817,12 +5817,10 @@
WebFrameProxy* frame = m_process->webFrame(frameID);
MESSAGE_CHECK(m_process, frame);
- m_uiClient->printFrame(*this, *frame);
-
- endPrinting(); // Send a message synchronously while m_isPerformingDOMPrintOperation is still true.
- m_isPerformingDOMPrintOperation = false;
-
- completionHandler();
+ m_uiClient->printFrame(*this, *frame, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] {
+ endPrinting(); // Send a message synchronously while m_isPerformingDOMPrintOperation is still true.
+ m_isPerformingDOMPrintOperation = false;
+ });
}
void WebPageProxy::setMediaVolume(float volume)
Modified: trunk/Tools/ChangeLog (258573 => 258574)
--- trunk/Tools/ChangeLog 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Tools/ChangeLog 2020-03-17 19:46:46 UTC (rev 258574)
@@ -1,3 +1,16 @@
+2020-03-17 Alex Christensen <[email protected]>
+
+ Add WKUIDelegatePrivate SPI _webView:printFrame:completionHandler:
+ https://bugs.webkit.org/show_bug.cgi?id=209192
+ <rdar://problem/51313336>
+
+ Reviewed by Geoff Garen.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm:
+ (-[PrintDelegateWithCompletionHandler _webView:printFrame:completionHandler:]):
+ (-[PrintDelegateWithCompletionHandler waitForPrintFrameCall]):
+ (TEST):
+
2020-03-17 Chris Dumez <[email protected]>
Use less sync IPC for ITP testRunner methods
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm (258573 => 258574)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm 2020-03-17 19:45:05 UTC (rev 258573)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm 2020-03-17 19:46:46 UTC (rev 258574)
@@ -441,6 +441,37 @@
[previewView drawRect:CGRectMake(0, 0, 10, 10)];
}
+@interface PrintDelegateWithCompletionHandler : NSObject <WKUIDelegatePrivate>
+- (void)waitForPrintFrameCall;
+@end
+
+@implementation PrintDelegateWithCompletionHandler {
+ bool _done;
+}
+
+- (void)_webView:(WKWebView *)webView printFrame:(_WKFrameHandle *)frame completionHandler:(void (^)(void))completionHandler
+{
+ completionHandler();
+ _done = true;
+}
+
+- (void)waitForPrintFrameCall
+{
+ while (!_done)
+ TestWebKitAPI::Util::spinRunLoop();
+}
+
+@end
+
+TEST(WebKit, PrintWithCompletionHandler)
+{
+ auto webView = adoptNS([WKWebView new]);
+ auto delegate = adoptNS([PrintDelegateWithCompletionHandler new]);
+ [webView setUIDelegate:delegate.get()];
+ [webView loadHTMLString:@"<head><title>test_title</title></head><body _onload_='print()'>hello world!</body>" baseURL:[NSURL URLWithString:@"http://example.com/"]];
+ [delegate waitForPrintFrameCall];
+}
+
@interface NotificationDelegate : NSObject <WKUIDelegatePrivate> {
bool _allowNotifications;
}