WebKit Bugzilla
Attachment 357729 Details for
Bug 192793
: Add a new SPI for controlling getUserMedia
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-192793-20181219145246.patch (text/plain), 54.20 KB, created by
youenn fablet
on 2018-12-19 14:52:48 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2018-12-19 14:52:48 PST
Size:
54.20 KB
patch
obsolete
>Subversion Revision: 239107 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 79cbefc1b389b5c407c73dc15394980702f553f8..13f00b4dc491e996e26d8e936c5914cba3f30043 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,48 @@ >+2018-12-19 Youenn Fablet <youenn@apple.com> >+ >+ Add a new SPI for controlling getUserMedia >+ https://bugs.webkit.org/show_bug.cgi?id=192793 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Some weaknesses of the current getUserMedia SPI were found. >+ In particular: >+ - The hash salt should be handled by WebKit. >+ - No need to expose the frame URL, only the top level origin is needed. >+ - The names of the callback can be improved. >+ Addressed these by creating a new SPI which will replace the current one. >+ The current SPI will be removed later on. >+ >+ Did some refactoring by making the callbacks not return false. >+ Instead, implement the default behavior inside the request objects as deny methods. >+ >+ * UIProcess/API/APIUIClient.h: >+ (API::UIClient::decidePolicyForUserMediaPermissionRequest): >+ (API::UIClient::checkUserMediaPermissionForOrigin): >+ * UIProcess/API/C/WKPage.cpp: >+ (WKPageSetPageUIClient): >+ * UIProcess/API/Cocoa/WKUIDelegatePrivate.h: >+ * UIProcess/API/Cocoa/WKWebView.mm: >+ (-[WKWebView _mediaCaptureState]): >+ (-[WKWebView _setMediaCaptureMuted:]): >+ * UIProcess/API/Cocoa/WKWebViewPrivate.h: >+ * UIProcess/API/glib/WebKitUIClient.cpp: >+ * UIProcess/Cocoa/MediaCaptureUtilities.h: Added. >+ * UIProcess/Cocoa/MediaCaptureUtilities.mm: Added. >+ * UIProcess/Cocoa/UIDelegate.h: >+ * UIProcess/Cocoa/UIDelegate.mm: >+ (WebKit::UIDelegate::setDelegate): >+ (WebKit::requestUserMediaAuthorizationForFrame): >+ (WebKit::UIDelegate::UIClient::decidePolicyForUserMediaPermissionRequest): >+ (WebKit::UIDelegate::UIClient::checkUserMediaPermissionForOrigin): >+ (WebKit::UIDelegate::UIClient::mediaCaptureStateDidChange): >+ * UIProcess/UserMediaPermissionCheckProxy.h: >+ (WebKit::UserMediaPermissionCheckProxy::deny): >+ * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: >+ (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): >+ (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): >+ * UIProcess/UserMediaPermissionRequestProxy.h: >+ > 2018-12-09 Darin Adler <darin@apple.com> > > [iOS] Zero memory containing the password for PDF documents when a WKPDFView is deallocated >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index dfef9fec52fd27ee105cd500881c8dcafc2aae47..e84c34cbf12d98bd2da4aeb5cd30d21db608b808 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -25510,6 +25510,8 @@ > D0D8648E21B70676003C983C /* WebGPUBuffer.idl */, > D0D8648221B61727003C983C /* WebGPUBufferDescriptor.h */, > D0D8648321B61727003C983C /* WebGPUBufferDescriptor.idl */, >+ D063AE4E21C0810A000E6A35 /* WebGPUBufferUsage.h */, >+ D063AE4C21C07AB5000E6A35 /* WebGPUBufferUsage.idl */, > D001D9AC21B0C81A0023B9BC /* WebGPUColor.h */, > D001D9AD21B0C81A0023B9BC /* WebGPUColor.idl */, > D0EACF7721937228000FA75C /* WebGPUCommandBuffer.cpp */, >@@ -25561,8 +25563,6 @@ > D0EACF882193EE4E000FA75C /* WebGPUTextureView.cpp */, > D0EACF872193EE4E000FA75C /* WebGPUTextureView.h */, > D0EACF892193EE4E000FA75C /* WebGPUTextureView.idl */, >- D063AE4C21C07AB5000E6A35 /* WebGPUBufferUsage.idl */, >- D063AE4E21C0810A000E6A35 /* WebGPUBufferUsage.h */, > ); > path = webgpu; > sourceTree = "<group>"; >diff --git a/Source/WebKit/SourcesCocoa.txt b/Source/WebKit/SourcesCocoa.txt >index 55eaf591317889af066c522f46f3adee3dd226f1..07cb0ad2702e2bf434f9eea2dbca07f5b59ca120 100644 >--- a/Source/WebKit/SourcesCocoa.txt >+++ b/Source/WebKit/SourcesCocoa.txt >@@ -319,6 +319,7 @@ UIProcess/Cocoa/FindClient.mm > UIProcess/Cocoa/FullscreenClient.mm > UIProcess/Cocoa/IconLoadingDelegate.mm > UIProcess/Cocoa/LegacyCustomProtocolManagerClient.mm >+UIProcess/Cocoa/MediaCaptureUtilities.mm > UIProcess/Cocoa/NavigationState.mm > UIProcess/Cocoa/PageClientImplCocoa.mm > UIProcess/Cocoa/PlaybackSessionManagerProxy.mm >diff --git a/Source/WebKit/UIProcess/API/APIUIClient.h b/Source/WebKit/UIProcess/API/APIUIClient.h >index 1d35272c9c2d41d37811e25875eba83dc1c15428..6bb4bd33d04692141ed09dbbed08fd8ef6d1d605 100644 >--- a/Source/WebKit/UIProcess/API/APIUIClient.h >+++ b/Source/WebKit/UIProcess/API/APIUIClient.h >@@ -129,8 +129,8 @@ public: > > virtual bool runOpenPanel(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, OpenPanelParameters*, WebKit::WebOpenPanelResultListenerProxy*) { return false; } > virtual void decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, Function<void(bool)>&) { } >- virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; } >- virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { return false; } >+ virtual void decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { } >+ virtual void checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { } > virtual void decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy&, SecurityOrigin&, Function<void(bool)>&& completionHandler) { completionHandler(false); } > virtual void requestStorageAccessConfirm(WebKit::WebPageProxy&, WebKit::WebFrameProxy*, const WTF::String& requestingDomain, const WTF::String& currentDomain, CompletionHandler<void(bool)>&& completionHandler) { completionHandler(true); } > >diff --git a/Source/WebKit/UIProcess/API/C/WKPage.cpp b/Source/WebKit/UIProcess/API/C/WKPage.cpp >index 2537439641b6ffe27e1626155438525150334668..5ad0946e26efd37601dcfe7e51831518de7b342a 100644 >--- a/Source/WebKit/UIProcess/API/C/WKPage.cpp >+++ b/Source/WebKit/UIProcess/API/C/WKPage.cpp >@@ -1854,22 +1854,24 @@ void WKPageSetPageUIClient(WKPageRef pageRef, const WKPageUIClientBase* wkClient > m_client.decidePolicyForGeolocationPermissionRequest(toAPI(&page), toAPI(&frame), toAPI(&origin), toAPI(GeolocationPermissionRequest::create(std::exchange(completionHandler, nullptr)).ptr()), m_client.base.clientInfo); > } > >- bool decidePolicyForUserMediaPermissionRequest(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionRequestProxy& permissionRequest) final >+ void decidePolicyForUserMediaPermissionRequest(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionRequestProxy& permissionRequest) final > { >- if (!m_client.decidePolicyForUserMediaPermissionRequest) >- return false; >+ if (!m_client.decidePolicyForUserMediaPermissionRequest) { >+ permissionRequest.deny(); >+ return; >+ } > > m_client.decidePolicyForUserMediaPermissionRequest(toAPI(&page), toAPI(&frame), toAPI(&userMediaDocumentOrigin), toAPI(&topLevelDocumentOrigin), toAPI(&permissionRequest), m_client.base.clientInfo); >- return true; > } > >- bool checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionCheckProxy& request) final >+ void checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionCheckProxy& request) final > { >- if (!m_client.checkUserMediaPermissionForOrigin) >- return false; >+ if (!m_client.checkUserMediaPermissionForOrigin) { >+ request.deny(); >+ return; >+ } > > m_client.checkUserMediaPermissionForOrigin(toAPI(&page), toAPI(&frame), toAPI(&userMediaDocumentOrigin), toAPI(&topLevelDocumentOrigin), toAPI(&request), m_client.base.clientInfo); >- return true; > } > > void decidePolicyForNotificationPermissionRequest(WebPageProxy& page, API::SecurityOrigin& origin, Function<void(bool)>&& completionHandler) final >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h b/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h >index 7f61a82eba7cbb6e5811ced24fdffc0859f03c1f..3051d8d75a7817e273d68fb77c00ab1122a0238b 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h >@@ -104,6 +104,8 @@ struct UIEdgeInsets; > > - (void)_webView:(WKWebView *)webView imageOrMediaDocumentSizeChanged:(CGSize)size WK_API_AVAILABLE(macosx(10.12), ios(10.0)); > - (NSDictionary *)_dataDetectionContextForWebView:(WKWebView *)webView WK_API_AVAILABLE(macosx(10.12), ios(10.0)); >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo *)mainFrame devices:(_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL authorized))decisionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); >+- (void)_webView:(WKWebView *)webView isMediaCaptureAuthorizedForFrame:(WKFrameInfo *)mainFrame decisionHandler:(void (^)(BOOL authorized))decisionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > - (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(_WKCaptureDevices)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL authorized))decisionHandler WK_API_AVAILABLE(macosx(10.13), ios(11.0)); > - (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler WK_API_AVAILABLE(macosx(10.12.3), ios(10.3)); > - (void)_webView:(WKWebView *)webView mediaCaptureStateDidChange:(_WKMediaCaptureState)state WK_API_AVAILABLE(macosx(10.13), ios(11.0)); >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >index ba2048eabaab68cd733825c64f8b920fab96441e..db34dd157270a01dbd2b92cd918508bfe21f70b1 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >@@ -40,6 +40,7 @@ > #import "IconLoadingDelegate.h" > #import "LegacySessionStateCoding.h" > #import "Logging.h" >+#import "MediaCaptureUtilities.h" > #import "NavigationState.h" > #import "ObjCObjectGraph.h" > #import "PageClient.h" >@@ -5438,6 +5439,16 @@ static inline WebKit::FindOptions toFindOptions(_WKFindOptions wkFindOptions) > #endif > } > >+- (_WKMediaCaptureState)_mediaCaptureState >+{ >+ return WebKit::toWKMediaCaptureState(_page->mediaStateFlags()); >+} >+ >+- (void)_setMediaCaptureMuted:(BOOL)muted >+{ >+ _page->setMediaStreamCaptureMuted(muted); >+} >+ > - (void)_muteMediaCapture > { > _page->setMediaStreamCaptureMuted(true); >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >index 170c2aaefa150b41f996cce468ce32779bad6f8f..fa1c8d449ae6a8b3bd2fb157f889ecf8a43ab9ac 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >@@ -390,6 +390,9 @@ typedef NS_OPTIONS(NSUInteger, _WKRectEdge) { > @property (nonatomic, setter=_setFullscreenDelegate:) id<_WKFullscreenDelegate> _fullscreenDelegate WK_API_AVAILABLE(macosx(10.13), ios(11.0)); > @property (nonatomic, readonly) BOOL _isInFullscreen WK_API_AVAILABLE(macosx(10.12.3)); > >+@property (nonatomic, readonly) _WKMediaCaptureState _mediaCaptureState WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); >+ >+- (void)_setMediaCaptureMuted:(BOOL)muted WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > - (void)_muteMediaCapture WK_API_AVAILABLE(macosx(10.13), ios(11.0)); > - (void)_setPageMuted:(_WKMediaMutedState)mutedState WK_API_AVAILABLE(macosx(10.13), ios(11.0)); > >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp b/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >index 1c7688690781f2a09c0c8b7b48f78e8eee55690f..c52b170c539be759abbdd14a13456e7d127d6920 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >+++ b/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >@@ -184,18 +184,16 @@ private: > webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(geolocationPermissionRequest.get())); > } > >- bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionRequestProxy& permissionRequest) final >+ void decidePolicyForUserMediaPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionRequestProxy& permissionRequest) final > { > GRefPtr<WebKitUserMediaPermissionRequest> userMediaPermissionRequest = adoptGRef(webkitUserMediaPermissionRequestCreate(permissionRequest, userMediaDocumentOrigin, topLevelDocumentOrigin)); > webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(userMediaPermissionRequest.get())); >- return true; > } > >- bool checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy&, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionCheckProxy& permissionRequest) override >+ void checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy&, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionCheckProxy& permissionRequest) override > { > auto deviceInfoPermissionRequest = adoptGRef(webkitDeviceInfoPermissionRequestCreate(permissionRequest, page.websiteDataStore().deviceIdHashSaltStorage())); > webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(deviceInfoPermissionRequest.get())); >- return true; > } > > void decidePolicyForNotificationPermissionRequest(WebPageProxy&, API::SecurityOrigin&, Function<void(bool)>&& completionHandler) final >diff --git a/Source/WebKit/UIProcess/Cocoa/MediaCaptureUtilities.h b/Source/WebKit/UIProcess/Cocoa/MediaCaptureUtilities.h >new file mode 100644 >index 0000000000000000000000000000000000000000..400403ffd839b1d67390b2052502432ae1a16b23 >--- /dev/null >+++ b/Source/WebKit/UIProcess/Cocoa/MediaCaptureUtilities.h >@@ -0,0 +1,39 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+#if WK_API_ENABLED >+ >+#import "WKWebViewPrivate.h" >+#import <WebCore/MediaProducer.h> >+ >+namespace WebKit { >+ >+_WKMediaCaptureState toWKMediaCaptureState(WebCore::MediaProducer::MediaStateFlags); >+ >+} // namespace WebKit >+ >+#endif >diff --git a/Source/WebKit/UIProcess/Cocoa/MediaCaptureUtilities.mm b/Source/WebKit/UIProcess/Cocoa/MediaCaptureUtilities.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..5aee38eb64e2e248416087688f3fc600d6a1128c >--- /dev/null >+++ b/Source/WebKit/UIProcess/Cocoa/MediaCaptureUtilities.mm >@@ -0,0 +1,50 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "MediaCaptureUtilities.h" >+ >+#if WK_API_ENABLED >+ >+namespace WebKit { >+ >+_WKMediaCaptureState toWKMediaCaptureState(WebCore::MediaProducer::MediaStateFlags state) >+{ >+ _WKMediaCaptureState mediaCaptureState = _WKMediaCaptureStateNone; >+ if (state & WebCore::MediaProducer::HasActiveAudioCaptureDevice) >+ mediaCaptureState |= _WKMediaCaptureStateActiveMicrophone; >+ if (state & WebCore::MediaProducer::HasActiveVideoCaptureDevice) >+ mediaCaptureState |= _WKMediaCaptureStateActiveCamera; >+ if (state & WebCore::MediaProducer::HasMutedAudioCaptureDevice) >+ mediaCaptureState |= _WKMediaCaptureStateMutedMicrophone; >+ if (state & WebCore::MediaProducer::HasMutedVideoCaptureDevice) >+ mediaCaptureState |= _WKMediaCaptureStateMutedCamera; >+ >+ return mediaCaptureState; >+} >+ >+} // namespace WebKit >+ >+#endif >diff --git a/Source/WebKit/UIProcess/Cocoa/UIDelegate.h b/Source/WebKit/UIProcess/Cocoa/UIDelegate.h >index c0da3ffda10689fe13d0b336808ec82f92f1daae..88fa48fb7e74e1ee05a70cd634251de06d212217 100644 >--- a/Source/WebKit/UIProcess/Cocoa/UIDelegate.h >+++ b/Source/WebKit/UIProcess/Cocoa/UIDelegate.h >@@ -123,8 +123,8 @@ private: > #endif > bool needsFontAttributes() const final { return m_uiDelegate.m_delegateMethods.webViewDidChangeFontAttributes; } > void didChangeFontAttributes(const WebCore::FontAttributes&) final; >- bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, UserMediaPermissionRequestProxy&) final; >- bool checkUserMediaPermissionForOrigin(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, UserMediaPermissionCheckProxy&) final; >+ 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; > #if PLATFORM(IOS_FAMILY) >@@ -197,8 +197,8 @@ private: > bool webViewFullscreenMayReturnToInline : 1; > bool webViewDidEnterFullscreen : 1; > bool webViewDidExitFullscreen : 1; >- bool webViewRequestUserMediaAuthorizationForDevicesURLMainFrameURLDecisionHandler : 1; >- bool webViewCheckUserMediaPermissionForURLMainFrameURLFrameIdentifierDecisionHandler : 1; >+ bool webViewRequestMediaCaptureAuthorizationForFrameDecisionHandler : 1; >+ bool webViewIsMediaCaptureAuthorizedForFrameDecisionHandler : 1; > bool webViewMediaCaptureStateDidChange : 1; > bool webViewDidChangeFontAttributes : 1; > #if PLATFORM(IOS_FAMILY) >diff --git a/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm b/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm >index a7a83b4ebafe01d614ff36fe4f0bea88e1856738..86a55fb9f6a3c367e03ce62eb1377e21167ee7fd 100644 >--- a/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm >+++ b/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm >@@ -31,6 +31,7 @@ > #import "APIFrameInfo.h" > #import "APIHitTestResult.h" > #import "CompletionHandlerCallChecker.h" >+#import "MediaCaptureUtilities.h" > #import "NativeWebWheelEvent.h" > #import "NavigationActionData.h" > #import "UserMediaPermissionCheckProxy.h" >@@ -150,8 +151,9 @@ void UIDelegate::setDelegate(id <WKUIDelegate> delegate) > m_delegateMethods.webViewDidNotHandleTapAsClickAtPoint = [delegate respondsToSelector:@selector(_webView:didNotHandleTapAsClickAtPoint:)]; > m_delegateMethods.presentingViewControllerForWebView = [delegate respondsToSelector:@selector(_presentingViewControllerForWebView:)]; > #endif >- m_delegateMethods.webViewRequestUserMediaAuthorizationForDevicesURLMainFrameURLDecisionHandler = [delegate respondsToSelector:@selector(_webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:)]; >- m_delegateMethods.webViewCheckUserMediaPermissionForURLMainFrameURLFrameIdentifierDecisionHandler = [delegate respondsToSelector:@selector(_webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:)]; >+ m_delegateMethods.webViewRequestMediaCaptureAuthorizationForFrameDecisionHandler = [delegate respondsToSelector:@selector(_webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:)] || [delegate respondsToSelector:@selector(_webView:requestMediaCaptureAuthorizationForFrame:devices:decisionHandler:)]; >+ m_delegateMethods.webViewIsMediaCaptureAuthorizedForFrameDecisionHandler = [delegate respondsToSelector:@selector(_webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:)] || [delegate respondsToSelector:@selector(_webView:isMediaCaptureAuthorizedForFrame:decisionHandler:)]; >+ > m_delegateMethods.webViewMediaCaptureStateDidChange = [delegate respondsToSelector:@selector(_webView:mediaCaptureStateDidChange:)]; > m_delegateMethods.webViewDidChangeFontAttributes = [delegate respondsToSelector:@selector(_webView:didChangeFontAttributes:)]; > m_delegateMethods.dataDetectionContextForWebView = [delegate respondsToSelector:@selector(_dataDetectionContextForWebView:)]; >@@ -854,9 +856,14 @@ bool UIDelegate::UIClient::runOpenPanel(WebPageProxy*, WebFrameProxy* webFramePr > #endif > > #if ENABLE(MEDIA_STREAM) >-static void requestUserMediaAuthorizationForDevices(const WebFrameProxy& frame, UserMediaPermissionRequestProxy& request, id <WKUIDelegatePrivate> delegate, WKWebView& webView) >+static void requestUserMediaAuthorizationForFrame(const WebFrameProxy& frame, API::SecurityOrigin& topLevelOrigin, UserMediaPermissionRequestProxy& request, id <WKUIDelegatePrivate> delegate, WKWebView& webView) > { >- auto decisionHandler = makeBlockPtr([protectedRequest = makeRef(request)](BOOL authorized) { >+ auto checker = CompletionHandlerCallChecker::create(delegate, @selector(_webView:requestMediaCaptureAuthorizationForFrame:devices:decisionHandler:)); >+ auto decisionHandler = makeBlockPtr([protectedRequest = makeRef(request), checker = WTFMove(checker)](BOOL authorized) { >+ if (checker->completionHandlerHasBeenCalled()) >+ return; >+ checker->didCallCompletionHandler(); >+ > if (!authorized) { > protectedRequest->deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied); > return; >@@ -866,10 +873,6 @@ static void requestUserMediaAuthorizationForDevices(const WebFrameProxy& frame, > protectedRequest->allow(audioDeviceUID, videoDeviceUID); > }); > >- const WebFrameProxy* mainFrame = frame.page()->mainFrame(); >- URL requestFrameURL(URL(), frame.url()); >- URL mainFrameURL(URL(), mainFrame->url()); >- > _WKCaptureDevices devices = 0; > if (request.requiresAudioCapture()) > devices |= _WKCaptureDeviceMicrophone; >@@ -880,8 +883,19 @@ static void requestUserMediaAuthorizationForDevices(const WebFrameProxy& frame, > ASSERT(!(devices & _WKCaptureDeviceCamera)); > } > >- auto protectedWebView = RetainPtr<WKWebView>(&webView); >- [delegate _webView:protectedWebView.get() requestUserMediaAuthorizationForDevices:devices url:requestFrameURL mainFrameURL:mainFrameURL decisionHandler:decisionHandler.get()]; >+ const WebFrameProxy* mainFrame = frame.page()->mainFrame(); >+ >+ // FIXME: Provide a specific delegate for display capture. >+ if (!request.requiresDisplayCapture() && [delegate respondsToSelector:@selector(_webView:requestMediaCaptureAuthorizationForFrame:devices:decisionHandler:)]) { >+ >+ [delegate _webView:&webView requestMediaCaptureAuthorizationForFrame:wrapper(API::FrameInfo::create(*mainFrame, topLevelOrigin.securityOrigin())) devices:devices decisionHandler:decisionHandler.get()]; >+ return; >+ } >+ >+ URL requestFrameURL(URL(), frame.url()); >+ URL mainFrameURL(URL(), mainFrame->url()); >+ >+ [delegate _webView:&webView requestUserMediaAuthorizationForDevices:devices url:requestFrameURL mainFrameURL:mainFrameURL decisionHandler:decisionHandler.get()]; > } > #endif > >@@ -894,13 +908,13 @@ void UIDelegate::UIClient::didChangeFontAttributes(const WebCore::FontAttributes > [privateUIDelegate _webView:m_uiDelegate.m_webView didChangeFontAttributes:fontAttributes.createDictionary().get()]; > } > >-bool UIDelegate::UIClient::decidePolicyForUserMediaPermissionRequest(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaOrigin, API::SecurityOrigin& topLevelOrigin, UserMediaPermissionRequestProxy& request) >+void UIDelegate::UIClient::decidePolicyForUserMediaPermissionRequest(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaOrigin, API::SecurityOrigin& topLevelOrigin, UserMediaPermissionRequestProxy& request) > { > #if ENABLE(MEDIA_STREAM) > auto delegate = m_uiDelegate.m_delegate.get(); >- if (!delegate || !m_uiDelegate.m_delegateMethods.webViewRequestUserMediaAuthorizationForDevicesURLMainFrameURLDecisionHandler) { >+ if (!delegate || !m_uiDelegate.m_delegateMethods.webViewRequestMediaCaptureAuthorizationForFrameDecisionHandler) { > request.deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled); >- return true; >+ return; > } > > bool requiresAudioCapture = request.requiresAudioCapture(); >@@ -908,33 +922,33 @@ bool UIDelegate::UIClient::decidePolicyForUserMediaPermissionRequest(WebPageProx > bool requiresDisplayCapture = request.requiresDisplayCapture(); > if (!requiresAudioCapture && !requiresVideoCapture && !requiresDisplayCapture) { > request.deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints); >- return true; >+ return; > } > > #if PLATFORM(IOS_FAMILY) > bool usingMockCaptureDevices = page.preferences().mockCaptureDevicesEnabled(); >- auto requestCameraAuthorization = makeBlockPtr([this, &frame, protectedRequest = makeRef(request), webView = RetainPtr<WKWebView>(m_uiDelegate.m_webView), usingMockCaptureDevices]() { >+ auto requestCameraAuthorization = makeBlockPtr([this, &frame, protectedRequest = makeRef(request), webView = RetainPtr<WKWebView>(m_uiDelegate.m_webView), topLevelOrigin = makeRef(topLevelOrigin), usingMockCaptureDevices]() mutable { > > if (!protectedRequest->requiresVideoCapture()) { >- requestUserMediaAuthorizationForDevices(frame, protectedRequest, (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get(), *webView.get()); >+ requestUserMediaAuthorizationForFrame(frame, topLevelOrigin, protectedRequest, (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get(), *webView.get()); > return; > } > AVAuthorizationStatus cameraAuthorizationStatus = usingMockCaptureDevices ? AVAuthorizationStatusAuthorized : [getAVCaptureDeviceClass() authorizationStatusForMediaType:getAVMediaTypeVideo()]; > switch (cameraAuthorizationStatus) { > case AVAuthorizationStatusAuthorized: >- requestUserMediaAuthorizationForDevices(frame, protectedRequest, (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get(), *webView.get()); >+ requestUserMediaAuthorizationForFrame(frame, topLevelOrigin, protectedRequest, (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get(), *webView.get()); > break; > case AVAuthorizationStatusDenied: > case AVAuthorizationStatusRestricted: > protectedRequest->deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied); > return; > case AVAuthorizationStatusNotDetermined: >- auto decisionHandler = makeBlockPtr([this, &frame, protectedRequest = makeRef(protectedRequest.get()), webView = RetainPtr<WKWebView>(m_uiDelegate.m_webView)](BOOL authorized) { >+ auto decisionHandler = makeBlockPtr([this, &frame, protectedRequest = makeRef(protectedRequest.get()), webView = RetainPtr<WKWebView>(m_uiDelegate.m_webView), topLevelOrigin = WTFMove(topLevelOrigin)](BOOL authorized) { > if (!authorized) { > protectedRequest->deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied); > return; > } >- requestUserMediaAuthorizationForDevices(frame, protectedRequest, (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get(), *webView.get()); >+ requestUserMediaAuthorizationForFrame(frame, topLevelOrigin, protectedRequest, (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get(), *webView.get()); > }); > > [getAVCaptureDeviceClass() requestAccessForMediaType:getAVMediaTypeVideo() completionHandler:decisionHandler.get()]; >@@ -951,7 +965,7 @@ bool UIDelegate::UIClient::decidePolicyForUserMediaPermissionRequest(WebPageProx > case AVAuthorizationStatusDenied: > case AVAuthorizationStatusRestricted: > request.deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied); >- return true; >+ return; > case AVAuthorizationStatusNotDetermined: > auto decisionHandler = makeBlockPtr([protectedRequest = makeRef(request), requestCameraAuthorization](BOOL authorized) { > if (!authorized) { >@@ -967,53 +981,61 @@ bool UIDelegate::UIClient::decidePolicyForUserMediaPermissionRequest(WebPageProx > } else > requestCameraAuthorization(); > #else >- requestUserMediaAuthorizationForDevices(frame, request, (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get(), *m_uiDelegate.m_webView); >+ requestUserMediaAuthorizationForFrame(frame, topLevelOrigin, request, (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get(), *m_uiDelegate.m_webView); > #endif > #endif >- >- return true; > } > >-bool UIDelegate::UIClient::checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaOrigin, API::SecurityOrigin& topLevelOrigin, UserMediaPermissionCheckProxy& request) >+void UIDelegate::UIClient::checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaOrigin, API::SecurityOrigin& topLevelOrigin, UserMediaPermissionCheckProxy& request) > { > auto delegate = m_uiDelegate.m_delegate.get(); >- if (!delegate || !m_uiDelegate.m_delegateMethods.webViewCheckUserMediaPermissionForURLMainFrameURLFrameIdentifierDecisionHandler) { >+ if (!delegate || !m_uiDelegate.m_delegateMethods.webViewIsMediaCaptureAuthorizedForFrameDecisionHandler) { > request.setUserMediaAccessInfo(false); >- return true; >+ return; > } > >- WKWebView *webView = m_uiDelegate.m_webView; >- const WebFrameProxy* mainFrame = frame.page()->mainFrame(); >- URL requestFrameURL(URL(), frame.url()); >- URL mainFrameURL(URL(), mainFrame->url()); >+ const auto mainFrame = frame.page()->mainFrame(); >+ >+ if ([delegate respondsToSelector:@selector(_webView:isMediaCaptureAuthorizedForFrame:decisionHandler:)]) { >+ auto checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:isMediaCaptureAuthorizedForFrame:decisionHandler:)); >+ auto decisionHandler = makeBlockPtr([protectedRequest = makeRef(request), checker = WTFMove(checker)](BOOL authorized) { >+ if (checker->completionHandlerHasBeenCalled()) >+ return; >+ checker->didCallCompletionHandler(); >+ >+ protectedRequest->setUserMediaAccessInfo(authorized); >+ }); >+ >+ [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView isMediaCaptureAuthorizedForFrame:wrapper(API::FrameInfo::create(*mainFrame, topLevelOrigin.securityOrigin())) decisionHandler:decisionHandler.get()]; >+ return; >+ } >+ >+ auto checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:)); >+ auto decisionHandler = makeBlockPtr([protectedRequest = makeRef(request), checker = WTFMove(checker)](NSString*, BOOL authorized) { >+ if (checker->completionHandlerHasBeenCalled()) >+ return; >+ checker->didCallCompletionHandler(); > >- auto decisionHandler = makeBlockPtr([protectedRequest = makeRef(request)](NSString*, BOOL authorized) { > protectedRequest->setUserMediaAccessInfo(authorized); > }); > >- [(id <WKUIDelegatePrivate>)delegate _webView:webView checkUserMediaPermissionForURL:requestFrameURL mainFrameURL:mainFrameURL frameIdentifier:frame.frameID() decisionHandler:decisionHandler.get()]; >+ URL requestFrameURL(URL(), frame.url()); >+ URL mainFrameURL(URL(), mainFrame->url()); > >- return true; >+ [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView checkUserMediaPermissionForURL:requestFrameURL mainFrameURL:mainFrameURL frameIdentifier:frame.frameID() decisionHandler:decisionHandler.get()]; > } > > void UIDelegate::UIClient::mediaCaptureStateDidChange(WebCore::MediaProducer::MediaStateFlags state) > { > WKWebView *webView = m_uiDelegate.m_webView; >+ >+ [webView didChangeValueForKey:@"mediaCaptureState"]; >+ > auto delegate = m_uiDelegate.m_delegate.get(); > if (!delegate || !m_uiDelegate.m_delegateMethods.webViewMediaCaptureStateDidChange) > return; > >- _WKMediaCaptureState mediaCaptureState = _WKMediaCaptureStateNone; >- if (state & WebCore::MediaProducer::HasActiveAudioCaptureDevice) >- mediaCaptureState |= _WKMediaCaptureStateActiveMicrophone; >- if (state & WebCore::MediaProducer::HasActiveVideoCaptureDevice) >- mediaCaptureState |= _WKMediaCaptureStateActiveCamera; >- if (state & WebCore::MediaProducer::HasMutedAudioCaptureDevice) >- mediaCaptureState |= _WKMediaCaptureStateMutedMicrophone; >- if (state & WebCore::MediaProducer::HasMutedVideoCaptureDevice) >- mediaCaptureState |= _WKMediaCaptureStateMutedCamera; >- >- [(id <WKUIDelegatePrivate>)delegate _webView:webView mediaCaptureStateDidChange:mediaCaptureState]; >+ [(id <WKUIDelegatePrivate>)delegate _webView:webView mediaCaptureStateDidChange:toWKMediaCaptureState(state)]; > } > > void UIDelegate::UIClient::reachedApplicationCacheOriginQuota(WebPageProxy*, const WebCore::SecurityOrigin& securityOrigin, uint64_t currentQuota, uint64_t totalBytesNeeded, Function<void (unsigned long long)>&& completionHandler) >diff --git a/Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.h b/Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.h >index d91f04ffdab8d142454d5063fe17f0ebfa8334eb..6a089506cea388d1d4c3d6defda5fe0e0aee57c4 100644 >--- a/Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.h >+++ b/Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.h >@@ -46,6 +46,7 @@ public: > return adoptRef(*new UserMediaPermissionCheckProxy(frameID, WTFMove(handler), WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin))); > } > >+ void deny() { setUserMediaAccessInfo(false); } > void setUserMediaAccessInfo(bool); > void invalidate(); > >diff --git a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp >index 95f553dd225ebcaf3db8f9ad02b57a43a8bcbf83..74d57889978d7c31f0d13c9e1c4c81c8c8fa459d 100644 >--- a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp >+++ b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp >@@ -374,8 +374,7 @@ void UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame( > return; > } > >- if (!m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *m_page.process().webFrame(frameID), WTFMove(userMediaOrigin), WTFMove(topLevelOrigin), pendingRequest.get())) >- userMediaAccessWasDenied(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled); >+ m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *m_page.process().webFrame(frameID), WTFMove(userMediaOrigin), WTFMove(topLevelOrigin), pendingRequest.get()); > }; > > auto requestID = generateRequestID(); >@@ -417,10 +416,7 @@ void UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo(uint64_t > auto request = UserMediaPermissionCheckProxy::create(frameID, WTFMove(handler), WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin)); > > m_pendingDeviceRequests.add(requestID, request.copyRef()); >- if (!m_page.uiClient().checkUserMediaPermissionForOrigin(m_page, *m_page.process().webFrame(frameID), userMediaOrigin.get(), topLevelOrigin.get(), request.get())) { >- m_pendingDeviceRequests.take(requestID); >- handler(false); >- } >+ m_page.uiClient().checkUserMediaPermissionForOrigin(m_page, *m_page.process().webFrame(frameID), userMediaOrigin.get(), topLevelOrigin.get(), request.get()); > } > > bool UserMediaPermissionRequestManagerProxy::wasGrantedVideoOrAudioAccess(uint64_t frameID, const SecurityOrigin& userMediaDocumentOrigin, const SecurityOrigin& topLevelDocumentOrigin) >diff --git a/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h b/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h >index 5980dc709a00285d0aa8e735cd308197c9118bdb..ac805e788be2317e0a7aaeb718909cf45bca8908 100644 >--- a/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h >+++ b/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h >@@ -45,7 +45,7 @@ public: > void allow(); > > enum class UserMediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, OtherFailure }; >- void deny(UserMediaAccessDenialReason); >+ void deny(UserMediaAccessDenialReason = UserMediaAccessDenialReason::UserMediaDisabled); > > void invalidate(); > >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index 6b189008453095b4c4db7e50ee32936a1b6cf93c..d8ed7cabe87fb5f8a3f2b9dbf2aa73545a138938 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -2997,6 +2997,8 @@ > 410482CB1DDD2FB500F006D0 /* RTCNetwork.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCNetwork.cpp; sourceTree = "<group>"; }; > 410482CC1DDD2FB500F006D0 /* RTCNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCNetwork.h; sourceTree = "<group>"; }; > 4111436320F677B10026F912 /* InjectUserScriptImmediately.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectUserScriptImmediately.h; sourceTree = "<group>"; }; >+ 411286EF21C8A90C003A8550 /* MediaCaptureUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaCaptureUtilities.h; sourceTree = "<group>"; }; >+ 411286F021C8A90D003A8550 /* MediaCaptureUtilities.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaCaptureUtilities.mm; sourceTree = "<group>"; }; > 4112B5471F9FD3AB00E67875 /* NetworkRTCResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkRTCResolver.cpp; sourceTree = "<group>"; }; > 4112B5471F9FD3AB00E67986 /* NetworkRTCResolverCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkRTCResolverCocoa.cpp; sourceTree = "<group>"; }; > 4112B5481F9FD3AC00E67875 /* NetworkRTCResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkRTCResolver.h; sourceTree = "<group>"; }; >@@ -5297,6 +5299,8 @@ > 0F0C365918C0555800F607D7 /* LayerRepresentation.h */, > 7A821F4B1E2F664800604577 /* LegacyCustomProtocolManagerClient.h */, > 7A821F4D1E2F679E00604577 /* LegacyCustomProtocolManagerClient.mm */, >+ 411286EF21C8A90C003A8550 /* MediaCaptureUtilities.h */, >+ 411286F021C8A90D003A8550 /* MediaCaptureUtilities.mm */, > 1ABC3DF41899E437004F0626 /* NavigationState.h */, > 1ABC3DF31899E437004F0626 /* NavigationState.mm */, > 5C6CE6D31F59EA350007C6CB /* PageClientImplCocoa.h */, >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index b2bfc801513e77db963f766ce53f05929f1ec56a..b5d0a8a8ef4933cc8b18409be7750f35b72107b5 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,26 @@ >+2018-12-19 Youenn Fablet <youenn@apple.com> >+ >+ Add a new SPI for controlling getUserMedia >+ https://bugs.webkit.org/show_bug.cgi?id=192793 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * MiniBrowser/mac/WK2BrowserWindowController.m: >+ (-[WK2BrowserWindowController _webView:requestUserMediaAuthorizationForFrame:devices:decisionHandler:]): >+ (-[WK2BrowserWindowController _webView:isMediaCaptureAuthorizedForFrame:decisionHandler:]): >+ * TestWebKitAPI/Tests/WebKit/GetUserMediaNavigation.mm: >+ (-[NavigationWhileGetUserMediaPromptDisplayedUIDelegate _webView:requestMediaCaptureAuthorizationForFrame:devices:decisionHandler:]): >+ * TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm: >+ (-[GetUserMediaRepromptUIDelegate _webView:requestMediaCaptureAuthorizationForFrame:devices:decisionHandler:]): >+ * TestWebKitAPI/Tests/WebKit/MediaStreamTrackDetached.mm: >+ (-[MediaStreamTrackDetachedUIDelegate _webView:requestMediaCaptureAuthorizationForFrame:devices:decisionHandler:]): >+ * TestWebKitAPI/Tests/WebKitCocoa/UserMediaDisabled.mm: >+ (-[UserMediaUIDelegate _webView:requestMediaCaptureAuthorizationForFrame:devices:decisionHandler:]): >+ (-[UserMediaUIDelegate _webView:isMediaCaptureAuthorizedForFrame:decisionHandler:]): >+ * TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm: >+ (-[SimulateFailedSandboxUIDelegate _webView:requestMediaCaptureAuthorizationForFrame:devices:decisionHandler:]): >+ (-[SimulateFailedSandboxUIDelegate _webView:isMediaCaptureAuthorizedForFrame:decisionHandler:]): >+ > 2018-12-12 Commit Queue <commit-queue@webkit.org> > > Unreviewed, rolling out r239103. >diff --git a/Tools/MiniBrowser/mac/WK2BrowserWindowController.m b/Tools/MiniBrowser/mac/WK2BrowserWindowController.m >index 3e739d7c915538e00329cff0c047aaa70fd4a1bf..9b4812c174cc314cd18f41fe13c9b50b731899f5 100644 >--- a/Tools/MiniBrowser/mac/WK2BrowserWindowController.m >+++ b/Tools/MiniBrowser/mac/WK2BrowserWindowController.m >@@ -791,14 +791,14 @@ - (void)findBarViewDidChangeHeight > { > } > >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(_WKCaptureDevices)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL authorized))decisionHandler >+- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForFrame:(WKFrameInfo *) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL authorized))decisionHandler > { > decisionHandler(true); > } > >-- (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler >+- (void)_webView:(WKWebView *)webView isMediaCaptureAuthorizedForFrame:(WKFrameInfo *) mainFrame decisionHandler:(void (^)(BOOL authorized))decisionHandler > { >- decisionHandler(@"", false); >+ decisionHandler(false); > } > > @end >diff --git a/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaNavigation.mm b/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaNavigation.mm >index 421eea4292cbab14e946f798a35deb73f82b3508..6af6cfa9830fa4c5da777bfb830ac1182412be34 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaNavigation.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaNavigation.mm >@@ -42,12 +42,12 @@ static bool okToProceed = false; > static bool shouldReleaseInEnumerate = false; > > @interface NavigationWhileGetUserMediaPromptDisplayedUIDelegate : NSObject<WKUIDelegate> >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(_WKCaptureDevices)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL authorized))decisionHandler; >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo*) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler; > - (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler; > @end > > @implementation NavigationWhileGetUserMediaPromptDisplayedUIDelegate >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(_WKCaptureDevices)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL authorized))decisionHandler >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo*) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler > { > [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; > [webView release]; >diff --git a/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm b/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm >index c432fcae5e8fc59791233e50bdbb7532cbac4f7e..d9db657d50b043bd0bf2dbf12814befcc9caae7f 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm >@@ -41,12 +41,12 @@ > static bool wasPrompted = false; > > @interface GetUserMediaRepromptUIDelegate : NSObject<WKUIDelegate> >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(_WKCaptureDevices)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL authorized))decisionHandler; >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo*) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler; > - (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler; > @end > > @implementation GetUserMediaRepromptUIDelegate >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(_WKCaptureDevices)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL authorized))decisionHandler >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo*) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler > { > wasPrompted = true; > decisionHandler(YES); >diff --git a/Tools/TestWebKitAPI/Tests/WebKit/MediaStreamTrackDetached.mm b/Tools/TestWebKitAPI/Tests/WebKit/MediaStreamTrackDetached.mm >index 1eccd0a6ee331642632d4d5c6df0bbcd02ae2f43..caa79dd4a25e5a15debbd55461faca4f60b6614d 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKit/MediaStreamTrackDetached.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKit/MediaStreamTrackDetached.mm >@@ -40,13 +40,13 @@ > static bool hasRecievedCorrectCaptureState = false; > > @interface MediaStreamTrackDetachedUIDelegate : NSObject<WKUIDelegate> >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(_WKCaptureDevices)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL authorized))decisionHandler; >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo*) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler; > - (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler; > - (void)_webView:(WKWebView *)webView mediaCaptureStateDidChange:(_WKMediaCaptureState)state; > @end > > @implementation MediaStreamTrackDetachedUIDelegate >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(_WKCaptureDevices)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL authorized))decisionHandler >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo*) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler > { > decisionHandler(YES); > } >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaDisabled.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaDisabled.mm >index 88333c3fbb680e165e7f261a626e5b1d131b3bab..1085c5ec378fe6978301bf22b9e2f803523c56e4 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaDisabled.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaDisabled.mm >@@ -39,7 +39,6 @@ > > #if WK_API_ENABLED > >-static bool refuseRequest = false; > static bool wasPrompted = false; > > static bool receivedScriptMessage = false; >@@ -62,15 +61,10 @@ static RetainPtr<WKScriptMessage> lastScriptMessage; > > @implementation UserMediaUIDelegate > >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(NSUInteger)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL))decisionHandler >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo*) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler > { > wasPrompted = true; > >- if (refuseRequest) { >- decisionHandler(NO); >- return; >- } >- > BOOL needsMicrophoneAuthorized = devices & _WKCaptureDeviceMicrophone; > BOOL needsCameraAuthorized = devices & _WKCaptureDeviceCamera; > if (!needsMicrophoneAuthorized && !needsCameraAuthorized) { >@@ -81,14 +75,9 @@ static RetainPtr<WKScriptMessage> lastScriptMessage; > decisionHandler(YES); > } > >-- (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *, BOOL))decisionHandler >+- (void)_webView:(WKWebView *)webView isMediaCaptureAuthorizedForFrame:(WKFrameInfo *) mainFrame decisionHandler:(void (^)(BOOL authorized))decisionHandler > { >- if (refuseRequest) { >- decisionHandler(nil, NO); >- return; >- } >- >- decisionHandler(@"0x987654321", NO); >+ decisionHandler(NO); > } > @end > >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm >index c73c98994e417334902552a878def5d17225bdf4..9cd985f79f14f35696e596daa13a93ca304a8426 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm >@@ -39,7 +39,6 @@ > > #if WK_API_ENABLED > >-static bool refuseRequest = false; > static bool wasPrompted = false; > > static bool receivedScriptMessage = false; >@@ -62,15 +61,10 @@ static RetainPtr<WKScriptMessage> lastScriptMessage; > > @implementation SimulateFailedSandboxUIDelegate > >-- (void)_webView:(WKWebView *)webView requestUserMediaAuthorizationForDevices:(NSUInteger)devices url:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL decisionHandler:(void (^)(BOOL))decisionHandler >+- (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorizationForFrame:(WKFrameInfo*) mainFrame devices: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler > { > wasPrompted = true; > >- if (refuseRequest) { >- decisionHandler(NO); >- return; >- } >- > BOOL needsMicrophoneAuthorized = devices & _WKCaptureDeviceMicrophone; > BOOL needsCameraAuthorized = devices & _WKCaptureDeviceCamera; > if (!needsMicrophoneAuthorized && !needsCameraAuthorized) { >@@ -81,14 +75,9 @@ static RetainPtr<WKScriptMessage> lastScriptMessage; > decisionHandler(YES); > } > >-- (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *, BOOL))decisionHandler >+- (void)_webView:(WKWebView *)webView isMediaCaptureAuthorizedForFrame:(WKFrameInfo *) mainFrame decisionHandler:(void (^)(BOOL authorized))decisionHandler > { >- if (refuseRequest) { >- decisionHandler(nil, NO); >- return; >- } >- >- decisionHandler(@"0x987654321", NO); >+ decisionHandler(NO); > } > @end >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 192793
:
357581
|
357590
|
357605
|
357639
|
357729
|
357745
|
357873
|
357885
|
358631
|
358647
|
359296
|
359314
|
359331