Changeset 288087 in webkit


Ignore:
Timestamp:
Jan 16, 2022 10:44:44 PM (6 months ago)
Author:
youenn@apple.com
Message:

Enforce focus check for getUserMedia
https://bugs.webkit.org/show_bug.cgi?id=235026

Source/WebCore:

Reviewed by Eric Carlson.

Add infrastructure to register a callback so that a task is executed when the document is visible.
Use this to delay getUserMedia requests until document is visible.
The spec currently defines that we should wait for the current document to have focus but this is about to be changed and is not aligned with other browser implementations.

The patch also moves some getUserMedia checks earlier so as to respect order provided by the specs.
Add a check to validate getDisplayMedia is called on a visible document as the user gesture is now time based.

Covered by API test.

  • Modules/mediastream/MediaDevices.cpp:
  • Modules/mediastream/UserMediaRequest.cpp:
  • Modules/mediastream/UserMediaRequest.h:
  • dom/Document.cpp:
  • dom/Document.h:
  • editing/FrameSelection.cpp:

Source/WebKit:

Reviewed by Eric Carlson.

Add setters/getters for the getUserMedia focus settings.

  • UIProcess/API/C/WKPreferences.cpp:

(WKPreferencesSetGetUserMediaRequiresFocus):
(WKPreferencesGetGetUserMediaRequiresFocus):

  • UIProcess/API/C/WKPreferencesRefPrivate.h:
  • UIProcess/API/Cocoa/WKPreferences.mm:

(-[WKPreferences _getUserMediaRequiresFocus]):
(-[WKPreferences _setGetUserMediaRequiresFocus:]):

  • UIProcess/API/Cocoa/WKPreferencesPrivate.h:
  • UIProcess/API/glib/WebKitSettings.cpp:

(webkitSettingsSetGetUserMediaRequiresFocus):

  • UIProcess/API/glib/WebKitSettingsPrivate.h:
  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewBaseMap): Always add the WindowIsActive flag under xvfb.
(webkitWebViewBaseIsFocused): Always consider the view focused when WindowIsActive flag is present under xvfb.

Source/WTF:

Reviewed by Eric Carlson.

  • Scripts/Preferences/WebPreferencesInternal.yaml:

Tools:

Reviewed by Eric Carlson.

Disable focus flag for testing to not require to focus the window.

  • TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:

