Title: [242113] trunk
Revision
242113
Author
jer.no...@apple.com
Date
2019-02-26 16:04:10 -0800 (Tue, 26 Feb 2019)

Log Message

[Cocoa] Media elements will restart network buffering just before suspending
https://bugs.webkit.org/show_bug.cgi?id=193691

Reviewed by Eric Carlson.

Source/WebCore:

API Test: WebKit.ProcessSuspendMediaBuffering

Allow the Page to suspend all media buffering in its child Documents.

* dom/Document.cpp:
(WebCore::Document::suspendAllMediaBuffering):
(WebCore::Document::resumeAllMediaBuffering):
* dom/Document.h:
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::dataBufferingPermitted const):
(WebCore::MediaElementSession::suspendBuffering):
(WebCore::MediaElementSession::resumeBuffering):
(WebCore::MediaElementSession::bufferingSuspended const):
* html/MediaElementSession.h:
* page/Page.cpp:
(WebCore::Page::suspendAllMediaBuffering):
(WebCore::Page::resumeAllMediaBuffering):
* page/Page.h:
(WebCore::Page::mediaPlaybackIsSuspended const):
(WebCore::Page::mediaBufferingIsSuspended const):
(WebCore::Page::mediaPlaybackIsSuspended): Deleted.
* platform/audio/PlatformMediaSession.h:
(WebCore::PlatformMediaSession::suspendBuffering):
(WebCore::PlatformMediaSession::resumeBuffering):
* platform/audio/PlatformMediaSessionManager.cpp:
(WebCore::PlatformMediaSessionManager::suspendAllMediaBufferingForDocument):
(WebCore::PlatformMediaSessionManager::resumeAllMediaBufferingForDocument):
* platform/audio/PlatformMediaSessionManager.h:

Source/WebKit:

When the WebProcess receives a notification that the process is about to become
suspended, it tells the MemoryPressureHandler to release all critical memory. This
has the side effect of causing AVFoundation-backed media elements to dump their
in-memory caches and start downloading media data again. Instead, media elements
should all stop buffering media data during suspension. Add new testing SPI to
simulate suspension and resume messages.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _processWillSuspendImminentlyForTesting]):
(-[WKWebView _processDidResumeForTesting]):
* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/WebProcessProxy.h:
* UIProcess/ios/WKInkPickerView.mm:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::suspendAllMediaBuffering):
(WebKit::WebPage::resumeAllMediaBuffering):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::actualPrepareToSuspend):
(WebKit::WebProcess::cancelPrepareToSuspend):
(WebKit::WebProcess::processDidResume):
(WebKit::WebProcess::suspendAllMediaBuffering):
(WebKit::WebProcess::resumeAllMediaBuffering):
* WebProcess/WebProcess.h:

Tools:

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm: Added.
(TEST):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (242112 => 242113)


--- trunk/Source/WebCore/ChangeLog	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/ChangeLog	2019-02-27 00:04:10 UTC (rev 242113)
@@ -1,3 +1,39 @@
+2019-02-20  Jer Noble  <jer.no...@apple.com>
+
+        [Cocoa] Media elements will restart network buffering just before suspending
+        https://bugs.webkit.org/show_bug.cgi?id=193691
+
+        Reviewed by Eric Carlson.
+
+        API Test: WebKit.ProcessSuspendMediaBuffering
+
+        Allow the Page to suspend all media buffering in its child Documents.
+
+        * dom/Document.cpp:
+        (WebCore::Document::suspendAllMediaBuffering):
+        (WebCore::Document::resumeAllMediaBuffering):
+        * dom/Document.h:
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::dataBufferingPermitted const):
+        (WebCore::MediaElementSession::suspendBuffering):
+        (WebCore::MediaElementSession::resumeBuffering):
+        (WebCore::MediaElementSession::bufferingSuspended const):
+        * html/MediaElementSession.h:
+        * page/Page.cpp:
+        (WebCore::Page::suspendAllMediaBuffering):
+        (WebCore::Page::resumeAllMediaBuffering):
+        * page/Page.h:
+        (WebCore::Page::mediaPlaybackIsSuspended const):
+        (WebCore::Page::mediaBufferingIsSuspended const):
+        (WebCore::Page::mediaPlaybackIsSuspended): Deleted.
+        * platform/audio/PlatformMediaSession.h:
+        (WebCore::PlatformMediaSession::suspendBuffering):
+        (WebCore::PlatformMediaSession::resumeBuffering):
+        * platform/audio/PlatformMediaSessionManager.cpp:
+        (WebCore::PlatformMediaSessionManager::suspendAllMediaBufferingForDocument):
+        (WebCore::PlatformMediaSessionManager::resumeAllMediaBufferingForDocument):
+        * platform/audio/PlatformMediaSessionManager.h:
+
 2019-02-26  Youenn Fablet  <you...@apple.com>
 
         Move service worker response validation from the service worker client to the service worker itself

