Title: [217837] trunk/Source
Revision
217837
Author
[email protected]
Date
2017-06-06 09:53:55 -0700 (Tue, 06 Jun 2017)

Log Message

Add an option to disable getUserMedia prompt in case of mock capture sources
https://bugs.webkit.org/show_bug.cgi?id=172981
<rdar://problem/32580325>

Patch by Youenn Fablet <[email protected]> on 2017-06-06
Reviewed by Eric Carlson.

Source/WebKit/mac:

Defining the option, getter and setter.

* WebView/WebPreferences.mm:
(+[WebPreferences initialize]):
(-[WebPreferences mockCaptureDevicesPromptEnabled]):
(-[WebPreferences setMockCaptureDevicesPromptEnabled:]):
* WebView/WebPreferencesPrivate.h:

Source/WebKit2:

Adding mockCaptureDevicesPromptEnabled option.
Allowing any getUserMedia request if mock is on and prompt is off.

Renaming UserMediaProcessManager::willEnableMediaStreamInPage to muteCaptureMediaStreamsExceptIn.
This eases reading the code.
Making sure that a page for which a new getUserMedia MediaStream will be created is capture-unmuted.

* Shared/WebPreferencesDefinitions.h:
* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):
* UIProcess/UserMediaProcessManager.cpp:
(WebKit::UserMediaProcessManager::muteCaptureMediaStreamsExceptIn):
(WebKit::UserMediaProcessManager::willCreateMediaStream):
* UIProcess/UserMediaProcessManager.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::setMuted):
* UIProcess/WebPageProxy.h:
(WebKit::WebPageProxy::activateMediaStreamCaptureInPage):

Modified Paths

Diff

Modified: trunk/Source/WebKit/mac/ChangeLog (217836 => 217837)


--- trunk/Source/WebKit/mac/ChangeLog	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit/mac/ChangeLog	2017-06-06 16:53:55 UTC (rev 217837)
@@ -1,3 +1,19 @@
+2017-06-06  Youenn Fablet  <[email protected]>
+
+        Add an option to disable getUserMedia prompt in case of mock capture sources
+        https://bugs.webkit.org/show_bug.cgi?id=172981
+        <rdar://problem/32580325>
+
+        Reviewed by Eric Carlson.
+
+        Defining the option, getter and setter.
+
+        * WebView/WebPreferences.mm:
+        (+[WebPreferences initialize]):
+        (-[WebPreferences mockCaptureDevicesPromptEnabled]):
+        (-[WebPreferences setMockCaptureDevicesPromptEnabled:]):
+        * WebView/WebPreferencesPrivate.h:
+
 2017-06-05  Dan Bernstein  <[email protected]>
 
         Tried to fix the build when targrting macOS 10.12 using the macOS 10.13 developer beta SDK.

Modified: trunk/Source/WebKit/mac/WebView/WebPreferenceKeysPrivate.h (217836 => 217837)


--- trunk/Source/WebKit/mac/WebView/WebPreferenceKeysPrivate.h	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit/mac/WebView/WebPreferenceKeysPrivate.h	2017-06-06 16:53:55 UTC (rev 217837)
@@ -228,6 +228,7 @@
 #define WebKitEnableInheritURIQueryComponentPreferenceKey @"WebKitEnableInheritURIQueryComponent"
 #define WebKitMediaDataLoadsAutomaticallyPreferenceKey @"WebKitMediaDataLoadsAutomatically"
 #define WebKitMockCaptureDevicesEnabledPreferenceKey @"WebKitMockCaptureDevicesEnabled"
+#define WebKitMockCaptureDevicesPromptEnabledPreferenceKey @"WebKitMockCaptureDevicesPromptEnabled"
 #define WebKitEnumeratingAllNetworkInterfacesEnabledPreferenceKey @"WebKitEnumeratingAllNetworkInterfacesEnabled"
 #define WebKitICECandidateFilteringEnabledPreferenceKey @"WebKitICECandidateFilteringEnabled"
 #define WebKitMediaCaptureRequiresSecureConnectionPreferenceKey @"WebKitMediaCaptureRequiresSecureConnection"

Modified: trunk/Source/WebKit/mac/WebView/WebPreferences.mm (217836 => 217837)


--- trunk/Source/WebKit/mac/WebView/WebPreferences.mm	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit/mac/WebView/WebPreferences.mm	2017-06-06 16:53:55 UTC (rev 217837)
@@ -618,6 +618,7 @@
 #endif
 #if ENABLE(MEDIA_STREAM)
         [NSNumber numberWithBool:NO], WebKitMockCaptureDevicesEnabledPreferenceKey,
