Changeset 207159 in webkit


Ignore:
Timestamp:
Oct 11, 2016 1:17:58 PM (7 years ago)
Author:
dbates@webkit.org
Message:

[iOS] REGRESSION (r197953): User gesture required to load video in iOS 9-built apps
https://bugs.webkit.org/show_bug.cgi?id=163244
<rdar://problem/27250015>

Reviewed by Jer Noble.

Source/WebCore:

Adds a new setting to toggle requiring a user gesture to load a video (enabled by default).
Disable this setting for apps built against iOS 9 or earlier.

Tests: media/loadedmetadata-fires-without-user-gesture-when-setRequiresUserGestureToLoadVideo-false.html

media/require-user-gesture-to-load-video.html

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::HTMLMediaElement): Only require a user gesture to load a video
when Settings::requiresUserGestureToLoadVideo() is true.

  • page/Settings.cpp: Enable setting requiresUserGestureToLoadVideo by default.
  • page/Settings.in: Add setting, requiresUserGestureToLoadVideo.

Source/WebKit/mac:

Enable or disable the Setting::requiresUserGestureToLoadVideo() in legacy WebKit depending
on the version of iOS SDK that the app was linked against. We require a user gesture to
begin loading a video as of iOS 10.

  • WebView/WebView.mm:

(shouldRequireUserGestureToLoadVideo):
(-[WebView _preferencesChanged:]): Modified to pass the WebKit requiresUserGestureToLoadVideo
preference to WebCore.

Source/WebKit2:

Enable or disable the Setting::requiresUserGestureToLoadVideo() in WebKit depending on the
version of iOS SDK that the app was linked against. We require a user gesture to begin
loading a video as of iOS 10.

  • Shared/WebPreferencesDefinitions.h:
  • UIProcess/API/Cocoa/WKWebView.mm:

(shouldRequireUserGestureToLoadVideo): Added.
(-[WKWebView _initializeWithConfiguration:]): Set the requiresUserGestureToLoadVideo preference.

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::updatePreferences): Modified to pass the WebKit requiresUserGestureToLoadVideo
preference to WebCore.

LayoutTests:

Add tests to ensure that Settings::setRequiresUserGestureToLoadVideo() behaves as expected.

  • media/loadedmetadata-fires-without-user-gesture-when-setRequiresUserGestureToLoadVideo-false-expected.txt: Added.
  • media/loadedmetadata-fires-without-user-gesture-when-setRequiresUserGestureToLoadVideo-false.html: Added.
  • media/media-controls.js:

(clickPlayButton): Added.

  • media/require-user-gesture-to-load-video-expected.txt: Added.
  • media/require-user-gesture-to-load-video.html: Added.
  • media/video-controls-transformed.html: Write in terms of clickPlayButton().
  • media/video-controls-visible-audio-only.html: Ditto.
  • media/video-fullscreeen-only-playback.html: Ditto.
  • media/video-play-audio-require-user-gesture.html: Ditto.
  • media/video-play-require-user-gesture.html: Ditto.
  • media/video-test.js:

(passTest): Added.

  • platform/ios-simulator/TestExpectations: Skip test media/require-user-gesture-to-load-video.html as

we need to fix <https://bugs.webkit.org/show_bug.cgi?id=163291> to support tapping the play button on iOS.