Modified: trunk/Source/WebCore/dom/Document.cpp (242112 => 242113)


--- trunk/Source/WebCore/dom/Document.cpp	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/dom/Document.cpp	2019-02-27 00:04:10 UTC (rev 242113)
@@ -1737,6 +1737,18 @@
     if (auto* platformMediaSessionManager = PlatformMediaSessionManager::sharedManagerIfExists())
         platformMediaSessionManager->resumeAllMediaPlaybackForDocument(*this);
 }
+
+void Document::suspendAllMediaBuffering()
+{
+    if (auto* platformMediaSessionManager = PlatformMediaSessionManager::sharedManagerIfExists())
+        platformMediaSessionManager->suspendAllMediaBufferingForDocument(*this);
+}
+
+void Document::resumeAllMediaBuffering()
+{
+    if (auto* platformMediaSessionManager = PlatformMediaSessionManager::sharedManagerIfExists())
+        platformMediaSessionManager->resumeAllMediaBufferingForDocument(*this);
+}
 #endif
 
 String Document::nodeName() const

Modified: trunk/Source/WebCore/dom/Document.h (242112 => 242113)


--- trunk/Source/WebCore/dom/Document.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/dom/Document.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -1101,6 +1101,8 @@
     void stopAllMediaPlayback();
     void suspendAllMediaPlayback();
     void resumeAllMediaPlayback();
+    void suspendAllMediaBuffering();
+    void resumeAllMediaBuffering();
 #endif
 
     WEBCORE_EXPORT void setShouldCreateRenderers(bool);

Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (242112 => 242113)


--- trunk/Source/WebCore/html/MediaElementSession.cpp	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp	2019-02-27 00:04:10 UTC (rev 242113)
@@ -379,6 +379,9 @@
     if (isSuspended())
         return false;
 
+    if (bufferingSuspended())
+        return false;
+
     if (state() == PlatformMediaSession::Playing)
         return true;
 
@@ -785,6 +788,23 @@
     addBehaviorRestriction(RequireUserGestureToControlControlsManager | RequirePlaybackToControlControlsManager);
 }
 