(TestWebKitAPI::initializeMediaCaptureConfiguration):
(TestWebKitAPI::doCaptureMuteTest):
(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKit/GetUserMediaNavigation.mm:

(TestWebKitAPI::initializeMediaCaptureConfiguration):
(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm:

(TestWebKitAPI::initializeMediaCaptureConfiguration):
(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKit/MediaStreamTrackDetached.mm:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKit/UserMedia.cpp:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/GPUProcess.mm:

(TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/GetDisplayMedia.mm:

(TestWebKitAPI::GetDisplayMediaTest::SetUp):

  • TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
  • TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/UserMediaDisabled.mm:

(MediaCaptureDisabledTest::SetUp):

  • TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm:

(MediaCaptureSimulateFailedSandbox::SetUp):

  • TestWebKitAPI/Tests/WebKitGLib/TestUIClient.cpp:

(testWebViewUserMediaEnumerateDevicesPermissionCheck):
(testWebViewUserMediaPermissionRequests):
(testWebViewAudioOnlyUserMediaPermissionRequests):

LayoutTests:

Reviewed by Eric Carlson.

  • fast/mediastream/MediaDevices-getUserMedia-expected.txt:
Location:
trunk
Files:
32 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r288086 r288087  
     12022-01-16  Youenn Fablet  <youenn@apple.com>
     2
     3        Enforce focus check for getUserMedia
     4        https://bugs.webkit.org/show_bug.cgi?id=235026
     5
     6        Reviewed by Eric Carlson.
     7
     8        * fast/mediastream/MediaDevices-getUserMedia-expected.txt:
     9
    1102022-01-16  Youenn Fablet  <youenn@apple.com>
    211
  • trunk/LayoutTests/fast/mediastream/MediaDevices-getUserMedia-expected.txt

    r252632 r288087  
    77
    88PASS navigator.mediaDevices.getUserMedia({audio:true}).then(gotStream1); did not throw exception.
    9 PASS navigator.mediaDevices.getUserMedia() rejected with error: TypeError: Type error
    10 PASS navigator.mediaDevices.getUserMedia({}) rejected with error: TypeError: Type error
     9PASS navigator.mediaDevices.getUserMedia() rejected with error: TypeError: No constraints provided
     10PASS navigator.mediaDevices.getUserMedia({}) rejected with error: TypeError: No constraints provided
    1111PASS navigator.mediaDevices.getUserMedia.apply(undefined) rejected with error: TypeError: Can only call MediaDevices.getUserMedia on instances of MediaDevices
    1212PASS Stream 1 generated.
  • trunk/Source/WTF/ChangeLog

    r288085 r288087  
     12022-01-16  Youenn Fablet  <youenn@apple.com>
     2
     3        Enforce focus check for getUserMedia
     4        https://bugs.webkit.org/show_bug.cgi?id=235026
     5
     6        Reviewed by Eric Carlson.
     7
     8        * Scripts/Preferences/WebPreferencesInternal.yaml:
     9
    1102022-01-16  Lauro Moura  <lmoura@igalia.com>
    211
  • trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml

    r287253 r288087  
    294294      default: false
    295295
     296GetUserMediaRequiresFocus:
     297  type: bool
     298  humanReadableName: "Require focus to start getUserMedia"
     299  humanReadableDescription: "Require focus to start getUserMedia"
     300  condition: ENABLE(MEDIA_STREAM)
     301  defaultValue:
     302    WebKitLegacy:
     303      default: true
     304    WebKit:
     305      default: true
     306    WebCore:
     307      default: true
     308
    296309ICECandidateFilteringEnabled:
    297310  type: bool
  • trunk/Source/WebCore/ChangeLog

    r288086 r288087  
     12022-01-16  Youenn Fablet  <youenn@apple.com>
     2
     3        Enforce focus check for getUserMedia
     4        https://bugs.webkit.org/show_bug.cgi?id=235026
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add infrastructure to register a callback so that a task is executed when the document is visible.
     9        Use this to delay getUserMedia requests until document is visible.
     10        The spec currently defines that we should wait for the current document to have focus but this is about to be changed and is not aligned with other browser implementations.
     11
     12        The patch also moves some getUserMedia checks earlier so as to respect order provided by the specs.
     13        Add a check to validate getDisplayMedia is called on a visible document as the user gesture is now time based.
     14
     15        Covered by API test.
     16
     17        * Modules/mediastream/MediaDevices.cpp:
     18        * Modules/mediastream/UserMediaRequest.cpp:
     19        * Modules/mediastream/UserMediaRequest.h:
     20        * dom/Document.cpp:
     21        * dom/Document.h:
     22        * editing/FrameSelection.cpp:
     23
    1242022-01-16  Youenn Fablet  <youenn@apple.com>
    225
  • trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp

    r287177 r288087  
    119119void MediaDevices::getUserMedia(const StreamConstraints& constraints, Promise&& promise)
    120120{
     121    auto audioConstraints = createMediaConstraints(constraints.audio);
     122    auto videoConstraints = createMediaConstraints(constraints.video);
     123
     124    if (!audioConstraints.isValid && !videoConstraints.isValid) {
     125        promise.reject(TypeError, "No constraints provided"_s);
     126        return;
     127    }
     128
    121129    auto* document = this->document();
    122130    if (!document || !document->isFullyActive()) {
     
    125133    }
    126134
    127     auto audioConstraints = createMediaConstraints(constraints.audio);
    128     auto videoConstraints = createMediaConstraints(constraints.video);
    129 
    130135    bool isUserGesturePriviledged = false;
    131136
     
    139144
    140145    auto request = UserMediaRequest::create(*document, { MediaStreamRequest::Type::UserMedia, WTFMove(audioConstraints), WTFMove(videoConstraints), isUserGesturePriviledged }, WTFMove(promise));
    141     request->start();
     146
     147    if (!document->settings().getUserMediaRequiresFocus()) {
     148        request->start();
     149        return;
     150    }
     151
     152    // FIXME: We use hidden while the spec is using focus, let's revisit when when spec is made clearer.
     153    document->whenVisible([request = WTFMove(request)] {
     154        if (request->isContextStopped())
     155            return;
     156        request->start();
     157    });
     158}
     159
     160static bool hasInvalidGetDisplayMediaConstraint(const MediaConstraints& constraints)
     161{
     162    // https://w3c.github.io/mediacapture-screen-share/#navigator-additions
     163    // 1. Let constraints be the method's first argument.
     164    // 2. For each member present in constraints whose value, value, is a dictionary, run the following steps:
     165    //     1. If value contains a member named advanced, return a promise rejected with a newly created TypeError.
     166    //     2. If value contains a member which in turn is a dictionary containing a member named either min or
     167    //        exact, return a promise rejected with a newly created TypeError.
     168    if (!constraints.isValid)
     169        return false;
     170
     171    if (!constraints.advancedConstraints.isEmpty())
     172        return true;
     173
     174    bool invalid = false;
     175    constraints.mandatoryConstraints.filter([&invalid] (const MediaConstraint& constraint) mutable {
     176        switch (constraint.constraintType()) {
     177        case MediaConstraintType::Width:
     178        case MediaConstraintType::Height: {
     179            auto& intConstraint = downcast<IntConstraint>(constraint);
     180            int value;
     181            invalid = intConstraint.getExact(value) || intConstraint.getMin(value);
     182            break;
     183        }
     184
     185        case MediaConstraintType::AspectRatio:
     186        case MediaConstraintType::FrameRate: {
     187            auto& doubleConstraint = downcast<DoubleConstraint>(constraint);
     188            double value;
     189            invalid = doubleConstraint.getExact(value) || doubleConstraint.getMin(value);
     190            break;
     191        }
     192
     193        case MediaConstraintType::DisplaySurface:
     194        case MediaConstraintType::LogicalSurface: {
     195            auto& boolConstraint = downcast<BooleanConstraint>(constraint);
     196            bool value;
     197            invalid = boolConstraint.getExact(value);
     198            break;
     199        }
     200
     201        case MediaConstraintType::FacingMode:
     202        case MediaConstraintType::DeviceId:
     203        case MediaConstraintType::GroupId: {
     204            auto& stringConstraint = downcast<StringConstraint>(constraint);
     205            Vector<String> values;
     206            invalid = stringConstraint.getExact(values);
     207            break;
     208        }
     209
     210        case MediaConstraintType::SampleRate:
     211        case MediaConstraintType::SampleSize:
     212        case MediaConstraintType::Volume:
     213        case MediaConstraintType::EchoCancellation:
     214            // Ignored.
     215            break;
     216
     217        case MediaConstraintType::Unknown:
     218            ASSERT_NOT_REACHED();
     219            break;
     220        }
     221
     222        return invalid;
     223    });
     224
     225    return invalid;
    142226}
    143227
     
    154238    }
    155239
    156     auto request = UserMediaRequest::create(*document, { MediaStreamRequest::Type::DisplayMedia, { }, createMediaConstraints(constraints.video), isUserGesturePriviledged }, WTFMove(promise));
     240    auto videoConstraints = createMediaConstraints(constraints.video);
     241    if (hasInvalidGetDisplayMediaConstraint(videoConstraints)) {
     242        promise.reject(Exception { TypeError, "getDisplayMedia must be called with valid constraints."_s });
     243        return;
     244    }
     245
     246    // FIXME: We use hidden while the spec is using focus, let's revisit when when spec is made clearer.
     247    if (!document->isFullyActive() || document->topDocument().hidden()) {
     248        promise.reject(Exception { InvalidStateError, "Document is not fully active or does not have focus"_s });
     249        return;
     250    }
     251
     252    auto request = UserMediaRequest::create(*document, { MediaStreamRequest::Type::DisplayMedia, { }, WTFMove(videoConstraints), isUserGesturePriviledged }, WTFMove(promise));
    157253    request->start();
    158254}
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp

    r286918 r288087  
    8686}
    8787
    88 static bool hasInvalidGetDisplayMediaConstraint(const MediaConstraints& constraints)
    89 {
    90     // https://w3c.github.io/mediacapture-screen-share/#navigator-additions
    91     // 1. Let constraints be the method's first argument.
    92     // 2. For each member present in constraints whose value, value, is a dictionary, run the following steps:
    93     //     1. If value contains a member named advanced, return a promise rejected with a newly created TypeError.
    94     //     2. If value contains a member which in turn is a dictionary containing a member named either min or
    95     //        exact, return a promise rejected with a newly created TypeError.
    96     if (!constraints.isValid)
    97         return false;
    98 
    99     if (!constraints.advancedConstraints.isEmpty())
    100         return true;
    101 
    102     bool invalid = false;
    103     constraints.mandatoryConstraints.filter([&invalid] (const MediaConstraint& constraint) mutable {
    104         switch (constraint.constraintType()) {
    105         case MediaConstraintType::Width:
    106         case MediaConstraintType::Height: {
    107             auto& intConstraint = downcast<IntConstraint>(constraint);
    108             int value;
    109             invalid = intConstraint.getExact(value) || intConstraint.getMin(value);
    110             break;
    111         }
    112 
    113         case MediaConstraintType::AspectRatio:
    114         case MediaConstraintType::FrameRate: {
    115             auto& doubleConstraint = downcast<DoubleConstraint>(constraint);
    116             double value;
    117             invalid = doubleConstraint.getExact(value) || doubleConstraint.getMin(value);
    118             break;
    119         }
    120 
    121         case MediaConstraintType::DisplaySurface:
    122         case MediaConstraintType::LogicalSurface: {
    123             auto& boolConstraint = downcast<BooleanConstraint>(constraint);
    124             bool value;
    125             invalid = boolConstraint.getExact(value);
    126             break;
    127         }
    128 
    129         case MediaConstraintType::FacingMode:
    130         case MediaConstraintType::DeviceId:
    131         case MediaConstraintType::GroupId: {
    132             auto& stringConstraint = downcast<StringConstraint>(constraint);
    133             Vector<String> values;
    134             invalid = stringConstraint.getExact(values);
    135             break;
    136         }
    137 
    138         case MediaConstraintType::SampleRate:
    139         case MediaConstraintType::SampleSize:
    140         case MediaConstraintType::Volume:
    141         case MediaConstraintType::EchoCancellation:
    142             // Ignored.
    143             break;
    144 
    145         case MediaConstraintType::Unknown:
    146             ASSERT_NOT_REACHED();
    147             break;
    148         }
    149 
    150         return invalid;
    151     });
    152 
    153     return invalid;
    154 }
    155 
    15688void UserMediaRequest::start()
    15789{
     
    16092    if (!context) {
    16193        deny(MediaAccessDenialReason::UserMediaDisabled);
    162         return;
    163     }
    164 
    165     if (m_request.type == MediaStreamRequest::Type::DisplayMedia) {
    166         if (hasInvalidGetDisplayMediaConstraint(m_request.videoConstraints)) {
    167             deny(MediaAccessDenialReason::IllegalConstraint);
    168             return;
    169         }
    170     }
    171 
    172     // https://w3c.github.io/mediacapture-main/getusermedia.html#dom-mediadevices-getusermedia()
    173     // 1. Let constraints be the method's first argument.
    174     // 2. Let requestedMediaTypes be the set of media types in constraints with either a dictionary
    175     //    value or a value of "true".
    176     // 3. If requestedMediaTypes is the empty set, return a promise rejected with a TypeError. The word
    177     //    "optional" occurs in the WebIDL due to WebIDL rules, but the argument must be supplied in order
    178     //    for the call to succeed.
    179     if (!m_request.audioConstraints.isValid && !m_request.videoConstraints.isValid) {
    180         deny(MediaAccessDenialReason::NoConstraints);
    18194        return;
    18295    }
     
    290203    ExceptionCode code;
    291204    switch (reason) {
    292     case MediaAccessDenialReason::IllegalConstraint:
    293         RELEASE_LOG(MediaStream, "UserMediaRequest::deny - invalid constraints");
    294         code = TypeError;
    295         break;
    296205    case MediaAccessDenialReason::NoConstraints:
    297206        RELEASE_LOG(MediaStream, "UserMediaRequest::deny - no constraints");
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h

    r281360 r288087  
    6464    WEBCORE_EXPORT void allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&&);
    6565
    66     enum MediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, InvalidAccess, IllegalConstraint, OtherFailure };
     66    enum MediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, InvalidAccess, OtherFailure };
    6767    WEBCORE_EXPORT void deny(MediaAccessDenialReason, const String& errorMessage = emptyString());
    6868
  • trunk/Source/WebCore/dom/Document.cpp

    r288069 r288087  
    18731873    }
    18741874#endif
     1875
     1876    if (!hidden()) {
     1877        auto callbacks = std::exchange(m_whenIsVisibleHandlers, { });
     1878        for (auto& callback : callbacks)
     1879            callback();
     1880    }
    18751881}
    18761882
     
    90969102}
    90979103
     9104void Document::whenVisible(Function<void()>&& callback)
     9105{
     9106    if (hidden()) {
     9107        m_whenIsVisibleHandlers.append(WTFMove(callback));
     9108        return;
     9109    }
     9110    callback();
     9111}
     9112
    90989113} // namespace WebCore
    90999114
  • trunk/Source/WebCore/dom/Document.h

    r288059 r288087  
    430430    WEBCORE_EXPORT Element* activeElement();
    431431    WEBCORE_EXPORT bool hasFocus() const;
     432    void whenVisible(Function<void()>&&);
    432433
    433434    bool hasManifest() const;
     
    22622263
    22632264    std::unique_ptr<ModalContainerObserver> m_modalContainerObserver;
     2265
     2266    Vector<Function<void()>> m_whenIsVisibleHandlers;
    22642267};
    22652268
  • trunk/Source/WebKit/ChangeLog

    r288085 r288087  
     12022-01-16  Youenn Fablet  <youenn@apple.com> and Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        Enforce focus check for getUserMedia
     4        https://bugs.webkit.org/show_bug.cgi?id=235026
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add setters/getters for the getUserMedia focus settings.
     9
     10        * UIProcess/API/C/WKPreferences.cpp:
     11        (WKPreferencesSetGetUserMediaRequiresFocus):
     12        (WKPreferencesGetGetUserMediaRequiresFocus):
     13        * UIProcess/API/C/WKPreferencesRefPrivate.h:
     14        * UIProcess/API/Cocoa/WKPreferences.mm:
     15        (-[WKPreferences _getUserMediaRequiresFocus]):
     16        (-[WKPreferences _setGetUserMediaRequiresFocus:]):
     17        * UIProcess/API/Cocoa/WKPreferencesPrivate.h:
     18        * UIProcess/API/glib/WebKitSettings.cpp:
     19        (webkitSettingsSetGetUserMediaRequiresFocus):
     20        * UIProcess/API/glib/WebKitSettingsPrivate.h:
     21        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     22        (webkitWebViewBaseMap): Always add the WindowIsActive flag under xvfb.
     23        (webkitWebViewBaseIsFocused): Always consider the view focused when WindowIsActive flag is present under xvfb.
     24
    1252022-01-16  Lauro Moura  <lmoura@igalia.com>
    226
  • trunk/Source/WebKit/UIProcess/API/C/WKPreferences.cpp

    r287121 r288087  
    15271527}
    15281528
     1529void WKPreferencesSetGetUserMediaRequiresFocus(WKPreferencesRef preferencesRef, bool enabled)
     1530{
     1531    toImpl(preferencesRef)->setGetUserMediaRequiresFocus(enabled);
     1532}
     1533
     1534bool WKPreferencesGetGetUserMediaRequiresFocus(WKPreferencesRef preferencesRef)
     1535{
     1536    return toImpl(preferencesRef)->getUserMediaRequiresFocus();
     1537}
     1538
    15291539void WKPreferencesSetICECandidateFilteringEnabled(WKPreferencesRef preferencesRef, bool enabled)
    15301540{
  • trunk/Source/WebKit/UIProcess/API/C/WKPreferencesRefPrivate.h

    r285575 r288087  
    400400
    401401// Defaults to true.
     402WK_EXPORT void WKPreferencesSetGetUserMediaRequiresFocus(WKPreferencesRef, bool);
     403WK_EXPORT bool WKPreferencesGetGetUserMediaRequiresFocus(WKPreferencesRef);
     404
     405// Defaults to true.
    402406WK_EXPORT void WKPreferencesSetICECandidateFilteringEnabled(WKPreferencesRef, bool);
    403407WK_EXPORT bool WKPreferencesGetICECandidateFilteringEnabled(WKPreferencesRef);
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm

    r288034 r288087  
    651651}
    652652
     653- (BOOL)_getUserMediaRequiresFocus
     654{
     655    return _preferences->getUserMediaRequiresFocus();
     656}
     657
     658- (void)_setGetUserMediaRequiresFocus:(BOOL)enabled
     659{
     660    _preferences->setGetUserMediaRequiresFocus(enabled);
     661}
     662
    653663- (BOOL)_screenCaptureEnabled
    654664{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h

    r288034 r288087  
    118118@property (nonatomic, setter=_setPeerConnectionEnabled:) BOOL _peerConnectionEnabled WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
    119119@property (nonatomic, setter=_setMediaDevicesEnabled:) BOOL _mediaDevicesEnabled WK_API_AVAILABLE(macos(10.13), ios(11.0));
     120@property (nonatomic, setter=_setGetUserMediaRequiresFocus:) BOOL _getUserMediaRequiresFocus WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    120121@property (nonatomic, setter=_setScreenCaptureEnabled:) BOOL _screenCaptureEnabled WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
    121122@property (nonatomic, setter=_setMockCaptureDevicesEnabled:) BOOL _mockCaptureDevicesEnabled WK_API_AVAILABLE(macos(10.13), ios(11.0));
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitSettings.cpp

    r286772 r288087  
    38283828}
    38293829
     3830void webkitSettingsSetGetUserMediaRequiresFocus(WebKitSettings* settings, bool required)
     3831{
     3832    WebKitSettingsPrivate* priv = settings->priv;
     3833    priv->preferences->setGetUserMediaRequiresFocus(required);
     3834}
     3835
    38303836/**
    38313837 * webkit_settings_get_media_content_types_requiring_hardware_support:
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitSettingsPrivate.h

    r270640 r288087  
    3434
    3535WK_EXPORT void webkitSettingsSetMediaCaptureRequiresSecureConnection(WebKitSettings*, bool required);
     36WK_EXPORT void webkitSettingsSetGetUserMediaRequiresFocus(WebKitSettings*, bool required);
    3637
    3738#endif // WebKitSettingsPrivate_h
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r287794 r288087  
    912912        if (!(priv->activityState & ActivityState::IsInWindow))
    913913            flagsToUpdate.add(ActivityState::IsInWindow);
     914
     915#if ENABLE(DEVELOPER_MODE)
     916        // Xvfb doesn't support toplevel focus, so gtk_window_is_active() always returns false. We consider
     917        // toplevel window to be always active since it's the only one.
     918        if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11) {
     919            if (!g_strcmp0(g_getenv("UNDER_XVFB"), "yes"))
     920                flagsToUpdate.add(ActivityState::WindowIsActive);
     921        }
     922#endif
     923
    914924        if (gtk_window_is_active(GTK_WINDOW(priv->toplevelOnScreenWindow)) && !(priv->activityState & ActivityState::WindowIsActive))
    915925            flagsToUpdate.add(ActivityState::WindowIsActive);
     
    24302440bool webkitWebViewBaseIsFocused(WebKitWebViewBase* webViewBase)
    24312441{
     2442#if ENABLE(DEVELOPER_MODE)
     2443    // Xvfb doesn't support toplevel focus, so the view is never focused. We consider it to tbe focused when
     2444    // its window is marked as active.
     2445    if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11) {
     2446        if (!g_strcmp0(g_getenv("UNDER_XVFB"), "yes") && webViewBase->priv->activityState.contains(ActivityState::WindowIsActive))
     2447            return true;
     2448    }
     2449#endif
    24322450    return webViewBase->priv->activityState.contains(ActivityState::IsFocused);
    24332451}
  • trunk/Tools/ChangeLog

    r288071 r288087  
     12022-01-16  Youenn Fablet  <youenn@apple.com>
     2
     3        Enforce focus check for getUserMedia
     4        https://bugs.webkit.org/show_bug.cgi?id=235026
     5
     6        Reviewed by Eric Carlson.
     7
     8        Disable focus flag for testing to not require to focus the window.
     9
     10        * TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:
     11        (TestWebKitAPI::initializeMediaCaptureConfiguration):
     12        (TestWebKitAPI::doCaptureMuteTest):
     13        (TestWebKitAPI::TEST):
     14        * TestWebKitAPI/Tests/WebKit/GetUserMediaNavigation.mm:
     15        (TestWebKitAPI::initializeMediaCaptureConfiguration):
     16        (TestWebKitAPI::TEST):
     17        * TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm:
     18        (TestWebKitAPI::initializeMediaCaptureConfiguration):
     19        (TestWebKitAPI::TEST):
     20        * TestWebKitAPI/Tests/WebKit/MediaStreamTrackDetached.mm:
     21        (TestWebKitAPI::TEST):
     22        * TestWebKitAPI/Tests/WebKit/UserMedia.cpp:
     23        (TestWebKitAPI::TEST):
     24        * TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm:
     25        (TestWebKitAPI::TEST):
     26        * TestWebKitAPI/Tests/WebKitCocoa/GPUProcess.mm:
     27        (TEST):
     28        * TestWebKitAPI/Tests/WebKitCocoa/GetDisplayMedia.mm:
     29        (TestWebKitAPI::GetDisplayMediaTest::SetUp):
     30        * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
     31        * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
     32        (TestWebKitAPI::TEST):
     33        * TestWebKitAPI/Tests/WebKitCocoa/UserMediaDisabled.mm:
     34        (MediaCaptureDisabledTest::SetUp):
     35        * TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm:
     36        (MediaCaptureSimulateFailedSandbox::SetUp):
     37        * TestWebKitAPI/Tests/WebKitGLib/TestUIClient.cpp:
     38        (testWebViewUserMediaEnumerateDevicesPermissionCheck):
     39        (testWebViewUserMediaPermissionRequests):
     40        (testWebViewAudioOnlyUserMediaPermissionRequests):
     41
    1422022-01-15  Sam Weinig  <weinig@apple.com>
    243
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm

    r283180 r288087  
    153153}
    154154
     155static void initializeMediaCaptureConfiguration(WKWebViewConfiguration* configuration)
     156{
     157    auto preferences = [configuration preferences];
     158
     159    configuration._mediaCaptureEnabled = YES;
     160    preferences._mediaCaptureRequiresSecureConnection = NO;
     161    preferences._mockCaptureDevicesEnabled = YES;
     162    preferences._getUserMediaRequiresFocus = NO;
     163}
     164
    155165void doCaptureMuteTest(const Function<void(TestWKWebView*, _WKMediaMutedState)>& setPageMuted)
    156166{
    157167    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    158168    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    159     auto preferences = [configuration preferences];
    160     preferences._mediaCaptureRequiresSecureConnection = NO;
    161     configuration.get()._mediaCaptureEnabled = YES;
    162     preferences._mockCaptureDevicesEnabled = YES;
     169    initializeMediaCaptureConfiguration(configuration.get());
    163170    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    164171    auto delegate = adoptNS([[UserMediaCaptureUIDelegate alloc] init]);
     
    236243    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    237244    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    238     auto preferences = [configuration preferences];
    239     preferences._mediaCaptureRequiresSecureConnection = NO;
    240     configuration.get()._mediaCaptureEnabled = YES;
    241     preferences._mockCaptureDevicesEnabled = YES;
     245    initializeMediaCaptureConfiguration(configuration.get());
    242246    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    243247    auto delegate = adoptNS([[UserMediaCaptureUIDelegate alloc] init]);
     
    341345    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    342346    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    343     auto preferences = [configuration preferences];
    344     preferences._mediaCaptureRequiresSecureConnection = NO;
    345     configuration.get()._mediaCaptureEnabled = YES;
    346     preferences._mockCaptureDevicesEnabled = YES;
     347    initializeMediaCaptureConfiguration(configuration.get());
    347348
    348349    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     
    379380    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    380381    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    381     auto preferences = [configuration preferences];
    382     preferences._mediaCaptureRequiresSecureConnection = NO;
    383     configuration.get()._mediaCaptureEnabled = YES;
    384     preferences._mockCaptureDevicesEnabled = YES;
     382    initializeMediaCaptureConfiguration(configuration.get());
    385383
    386384    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     
    415413    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    416414    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    417     auto preferences = [configuration preferences];
    418     preferences._mediaCaptureRequiresSecureConnection = NO;
    419     configuration.get()._mediaCaptureEnabled = YES;
    420     preferences._mockCaptureDevicesEnabled = YES;
     415    initializeMediaCaptureConfiguration(configuration.get());
    421416
    422417    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     
    443438    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    444439    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    445     auto preferences = [configuration preferences];
    446     preferences._mediaCaptureRequiresSecureConnection = NO;
    447     configuration.get()._mediaCaptureEnabled = YES;
    448     preferences._mockCaptureDevicesEnabled = YES;
     440    initializeMediaCaptureConfiguration(configuration.get());
    449441
    450442    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     
    474466#endif
    475467
    476     auto preferences = [configuration preferences];
    477     preferences._mediaCaptureRequiresSecureConnection = NO;
    478     configuration.get()._mediaCaptureEnabled = YES;
    479     preferences._mockCaptureDevicesEnabled = YES;
     468    initializeMediaCaptureConfiguration(configuration.get());
    480469
    481470    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     
    533522#endif
    534523
    535     auto preferences = [configuration preferences];
    536     preferences._mediaCaptureRequiresSecureConnection = NO;
    537     configuration.get()._mediaCaptureEnabled = YES;
    538     preferences._mockCaptureDevicesEnabled = YES;
     524    initializeMediaCaptureConfiguration(configuration.get());
    539525
    540526    done = false;
     
    556542    configuration.get().processPool._configuration.shouldCaptureAudioInUIProcess = NO;
    557543
    558     auto preferences = [configuration preferences];
    559     preferences._mediaCaptureRequiresSecureConnection = NO;
    560     configuration.get()._mediaCaptureEnabled = YES;
    561     preferences._mockCaptureDevicesEnabled = YES;
     544    initializeMediaCaptureConfiguration(configuration.get());
    562545
    563546    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     
    592575    }
    593576
    594     preferences._mediaCaptureRequiresSecureConnection = NO;
    595     configuration.get()._mediaCaptureEnabled = YES;
    596     preferences._mockCaptureDevicesEnabled = YES;
     577    initializeMediaCaptureConfiguration(configuration.get());
    597578
    598579    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     
    667648            [preferences _setEnabled:YES forInternalDebugFeature:feature];
    668649    }
    669     preferences._mediaCaptureRequiresSecureConnection = NO;
    670     configuration.get()._mediaCaptureEnabled = YES;
    671     preferences._mockCaptureDevicesEnabled = YES;
     650    initializeMediaCaptureConfiguration(configuration.get());
    672651
    673652#if PLATFORM(IOS_FAMILY)
     
    747726    }
    748727
    749     preferences._mediaCaptureRequiresSecureConnection = NO;
    750     configuration.get()._mediaCaptureEnabled = YES;
    751     preferences._mockCaptureDevicesEnabled = YES;
     728    initializeMediaCaptureConfiguration(configuration.get());
    752729
    753730    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     
    868845    [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"gum"];
    869846
    870     auto preferences = [configuration preferences];
    871     preferences._mediaCaptureRequiresSecureConnection = NO;
    872     configuration.get()._mediaCaptureEnabled = YES;
    873     preferences._mockCaptureDevicesEnabled = YES;
     847    initializeMediaCaptureConfiguration(configuration.get());
    874848
    875849    done = false;
     
    897871    done = false;
    898872    [webView stringByEvaluatingJavaScript:@"doTest()"];
     873    TestWebKitAPI::Util::run(&done);
     874}
     875
     876static const char* getUserMediaFocusText = R"DOCDOCDOC(
     877<html><body>
     878<script>
     879onload = () => {
     880    document.onvisibilitychange = () => window.webkit.messageHandlers.gum.postMessage("PASS");
     881    window.webkit.messageHandlers.gum.postMessage("PASS");
     882}
     883
     884function capture()
     885{
     886    navigator.mediaDevices.getUserMedia({video : true}).then(stream => {
     887        window.webkit.messageHandlers.gum.postMessage(document.hasFocus() ? "PASS" : "FAIL");
     888    });
     889}
     890</script>
     891</body></html>
     892)DOCDOCDOC";
     893
     894TEST(WebKit, GetUserMediaFocus)
     895{
     896    TestWebKitAPI::HTTPServer server({
     897        { "/", { getUserMediaFocusText } }
     898    }, TestWebKitAPI::HTTPServer::Protocol::Http, nullptr, nullptr, 9090);
     899
     900    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     901
     902    auto context = adoptWK(TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
     903    configuration.get().processPool = (WKProcessPool *)context.get();
     904
     905    auto messageHandler = adoptNS([[GUMMessageHandler alloc] init]);
     906    [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"gum"];
     907
     908    initializeMediaCaptureConfiguration(configuration.get());
     909    auto preferences = [configuration preferences];
     910    preferences._getUserMediaRequiresFocus = YES;
     911
     912    done = false;
     913    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
     914
     915    auto delegate = adoptNS([[UserMediaCaptureUIDelegate alloc] init]);
     916    webView.get().UIDelegate = delegate.get();
     917
     918    // Load page.
     919    [webView loadRequest:server.request()];
     920    TestWebKitAPI::Util::run(&done);
     921
     922    // Minimize
     923    done = false;
     924    auto *hostWindow = [webView hostWindow];
     925    [hostWindow miniaturize:hostWindow];
     926    TestWebKitAPI::Util::run(&done);
     927
     928    // We call capture while minimizing.
     929    done = false;
     930    [webView stringByEvaluatingJavaScript:@"capture()"];
     931
     932    // Make sure that getUserMedia does not resolve too soon.
     933    TestWebKitAPI::Util::spinRunLoop(100);
     934    EXPECT_FALSE(done);
     935
     936    [hostWindow deminiaturize:hostWindow];
    899937    TestWebKitAPI::Util::run(&done);
    900938}
     
    925963    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    926964    [configuration setWebsiteDataStore:adoptNS([[WKWebsiteDataStore alloc] _initWithConfiguration:websiteDataStoreConfiguration.get()]).get()];
    927     auto preferences = [configuration preferences];
    928     configuration.get()._mediaCaptureEnabled = YES;
    929     preferences._mediaCaptureRequiresSecureConnection = NO;
    930     preferences._mockCaptureDevicesEnabled = YES;
     965    initializeMediaCaptureConfiguration(configuration.get());
    931966    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get()]);
    932967    auto delegate = adoptNS([[UserMediaCaptureUIDelegate alloc] init]);
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaNavigation.mm

    r275162 r288087  
    6868namespace TestWebKitAPI {
    6969
     70static void initializeMediaCaptureConfiguration(WKWebViewConfiguration* configuration)
     71{
     72    auto preferences = [configuration preferences];
     73
     74    configuration._mediaCaptureEnabled = YES;
     75    preferences._mediaCaptureRequiresSecureConnection = NO;
     76    preferences._mockCaptureDevicesEnabled = YES;
     77    preferences._getUserMediaRequiresFocus = NO;
     78}
     79
    7080TEST(WebKit, NavigateDuringGetUserMediaPrompt)
    7181{
     
    8999    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    90100    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    91     auto preferences = [configuration preferences];
    92     preferences._mediaCaptureRequiresSecureConnection = NO;
    93     configuration.get()._mediaCaptureEnabled = YES;
    94     preferences._mockCaptureDevicesEnabled = YES;
     101    initializeMediaCaptureConfiguration(configuration.get());
    95102    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    96103    auto delegate = adoptNS([[NavigationWhileGetUserMediaPromptDisplayedUIDelegate alloc] init]);
     
    118125    [configuration setWebsiteDataStore:adoptNS([[WKWebsiteDataStore alloc] _initWithConfiguration:websiteDataStoreConfiguration.get()]).get()];
    119126    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    120     auto preferences = [configuration preferences];
    121     preferences._mediaCaptureRequiresSecureConnection = NO;
    122     configuration.get()._mediaCaptureEnabled = YES;
    123     preferences._mockCaptureDevicesEnabled = YES;
     127    initializeMediaCaptureConfiguration(configuration.get());
    124128    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    125129    auto delegate = adoptNS([[NavigationWhileGetUserMediaPromptDisplayedUIDelegate alloc] init]);
     
    148152    [configuration setWebsiteDataStore:adoptNS([[WKWebsiteDataStore alloc] _initWithConfiguration:websiteDataStoreConfiguration.get()]).get()];
    149153    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    150     auto preferences = [configuration preferences];
    151     preferences._mediaCaptureRequiresSecureConnection = NO;
    152     configuration.get()._mediaCaptureEnabled = YES;
    153     preferences._mockCaptureDevicesEnabled = YES;
     154    initializeMediaCaptureConfiguration(configuration.get());
    154155    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    155156    auto delegate = adoptNS([[NavigationWhileGetUserMediaPromptDisplayedUIDelegate alloc] init]);
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMediaReprompt.mm

    r275162 r288087  
    6161namespace TestWebKitAPI {
    6262
     63static void initializeMediaCaptureConfiguration(WKWebViewConfiguration* configuration)
     64{
     65    auto preferences = [configuration preferences];
     66
     67    configuration._mediaCaptureEnabled = YES;
     68    preferences._mediaCaptureRequiresSecureConnection = NO;
     69    preferences._mockCaptureDevicesEnabled = YES;
     70    preferences._getUserMediaRequiresFocus = NO;
     71}
     72
    6373TEST(WebKit2, GetUserMediaReprompt)
    6474{
     
    6676    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    6777    auto preferences = [configuration preferences];
    68     preferences._mediaCaptureRequiresSecureConnection = NO;
    69     configuration.get()._mediaCaptureEnabled = YES;
    70     preferences._mockCaptureDevicesEnabled = YES;
     78    initializeMediaCaptureConfiguration(configuration.get());
    7179    auto webView = adoptNS([[GetUserMediaRepromptTestView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    7280    auto delegate = adoptNS([[UserMediaCaptureUIDelegate alloc] init]);
     
    101109    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    102110    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    103     auto preferences = [configuration preferences];
    104     preferences._mediaCaptureRequiresSecureConnection = NO;
    105     configuration.get()._mediaCaptureEnabled = YES;
    106     preferences._mockCaptureDevicesEnabled = YES;
     111    initializeMediaCaptureConfiguration(configuration.get());
    107112    auto webView = adoptNS([[GetUserMediaRepromptTestView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    108113    auto delegate = adoptNS([[UserMediaCaptureUIDelegate alloc] init]);
     
    124129    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    125130    auto processPoolConfig = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
    126     auto preferences = [configuration preferences];
    127     preferences._mediaCaptureRequiresSecureConnection = NO;
    128     configuration.get()._mediaCaptureEnabled = YES;
    129     preferences._mockCaptureDevicesEnabled = YES;
     131    initializeMediaCaptureConfiguration(configuration.get());
    130132    auto webView = adoptNS([[GetUserMediaRepromptTestView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    131133    auto delegate = adoptNS([[UserMediaCaptureUIDelegate alloc] init]);
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/MediaStreamTrackDetached.mm

    r275162 r288087  
    6262    configuration.get()._mediaCaptureEnabled = YES;
    6363    preferences._mockCaptureDevicesEnabled = YES;
     64    preferences._getUserMediaRequiresFocus = NO;
    6465    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get() processPoolConfiguration:processPoolConfig.get()]);
    6566    auto delegate = adoptNS([[MediaStreamTrackDetachedUIDelegate alloc] init]);
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/UserMedia.cpp

    r244390 r288087  
    7878    WKPreferencesSetMediaCaptureRequiresSecureConnection(preferences, false);
    7979    WKPreferencesSetMockCaptureDevicesEnabled(preferences, true);
     80    WKPreferencesSetGetUserMediaRequiresFocus(preferences, false);
    8081
    8182    WKPageUIClientV6 uiClient;
     
    114115    WKPreferencesSetMediaCaptureRequiresSecureConnection(preferences, false);
    115116    WKPreferencesSetMockCaptureDevicesEnabled(preferences, true);
     117    WKPreferencesSetGetUserMediaRequiresFocus(preferences, false);
    116118
    117119    WKPageUIClientV6 uiClient;
     
    174176    WKPreferencesSetMediaCaptureRequiresSecureConnection(preferences, false);
    175177    WKPreferencesSetMockCaptureDevicesEnabled(preferences, true);
     178    WKPreferencesSetGetUserMediaRequiresFocus(preferences, false);
    176179
    177180    WKPageUIClientV6 uiClient;
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm

    r280664 r288087  
    7373    preferences._mediaCaptureRequiresSecureConnection = NO;
    7474    preferences._mockCaptureDevicesEnabled = YES;
     75    preferences._getUserMediaRequiresFocus = NO;
    7576
    7677    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/GPUProcess.mm

    r286816 r288087  
    697697        configuration._mediaCaptureEnabled = YES;
    698698        preferences._mockCaptureDevicesEnabled = YES;
     699        preferences._getUserMediaRequiresFocus = NO;
    699700    });
    700701}
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/GetDisplayMedia.mm

    r285547 r288087  
    105105        preferences._screenCaptureEnabled = YES;
    106106
    107         m_webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:m_configuration.get()]);
     107        m_webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:m_configuration.get() addToWindow:YES]);
    108108
    109109        m_uiDelegate = adoptNS([[GetDisplayMediaUIDelegate alloc] init]);
    110110        m_webView.get().UIDelegate = m_uiDelegate.get();
     111        [m_webView focus];
    111112
    112113        [m_webView synchronouslyLoadTestPageNamed:@"getDisplayMedia"];
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm

    r286661 r288087  
    68296829    webViewConfiguration.get()._mediaCaptureEnabled = YES;
    68306830    preferences._mockCaptureDevicesEnabled = YES;
     6831    preferences._getUserMediaRequiresFocus = NO;
    68316832
    68326833    [webViewConfiguration setProcessPool:processPool.get()];
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm

    r285547 r288087  
    163163    preferences._speechRecognitionEnabled = YES;
    164164    preferences._mediaCaptureRequiresSecureConnection = NO;
     165    preferences._getUserMediaRequiresFocus = NO;
    165166    auto delegate = adoptNS([[SpeechRecognitionUIDelegate alloc] init]);
    166167    auto firstWebView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) configuration:configuration.get()]);
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaDisabled.mm

    r285547 r288087  
    8383        preferences._mockCaptureDevicesEnabled = YES;
    8484        preferences._mediaCaptureRequiresSecureConnection = NO;
     85        preferences._getUserMediaRequiresFocus = NO;
    8586
    8687        m_uiDelegate = adoptNS([[UserMediaUIDelegate alloc] init]);
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserMediaSimulateFailedSandbox.mm

    r285547 r288087  
    8484        preferences._mockCaptureDevicesEnabled = YES;
    8585        preferences._mediaCaptureRequiresSecureConnection = NO;
     86        preferences._getUserMediaRequiresFocus = NO;
    8687
    8788        m_uiDelegate = adoptNS([[SimulateFailedSandboxUIDelegate alloc] init]);
  • trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestUIClient.cpp

    r283972 r288087  
    10031003    webkit_settings_set_enable_media_stream(settings, TRUE);
    10041004    webkitSettingsSetMediaCaptureRequiresSecureConnection(settings, FALSE);
     1005    webkitSettingsSetGetUserMediaRequiresFocus(settings, FALSE);
    10051006    webkit_settings_set_enable_mock_capture_devices(settings, TRUE);
    10061007
     
    10381039    webkit_settings_set_enable_mock_capture_devices(settings, FALSE);
    10391040    webkitSettingsSetMediaCaptureRequiresSecureConnection(settings, TRUE);
     1041    webkitSettingsSetGetUserMediaRequiresFocus(settings, TRUE);
    10401042}
    10411043
     
    10471049    webkit_settings_set_enable_mock_capture_devices(settings, TRUE);
    10481050    webkitSettingsSetMediaCaptureRequiresSecureConnection(settings, FALSE);
     1051    webkitSettingsSetGetUserMediaRequiresFocus(settings, FALSE);
    10491052
    10501053    test->showInWindow();
     
    11061109    webkit_settings_set_enable_mock_capture_devices(settings, FALSE);
    11071110    webkitSettingsSetMediaCaptureRequiresSecureConnection(settings, TRUE);
     1111    webkitSettingsSetGetUserMediaRequiresFocus(settings, TRUE);
    11081112}
    11091113
     
    11151119    webkit_settings_set_enable_mock_capture_devices(settings, TRUE);
    11161120    webkitSettingsSetMediaCaptureRequiresSecureConnection(settings, FALSE);
     1121    webkitSettingsSetGetUserMediaRequiresFocus(settings, FALSE);
    11171122
    11181123    test->showInWindow();
     
    11451150    webkit_settings_set_enable_mock_capture_devices(settings, FALSE);
    11461151    webkitSettingsSetMediaCaptureRequiresSecureConnection(settings, TRUE);
     1152    webkitSettingsSetGetUserMediaRequiresFocus(settings, TRUE);
    11471153}
    11481154
Note: See TracChangeset for help on using the changeset viewer.