+        [NSNumber numberWithBool:YES], WebKitMockCaptureDevicesPromptEnabledPreferenceKey,
         [NSNumber numberWithBool:YES], WebKitMediaCaptureRequiresSecureConnectionPreferenceKey,
 #endif
         [NSNumber numberWithBool:YES], WebKitShadowDOMEnabledPreferenceKey,
@@ -2883,6 +2884,16 @@
     [self _setBoolValue:flag forKey:WebKitMockCaptureDevicesEnabledPreferenceKey];
 }
 
+- (BOOL)mockCaptureDevicesPromptEnabled
+{
+    return [self _boolValueForKey:WebKitMockCaptureDevicesPromptEnabledPreferenceKey];
+}
+
+- (void)setMockCaptureDevicesPromptEnabled:(BOOL)flag
+{
+    [self _setBoolValue:flag forKey:WebKitMockCaptureDevicesPromptEnabledPreferenceKey];
+}
+
 - (BOOL)enumeratingAllNetworkInterfacesEnabled
 {
     return [self _boolValueForKey:WebKitEnumeratingAllNetworkInterfacesEnabledPreferenceKey];

Modified: trunk/Source/WebKit/mac/WebView/WebPreferencesPrivate.h (217836 => 217837)


--- trunk/Source/WebKit/mac/WebView/WebPreferencesPrivate.h	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit/mac/WebView/WebPreferencesPrivate.h	2017-06-06 16:53:55 UTC (rev 217837)
@@ -505,6 +505,9 @@
 - (void)setMockCaptureDevicesEnabled:(BOOL)flag;
 - (BOOL)mockCaptureDevicesEnabled;
 
+- (void)setMockCaptureDevicesPromptEnabled:(BOOL)flag;
+- (BOOL)mockCaptureDevicesPromptEnabled;
+
 - (void)setEnumeratingAllNetworkInterfacesEnabled:(BOOL)flag;
 - (BOOL)enumeratingAllNetworkInterfacesEnabled;
 

Modified: trunk/Source/WebKit2/ChangeLog (217836 => 217837)


--- trunk/Source/WebKit2/ChangeLog	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit2/ChangeLog	2017-06-06 16:53:55 UTC (rev 217837)
@@ -1,3 +1,30 @@
+2017-06-06  Youenn Fablet  <[email protected]>
+
+        Add an option to disable getUserMedia prompt in case of mock capture sources
+        https://bugs.webkit.org/show_bug.cgi?id=172981
+        <rdar://problem/32580325>
+
+        Reviewed by Eric Carlson.
+
+        Adding mockCaptureDevicesPromptEnabled option.
+        Allowing any getUserMedia request if mock is on and prompt is off.
+
+        Renaming UserMediaProcessManager::willEnableMediaStreamInPage to muteCaptureMediaStreamsExceptIn.
+        This eases reading the code.
+        Making sure that a page for which a new getUserMedia MediaStream will be created is capture-unmuted.
+
+        * Shared/WebPreferencesDefinitions.h:
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):
+        * UIProcess/UserMediaProcessManager.cpp:
+        (WebKit::UserMediaProcessManager::muteCaptureMediaStreamsExceptIn):
+        (WebKit::UserMediaProcessManager::willCreateMediaStream):
+        * UIProcess/UserMediaProcessManager.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::setMuted):
+        * UIProcess/WebPageProxy.h:
+        (WebKit::WebPageProxy::activateMediaStreamCaptureInPage):
+
 2017-06-06  Carlos Garcia Campos  <[email protected]>
 
         [WPE] Enable remote inspector

Modified: trunk/Source/WebKit2/Shared/WebPreferencesDefinitions.h (217836 => 217837)


--- trunk/Source/WebKit2/Shared/WebPreferencesDefinitions.h	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit2/Shared/WebPreferencesDefinitions.h	2017-06-06 16:53:55 UTC (rev 217837)
@@ -248,6 +248,7 @@
     macro(DeferredCSSParserEnabled, deferredCSSParserEnabled, Bool, bool, false, "", "") \
     macro(HTTPEquivEnabled, httpEquivEnabled, Bool, bool, true, "", "") \
     macro(MockCaptureDevicesEnabled, mockCaptureDevicesEnabled, Bool, bool, false, "", "") \
+    macro(MockCaptureDevicesPromptEnabled, mockCaptureDevicesPromptEnabled, Bool, bool, true, "", "") \
     macro(MediaCaptureRequiresSecureConnection, mediaCaptureRequiresSecureConnection, Bool, bool, true, "", "") \
     macro(EnumeratingAllNetworkInterfacesEnabled, enumeratingAllNetworkInterfacesEnabled, Bool, bool, false, "", "") \
     macro(ICECandidateFilteringEnabled, iceCandidateFilteringEnabled, Bool, bool, true, "", "") \

Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (217836 => 217837)