+void MediaElementSession::suspendBuffering()
+{
+    updateClientDataBuffering();
+}
+
+void MediaElementSession::resumeBuffering()
+{
+    updateClientDataBuffering();
+}
+
+bool MediaElementSession::bufferingSuspended() const
+{
+    if (auto* page = m_element.document().page())
+        return page->mediaBufferingIsSuspended();
+    return true;
+}
+
 bool MediaElementSession::allowsPictureInPicture() const
 {
     return m_element.document().settings().allowsPictureInPictureMediaPlayback();

Modified: trunk/Source/WebCore/html/MediaElementSession.h (242112 => 242113)


--- trunk/Source/WebCore/html/MediaElementSession.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/html/MediaElementSession.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -101,6 +101,10 @@
 
     void resetPlaybackSessionState() override;
 
+    void suspendBuffering() override;
+    void resumeBuffering() override;
+    bool bufferingSuspended() const;
+
     // Restrictions to modify default behaviors.
     enum BehaviorRestrictionFlags : unsigned {
         NoRestrictions = 0,

Modified: trunk/Source/WebCore/page/Page.cpp (242112 => 242113)


--- trunk/Source/WebCore/page/Page.cpp	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/page/Page.cpp	2019-02-27 00:04:10 UTC (rev 242113)
@@ -1770,6 +1770,36 @@
 #endif
 }
 
+void Page::suspendAllMediaBuffering()
+{
+#if ENABLE(VIDEO)
+    ASSERT(!m_mediaBufferingIsSuspended);
+    if (m_mediaBufferingIsSuspended)
+        return;
+    m_mediaBufferingIsSuspended = true;
+
+    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
+        if (auto* document = frame->document())
+            document->suspendAllMediaBuffering();
+    }
+#endif
+}
+
+void Page::resumeAllMediaBuffering()
+{
+#if ENABLE(VIDEO)
+    ASSERT(m_mediaBufferingIsSuspended);
+    if (!m_mediaBufferingIsSuspended)
+        return;
+    m_mediaBufferingIsSuspended = false;
+
+    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
+        if (auto* document = frame->document())
+            document->resumeAllMediaBuffering();
+    }
+#endif
+}
+
 #if ENABLE(MEDIA_SESSION)
 void Page::handleMediaEvent(MediaEventType eventType)
 {

Modified: trunk/Source/WebCore/page/Page.h (242112 => 242113)


--- trunk/Source/WebCore/page/Page.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/page/Page.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -619,7 +619,10 @@
     WEBCORE_EXPORT void stopAllMediaPlayback();
     WEBCORE_EXPORT void suspendAllMediaPlayback();
     WEBCORE_EXPORT void resumeAllMediaPlayback();
-    bool mediaPlaybackIsSuspended() { return m_mediaPlaybackIsSuspended; }
+    bool mediaPlaybackIsSuspended() const { return m_mediaPlaybackIsSuspended; }
+    WEBCORE_EXPORT void suspendAllMediaBuffering();
+    WEBCORE_EXPORT void resumeAllMediaBuffering();
+    bool mediaBufferingIsSuspended() const { return m_mediaBufferingIsSuspended; }
 
 #if ENABLE(MEDIA_SESSION)
     WEBCORE_EXPORT void handleMediaEvent(MediaEventType);
@@ -973,6 +976,7 @@
 
     bool m_shouldEnableICECandidateFilteringByDefault { true };
     bool m_mediaPlaybackIsSuspended { false };
+    bool m_mediaBufferingIsSuspended { false };
 };
 
 inline PageGroup& Page::group()

Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSession.h (242112 => 242113)


--- trunk/Source/WebCore/platform/audio/PlatformMediaSession.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSession.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -113,6 +113,9 @@
 
     void pauseSession();
     void stopSession();
+
+    virtual void suspendBuffering() { }
+    virtual void resumeBuffering() { }
     
 #if ENABLE(VIDEO)
     uint64_t uniqueIdentifier() const;

Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp (242112 => 242113)


--- trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp	2019-02-27 00:04:10 UTC (rev 242113)
@@ -437,6 +437,22 @@
     });
 }
 
+void PlatformMediaSessionManager::suspendAllMediaBufferingForDocument(const Document& document)
+{
+    forEachSession([&] (PlatformMediaSession& session, size_t) {
+        if (session.client().hostingDocument() == &document)
+            session.suspendBuffering();
+    });
+}
+
+void PlatformMediaSessionManager::resumeAllMediaBufferingForDocument(const Document& document)
+{
+    forEachSession([&] (PlatformMediaSession& session, size_t) {
+        if (session.client().hostingDocument() == &document)
+            session.resumeBuffering();
+    });
+}
+
 void PlatformMediaSessionManager::forEachSession(const Function<void(PlatformMediaSession&, size_t)>& predicate) const
 {
     ++m_iteratingOverSessions;

Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h (242112 => 242113)


--- trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -82,6 +82,8 @@
 
     void suspendAllMediaPlaybackForDocument(const Document&);
     void resumeAllMediaPlaybackForDocument(const Document&);
+    void suspendAllMediaBufferingForDocument(const Document&);
+    void resumeAllMediaBufferingForDocument(const Document&);
 
     enum SessionRestrictionFlags {
         NoRestrictions = 0,

Modified: trunk/Source/WebKit/ChangeLog (242112 => 242113)


--- trunk/Source/WebKit/ChangeLog	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebKit/ChangeLog	2019-02-27 00:04:10 UTC (rev 242113)
@@ -1,3 +1,35 @@
+2019-02-20  Jer Noble  <jer.no...@apple.com>
+
+        [Cocoa] Media elements will restart network buffering just before suspending
+        https://bugs.webkit.org/show_bug.cgi?id=193691
+
+        Reviewed by Eric Carlson.
+
+        When the WebProcess receives a notification that the process is about to become
+        suspended, it tells the MemoryPressureHandler to release all critical memory. This
+        has the side effect of causing AVFoundation-backed media elements to dump their
+        in-memory caches and start downloading media data again. Instead, media elements
+        should all stop buffering media data during suspension. Add new testing SPI to
+        simulate suspension and resume messages.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _processWillSuspendImminentlyForTesting]):
+        (-[WKWebView _processDidResumeForTesting]):
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/WebProcessProxy.h:
+        * UIProcess/ios/WKInkPickerView.mm:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::suspendAllMediaBuffering):
+        (WebKit::WebPage::resumeAllMediaBuffering):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::actualPrepareToSuspend):
+        (WebKit::WebProcess::cancelPrepareToSuspend):
+        (WebKit::WebProcess::processDidResume):
+        (WebKit::WebProcess::suspendAllMediaBuffering):
+        (WebKit::WebProcess::resumeAllMediaBuffering):
+        * WebProcess/WebProcess.h:
+
 2019-02-26  Youenn Fablet  <you...@apple.com>
 
         Move service worker response validation from the service worker client to the service worker itself

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (242112 => 242113)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2019-02-27 00:04:10 UTC (rev 242113)
@@ -7150,6 +7150,18 @@
     return nil;
 }
 
