Changeset 251920 in webkit


Ignore:
Timestamp:
Nov 1, 2019 8:57:34 AM (4 years ago)
Author:
commit-queue@webkit.org
Message:

Picture-in-Picture layout test cases interfere with each other
https://bugs.webkit.org/show_bug.cgi?id=203614

Patch by Peng Liu <Peng Liu> on 2019-11-01
Reviewed by Eric Carlson.

Source/WebCore:

Fix test running issues, no new test is needed.

Add a member variable m_pictureInPictureAPITestEnabled to the HTMLVideoElement class.
When this variable is true, HTMLVideoElement::setFullscreenMode() will mock the
behavior of the Picture-in-Picture mode changing without the AVKit/CoreMedia involvement.
So we can run multiple layout test cases for Picture-in-Picture API simultaneously.
Note: this solution only tests the code for the Picture-in-Picture API implementation!
We still need to use the API tests to test the Picture-in-Picture implementation end-to-end.

  • html/HTMLVideoElement.cpp:

(WebCore::HTMLVideoElement::setFullscreenMode):
(WebCore::HTMLVideoElement::setPictureInPictureAPITestEnabled):

  • html/HTMLVideoElement.h:
  • html/HTMLVideoElement.idl:
  • testing/Internals.cpp:

(WebCore::Internals::setPictureInPictureAPITestEnabled):

  • testing/Internals.h:
  • testing/Internals.idl:

LayoutTests:

Use "internals.setPictureInPictureAPITestEnabled(video, true)" to test
the picture-in-picture API implementation without AVKit/CoreMedia stuffs.

  • media/picture-in-picture-api-enter-pip-1-expected.txt:
  • media/picture-in-picture-api-enter-pip-1.html:
  • media/picture-in-picture-api-enter-pip-2-expected.txt:
  • media/picture-in-picture-api-enter-pip-2.html:
  • media/picture-in-picture-api-enter-pip-3-expected.txt:
  • media/picture-in-picture-api-enter-pip-3.html:
  • media/picture-in-picture-api-enter-pip-4-expected.txt:
  • media/picture-in-picture-api-enter-pip-4.html:
  • media/picture-in-picture-api-exit-pip-1-expected.txt:
  • media/picture-in-picture-api-exit-pip-1.html:
  • media/picture-in-picture-api-exit-pip-2-expected.txt:
  • media/picture-in-picture-api-exit-pip-2.html:
  • media/picture-in-picture-api-pip-events-expected.txt:
  • media/picture-in-picture-api-pip-events.html:
  • media/picture-in-picture-api-pip-window-expected.txt:
  • media/picture-in-picture-api-pip-window.html:
