| <!DOCTYPE html><!-- webkit-test-runner [ enableModernMediaControls=false ] --> |
| <html> |
| <head> |
| <script src="../media-file.js"></script> |
| <script src="controls-test-helpers.js"></script> |
| <script> |
| var maxAttemptsToTestPlaceholderVisibility = 10; |
| var attemptsToTestPlaceholderVisibility = 0; |
| |
| if (window.internals) |
| window.internals.settings.setAllowsPictureInPictureMediaPlayback(true); |
| |
| const tester = new ControlsTest("non-existent-media-file", "error") |
| .whenReady(runTestsWithoutVideo) |
| .start(); |
| |
| function runTestsWithoutVideo() |
| { |
| const currentState = tester.currentState; |
| tester.test("We are using the apple idiom") |
| .value(currentState.idiom) |
| .isEqualTo("apple"); |
| |
| tester.startNewSection("Test the picture-in-picture button without video", true); |
| |
| const stateForPictureInPictureButton = tester.stateForControlsElement("Picture-in-picture Button"); |
| tester.test("Picture-in-picture button should not be visible if there's no video") |
| .value(stateForPictureInPictureButton.className) |
| .contains("hidden"); |
| |
| tester.resetEventTrigger("canplaythrough") |
| .whenReady(runTestsWithVideo) |
| .media.src = findMediaFile("video", "../content/test"); |
| } |
| |
| function runTestsWithVideo() |
| { |
| tester.startNewSection("Test the picture-in-picture button with valid video"); |
| |
| const stateForPictureInPictureButton = tester.stateForControlsElement("Picture-in-picture Button", true); |
| tester.test("Picture-in-picture button should be visible if there's video") |
| .value(stateForPictureInPictureButton.className) |
| .doesNotContain("hidden"); |
| |
| tester.test("Picture-in-picture button should be in the dom if there's video") |
| .value(stateForPictureInPictureButton.parentElement) |
| .isNotEqualTo(undefined); |
| |
| const stateForPlaceholder = tester.stateForControlsElement("Inline playback placeholder", true); |
| tester.test("Inline placeholder should not be visible at this point") |
| .value(stateForPlaceholder.className) |
| .contains("hidden"); |
| |
| internals.setMediaElementRestrictions(tester.media, "NoRestrictions"); |
| tester.resetEventTrigger("webkitpresentationmodechanged") |
| .whenReady(testPIPPlaceholder) |
| .media.webkitSetPresentationMode("picture-in-picture"); |
| } |
| |
| function testPIPPlaceholder() |
| { |
| tester.startNewSection("Test for the pip placeholder visibility in pip mode"); |
| |
| tester.test("Should be in pip mode") |
| .value(tester.media.webkitPresentationMode) |
| .isEqualTo("picture-in-picture"); |
| |
| pollPIPPlaceholderVisibilityChange(); |
| } |
| |
| function pollPIPPlaceholderVisibilityChange() |
| { |
| const stateForPlaceholder = tester.stateForControlsElement("Inline playback placeholder", true); |
| if (stateForPlaceholder.className.indexOf("hidden") >= 0) { |
| if (attemptsToTestPlaceholderVisibility > maxAttemptsToTestPlaceholderVisibility) { |
| tester.logFailure("Inline placeholder did not become visible after video enters picture-in-picture."); |
| tester.end(); |
| return; |
| } |
| |
| // Use 33 to match PlaceholderPollingDelay in mediaControlsApple.js. |
| setTimeout(pollPIPPlaceholderVisibilityChange, 33); |
| attemptsToTestPlaceholderVisibility++; |
| return; |
| } |
| |
| tester.test("Inline placeholder should be visible at this point") |
| .value(stateForPlaceholder.className) |
| .doesNotContain("hidden"); |
| |
| const controlsObserver = new MutationObserver(controlsDidChange); |
| controlsObserver.observe(tester.media, { attributes: true, attributeFilter: ['controls'] }); |
| |
| tester.media.removeAttribute('controls'); |
| } |
| |
| function controlsDidChange() |
| { |
| tester.startNewSection("Test for the pip placeholder visibility in pip mode without a 'controls' attribute"); |
| |
| tester.test("Should still be in pip mode") |
| .value(tester.media.webkitPresentationMode) |
| .isEqualTo("picture-in-picture"); |
| |
| tester.test("No controls attribute") |
| .value(tester.media.hasAttribute('controls')) |
| .isFalse(); |
| |
| const stateForPlaceholder = tester.stateForControlsElement("Inline playback placeholder", true); |
| tester.test("Inline placeholder should still be visible") |
| .value(stateForPlaceholder.className) |
| .doesNotContain("hidden"); |
| |
| tester.media.webkitSetPresentationMode("inline"); |
| |
| tester.end(); |
| } |
| </script> |
| </head> |
| <body> |
| <p>This tests the picture-in-picture button.</p> |
| <p>This test only runs in DRT!</p> |
| <video controls></video> |
| </body> |
| </html> |