+- (void)_processWillSuspendImminentlyForTesting
+{
+    if (_page)
+        _page->process().sendProcessWillSuspendImminently();
+}
+
+- (void)_processDidResumeForTesting
+{
+    if (_page)
+        _page->process().sendProcessDidResume();
+}
+
 - (void)_denyNextUserMediaRequest
 {
 #if ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h (242112 => 242113)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -548,6 +548,9 @@
 @property (nonatomic, readonly) _WKInspector *_inspector WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 @property (nonatomic, readonly) _WKFrameHandle *_mainFrame WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 
+- (void)_processWillSuspendImminentlyForTesting;
+- (void)_processDidResumeForTesting;
+
 @end
 
 #endif

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (242112 => 242113)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -259,6 +259,13 @@
 
     void didStartProvisionalLoadForMainFrame(const URL&);
 
+    // ProcessThrottlerClient
+    void sendProcessWillSuspendImminently() override;
+    void sendPrepareToSuspend() override;
+    void sendCancelPrepareToSuspend() override;
+    void sendProcessDidResume() override;
+    void didSetAssertionState(AssertionState) override;
+
 protected:
     static uint64_t generatePageID();
     WebProcessProxy(WebProcessPool&, WebsiteDataStore&, IsPrewarmed);
@@ -332,13 +339,6 @@
     void didChangeIsResponsive() override;
     bool mayBecomeUnresponsive() override;
 
-    // ProcessThrottlerClient
-    void sendProcessWillSuspendImminently() override;
-    void sendPrepareToSuspend() override;
-    void sendCancelPrepareToSuspend() override;
-    void sendProcessDidResume() override;
-    void didSetAssertionState(AssertionState) override;
-
     // Implemented in generated WebProcessProxyMessageReceiver.cpp
     void didReceiveWebProcessProxyMessage(IPC::Connection&, IPC::Decoder&);
     void didReceiveSyncWebProcessProxyMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&);

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (242112 => 242113)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2019-02-27 00:04:10 UTC (rev 242113)
@@ -689,6 +689,17 @@
     m_page->resumeAllMediaPlayback();
 }
 
