Diff
Modified: trunk/LayoutTests/ChangeLog (251919 => 251920)
--- trunk/LayoutTests/ChangeLog 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/ChangeLog 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,3 +1,30 @@
+2019-11-01 Peng Liu <peng.l...@apple.com>
+
+ Picture-in-Picture layout test cases interfere with each other
+ https://bugs.webkit.org/show_bug.cgi?id=203614
+
+ Reviewed by Eric Carlson.
+
+ 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:
+
2019-11-01 Tim Horton <timothy_hor...@apple.com>
Turn on IOSurface support in the iOS Simulator
Modified: trunk/LayoutTests/media/picture-in-picture-api-enter-pip-1-expected.txt (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-enter-pip-1-expected.txt 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-enter-pip-1-expected.txt 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,6 +1,7 @@
This tests that request Picture-in-Picture requires a user gesture.
RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
+RUN(internals.setPictureInPictureAPITestEnabled(video, true))
RUN(video.src = "" "content/test"))
EVENT(canplaythrough)
EXPECTED (error.name == 'NotAllowedError') OK
Modified: trunk/LayoutTests/media/picture-in-picture-api-enter-pip-1.html (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-enter-pip-1.html 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-enter-pip-1.html 2019-11-01 15:57:34 UTC (rev 251920)
@@ -8,6 +8,7 @@
findMediaElement();
run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
+ run('internals.setPictureInPictureAPITestEnabled(video, true)');
run('video.src = "" "content/test")');
await waitFor(video, 'canplaythrough');
Modified: trunk/LayoutTests/media/picture-in-picture-api-enter-pip-2-expected.txt (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-enter-pip-2-expected.txt 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-enter-pip-2-expected.txt 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,6 +1,7 @@
This tests that request Picture-in-Picture requires loaded metadata for the video element.
RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
+RUN(internals.setPictureInPictureAPITestEnabled(video, true))
EXPECTED (error.name == 'InvalidStateError') OK
END OF TEST
Modified: trunk/LayoutTests/media/picture-in-picture-api-enter-pip-2.html (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-enter-pip-2.html 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-enter-pip-2.html 2019-11-01 15:57:34 UTC (rev 251920)
@@ -8,6 +8,7 @@
findMediaElement();
run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
+ run('internals.setPictureInPictureAPITestEnabled(video, true)');
runWithKeyDown(function() {
video.requestPictureInPicture()
.then(() => {
Modified: trunk/LayoutTests/media/picture-in-picture-api-enter-pip-3-expected.txt (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-enter-pip-3-expected.txt 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-enter-pip-3-expected.txt 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,6 +1,7 @@
This tests that request Picture-in-Picture requires video track for the video element.
RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
+RUN(internals.setPictureInPictureAPITestEnabled(video, true))
RUN(video.src = "" "content/test"))
EVENT(canplaythrough)
EXPECTED (error.name == 'InvalidStateError') OK
Modified: trunk/LayoutTests/media/picture-in-picture-api-enter-pip-3.html (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-enter-pip-3.html 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-enter-pip-3.html 2019-11-01 15:57:34 UTC (rev 251920)
@@ -8,6 +8,7 @@
findMediaElement();
run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
+ run('internals.setPictureInPictureAPITestEnabled(video, true)');
run('video.src = "" "content/test")');
await waitFor(video, 'canplaythrough');
runWithKeyDown(function() {
Modified: trunk/LayoutTests/media/picture-in-picture-api-enter-pip-4-expected.txt (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-enter-pip-4-expected.txt 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-enter-pip-4-expected.txt 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,6 +1,7 @@
This tests that request Picture-in-Picture resolves on user click.
RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
+RUN(internals.setPictureInPictureAPITestEnabled(video, true))
RUN(video.src = "" "content/test"))
EVENT(canplaythrough)
END OF TEST
Modified: trunk/LayoutTests/media/picture-in-picture-api-enter-pip-4.html (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-enter-pip-4.html 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-enter-pip-4.html 2019-11-01 15:57:34 UTC (rev 251920)
@@ -8,12 +8,16 @@
findMediaElement();
run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
+ run('internals.setPictureInPictureAPITestEnabled(video, true)');
+
run('video.src = "" "content/test")');
await waitFor(video, 'canplaythrough');
runWithKeyDown(function() {
video.requestPictureInPicture()
.then(() => {
- endTest();
+ document.exitPictureInPicture().then(endTest).catch(() => {
+ failTest('Failed to exit the Picture-in-Picture mode.');
+ });
})
.catch(() => {
failTest('request Picture-in-Picture does not resolve on user click.');
Modified: trunk/LayoutTests/media/picture-in-picture-api-exit-pip-1-expected.txt (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-exit-pip-1-expected.txt 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-exit-pip-1-expected.txt 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,6 +1,7 @@
This tests that exit Picture-in-Picture resolves when there is a Picture-in-Picture video.
RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
+RUN(internals.setPictureInPictureAPITestEnabled(video, true))
RUN(video.src = "" "content/test"))
EVENT(canplaythrough)
EVENT(enterpictureinpicture)
Modified: trunk/LayoutTests/media/picture-in-picture-api-exit-pip-1.html (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-exit-pip-1.html 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-exit-pip-1.html 2019-11-01 15:57:34 UTC (rev 251920)
@@ -8,18 +8,15 @@
findMediaElement();
run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
+ run('internals.setPictureInPictureAPITestEnabled(video, true)');
+
run('video.src = "" "content/test")');
await waitFor(video, 'canplaythrough');
+
runWithKeyDown(function() { video.requestPictureInPicture() });
await waitFor(video, 'enterpictureinpicture');
- runWithKeyDown(function() {
- document.exitPictureInPicture()
- .then(() => {
- endTest();
- })
- .catch(() => {
- failTest('Exit Picture-in-Picture resolves when there is a Picture-in-Picture video.')
- });
+ document.exitPictureInPicture().then(endTest).catch(() => {
+ failTest('Failed to exit the Picture-in-Picture mode.');
});
});
</script>
Modified: trunk/LayoutTests/media/picture-in-picture-api-exit-pip-2-expected.txt (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-exit-pip-2-expected.txt 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-exit-pip-2-expected.txt 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,5 +1,7 @@
This tests that exit Picture-in-Picture rejects when there is no Picture-in-Picture video.
+RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
+RUN(internals.setPictureInPictureAPITestEnabled(video, true))
EXPECTED (error.name == 'InvalidStateError') OK
END OF TEST
Modified: trunk/LayoutTests/media/picture-in-picture-api-exit-pip-2.html (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-exit-pip-2.html 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-exit-pip-2.html 2019-11-01 15:57:34 UTC (rev 251920)
@@ -6,16 +6,18 @@
<script>
window.addEventListener('load', async event => {
findMediaElement();
- runWithKeyDown(function() {
- document.exitPictureInPicture()
- .then(() => {
- failTest('Exit Picture-in-Picture rejects when there is no Picture-in-Picture video.');
- })
- .catch(error => {
- window.error = error;
- testExpected('error.name', 'InvalidStateError');
- endTest();
- });
+
+ run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
+ run('internals.setPictureInPictureAPITestEnabled(video, true)');
+
+ document.exitPictureInPicture()
+ .then(() => {
+ failTest('Exit Picture-in-Picture rejects when there is no Picture-in-Picture video.');
+ })
+ .catch(error => {
+ window.error = error;
+ testExpected('error.name', 'InvalidStateError');
+ endTest();
});
});
</script>
Modified: trunk/LayoutTests/media/picture-in-picture-api-pip-events-expected.txt (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-pip-events-expected.txt 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-pip-events-expected.txt 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,6 +1,7 @@
This tests that events are fired correctly when a video element enters and exits the Picture-in-Picture mode.
RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
+RUN(internals.setPictureInPictureAPITestEnabled(video, true))
RUN(video.src = "" "content/test"))
EVENT(canplaythrough)
EVENT(enterpictureinpicture)
Modified: trunk/LayoutTests/media/picture-in-picture-api-pip-events.html (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-pip-events.html 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-pip-events.html 2019-11-01 15:57:34 UTC (rev 251920)
@@ -8,6 +8,7 @@
findMediaElement();
run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
+ run('internals.setPictureInPictureAPITestEnabled(video, true)');
run('video.src = "" "content/test")');
await waitFor(video, 'canplaythrough');
@@ -14,8 +15,7 @@
runWithKeyDown(function() { video.requestPictureInPicture(); });
await waitFor(video, 'enterpictureinpicture');
-
- runWithKeyDown(function() { document.exitPictureInPicture(); });
+ document.exitPictureInPicture();
await waitFor(video, 'leavepictureinpicture');
endTest();
Modified: trunk/LayoutTests/media/picture-in-picture-api-pip-window-expected.txt (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-pip-window-expected.txt 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-pip-window-expected.txt 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,6 +1,7 @@
This tests that a pip window is returned correctly when a video element enters the Picture-in-Picture mode.
RUN(internals.settings.setAllowsPictureInPictureMediaPlayback(true))
+RUN(internals.setPictureInPictureAPITestEnabled(video, true))
RUN(video.src = "" "content/test"))
EVENT(canplaythrough)
EXPECTED (pipWindow.width > '0') OK
Modified: trunk/LayoutTests/media/picture-in-picture-api-pip-window.html (251919 => 251920)
--- trunk/LayoutTests/media/picture-in-picture-api-pip-window.html 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/LayoutTests/media/picture-in-picture-api-pip-window.html 2019-11-01 15:57:34 UTC (rev 251920)
@@ -8,6 +8,7 @@
findMediaElement();
run('internals.settings.setAllowsPictureInPictureMediaPlayback(true)');
+ run('internals.setPictureInPictureAPITestEnabled(video, true)');
run('video.src = "" "content/test")');
await waitFor(video, 'canplaythrough');
@@ -18,12 +19,16 @@
window.pipWindow = pipWindow;
testExpected('pipWindow.width', 0, '>');
testExpected('pipWindow.height', 0, '>');
- endTest();
+
+ document.exitPictureInPicture().then(endTest).catch(() => {
+ failTest('Failed to exit the Picture-in-Picture mode.');
+ });
})
.catch(error => {
failTest("Failed to enter the Picture-in-Picture mode.");
});
});
+
});
</script>
</head>
Modified: trunk/Source/WebCore/ChangeLog (251919 => 251920)
--- trunk/Source/WebCore/ChangeLog 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/Source/WebCore/ChangeLog 2019-11-01 15:57:34 UTC (rev 251920)
@@ -1,3 +1,29 @@
+2019-11-01 Peng Liu <peng.l...@apple.com>
+
+ Picture-in-Picture layout test cases interfere with each other
+ https://bugs.webkit.org/show_bug.cgi?id=203614
+
+ Reviewed by Eric Carlson.
+
+ 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:
+
2019-11-01 Zalan Bujtas <za...@apple.com>
[LFC][IFC] Add support for text-align: justify
Modified: trunk/Source/WebCore/html/HTMLVideoElement.cpp (251919 => 251920)
--- trunk/Source/WebCore/html/HTMLVideoElement.cpp 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/Source/WebCore/html/HTMLVideoElement.cpp 2019-11-01 15:57:34 UTC (rev 251920)
@@ -449,6 +449,22 @@
void HTMLVideoElement::setFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode mode)
{
+#if ENABLE(PICTURE_IN_PICTURE_API)
+ if (m_pictureInPictureAPITestEnabled) {
+ if (mode == VideoFullscreenModePictureInPicture) {
+ fullscreenModeChanged(mode);
+ didBecomeFullscreenElement();
+ setVideoFullscreenFrame({0, 0, 100, 100});
+ return;
+ }
+
+ if (mode == VideoFullscreenModeNone) {
+ fullscreenModeChanged(mode);
+ return;
+ }
+ }
+#endif
+
if (mode == VideoFullscreenModeNone && isFullscreen()) {
exitFullscreen();
return;
@@ -517,6 +533,11 @@
{
m_pictureInPictureObserver = observer;
}
+
+void HTMLVideoElement::setPictureInPictureAPITestEnabled(bool enabled)
+{
+ m_pictureInPictureAPITestEnabled = enabled;
+}
#endif
#endif
Modified: trunk/Source/WebCore/html/HTMLVideoElement.h (251919 => 251920)
--- trunk/Source/WebCore/html/HTMLVideoElement.h 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/Source/WebCore/html/HTMLVideoElement.h 2019-11-01 15:57:34 UTC (rev 251920)
@@ -92,6 +92,7 @@
#if ENABLE(PICTURE_IN_PICTURE_API)
WEBCORE_EXPORT void didBecomeFullscreenElement() final;
void setPictureInPictureObserver(PictureInPictureObserver*);
+ WEBCORE_EXPORT void setPictureInPictureAPITestEnabled(bool);
#endif
#endif
@@ -139,6 +140,8 @@
bool m_waitingForPictureInPictureWindowFrame { false };
bool m_isFullscreen { false };
PictureInPictureObserver* m_pictureInPictureObserver { nullptr };
+
+ bool m_pictureInPictureAPITestEnabled { false };
#endif
};
Modified: trunk/Source/WebCore/html/HTMLVideoElement.idl (251919 => 251920)
--- trunk/Source/WebCore/html/HTMLVideoElement.idl 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/Source/WebCore/html/HTMLVideoElement.idl 2019-11-01 15:57:34 UTC (rev 251920)
@@ -25,6 +25,7 @@
[
Conditional=VIDEO,
+ ExportMacro=WEBCORE_EXPORT,
JSGenerateToNativeObject,
] interface HTMLVideoElement : HTMLMediaElement {
[CEReactions=NotNeeded, Reflect] attribute unsigned long width;
Modified: trunk/Source/WebCore/testing/Internals.cpp (251919 => 251920)
--- trunk/Source/WebCore/testing/Internals.cpp 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/Source/WebCore/testing/Internals.cpp 2019-11-01 15:57:34 UTC (rev 251920)
@@ -5273,6 +5273,13 @@
}
#endif
+#if ENABLE(PICTURE_IN_PICTURE_API)
+void Internals::setPictureInPictureAPITestEnabled(HTMLVideoElement& videoElement, bool enabled)
+{
+ videoElement.setPictureInPictureAPITestEnabled(enabled);
+}
+#endif
+
void Internals::setMaxCanvasPixelMemory(unsigned size)
{
HTMLCanvasElement::setMaxPixelMemoryForTesting(size);
Modified: trunk/Source/WebCore/testing/Internals.h (251919 => 251920)
--- trunk/Source/WebCore/testing/Internals.h 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/Source/WebCore/testing/Internals.h 2019-11-01 15:57:34 UTC (rev 251920)
@@ -72,6 +72,7 @@
class HTMLMediaElement;
class HTMLPictureElement;
class HTMLSelectElement;
+class HTMLVideoElement;
class ImageData;
class InspectorStubFrontend;
class InternalSettings;
@@ -898,6 +899,10 @@
void setMockWebAuthenticationConfiguration(const MockWebAuthenticationConfiguration&);
#endif
+#if ENABLE(PICTURE_IN_PICTURE_API)
+ void setPictureInPictureAPITestEnabled(HTMLVideoElement&, bool);
+#endif
+
int processIdentifier() const;
private:
Modified: trunk/Source/WebCore/testing/Internals.idl (251919 => 251920)
--- trunk/Source/WebCore/testing/Internals.idl 2019-11-01 15:53:02 UTC (rev 251919)
+++ trunk/Source/WebCore/testing/Internals.idl 2019-11-01 15:57:34 UTC (rev 251920)
@@ -813,4 +813,6 @@
void addPrefetchLoadEventListener(HTMLLinkElement link, EventListener? callback);
[Conditional=WEB_AUTHN] void setMockWebAuthenticationConfiguration(MockWebAuthenticationConfiguration configuration);
+
+ [Conditional=PICTURE_IN_PICTURE_API] void setPictureInPictureAPITestEnabled(HTMLVideoElement videoElement, boolean enabled);
};