Title: [253037] trunk
Revision
253037
Author
you...@apple.com
Date
2019-12-03 06:45:21 -0800 (Tue, 03 Dec 2019)

Log Message

Expose WKWebView API to stop ongoing capture
https://bugs.webkit.org/show_bug.cgi?id=204787

Reviewed by Eric Carlson.

Source/WebKit:

Covered by API test.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _stopMediaCapture]):
* UIProcess/API/Cocoa/WKWebViewPrivate.h:

Tools:

* TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:
(TestWebKitAPI::TEST):
* TestWebKitAPI/Tests/WebKit/getUserMedia.html:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (253036 => 253037)


--- trunk/Source/WebKit/ChangeLog	2019-12-03 13:37:01 UTC (rev 253036)
+++ trunk/Source/WebKit/ChangeLog	2019-12-03 14:45:21 UTC (rev 253037)
@@ -1,5 +1,18 @@
 2019-12-03  youenn fablet  <you...@apple.com>
 
+        Expose WKWebView API to stop ongoing capture
+        https://bugs.webkit.org/show_bug.cgi?id=204787
+
+        Reviewed by Eric Carlson.
+
+        Covered by API test.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _stopMediaCapture]):
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+
+2019-12-03  youenn fablet  <you...@apple.com>
+
         [Cocoa] Run camera capture in UIProcess by default in layout tests
         https://bugs.webkit.org/show_bug.cgi?id=204512
 

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (253036 => 253037)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2019-12-03 13:37:01 UTC (rev 253036)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2019-12-03 14:45:21 UTC (rev 253037)
@@ -4987,6 +4987,11 @@
 #endif
 }
 
+- (void)_stopMediaCapture
+{
+    _page->stopMediaCapture();
+}
+
 - (void)_stopAllMediaPlayback
 {
     _page->stopAllMediaPlayback();

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h (253036 => 253037)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2019-12-03 13:37:01 UTC (rev 253036)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2019-12-03 14:45:21 UTC (rev 253037)
@@ -422,6 +422,7 @@
 - (void)_setPageMuted:(_WKMediaMutedState)mutedState WK_API_AVAILABLE(macos(10.13), ios(11.0));
 
 @property (nonatomic, setter=_setMediaCaptureEnabled:) BOOL _mediaCaptureEnabled WK_API_AVAILABLE(macos(10.13), ios(11.0));
+- (void)_stopMediaCapture WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 @property (nonatomic, readonly) BOOL _canTogglePictureInPicture;
 @property (nonatomic, readonly) BOOL _isPictureInPictureActive;

Modified: trunk/Tools/ChangeLog (253036 => 253037)


--- trunk/Tools/ChangeLog	2019-12-03 13:37:01 UTC (rev 253036)
+++ trunk/Tools/ChangeLog	2019-12-03 14:45:21 UTC (rev 253037)
@@ -1,5 +1,16 @@
 2019-12-03  youenn fablet  <you...@apple.com>
 
+        Expose WKWebView API to stop ongoing capture
+        https://bugs.webkit.org/show_bug.cgi?id=204787
+
+        Reviewed by Eric Carlson.
+
+        * TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/Tests/WebKit/getUserMedia.html:
+
+2019-12-03  youenn fablet  <you...@apple.com>
+
         [Cocoa] Run camera capture in UIProcess by default in layout tests
         https://bugs.webkit.org/show_bug.cgi?id=204512
 

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm (253036 => 253037)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm	2019-12-03 13:37:01 UTC (rev 253036)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm	2019-12-03 14:45:21 UTC (rev 253037)
@@ -157,6 +157,39 @@
     EXPECT_TRUE(waitUntilCaptureState(webView, _WKMediaCaptureStateNone));
 }
 
+TEST(WebKit2, CaptureStop)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
+    auto preferences = [configuration preferences];
+    preferences._mediaCaptureRequiresSecureConnection = NO;
+    preferences._mediaDevicesEnabled = YES;
+    preferences._mockCaptureDevicesEnabled = YES;
+
+    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
+    [[configuration.get() userContentController] addScriptMessageHandler:messageHandler.get() name:@"gum"];
+
+    auto webView = [[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()];
+    auto delegate = adoptNS([[GetUserMediaCaptureUIDelegate alloc] init]);
+    webView.UIDelegate = delegate.get();
+
+    [webView loadTestPageNamed:@"getUserMedia"];
+    EXPECT_TRUE(waitUntilCaptureState(webView, _WKMediaCaptureStateActiveCamera));
+
+    [webView _setPageMuted: _WKMediaCaptureDevicesMuted];
+    EXPECT_TRUE(waitUntilCaptureState(webView, _WKMediaCaptureStateMutedCamera));
+    [webView _setPageMuted: _WKMediaNoneMuted];
+    EXPECT_TRUE(waitUntilCaptureState(webView, _WKMediaCaptureStateActiveCamera));
+
+    [webView stringByEvaluatingJavaScript:@"notifyEndedEvent()"];
+    [webView _stopMediaCapture];
+
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    EXPECT_TRUE(waitUntilCaptureState(webView, _WKMediaCaptureStateNone));
+}
+
 #if WK_HAVE_C_SPI
 TEST(WebKit, WebAudioAndGetUserMedia)
 {

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/getUserMedia.html (253036 => 253037)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/getUserMedia.html	2019-12-03 13:37:01 UTC (rev 253036)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/getUserMedia.html	2019-12-03 14:45:21 UTC (rev 253037)
@@ -60,6 +60,28 @@
             {
                 navigator.mediaDevices.getUserMedia({audio: true, video: true}).then(s => stream = s);
             }
+
+            function notifyEndedEvent()
+            {
+                if (!stream || !stream.getVideoTracks().length) {
+                    window.webkit.messageHandlers.gum.postMessage("No stream or video track");
+                    return;
+                }
+                
+                let waitForEndedEvent = true;
+                stream.getVideoTracks()[0]._onended_ = () => {
+                    if (!waitForEndedEvent)
+                        return;
+                    waitForEndedEvent = false;
+                    window.webkit.messageHandlers.gum.postMessage("PASS");
+                }
+                setTimeout(() => {
+                    if (!waitForEndedEvent)
+                       return;
+                    waitForEndedEvent = false;
+                    window.webkit.messageHandlers.gum.postMessage("Did not receive an ended event after 5 seconds");
+                }, 5000);
+            }
         </script>
     <head>
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to