Location:
trunk
Files:
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r251913 r251920  
     12019-11-01  Peng Liu  <peng.liu6@apple.com>
     2
     3        Picture-in-Picture layout test cases interfere with each other
     4        https://bugs.webkit.org/show_bug.cgi?id=203614
     5
     6        Reviewed by Eric Carlson.
     7
     8        Use "internals.setPictureInPictureAPITestEnabled(video, true)" to test
     9        the picture-in-picture API implementation without AVKit/CoreMedia stuffs.
     10
     11        * media/picture-in-picture-api-enter-pip-1-expected.txt:
     12        * media/picture-in-picture-api-enter-pip-1.html:
     13        * media/picture-in-picture-api-enter-pip-2-expected.txt:
     14        * media/picture-in-picture-api-enter-pip-2.html:
     15        * media/picture-in-picture-api-enter-pip-3-expected.txt:
     16        * media/picture-in-picture-api-enter-pip-3.html:
     17        * media/picture-in-picture-api-enter-pip-4-expected.txt:
     18        * media/picture-in-picture-api-enter-pip-4.html:
     19        * media/picture-in-picture-api-exit-pip-1-expected.txt:
     20        * media/picture-in-picture-api-exit-pip-1.html:
     21        * media/picture-in-picture-api-exit-pip-2-expected.txt:
     22        * media/picture-in-picture-api-exit-pip-2.html:
     23        * media/picture-in-picture-api-pip-events-expected.txt:
     24        * media/picture-in-picture-api-pip-events.html:
     25        * media/picture-in-picture-api-pip-window-expected.txt:
     26        * media/picture-in-picture-api-pip-window.html:
     27
    1282019-11-01  Tim Horton  <timothy_horton@apple.com>
    229
  • trunk/LayoutTests/media/picture-in-picture-api-enter-pip-1-expected.txt

    r251745 r251920  
    22
    33RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
     4RUN(internals.setPictureInPictureAPITestEnabled(video, true))
    45RUN(video.src = findMediaFile("video", "content/test"))
    56EVENT(canplaythrough)
  • trunk/LayoutTests/media/picture-in-picture-api-enter-pip-1.html

    r251745 r251920  
    99
    1010            run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
     11            run('internals.setPictureInPictureAPITestEnabled(video, true)');
    1112            run('video.src = findMediaFile("video", "content/test")');
    1213            await waitFor(video, 'canplaythrough');
  • trunk/LayoutTests/media/picture-in-picture-api-enter-pip-2-expected.txt

    r251745 r251920  
    22
    33RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
     4RUN(internals.setPictureInPictureAPITestEnabled(video, true))
    45EXPECTED (error.name == 'InvalidStateError') OK
    56END OF TEST
  • trunk/LayoutTests/media/picture-in-picture-api-enter-pip-2.html

    r251745 r251920  
    99
    1010            run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
     11            run('internals.setPictureInPictureAPITestEnabled(video, true)');
    1112            runWithKeyDown(function() {
    1213                video.requestPictureInPicture()
  • trunk/LayoutTests/media/picture-in-picture-api-enter-pip-3-expected.txt

    r251745 r251920  
    22
    33RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
     4RUN(internals.setPictureInPictureAPITestEnabled(video, true))
    45RUN(video.src = findMediaFile("audio", "content/test"))
    56EVENT(canplaythrough)
  • trunk/LayoutTests/media/picture-in-picture-api-enter-pip-3.html

    r251745 r251920  
    99
    1010            run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
     11            run('internals.setPictureInPictureAPITestEnabled(video, true)');
    1112            run('video.src = findMediaFile("audio", "content/test")');
    1213            await waitFor(video, 'canplaythrough');
  • trunk/LayoutTests/media/picture-in-picture-api-enter-pip-4-expected.txt

    r251745 r251920  
    22
    33RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
     4RUN(internals.setPictureInPictureAPITestEnabled(video, true))
    45RUN(video.src = findMediaFile("video", "content/test"))
    56EVENT(canplaythrough)
  • trunk/LayoutTests/media/picture-in-picture-api-enter-pip-4.html

    r251745 r251920  
    99
    1010            run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
     11            run('internals.setPictureInPictureAPITestEnabled(video, true)');
     12
    1113            run('video.src = findMediaFile("video", "content/test")');
    1214            await waitFor(video, 'canplaythrough');
     
    1416                video.requestPictureInPicture()
    1517                .then(() => {
    16                     endTest();
     18                    document.exitPictureInPicture().then(endTest).catch(() => {
     19                        failTest('Failed to exit the Picture-in-Picture mode.');
     20                    });
    1721                })
    1822                .catch(() => {
  • trunk/LayoutTests/media/picture-in-picture-api-exit-pip-1-expected.txt

    r251745 r251920  
    22
    33RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
     4RUN(internals.setPictureInPictureAPITestEnabled(video, true))
    45RUN(video.src = findMediaFile("video", "content/test"))
    56EVENT(canplaythrough)
  • trunk/LayoutTests/media/picture-in-picture-api-exit-pip-1.html

    r251745 r251920  
    99
    1010            run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
     11            run('internals.setPictureInPictureAPITestEnabled(video, true)');
     12
    1113            run('video.src = findMediaFile("video", "content/test")');
    1214            await waitFor(video, 'canplaythrough');
     15
    1316            runWithKeyDown(function() { video.requestPictureInPicture() });
    1417            await waitFor(video, 'enterpictureinpicture');
    15             runWithKeyDown(function() {
    16                 document.exitPictureInPicture()
    17                 .then(() => {
    18                     endTest();
    19                 })
    20                 .catch(() => {
    21                     failTest('Exit Picture-in-Picture resolves when there is a Picture-in-Picture video.')
    22                 });
     18            document.exitPictureInPicture().then(endTest).catch(() => {
     19                failTest('Failed to exit the Picture-in-Picture mode.');
    2320            });
    2421        });
  • trunk/LayoutTests/media/picture-in-picture-api-exit-pip-2-expected.txt

    r251745 r251920  
    11This tests that exit Picture-in-Picture rejects when there is no Picture-in-Picture video.
    22
     3RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
     4RUN(internals.setPictureInPictureAPITestEnabled(video, true))
    35EXPECTED (error.name == 'InvalidStateError') OK
    46END OF TEST
  • trunk/LayoutTests/media/picture-in-picture-api-exit-pip-2.html

    r251745 r251920  
    77        window.addEventListener('load', async event => {
    88            findMediaElement();
    9             runWithKeyDown(function() {
    10                 document.exitPictureInPicture()
    11                 .then(() => {
    12                     failTest('Exit Picture-in-Picture rejects when there is no Picture-in-Picture video.');
    13                 })
    14                 .catch(error => {
    15                     window.error = error;
    16                     testExpected('error.name', 'InvalidStateError');
    17                     endTest();
    18                 });
     9
     10            run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
     11            run('internals.setPictureInPictureAPITestEnabled(video, true)');
     12
     13            document.exitPictureInPicture()
     14            .then(() => {
     15                failTest('Exit Picture-in-Picture rejects when there is no Picture-in-Picture video.');
     16            })
     17            .catch(error => {
     18                window.error = error;
     19                testExpected('error.name', 'InvalidStateError');
     20                endTest();
    1921            });
    2022        });
  • trunk/LayoutTests/media/picture-in-picture-api-pip-events-expected.txt

    r251834 r251920  
    22
    33RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
     4RUN(internals.setPictureInPictureAPITestEnabled(video, true))
    45RUN(video.src = findMediaFile("video", "content/test"))
    56EVENT(canplaythrough)
  • trunk/LayoutTests/media/picture-in-picture-api-pip-events.html

    r251834 r251920  
    99
    1010            run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
     11            run('internals.setPictureInPictureAPITestEnabled(video, true)');
    1112
    1213            run('video.src = findMediaFile("video", "content/test")');
     
    1516            runWithKeyDown(function() { video.requestPictureInPicture(); });
    1617            await waitFor(video, 'enterpictureinpicture');
    17 
    18             runWithKeyDown(function() { document.exitPictureInPicture(); });
     18            document.exitPictureInPicture();
    1919            await waitFor(video, 'leavepictureinpicture');
    2020
  • trunk/LayoutTests/media/picture-in-picture-api-pip-window-expected.txt

    r251834 r251920  
    22
    33RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
     4RUN(internals.setPictureInPictureAPITestEnabled(video, true))
    45RUN(video.src = findMediaFile("video", "content/test"))
    56EVENT(canplaythrough)
  • trunk/LayoutTests/media/picture-in-picture-api-pip-window.html

    r251834 r251920  
    99
    1010            run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
     11            run('internals.setPictureInPictureAPITestEnabled(video, true)');
    1112
    1213            run('video.src = findMediaFile("video", "content/test")');
     
    1920                    testExpected('pipWindow.width', 0, '>');
    2021                    testExpected('pipWindow.height', 0, '>');
    21                     endTest();
     22
     23                    document.exitPictureInPicture().then(endTest).catch(() => {
     24                        failTest('Failed to exit the Picture-in-Picture mode.');
     25                    });
    2226                })
    2327                .catch(error => {
     
    2529                });
    2630            });
     31
    2732        });
    2833    </script>
  • trunk/Source/WebCore/ChangeLog

    r251917 r251920  
     12019-11-01  Peng Liu  <peng.liu6@apple.com>
     2
     3        Picture-in-Picture layout test cases interfere with each other
     4        https://bugs.webkit.org/show_bug.cgi?id=203614
     5
     6        Reviewed by Eric Carlson.
     7
     8        Fix test running issues, no new test is needed.
     9
     10        Add a member variable m_pictureInPictureAPITestEnabled to the HTMLVideoElement class.
     11        When this variable is true, HTMLVideoElement::setFullscreenMode() will mock the
     12        behavior of the Picture-in-Picture mode changing without the AVKit/CoreMedia involvement.
     13        So we can run multiple layout test cases for Picture-in-Picture API simultaneously.
     14        Note: this solution only tests the code for the Picture-in-Picture API implementation!
     15        We still need to use the API tests to test the Picture-in-Picture implementation end-to-end.
     16
     17        * html/HTMLVideoElement.cpp:
     18        (WebCore::HTMLVideoElement::setFullscreenMode):
     19        (WebCore::HTMLVideoElement::setPictureInPictureAPITestEnabled):
     20        * html/HTMLVideoElement.h:
     21        * html/HTMLVideoElement.idl:
     22        * testing/Internals.cpp:
     23        (WebCore::Internals::setPictureInPictureAPITestEnabled):
     24        * testing/Internals.h:
     25        * testing/Internals.idl:
     26
    1272019-11-01  Zalan Bujtas  <zalan@apple.com>
    228
  • trunk/Source/WebCore/html/HTMLVideoElement.cpp

    r251834 r251920  
    450450void HTMLVideoElement::setFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode mode)
    451451{
     452#if ENABLE(PICTURE_IN_PICTURE_API)
     453    if (m_pictureInPictureAPITestEnabled) {
     454        if (mode == VideoFullscreenModePictureInPicture) {
     455            fullscreenModeChanged(mode);
     456            didBecomeFullscreenElement();
     457            setVideoFullscreenFrame({0, 0, 100, 100});
     458            return;
     459        }
     460
     461        if (mode == VideoFullscreenModeNone) {
     462            fullscreenModeChanged(mode);
     463            return;
     464        }
     465    }
     466#endif
     467
    452468    if (mode == VideoFullscreenModeNone && isFullscreen()) {
    453469        exitFullscreen();
     
    518534    m_pictureInPictureObserver = observer;
    519535}
     536
     537void HTMLVideoElement::setPictureInPictureAPITestEnabled(bool enabled)
     538{
     539    m_pictureInPictureAPITestEnabled = enabled;
     540}
    520541#endif
    521542
  • trunk/Source/WebCore/html/HTMLVideoElement.h

    r251745 r251920  
    9393    WEBCORE_EXPORT void didBecomeFullscreenElement() final;
    9494    void setPictureInPictureObserver(PictureInPictureObserver*);
     95    WEBCORE_EXPORT void setPictureInPictureAPITestEnabled(bool);
    9596#endif
    9697#endif
     
    140141    bool m_isFullscreen { false };
    141142    PictureInPictureObserver* m_pictureInPictureObserver { nullptr };
     143
     144    bool m_pictureInPictureAPITestEnabled { false };
    142145#endif
    143146};
  • trunk/Source/WebCore/html/HTMLVideoElement.idl

    r238748 r251920  
    2626[
    2727    Conditional=VIDEO,
     28    ExportMacro=WEBCORE_EXPORT,
    2829    JSGenerateToNativeObject,
    2930] interface HTMLVideoElement : HTMLMediaElement {
  • trunk/Source/WebCore/testing/Internals.cpp

    r251737 r251920  
    52745274#endif
    52755275
     5276#if ENABLE(PICTURE_IN_PICTURE_API)
     5277void Internals::setPictureInPictureAPITestEnabled(HTMLVideoElement& videoElement, bool enabled)
     5278{
     5279    videoElement.setPictureInPictureAPITestEnabled(enabled);
     5280}
     5281#endif
     5282
    52765283void Internals::setMaxCanvasPixelMemory(unsigned size)
    52775284{
  • trunk/Source/WebCore/testing/Internals.h

    r251737 r251920  
    7373class HTMLPictureElement;
    7474class HTMLSelectElement;
     75class HTMLVideoElement;
    7576class ImageData;
    7677class InspectorStubFrontend;
     
    899900#endif
    900901
     902#if ENABLE(PICTURE_IN_PICTURE_API)
     903    void setPictureInPictureAPITestEnabled(HTMLVideoElement&, bool);
     904#endif
     905
    901906    int processIdentifier() const;
    902907
  • trunk/Source/WebCore/testing/Internals.idl

    r251737 r251920  
    814814
    815815    [Conditional=WEB_AUTHN] void setMockWebAuthenticationConfiguration(MockWebAuthenticationConfiguration configuration);
    816 };
     816
     817    [Conditional=PICTURE_IN_PICTURE_API] void setPictureInPictureAPITestEnabled(HTMLVideoElement videoElement, boolean enabled);
     818};
Note: See TracChangeset for help on using the changeset viewer.