Location:
trunk
Files:
4 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r207155 r207159  
     12016-10-11  Daniel Bates  <dabates@apple.com>
     2
     3        [iOS] REGRESSION (r197953): User gesture required to load video in iOS 9-built apps
     4        https://bugs.webkit.org/show_bug.cgi?id=163244
     5        <rdar://problem/27250015>
     6
     7        Reviewed by Jer Noble.
     8
     9        Add tests to ensure that Settings::setRequiresUserGestureToLoadVideo() behaves as expected.
     10
     11        * media/loadedmetadata-fires-without-user-gesture-when-setRequiresUserGestureToLoadVideo-false-expected.txt: Added.
     12        * media/loadedmetadata-fires-without-user-gesture-when-setRequiresUserGestureToLoadVideo-false.html: Added.
     13        * media/media-controls.js:
     14        (clickPlayButton): Added.
     15        * media/require-user-gesture-to-load-video-expected.txt: Added.
     16        * media/require-user-gesture-to-load-video.html: Added.
     17        * media/video-controls-transformed.html: Write in terms of clickPlayButton().
     18        * media/video-controls-visible-audio-only.html: Ditto.
     19        * media/video-fullscreeen-only-playback.html: Ditto.
     20        * media/video-play-audio-require-user-gesture.html: Ditto.
     21        * media/video-play-require-user-gesture.html: Ditto.
     22        * media/video-test.js:
     23        (passTest): Added.
     24        * platform/ios-simulator/TestExpectations: Skip test media/require-user-gesture-to-load-video.html as
     25        we need to fix <https://bugs.webkit.org/show_bug.cgi?id=163291> to support tapping the play button on iOS.
     26
    1272016-10-11  Daniel Bates  <dabates@apple.com>
    228
  • trunk/LayoutTests/media/media-controls.js

    r168467 r207159  
    9393    return displayElement;
    9494}
     95
     96// FIXME: Make this work for iOS.
     97function clickPlayButton(video)
     98{
     99    if (!window.eventSender)
     100        return;
     101
     102    var playButtonCoordinates = mediaControlsButtonCoordinates(video, "play-button");
     103    var x = playButtonCoordinates[0];
     104    var y = playButtonCoordinates[1];
     105
     106    eventSender.mouseMoveTo(x, y);
     107    eventSender.mouseDown();
     108    eventSender.mouseUp();
     109}
  • trunk/LayoutTests/media/video-controls-transformed.html

    r95133 r207159  
    1919        testExpected("video.controls", null, '!=');
    2020        waitForEvent('canplaythrough', function () {
    21             if (window.eventSender) {
    22                 // Find the play button and click the middle of its bounding box.
    23                 var playCoords;
    24                 try {
    25                     playCoords = mediaControlsButtonCoordinates(video, "play-button");
    26                 } catch (exception) {
    27                     failTest(exception.description);
    28                     return;
    29                 }
    30                 var clickX = playCoords[0];
    31                 var clickY = playCoords[1];
    32                 eventSender.mouseMoveTo(clickX, clickY);
    33                 eventSender.mouseDown();
    34                 eventSender.mouseUp();
     21            try {
     22                clickPlayButton(video);
     23            } catch (exception) {
     24                failTest(exception.description);
     25                return;
    3526            }
    3627            testExpected("video.paused", false);
  • trunk/LayoutTests/media/video-controls-visible-audio-only.html

    r120416 r207159  
    3838                    return;
    3939
    40                 // start playback
    41                 var playCoords
    4240                try {
    43                     playCoords = mediaControlsButtonCoordinates(video, "play-button");
     41                    clickPlayButton(video);
    4442                } catch (exception) {
    4543                    consoleWrite(exception.description);
     
    4745                    return;
    4846                }
    49                 var clickX = playCoords[0];
    50                 var clickY = playCoords[1];
    51                 eventSender.mouseMoveTo(clickX, clickY);
    52                 eventSender.mouseDown();
    53                 eventSender.mouseUp();
    5447                testcondition("!video.paused");
    5548
  • trunk/LayoutTests/media/video-fullscreeen-only-playback.html

    r189112 r207159  
    3434                consoleWrite("<br>** Clicking \'play\' button...");
    3535
    36                 var playCoords;
    3736                try {
    38                     playCoords = mediaControlsButtonCoordinates(video, "play-button");
     37                    clickPlayButton(video);
    3938                } catch (exception) {
    4039                    failTest(exception.description);
    4140                    return;
    4241                }
    43 
    44                 eventSender.mouseMoveTo(playCoords[0], playCoords[1]);
    45                 eventSender.mouseDown();
    46                 eventSender.mouseUp();
    4742            }
    4843
  • trunk/LayoutTests/media/video-play-audio-require-user-gesture.html

    r201109 r207159  
    99            if (window.internals)
    1010                window.internals.settings.setAudioPlaybackRequiresUserGesture(true);
    11 
    12             function click()
    13             {
    14                 if (window.eventSender) {
    15                     var playCoords;
    16                     try {
    17                         playCoords = mediaControlsButtonCoordinates(video, "play-button");
    18                     } catch (exception) {
    19                         failTest(exception.description);
    20                         return;
    21                     }
    22                     var x = playCoords[0];
    23                     var y = playCoords[1];
    24                      
    25                     userGestureInitiated = 1;
    26                     eventSender.mouseMoveTo(x, y);
    27                     eventSender.mouseDown();
    28                     eventSender.mouseUp();
    29                 }
    30             }
    3111
    3212            function playing()
     
    6343
    6444                consoleWrite("* User gesture initiated");
    65                 click();
     45                userGestureInitiated = 1;
     46                try {
     47                    clickPlayButton(video);
     48                } catch (exception) {
     49                    failTest(exception.description);
     50                    return;
     51                }
    6652            }
    6753
  • trunk/LayoutTests/media/video-play-require-user-gesture.html

    r197953 r207159  
    99            if (window.internals)
    1010                window.internals.settings.setVideoPlaybackRequiresUserGesture(true);
    11 
    12             function click()
    13             {
    14                 if (window.eventSender) {
    15                     var playCoords;
    16                     try {
    17                         playCoords = mediaControlsButtonCoordinates(video, "play-button");
    18                     } catch (exception) {
    19                         failTest(exception.description);
    20                         return;
    21                     }
    22                     var x = playCoords[0];
    23                     var y = playCoords[1];
    24                      
    25                     userGestureInitiated = 1;
    26                     eventSender.mouseMoveTo(x, y);
    27                     eventSender.mouseDown();
    28                     eventSender.mouseUp();
    29                 }
    30             }
    3111
    3212            function playing()
     
    6343
    6444                consoleWrite("* User gesture initiated");
    65                 click();
     45                userGestureInitiated = 1;
     46                try {
     47                    clickPlayButton(video);
     48                } catch (exception) {
     49                    failTest(exception.description);
     50                    return;
     51                }
    6652            }
    6753
  • trunk/LayoutTests/media/video-test.js

    r201187 r207159  
    55var printFullTestDetails = true; // This is optionaly switched of by test whose tested values can differ. (see disableFullTestDetailsPrinting())
    66var Failed = false;
     7var Success = true;
    78
    89var track = null; // Current TextTrack being tested.
     
    267268}
    268269
     270function passTest(text)
     271{
     272    logResult(Success, text);
     273    endTest();
     274}
    269275
    270276function logResult(success, text)
  • trunk/LayoutTests/platform/ios-simulator/TestExpectations

    r207031 r207159  
    25462546media/video-controls-show-on-kb-or-ax-event.html
    25472547media/video-fullscreen-restriction-removed.html
    2548 media/video-play-require-user-gesture.html
    25492548media/video-playsinline.html
    25502549media/video-remote-control-playpause.html
     
    26272626media/video-controls-no-scripting.html [ Failure ]
    26282627media/video-controls-toggling.html [ Failure ]
    2629 media/video-controls-transformed.html [ Failure ]
    2630 media/video-controls-visible-audio-only.html [ Failure ]
    26312628media/video-controls-visible-exiting-fullscreen.html [ Failure ]
    26322629media/video-controls-zoomed.html [ Failure ]
    26332630media/video-frame-accurate-seek.html [ Failure ]
    26342631media/video-fullscreeen-only-controls.html [ Failure ]
    2635 media/video-fullscreeen-only-playback.html [ Failure ]
    26362632media/video-initially-hidden-volume-slider-up.html [ Failure ]
    2637 media/video-play-audio-require-user-gesture.html [ Failure ]
    26382633media/video-trackmenu-selection.html [ Failure ]
    26392634media/video-volume.html [ Failure ]
     
    26862681
    26872682webkit.org/b/162647 http/tests/xmlhttprequest/onabort-response-getters.html [ Pass Failure ]
     2683
     2684# Media tests cannot tap play button on iOS.
     2685webkit.org/b/163291 media/require-user-gesture-to-load-video.html
     2686webkit.org/b/163291 media/video-controls-transformed.html [ Failure ]
     2687webkit.org/b/163291 media/video-controls-visible-audio-only.html [ Failure ]
     2688webkit.org/b/163291 media/video-fullscreeen-only-playback.html [ Failure ]
     2689webkit.org/b/163291 media/video-play-audio-require-user-gesture.html [ Failure ]
     2690webkit.org/b/163291 media/video-play-require-user-gesture.html
     2691
  • trunk/Source/WebCore/ChangeLog

    r207158 r207159  
     12016-10-11  Daniel Bates  <dabates@apple.com>
     2
     3        [iOS] REGRESSION (r197953): User gesture required to load video in iOS 9-built apps
     4        https://bugs.webkit.org/show_bug.cgi?id=163244
     5        <rdar://problem/27250015>
     6
     7        Reviewed by Jer Noble.
     8
     9        Adds a new setting to toggle requiring a user gesture to load a video (enabled by default).
     10        Disable this setting for apps built against iOS 9 or earlier.
     11
     12        Tests: media/loadedmetadata-fires-without-user-gesture-when-setRequiresUserGestureToLoadVideo-false.html
     13               media/require-user-gesture-to-load-video.html
     14
     15        * html/HTMLMediaElement.cpp:
     16        (WebCore::HTMLMediaElement::HTMLMediaElement): Only require a user gesture to load a video
     17        when Settings::requiresUserGestureToLoadVideo() is true.
     18        * page/Settings.cpp: Enable setting requiresUserGestureToLoadVideo by default.
     19        * page/Settings.in: Add setting, requiresUserGestureToLoadVideo.
     20
    1212016-10-11  Sam Weinig  <sam@webkit.org>
    222
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r207005 r207159  
    505505        if (settings && settings->videoPlaybackRequiresUserGesture()) {
    506506            m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureForVideoRateChange);
    507             m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureForLoad);
     507            if (settings->requiresUserGestureToLoadVideo())
     508                m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureForLoad);
    508509        }
    509510
  • trunk/Source/WebCore/page/Settings.cpp

    r206119 r207159  
    168168#endif
    169169
     170static const bool defaultRequiresUserGestureToLoadVideo = true;
     171
    170172static const bool defaultAllowsPictureInPictureMediaPlayback = true;
    171173
  • trunk/Source/WebCore/page/Settings.in

    r206843 r207159  
    128128allowDisplayOfInsecureContent initial=false
    129129allowRunningOfInsecureContent initial=false
     130requiresUserGestureToLoadVideo initial=defaultRequiresUserGestureToLoadVideo
    130131videoPlaybackRequiresUserGesture initial=defaultVideoPlaybackRequiresUserGesture
    131132audioPlaybackRequiresUserGesture initial=defaultAudioPlaybackRequiresUserGesture
  • trunk/Source/WebKit/mac/ChangeLog

    r207151 r207159  
     12016-10-11  Daniel Bates  <dabates@apple.com>
     2
     3        [iOS] REGRESSION (r197953): User gesture required to load video in iOS 9-built apps
     4        https://bugs.webkit.org/show_bug.cgi?id=163244
     5        <rdar://problem/27250015>
     6
     7        Reviewed by Jer Noble.
     8
     9        Enable or disable the Setting::requiresUserGestureToLoadVideo() in legacy WebKit depending
     10        on the version of iOS SDK that the app was linked against. We require a user gesture to
     11        begin loading a video as of iOS 10.
     12
     13        * WebView/WebView.mm:
     14        (shouldRequireUserGestureToLoadVideo):
     15        (-[WebView _preferencesChanged:]): Modified to pass the WebKit requiresUserGestureToLoadVideo
     16        preference to WebCore.
     17
    1182016-10-11  Alex Christensen  <achristensen@webkit.org>
    219
  • trunk/Source/WebKit/mac/WebView/WebView.mm

    r207151 r207159  
    904904}
    905905
     906static bool shouldRequireUserGestureToLoadVideo()
     907{
     908    static bool shouldRequireUserGestureToLoadVideo = dyld_get_program_sdk_version() >= DYLD_IOS_VERSION_10_0;
     909    return shouldRequireUserGestureToLoadVideo;
     910}
     911
    906912#if ENABLE(GAMEPAD)
    907913static void WebKitInitializeGamepadProviderIfNecessary()
     
    23712377    settings.setVideoPlaybackRequiresUserGesture(mediaPlaybackRequiresUserGesture || [preferences videoPlaybackRequiresUserGesture]);
    23722378    settings.setAudioPlaybackRequiresUserGesture(mediaPlaybackRequiresUserGesture || [preferences audioPlaybackRequiresUserGesture]);
     2379    settings.setRequiresUserGestureToLoadVideo(shouldRequireUserGestureToLoadVideo());
    23732380    settings.setMainContentUserGestureOverrideEnabled([preferences overrideUserGestureRequirementForMainContent]);
    23742381    settings.setAllowsInlineMediaPlayback([preferences mediaPlaybackAllowsInline]);
  • trunk/Source/WebKit2/ChangeLog

    r207151 r207159  
     12016-10-11  Daniel Bates  <dabates@apple.com>
     2
     3        [iOS] REGRESSION (r197953): User gesture required to load video in iOS 9-built apps
     4        https://bugs.webkit.org/show_bug.cgi?id=163244
     5        <rdar://problem/27250015>
     6
     7        Reviewed by Jer Noble.
     8
     9        Enable or disable the Setting::requiresUserGestureToLoadVideo() in WebKit depending on the
     10        version of iOS SDK that the app was linked against. We require a user gesture to begin
     11        loading a video as of iOS 10.
     12
     13        * Shared/WebPreferencesDefinitions.h:
     14        * UIProcess/API/Cocoa/WKWebView.mm:
     15        (shouldRequireUserGestureToLoadVideo): Added.
     16        (-[WKWebView _initializeWithConfiguration:]): Set the requiresUserGestureToLoadVideo preference.
     17        * WebProcess/WebPage/WebPage.cpp:
     18        (WebKit::WebPage::updatePreferences): Modified to pass the WebKit requiresUserGestureToLoadVideo
     19        preference to WebCore.
     20
    1212016-10-11  Alex Christensen  <achristensen@webkit.org>
    222
  • trunk/Source/WebKit2/Shared/WebPreferencesDefinitions.h

    r207139 r207159  
    150150    macro(RequiresUserGestureForVideoPlayback, requiresUserGestureForVideoPlayback, Bool, bool, false, "", "") \
    151151    macro(RequiresUserGestureForAudioPlayback, requiresUserGestureForAudioPlayback, Bool, bool, DEFAULT_REQUIRES_USER_GESTURE_FOR_AUDIO_PLAYBACK, "", "") \
     152    macro(RequiresUserGestureToLoadVideo, requiresUserGestureToLoadVideo, Bool, bool, false, "", "") \
    152153    macro(MainContentUserGestureOverrideEnabled, mainContentUserGestureOverrideEnabled, Bool, bool, false, "", "") \
    153154    macro(AllowsInlineMediaPlayback, allowsInlineMediaPlayback, Bool, bool, DEFAULT_ALLOWS_INLINE_MEDIA_PLAYBACK, "", "") \
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r206986 r207159  
    327327#endif
    328328
     329static bool shouldRequireUserGestureToLoadVideo()
     330{
     331    static bool shouldRequireUserGestureToLoadVideo = dyld_get_program_sdk_version() >= DYLD_IOS_VERSION_10_0;
     332    return shouldRequireUserGestureToLoadVideo;
     333}
     334
    329335#if ENABLE(DATA_DETECTION) && PLATFORM(IOS)
    330336static WebCore::DataDetectorTypes fromWKDataDetectorTypes(uint64_t types)
     
    456462    pageConfiguration->preferenceValues().set(WebKit::WebPreferencesKey::requiresUserGestureForVideoPlaybackKey(), WebKit::WebPreferencesStore::Value((mediaTypesRequiringUserGesture & WKAudiovisualMediaTypeVideo) == WKAudiovisualMediaTypeVideo));
    457463    pageConfiguration->preferenceValues().set(WebKit::WebPreferencesKey::requiresUserGestureForAudioPlaybackKey(), WebKit::WebPreferencesStore::Value(((mediaTypesRequiringUserGesture & WKAudiovisualMediaTypeAudio) == WKAudiovisualMediaTypeAudio)));
     464    pageConfiguration->preferenceValues().set(WebKit::WebPreferencesKey::requiresUserGestureToLoadVideoKey(), WebKit::WebPreferencesStore::Value(shouldRequireUserGestureToLoadVideo()));
    458465    pageConfiguration->preferenceValues().set(WebKit::WebPreferencesKey::mainContentUserGestureOverrideEnabledKey(), WebKit::WebPreferencesStore::Value(!![_configuration _mainContentUserGestureOverrideEnabled]));
    459466    pageConfiguration->preferenceValues().set(WebKit::WebPreferencesKey::invisibleAutoplayNotPermittedKey(), WebKit::WebPreferencesStore::Value(!![_configuration _invisibleAutoplayNotPermitted]));
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r206843 r207159  
    30223022    settings.setVideoPlaybackRequiresUserGesture(requiresUserGestureForMedia || store.getBoolValueForKey(WebPreferencesKey::requiresUserGestureForVideoPlaybackKey()));
    30233023    settings.setAudioPlaybackRequiresUserGesture(requiresUserGestureForMedia || store.getBoolValueForKey(WebPreferencesKey::requiresUserGestureForAudioPlaybackKey()));
     3024    settings.setRequiresUserGestureToLoadVideo(store.getBoolValueForKey(WebPreferencesKey::requiresUserGestureToLoadVideoKey()));
    30243025    settings.setMainContentUserGestureOverrideEnabled(store.getBoolValueForKey(WebPreferencesKey::mainContentUserGestureOverrideEnabledKey()));
    30253026    settings.setAllowsInlineMediaPlayback(store.getBoolValueForKey(WebPreferencesKey::allowsInlineMediaPlaybackKey()));
Note: See TracChangeset for help on using the changeset viewer.