+void WebPage::suspendAllMediaBuffering()
+{
+    m_page->suspendAllMediaBuffering();
+}
+
+void WebPage::resumeAllMediaBuffering()
+{
+    m_page->resumeAllMediaBuffering();
+}
+
+
 void WebPage::reinitializeWebPage(WebPageCreationParameters&& parameters)
 {
     ASSERT(m_drawingArea);

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (242112 => 242113)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -1149,6 +1149,9 @@
 
     const Optional<WebCore::Color>& backgroundColor() const { return m_backgroundColor; }
 
+    void suspendAllMediaBuffering();
+    void resumeAllMediaBuffering();
+
 private:
     WebPage(uint64_t pageID, WebPageCreationParameters&&);
 

Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (242112 => 242113)


--- trunk/Source/WebKit/WebProcess/WebProcess.cpp	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp	2019-02-27 00:04:10 UTC (rev 242113)
@@ -1427,6 +1427,10 @@
 {
     SetForScope<bool> suspensionScope(m_isSuspending, true);
 
+#if ENABLE(VIDEO)
+    suspendAllMediaBuffering();
+#endif
+
     if (!m_suppressMemoryPressureHandler)
         MemoryPressureHandler::singleton().releaseMemory(Critical::Yes, Synchronous::Yes);
 
@@ -1483,7 +1487,11 @@
 #if PLATFORM(IOS_FAMILY)
     accessibilityProcessSuspendedNotification(false);
 #endif
-    
+
+#if ENABLE(VIDEO)
+    resumeAllMediaBuffering();
+#endif
+
     // If we've already finished cleaning up and sent ProcessReadyToSuspend, we
     // shouldn't send DidCancelProcessSuspension; the UI process strictly expects one or the other.
     if (!m_pageMarkingLayersAsVolatileCounter)
@@ -1550,6 +1558,10 @@
 #if PLATFORM(IOS_FAMILY)
     accessibilityProcessSuspendedNotification(false);
 #endif
+
+#if ENABLE(VIDEO)
+    resumeAllMediaBuffering();
+#endif
 }
 
 void WebProcess::sendPrewarmInformation(const URL& url)
@@ -1802,6 +1814,20 @@
 }
 #endif
 
+#if ENABLE(VIDEO)
+void WebProcess::suspendAllMediaBuffering()
+{
+    for (auto& page : m_pageMap.values())
+        page->suspendAllMediaBuffering();
+}
+
+void WebProcess::resumeAllMediaBuffering()
+{
+    for (auto& page : m_pageMap.values())
+        page->resumeAllMediaBuffering();
+}
+#endif
+
 void WebProcess::clearCurrentModifierStateForTesting()
 {
     PlatformKeyboardEvent::setCurrentModifierState({ });

Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (242112 => 242113)


--- trunk/Source/WebKit/WebProcess/WebProcess.h	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h	2019-02-27 00:04:10 UTC (rev 242113)
@@ -397,6 +397,11 @@
 #endif
 #endif
 
+#if ENABLE(VIDEO)
+    void suspendAllMediaBuffering();
+    void resumeAllMediaBuffering();
+#endif
+
     void clearCurrentModifierStateForTesting();
 
     RefPtr<WebConnectionToUIProcess> m_webConnection;

Modified: trunk/Tools/ChangeLog (242112 => 242113)


--- trunk/Tools/ChangeLog	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Tools/ChangeLog	2019-02-27 00:04:10 UTC (rev 242113)
@@ -1,3 +1,14 @@
+2019-02-20  Jer Noble  <jer.no...@apple.com>
+
+        [Cocoa] Media elements will restart network buffering just before suspending
+        https://bugs.webkit.org/show_bug.cgi?id=193691
+
+        Reviewed by Eric Carlson.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm: Added.
+        (TEST):
+
 2019-02-26  Takashi Komori  <takashi.kom...@sony.com>
 
         [Curl] Load HTTP body of 401 response when AuthenticationChange is cancelled.

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (242112 => 242113)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-02-26 23:53:22 UTC (rev 242112)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-02-27 00:04:10 UTC (rev 242113)
@@ -790,6 +790,7 @@
 		CDA315981ED53651009F60D3 /* MediaPlaybackSleepAssertion.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDA315961ED53651009F60D3 /* MediaPlaybackSleepAssertion.mm */; };
 		CDA3159A1ED548F1009F60D3 /* MediaPlaybackSleepAssertion.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = CDA315991ED540A5009F60D3 /* MediaPlaybackSleepAssertion.html */; };
 		CDA3159D1ED5643F009F60D3 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDA3159C1ED5643F009F60D3 /* IOKit.framework */; };
+		CDA4438E21F7A47700379489 /* ProcessSuspendMediaBuffering.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDA4438D21F7A47700379489 /* ProcessSuspendMediaBuffering.mm */; };
 		CDB4115A1E0B00DB00EAD352 /* video-with-muted-audio.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = CDB411591E09DA8E00EAD352 /* video-with-muted-audio.html */; };
 		CDB5DFFF213610FA00D3E189 /* now-playing.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = CDB5DFFE21360ED800D3E189 /* now-playing.html */; };
 		CDBFCC451A9FF45300A7B691 /* FullscreenZoomInitialFrame.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDBFCC431A9FF44800A7B691 /* FullscreenZoomInitialFrame.mm */; };