--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2017-06-06 16:53:55 UTC (rev 217837)
@@ -209,6 +209,14 @@
         auto topLevelOrigin = API::SecurityOrigin::create(topLevelDocumentOrigin.get());
         auto request = createRequest(userMediaID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIdentifierHashSalt));
 
+        if (m_page.preferences().mockCaptureDevicesEnabled() && !m_page.preferences().mockCaptureDevicesPromptEnabled()) {
+            // FIXME: https://bugs.webkit.org/show_bug.cgi?id=172989
+            // We should probably only allow this if page is already actively capturing or page is visible.
+            // If page is hidden and not capturing, we should wait for page to be visible before allowing the request.
+            request->allow(request->audioDeviceUIDs().isEmpty() ? String() : request->audioDeviceUIDs()[0], request->videoDeviceUIDs().isEmpty() ? String() : request->videoDeviceUIDs()[0]);
+            return;
+        }
+
         if (!m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *m_page.process().webFrame(frameID), WTFMove(userMediaOrigin), WTFMove(topLevelOrigin), request.get()))
             userMediaAccessWasDenied(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled);
     };

Modified: trunk/Source/WebKit2/UIProcess/UserMediaProcessManager.cpp (217836 => 217837)


--- trunk/Source/WebKit2/UIProcess/UserMediaProcessManager.cpp	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit2/UIProcess/UserMediaProcessManager.cpp	2017-06-06 16:53:55 UTC (rev 217837)
@@ -109,7 +109,7 @@
     }
 }
 
-void UserMediaProcessManager::willEnableMediaStreamInPage(WebPageProxy& pageStartingCapture)
+void UserMediaProcessManager::muteCaptureMediaStreamsExceptIn(WebPageProxy& pageStartingCapture)
 {
 #if PLATFORM(COCOA)
     for (auto& state : stateMap()) {
@@ -116,7 +116,6 @@
         for (auto& manager : state.value->managers()) {
             if (&manager->page() == &pageStartingCapture)
                 continue;
-
             manager->page().setMuted(WebCore::MediaProducer::CaptureDevicesAreMuted);
         }
     }
@@ -132,7 +131,7 @@
 
     ASSERT(stateMap().contains(&processStartingCapture));
 
-    willEnableMediaStreamInPage(proxy.page());
+    proxy.page().activateMediaStreamCaptureInPage();
 
     auto& state = processState(processStartingCapture);
     size_t extensionCount = 0;

Modified: trunk/Source/WebKit2/UIProcess/UserMediaProcessManager.h (217836 => 217837)


--- trunk/Source/WebKit2/UIProcess/UserMediaProcessManager.h	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit2/UIProcess/UserMediaProcessManager.h	2017-06-06 16:53:55 UTC (rev 217837)
@@ -35,7 +35,7 @@
     void removeUserMediaPermissionRequestManagerProxy(UserMediaPermissionRequestManagerProxy&);
 
     void willCreateMediaStream(UserMediaPermissionRequestManagerProxy&, bool withAudio, bool withVideo);
-    void willEnableMediaStreamInPage(WebPageProxy&);
+    void muteCaptureMediaStreamsExceptIn(WebPageProxy&);
 
     void startedCaptureSession(UserMediaPermissionRequestManagerProxy&);
     void endedCaptureSession(UserMediaPermissionRequestManagerProxy&);

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (217836 => 217837)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2017-06-06 16:53:55 UTC (rev 217837)
@@ -4184,7 +4184,7 @@
 
 #if ENABLE(MEDIA_STREAM)
     if (!(state & WebCore::MediaProducer::CaptureDevicesAreMuted))
-        UserMediaProcessManager::singleton().willEnableMediaStreamInPage(*this);
+        UserMediaProcessManager::singleton().muteCaptureMediaStreamsExceptIn(*this);
 #endif
 
     m_process->send(Messages::WebPage::SetMuted(state), m_pageID);

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (217836 => 217837)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2017-06-06 16:29:20 UTC (rev 217836)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2017-06-06 16:53:55 UTC (rev 217837)
@@ -470,6 +470,8 @@
     void setEditable(bool);
     bool isEditable() const { return m_isEditable; }
 
+    void activateMediaStreamCaptureInPage() { setMuted(m_mutedState & ~WebCore::MediaProducer::CaptureDevicesAreMuted); }
+
 #if PLATFORM(IOS)
     void executeEditCommand(const String& commandName, std::function<void (CallbackBase::Error)>);
     double displayedContentScale() const { return m_lastVisibleContentRectUpdate.scale(); }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to