Title: [258574] trunk
Revision
258574
Author
[email protected]
Date
2020-03-17 12:46:46 -0700 (Tue, 17 Mar 2020)

Log Message

Add WKUIDelegatePrivate SPI _webView:printFrame:completionHandler:
https://bugs.webkit.org/show_bug.cgi?id=209192
<rdar://problem/51313336>

Reviewed by Geoff Garen.

Source/WebKit:

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):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm:
(-[PrintDelegateWithCompletionHandler _webView:printFrame:completionHandler:]):
(-[PrintDelegateWithCompletionHandler waitForPrintFrameCall]):
(TEST):

Modified Paths

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;
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to