@@ -2121,6 +2122,7 @@
 		CDA315961ED53651009F60D3 /* MediaPlaybackSleepAssertion.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaPlaybackSleepAssertion.mm; sourceTree = "<group>"; };
 		CDA315991ED540A5009F60D3 /* MediaPlaybackSleepAssertion.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = MediaPlaybackSleepAssertion.html; sourceTree = "<group>"; };
 		CDA3159C1ED5643F009F60D3 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+		CDA4438D21F7A47700379489 /* ProcessSuspendMediaBuffering.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ProcessSuspendMediaBuffering.mm; sourceTree = "<group>"; };
 		CDB411591E09DA8E00EAD352 /* video-with-muted-audio.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "video-with-muted-audio.html"; sourceTree = "<group>"; };
 		CDB5DFFE21360ED800D3E189 /* now-playing.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "now-playing.html"; sourceTree = "<group>"; };
 		CDBFCC421A9FF44800A7B691 /* FullscreenZoomInitialFrame.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = FullscreenZoomInitialFrame.html; sourceTree = "<group>"; };
@@ -2577,6 +2579,7 @@
 				CD227E43211A4D5D00D285AF /* PreferredAudioBufferSize.mm */,
 				7C1AF7931E8DCBAB002645B9 /* PrepareForMoveToWindow.mm */,
 				41882F0221010A70002FF288 /* ProcessPreWarming.mm */,
+				CDA4438D21F7A47700379489 /* ProcessSuspendMediaBuffering.mm */,
 				518C1152205B04F9001FF4AE /* ProcessSwapOnNavigation.mm */,
 				5798E2AF1CAF5C2800C5CBA0 /* ProvisionalURLNotChange.mm */,
 				A1C4FB6C1BACCE50003742D0 /* QuickLook.mm */,
@@ -4219,6 +4222,7 @@
 				7CCE7F0C1A411AE600447C4C /* PrivateBrowsingPushStateNoHistoryCallback.cpp in Sources */,
 				4647B1261EBA3B850041D7EF /* ProcessDidTerminate.cpp in Sources */,
 				41882F0321010C0D002FF288 /* ProcessPreWarming.mm in Sources */,
+				CDA4438E21F7A47700379489 /* ProcessSuspendMediaBuffering.mm in Sources */,
 				518C1153205B0504001FF4AE /* ProcessSwapOnNavigation.mm in Sources */,
 				7C83E0C11D0A652F00FEBCF3 /* ProvisionalURLNotChange.mm in Sources */,
 				041A1E34216FFDBC00789E0A /* PublicSuffix.cpp in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm (0 => 242113)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm	2019-02-27 00:04:10 UTC (rev 242113)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if WK_API_ENABLED && WK_HAVE_C_SPI
+
+#import "PlatformUtilities.h"
+#import "TestWKWebView.h"
+
+#import <WebKit/WKWebViewConfigurationPrivate.h>
+#import <WebKit/WKWebViewPrivate.h>
+
+TEST(WebKit, ProcessSuspendMediaBuffering)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    WKRetainPtr<WKContextRef> context(AdoptWK, TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
+    configuration.get().processPool = (WKProcessPool *)context.get();
+    configuration.get()._mediaDataLoadsAutomatically = YES;
+    configuration.get().mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
+
+    __block bool isPlaying = false;
+    [webView performAfterReceivingMessage:@"playing" action:^() { isPlaying = true; }];
+
+    [webView synchronouslyLoadTestPageNamed:@"video-with-audio"];
+
+    TestWebKitAPI::Util::run(&isPlaying);
+
+    auto isElementAllowedToBuffer = [&] {
+        return [webView stringByEvaluatingJavaScript:@"window.internals.elementShouldBufferData(document.querySelector('video'))"].boolValue;
+    };
+
+    ASSERT_TRUE(isElementAllowedToBuffer());
+
+    [webView _processWillSuspendImminentlyForTesting];
+
+    ASSERT_FALSE(isElementAllowedToBuffer());
+
+    [webView _processDidResumeForTesting];
+
+    ASSERT_TRUE(isElementAllowedToBuffer());
+}
+
+#endif // WK_API_ENABLED && WK_HAVE_C_SPI
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to