Changeset 251745 in webkit
- Timestamp:
- Oct 29, 2019 5:21:19 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 16 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r251742 r251745 1 2019-10-29 Peng Liu <peng.liu6@apple.com> 2 3 [Picture-in-Picture Web API] Implement PictureInPictureWindow 4 https://bugs.webkit.org/show_bug.cgi?id=202615 5 6 Reviewed by Eric Carlson. 7 8 Add layout test cases for the Picture-in-Picture API. 9 10 * TestExpectations: 11 * media/picture-in-picture-api-enter-pip-1-expected.txt: Added. 12 * media/picture-in-picture-api-enter-pip-1.html: Added. 13 * media/picture-in-picture-api-enter-pip-2-expected.txt: Added. 14 * media/picture-in-picture-api-enter-pip-2.html: Added. 15 * media/picture-in-picture-api-enter-pip-3-expected.txt: Added. 16 * media/picture-in-picture-api-enter-pip-3.html: Added. 17 * media/picture-in-picture-api-enter-pip-4-expected.txt: Added. 18 * media/picture-in-picture-api-enter-pip-4.html: Added. 19 * media/picture-in-picture-api-exit-pip-1-expected.txt: Added. 20 * media/picture-in-picture-api-exit-pip-1.html: Added. 21 * media/picture-in-picture-api-exit-pip-2-expected.txt: Added. 22 * media/picture-in-picture-api-exit-pip-2.html: Added. 23 * media/picture-in-picture-api-pip-events-expected.txt: Added. 24 * media/picture-in-picture-api-pip-events.html: Added. 25 * media/picture-in-picture-api-pip-window-expected.txt: Added. 26 * media/picture-in-picture-api-pip-window.html: Added. 27 * platform/mac-wk2/TestExpectations: 28 1 29 2019-10-29 Antoine Quint <graouts@apple.com> 2 30 -
trunk/LayoutTests/TestExpectations
r251731 r251745 196 196 # PiP API tests are only relevant on mac and iPad 197 197 media/picture-in-picture-api-element-attributes.html [ Skip ] 198 media/picture-in-picture-api-enter-pip-1.html [ Skip ] 199 media/picture-in-picture-api-enter-pip-2.html [ Skip ] 200 media/picture-in-picture-api-enter-pip-3.html [ Skip ] 201 media/picture-in-picture-api-enter-pip-4.html [ Skip ] 202 media/picture-in-picture-api-exit-pip-1.html [ Skip ] 203 media/picture-in-picture-api-exit-pip-2.html [ Skip ] 204 media/picture-in-picture-api-pip-events.html [ Skip ] 205 media/picture-in-picture-api-pip-window.html [ Skip ] 198 206 199 207 # Shared Workers are unsupported -
trunk/LayoutTests/platform/mac-wk2/TestExpectations
r251715 r251745 543 543 [ Sierra+ ] media/pip-video-going-into-fullscreen.html [ Pass ] 544 544 [ Sierra+ ] media/picture-in-picture-api-element-attributes.html [ Pass ] 545 [ Sierra+ ] media/picture-in-picture-api-enter-pip-1.html [ Pass ] 546 [ Sierra+ ] media/picture-in-picture-api-enter-pip-2.html [ Pass ] 547 [ Sierra+ ] media/picture-in-picture-api-enter-pip-3.html [ Pass ] 548 [ Sierra+ ] media/picture-in-picture-api-enter-pip-4.html [ Pass ] 549 [ Sierra+ ] media/picture-in-picture-api-exit-pip-1.html [ Pass ] 550 [ Sierra+ ] media/picture-in-picture-api-exit-pip-2.html [ Pass ] 551 [ Sierra+ ] media/picture-in-picture-api-pip-events.html [ Pass ] 552 [ Sierra+ ] media/picture-in-picture-api-pip-window.html [ Pass ] 545 553 546 554 # RTL Scrollbars are enabled on Sierra WebKit2. -
trunk/Source/WebCore/ChangeLog
r251742 r251745 1 2019-10-29 Peng Liu <peng.liu6@apple.com> 2 3 [Picture-in-Picture Web API] Implement PictureInPictureWindow 4 https://bugs.webkit.org/show_bug.cgi?id=202615 5 6 Reviewed by Eric Carlson. 7 8 Tests: media/picture-in-picture-api-enter-pip-1.html 9 media/picture-in-picture-api-enter-pip-2.html 10 media/picture-in-picture-api-enter-pip-3.html 11 media/picture-in-picture-api-enter-pip-4.html 12 media/picture-in-picture-api-exit-pip-1.html 13 media/picture-in-picture-api-exit-pip-2.html 14 media/picture-in-picture-api-pip-events.html 15 media/picture-in-picture-api-pip-window.html 16 17 * Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp: 18 (WebCore::HTMLVideoElementPictureInPicture::HTMLVideoElementPictureInPicture): 19 (WebCore::HTMLVideoElementPictureInPicture::requestPictureInPicture): 20 (WebCore::HTMLVideoElementPictureInPicture::didEnterPictureInPicture): 21 (WebCore::HTMLVideoElementPictureInPicture::didExitPictureInPicture): 22 (WebCore::HTMLVideoElementPictureInPicture::pictureInPictureWindowResized): 23 * Modules/pictureinpicture/HTMLVideoElementPictureInPicture.h: 24 * Modules/pictureinpicture/PictureInPictureWindow.cpp: 25 (WebCore::PictureInPictureWindow::create): 26 (WebCore::PictureInPictureWindow::PictureInPictureWindow): 27 (WebCore::PictureInPictureWindow::setSize): 28 (WebCore::PictureInPictureWindow::close): 29 * Modules/pictureinpicture/PictureInPictureWindow.h: 30 * html/HTMLVideoElement.cpp: 31 (WebCore::HTMLVideoElement::fullscreenModeChanged): 32 (WebCore::HTMLVideoElement::didBecomeFullscreenElement): 33 (WebCore::HTMLVideoElement::setPictureInPictureObserver): 34 (WebCore::HTMLVideoElement::setVideoFullscreenFrame): 35 * html/HTMLVideoElement.h: 36 * platform/PictureInPictureObserver.h: 37 1 38 2019-10-29 Antoine Quint <graouts@apple.com> 2 39 -
trunk/Source/WebCore/Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp
r251530 r251745 32 32 #include "HTMLVideoElement.h" 33 33 #include "JSDOMPromiseDeferred.h" 34 #include "JSPictureInPictureWindow.h" 34 35 #include "Logging.h" 35 36 #include "PictureInPictureWindow.h" … … 43 44 HTMLVideoElementPictureInPicture::HTMLVideoElementPictureInPicture(HTMLVideoElement& videoElement) 44 45 : m_videoElement(videoElement) 46 , m_pictureInPictureWindow(PictureInPictureWindow::create(videoElement.document())) 45 47 #if !RELEASE_LOG_DISABLED 46 48 , m_logger(videoElement.document().logger()) … … 71 73 void HTMLVideoElementPictureInPicture::requestPictureInPicture(HTMLVideoElement& videoElement, Ref<DeferredPromise>&& promise) 72 74 { 73 if (!videoElement.player() || !videoElement.player()->supportsPictureInPicture()) {74 promise->reject(NotSupportedError, "The video element does not support the Picture-in-Picture mode.");75 return;76 }77 78 75 if (videoElement.readyState() == HTMLMediaElementEnums::HAVE_NOTHING) { 79 76 promise->reject(InvalidStateError, "The video element is not ready to enter the Picture-in-Picture mode."); … … 94 91 } 95 92 93 auto videoElementPictureInPicture = HTMLVideoElementPictureInPicture::from(videoElement); 96 94 if (videoElement.document().pictureInPictureElement() == &videoElement) { 97 promise->re ject(NotAllowedError, "The video element is already in the Picture-in-Picture mode.");95 promise->resolve<IDLInterface<PictureInPictureWindow>>(*(videoElementPictureInPicture->m_pictureInPictureWindow)); 98 96 return; 99 97 } 100 98 101 auto videoElementPictureInPicture = HTMLVideoElementPictureInPicture::from(videoElement);102 99 if (videoElementPictureInPicture->m_enterPictureInPicturePromise || videoElementPictureInPicture->m_exitPictureInPicturePromise) { 103 100 promise->reject(NotAllowedError, "The video element is processing a Picture-in-Picture request."); … … 144 141 } 145 142 146 void HTMLVideoElementPictureInPicture::didEnterPictureInPicture( IntSizewindowSize)143 void HTMLVideoElementPictureInPicture::didEnterPictureInPicture(const IntSize& windowSize) 147 144 { 148 145 INFO_LOG(LOGIDENTIFIER); 149 146 m_videoElement.document().setPictureInPictureElement(&m_videoElement); 147 m_pictureInPictureWindow->setSize(windowSize); 148 150 149 if (m_enterPictureInPicturePromise) { 151 150 EnterPictureInPictureEvent::Init initializer; 152 151 initializer.bubbles = true; 153 initializer.pictureInPictureWindow = PictureInPictureWindow::create(m_videoElement.document(), windowSize.width(), windowSize.height());152 initializer.pictureInPictureWindow = m_pictureInPictureWindow; 154 153 m_videoElement.scheduleEvent(EnterPictureInPictureEvent::create(eventNames().enterpictureinpictureEvent, WTFMove(initializer))); 155 156 m_enterPictureInPicturePromise->resolve(); 154 m_enterPictureInPicturePromise->resolve<IDLInterface<PictureInPictureWindow>>(*m_pictureInPictureWindow); 157 155 m_enterPictureInPicturePromise = nullptr; 158 156 } … … 162 160 { 163 161 INFO_LOG(LOGIDENTIFIER); 162 m_pictureInPictureWindow->close(); 164 163 m_videoElement.document().setPictureInPictureElement(nullptr); 164 165 165 if (m_exitPictureInPicturePromise) { 166 166 m_videoElement.scheduleEvent(Event::create(eventNames().leavepictureinpictureEvent, Event::CanBubble::Yes, Event::IsCancelable::No)); 167 168 167 m_exitPictureInPicturePromise->resolve(); 169 168 m_exitPictureInPicturePromise = nullptr; 170 169 } 170 } 171 172 void HTMLVideoElementPictureInPicture::pictureInPictureWindowResized(const IntSize& windowSize) 173 { 174 if (m_pictureInPictureWindow->width() == windowSize.width() && m_pictureInPictureWindow->height() == windowSize.height()) 175 return; 176 177 m_pictureInPictureWindow->setSize(windowSize); 178 auto resizeEvent = Event::create(eventNames().resizeEvent, Event::CanBubble::Yes, Event::IsCancelable::No); 179 resizeEvent->setTarget(m_pictureInPictureWindow); 180 m_videoElement.scheduleEvent(WTFMove(resizeEvent)); 171 181 } 172 182 … … 178 188 #endif 179 189 180 void HTMLVideoElementPictureInPicture::pictureInPictureWindowResized(IntSize)181 {182 }183 184 190 } // namespace WebCore 185 191 -
trunk/Source/WebCore/Modules/pictureinpicture/HTMLVideoElementPictureInPicture.h
r251530 r251745 61 61 void exitPictureInPicture(Ref<DeferredPromise>&&); 62 62 63 void didEnterPictureInPicture( IntSize);63 void didEnterPictureInPicture(const IntSize&); 64 64 void didExitPictureInPicture(); 65 void pictureInPictureWindowResized( IntSize);65 void pictureInPictureWindowResized(const IntSize&); 66 66 67 67 #if !RELEASE_LOG_DISABLED … … 79 79 80 80 HTMLVideoElement& m_videoElement; 81 RefPtr<PictureInPictureWindow> m_pictureInPictureWindow; 81 82 RefPtr<DeferredPromise> m_enterPictureInPicturePromise; 82 83 RefPtr<DeferredPromise> m_exitPictureInPicturePromise; -
trunk/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.cpp
r251530 r251745 36 36 WTF_MAKE_ISO_ALLOCATED_IMPL(PictureInPictureWindow); 37 37 38 Ref<PictureInPictureWindow> PictureInPictureWindow::create(ScriptExecutionContext& scriptExecutionContext , int width, int height)38 Ref<PictureInPictureWindow> PictureInPictureWindow::create(ScriptExecutionContext& scriptExecutionContext) 39 39 { 40 return adoptRef(*new PictureInPictureWindow(scriptExecutionContext , width, height));40 return adoptRef(*new PictureInPictureWindow(scriptExecutionContext)); 41 41 } 42 42 43 PictureInPictureWindow::PictureInPictureWindow(ScriptExecutionContext& scriptExecutionContext , int width, int height)43 PictureInPictureWindow::PictureInPictureWindow(ScriptExecutionContext& scriptExecutionContext) 44 44 : m_scriptExecutionContext(scriptExecutionContext) 45 , m_width(width)46 , m_height(height)47 45 { 48 46 } … … 50 48 PictureInPictureWindow::~PictureInPictureWindow() = default; 51 49 50 void PictureInPictureWindow::setSize(const IntSize& size) 51 { 52 m_size = size; 53 } 54 55 void PictureInPictureWindow::close() 56 { 57 m_size = { 0, 0 }; 58 } 59 52 60 } // namespace WebCore 53 61 -
trunk/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.h
r251530 r251745 39 39 WTF_MAKE_ISO_ALLOCATED(PictureInPictureWindow); 40 40 public: 41 static Ref<PictureInPictureWindow> create(ScriptExecutionContext& , int, int);41 static Ref<PictureInPictureWindow> create(ScriptExecutionContext&); 42 42 virtual ~PictureInPictureWindow(); 43 43 44 int width() const { return m_width; } 45 int height() const { return m_height; } 44 int width() const { return m_size.width(); } 45 int height() const { return m_size.height(); } 46 void setSize(const IntSize&); 47 void close(); 46 48 47 49 using RefCounted<PictureInPictureWindow>::ref; … … 49 51 50 52 private: 51 PictureInPictureWindow(ScriptExecutionContext& , int, int);53 PictureInPictureWindow(ScriptExecutionContext&); 52 54 53 55 // EventTarget … … 58 60 59 61 ScriptExecutionContext& m_scriptExecutionContext; 60 int m_width; 61 int m_height; 62 IntSize m_size; 62 63 }; 63 64 -
trunk/Source/WebCore/html/HTMLVideoElement.cpp
r251530 r251745 493 493 HTMLVideoElement::VideoPresentationMode sourceVideoPresentationMode = toPresentationMode(fullscreenMode()); 494 494 495 if (targetVideoPresentationMode != HTMLVideoElement::VideoPresentationMode::PictureInPicture && sourceVideoPresentationMode == HTMLVideoElement::VideoPresentationMode::PictureInPicture) 495 if (targetVideoPresentationMode != HTMLVideoElement::VideoPresentationMode::PictureInPicture && sourceVideoPresentationMode == HTMLVideoElement::VideoPresentationMode::PictureInPicture) { 496 496 m_pictureInPictureObserver->didExitPictureInPicture(); 497 m_isFullscreen = false; 498 } 497 499 } 498 500 #endif … … 508 510 void HTMLVideoElement::didBecomeFullscreenElement() 509 511 { 512 m_isFullscreen = true; 510 513 m_waitingForPictureInPictureWindowFrame = true; 511 514 HTMLMediaElement::didBecomeFullscreenElement(); … … 516 519 m_pictureInPictureObserver = observer; 517 520 } 518 519 521 #endif 520 522 … … 527 529 528 530 #if ENABLE(PICTURE_IN_PICTURE_API) 531 // fullscreenMode() does not always provide the correct fullscreen mode 532 // when mode changing is happening (webkit.org/b/203443) 533 if (!m_isFullscreen) 534 return; 535 529 536 if (toPresentationMode(fullscreenMode()) != VideoPresentationMode::PictureInPicture) 530 537 return; -
trunk/Source/WebCore/html/HTMLVideoElement.h
r251530 r251745 138 138 #if ENABLE(PICTURE_IN_PICTURE_API) 139 139 bool m_waitingForPictureInPictureWindowFrame { false }; 140 bool m_isFullscreen { false }; 140 141 PictureInPictureObserver* m_pictureInPictureObserver { nullptr }; 141 142 #endif -
trunk/Source/WebCore/platform/PictureInPictureObserver.h
r251530 r251745 33 33 public: 34 34 virtual ~PictureInPictureObserver() { }; 35 virtual void didEnterPictureInPicture( IntSize) = 0;35 virtual void didEnterPictureInPicture(const IntSize&) = 0; 36 36 virtual void didExitPictureInPicture() = 0; 37 virtual void pictureInPictureWindowResized( IntSize) = 0;37 virtual void pictureInPictureWindowResized(const IntSize&) = 0; 38 38 }; 39 39
Note: See TracChangeset
for help on using the changeset viewer.