WebKit Bugzilla
Attachment 360352 Details for
Bug 193691
: [Cocoa] Media elements will restart network buffering just before suspending
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-193691-20190128102646.patch (text/plain), 26.04 KB, created by
Jer Noble
on 2019-01-28 10:26:47 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Jer Noble
Created:
2019-01-28 10:26:47 PST
Size:
26.04 KB
patch
obsolete
>Subversion Revision: 240588 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index be0b10298aae75e3d17de54c2bfd16ed1e5e2052..28a635f4d1babb01af7ec9337a672541ee57eeaa 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,39 @@ >+2019-01-22 Jer Noble <jer.noble@apple.com> >+ >+ [Cocoa] Media elements will restart network buffering just before suspending >+ https://bugs.webkit.org/show_bug.cgi?id=193691 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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-01-28 Oriol Brufau <obrufau@igalia.com> > > [css-logical] Reject unitless length quirk in 'inset' shorthand >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index e90a49d68ad6ee2f5a07cd88c41367e1905242a0..728672c1a2a165b4cb546eb0d5a6f992c1a366b5 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,35 @@ >+2019-01-22 Jer Noble <jer.noble@apple.com> >+ >+ [Cocoa] Media elements will restart network buffering just before suspending >+ https://bugs.webkit.org/show_bug.cgi?id=193691 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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-01-28 Antoine Quint <graouts@apple.com> > > Limit user-agent interactions based on the touch-action property on iOS >diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp >index 612c35fd454b8e17308938f45037125dbb550656..3af3fb94d38639f66742e70d6cc0d7732caf9879 100644 >--- a/Source/WebCore/dom/Document.cpp >+++ b/Source/WebCore/dom/Document.cpp >@@ -1741,6 +1741,18 @@ void Document::resumeAllMediaPlayback() > 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 >diff --git a/Source/WebCore/dom/Document.h b/Source/WebCore/dom/Document.h >index 8e2878f4d15ab8515067a3aa5da3f25731102d03..1c8021e71314005d1ebc68e14846fb4758abe6ae 100644 >--- a/Source/WebCore/dom/Document.h >+++ b/Source/WebCore/dom/Document.h >@@ -1125,6 +1125,8 @@ public: > void stopAllMediaPlayback(); > void suspendAllMediaPlayback(); > void resumeAllMediaPlayback(); >+ void suspendAllMediaBuffering(); >+ void resumeAllMediaBuffering(); > #endif > > WEBCORE_EXPORT void setShouldCreateRenderers(bool); >diff --git a/Source/WebCore/html/MediaElementSession.cpp b/Source/WebCore/html/MediaElementSession.cpp >index 71ac9956883102752def4d877501226402645a6f..153415a6f86058b4660039745892d5bd4b663833 100644 >--- a/Source/WebCore/html/MediaElementSession.cpp >+++ b/Source/WebCore/html/MediaElementSession.cpp >@@ -379,6 +379,9 @@ bool MediaElementSession::dataBufferingPermitted() const > if (isSuspended()) > return false; > >+ if (bufferingSuspended()) >+ return false; >+ > if (state() == PlatformMediaSession::Playing) > return true; > >@@ -785,6 +788,23 @@ void MediaElementSession::resetPlaybackSessionState() > 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(); >diff --git a/Source/WebCore/html/MediaElementSession.h b/Source/WebCore/html/MediaElementSession.h >index 597ba27729acc8f2e2e78caf964f5fc808e2a01e..ce058c6e11fe441c18de0652681cbaa4198147e1 100644 >--- a/Source/WebCore/html/MediaElementSession.h >+++ b/Source/WebCore/html/MediaElementSession.h >@@ -101,6 +101,10 @@ public: > > void resetPlaybackSessionState() override; > >+ void suspendBuffering() override; >+ void resumeBuffering() override; >+ bool bufferingSuspended() const; >+ > // Restrictions to modify default behaviors. > enum BehaviorRestrictionFlags : unsigned { > NoRestrictions = 0, >diff --git a/Source/WebCore/page/Page.cpp b/Source/WebCore/page/Page.cpp >index 26a25819c1a7741d12cd964629ad15979986d0d0..646bd5f4452c4f4f17feebb554cef01a72874cfc 100644 >--- a/Source/WebCore/page/Page.cpp >+++ b/Source/WebCore/page/Page.cpp >@@ -1759,6 +1759,36 @@ void Page::resumeAllMediaPlayback() > #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) > { >diff --git a/Source/WebCore/page/Page.h b/Source/WebCore/page/Page.h >index 7f7b370bcae98ab957db4c50176dec29b7b4f926..fd23cad909d824400221a7fe115a3b94201b5fec 100644 >--- a/Source/WebCore/page/Page.h >+++ b/Source/WebCore/page/Page.h >@@ -609,7 +609,10 @@ public: > 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); >@@ -959,6 +962,7 @@ private: > > bool m_shouldEnableICECandidateFilteringByDefault { true }; > bool m_mediaPlaybackIsSuspended { false }; >+ bool m_mediaBufferingIsSuspended { false }; > }; > > inline PageGroup& Page::group() >diff --git a/Source/WebCore/platform/audio/PlatformMediaSession.h b/Source/WebCore/platform/audio/PlatformMediaSession.h >index 25c177990cf2613f25fe0ad00d8812429b6da0f2..87e192f4fe3faac8cd64d374eed72f40d83697b6 100644 >--- a/Source/WebCore/platform/audio/PlatformMediaSession.h >+++ b/Source/WebCore/platform/audio/PlatformMediaSession.h >@@ -113,6 +113,9 @@ public: > > void pauseSession(); > void stopSession(); >+ >+ virtual void suspendBuffering() { } >+ virtual void resumeBuffering() { } > > #if ENABLE(VIDEO) > uint64_t uniqueIdentifier() const; >diff --git a/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp b/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp >index 2050c5e082f3381b671802f835b07ec54e48c5d4..b9b079d9e1fd7ffffc2085337a0331f1f277058d 100644 >--- a/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp >+++ b/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp >@@ -437,6 +437,22 @@ void PlatformMediaSessionManager::resumeAllMediaPlaybackForDocument(const Docume > }); > } > >+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; >diff --git a/Source/WebCore/platform/audio/PlatformMediaSessionManager.h b/Source/WebCore/platform/audio/PlatformMediaSessionManager.h >index 065d94fedc895ad6edd5bdae20046cab2260d8f2..baf5dd8c7488111a0465413a6ba09d6203e00071 100644 >--- a/Source/WebCore/platform/audio/PlatformMediaSessionManager.h >+++ b/Source/WebCore/platform/audio/PlatformMediaSessionManager.h >@@ -81,6 +81,8 @@ public: > > void suspendAllMediaPlaybackForDocument(const Document&); > void resumeAllMediaPlaybackForDocument(const Document&); >+ void suspendAllMediaBufferingForDocument(const Document&); >+ void resumeAllMediaBufferingForDocument(const Document&); > > enum SessionRestrictionFlags { > NoRestrictions = 0, >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >index b987c9924b986f6402abc8851e3c8ada92da46ff..f15b1c1c81acad73b82eb0abc930f8cbb2027e50 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >@@ -7091,6 +7091,18 @@ - (_WKFrameHandle *)_mainFrame > return nil; > } > >+- (void)_processWillSuspendImminentlyForTesting >+{ >+ if (_page) >+ _page->process().sendProcessWillSuspendImminently(); >+} >+ >+- (void)_processDidResumeForTesting >+{ >+ if (_page) >+ _page->process().sendProcessDidResume(); >+} >+ > - (void)_denyNextUserMediaRequest > { > #if ENABLE(MEDIA_STREAM) >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >index 12b01e85d193601df1a2ba3e8411e4815cf7e477..46f5efd363cd3262120dfdd776c656836f095d79 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >@@ -547,6 +547,9 @@ typedef NS_OPTIONS(NSUInteger, _WKRectEdge) { > @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 >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.h b/Source/WebKit/UIProcess/WebProcessProxy.h >index 835686c63013cbcd9d03357b01757f81c40ebd02..0a6aedc8030b3c4511a2a8c3bdf6187a933397df 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.h >+++ b/Source/WebKit/UIProcess/WebProcessProxy.h >@@ -252,6 +252,13 @@ public: > void shutDown(); > void maybeShutDown(); > >+ // 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); >@@ -321,13 +328,6 @@ private: > 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>&); >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.cpp b/Source/WebKit/WebProcess/WebPage/WebPage.cpp >index d0b9753080c36138afb3453551c5aee7180827b8..ee82c927d6f47b351218670c85959f168172265e 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.cpp >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.cpp >@@ -680,6 +680,17 @@ void WebPage::resumeAllMediaPlayback() > m_page->resumeAllMediaPlayback(); > } > >+void WebPage::suspendAllMediaBuffering() >+{ >+ m_page->suspendAllMediaBuffering(); >+} >+ >+void WebPage::resumeAllMediaBuffering() >+{ >+ m_page->resumeAllMediaBuffering(); >+} >+ >+ > void WebPage::reinitializeWebPage(WebPageCreationParameters&& parameters) > { > ASSERT(m_drawingArea); >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h >index e764f992e25179f3eb190981c6950443190f2031..a717e091a623c96dfb9a1607660db620cc14f54a 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.h >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.h >@@ -1137,6 +1137,9 @@ public: > > void didReceiveWebPageMessage(IPC::Connection&, IPC::Decoder&); > >+ void suspendAllMediaBuffering(); >+ void resumeAllMediaBuffering(); >+ > private: > WebPage(uint64_t pageID, WebPageCreationParameters&&); > >diff --git a/Source/WebKit/WebProcess/WebProcess.cpp b/Source/WebKit/WebProcess/WebProcess.cpp >index 67b894d78ca040215bdc9041135e3c40d4168b3e..960eec77adf4c346d8a80797a33628cc905ee0c8 100644 >--- a/Source/WebKit/WebProcess/WebProcess.cpp >+++ b/Source/WebKit/WebProcess/WebProcess.cpp >@@ -1379,6 +1379,10 @@ void WebProcess::actualPrepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend shou > { > SetForScope<bool> suspensionScope(m_isSuspending, true); > >+#if ENABLE(VIDEO) >+ suspendAllMediaBuffering(); >+#endif >+ > if (!m_suppressMemoryPressureHandler) > MemoryPressureHandler::singleton().releaseMemory(Critical::Yes, Synchronous::Yes); > >@@ -1435,7 +1439,11 @@ void WebProcess::cancelPrepareToSuspend() > #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) >@@ -1500,6 +1508,10 @@ void WebProcess::processDidResume() > #if PLATFORM(IOS_FAMILY) > accessibilityProcessSuspendedNotification(false); > #endif >+ >+#if ENABLE(VIDEO) >+ resumeAllMediaBuffering(); >+#endif > } > > void WebProcess::sendPrewarmInformation(const URL& url) >@@ -1752,6 +1764,20 @@ void WebProcess::resetMockMediaDevices() > } > #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({ }); >diff --git a/Source/WebKit/WebProcess/WebProcess.h b/Source/WebKit/WebProcess/WebProcess.h >index 8d0213394818150b50e22444f9ec2b3ec7c5675a..898d230531daa4f243b57cef6bc34a73d63887ec 100644 >--- a/Source/WebKit/WebProcess/WebProcess.h >+++ b/Source/WebKit/WebProcess/WebProcess.h >@@ -394,6 +394,11 @@ private: > #endif > #endif > >+#if ENABLE(VIDEO) >+ void suspendAllMediaBuffering(); >+ void resumeAllMediaBuffering(); >+#endif >+ > void clearCurrentModifierStateForTesting(); > > RefPtr<WebConnectionToUIProcess> m_webConnection; >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index a59da2cd9cfe7c1b5771e03ccb437b442402e10d..d974836cd2f951b5a1877bab91a34ce4b07247da 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,14 @@ >+2019-01-22 Jer Noble <jer.noble@apple.com> >+ >+ [Cocoa] Media elements will restart network buffering just before suspending >+ https://bugs.webkit.org/show_bug.cgi?id=193691 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: >+ * TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm: Added. >+ (TEST): >+ > 2018-11-06 Jer Noble <jer.noble@apple.com> > > Add a git utility method that allows the caller to determine if a specific commitish is within a specified range of commits. >diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >index d4a28c1fd6bcd6c6cf22cea1c745e87c52e979ca..9278c943acce1bac5c7d3a00ae8933a35db292e6 100644 >--- a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >+++ b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >@@ -777,6 +777,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 */; }; >@@ -2087,6 +2088,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>"; }; >@@ -2542,6 +2544,7 @@ > CD227E43211A4D5D00D285AF /* PreferredAudioBufferSize.mm */, > 7C1AF7931E8DCBAB002645B9 /* PrepareForMoveToWindow.mm */, > 41882F0221010A70002FF288 /* ProcessPreWarming.mm */, >+ CDA4438D21F7A47700379489 /* ProcessSuspendMediaBuffering.mm */, > 518C1152205B04F9001FF4AE /* ProcessSwapOnNavigation.mm */, > 5798E2AF1CAF5C2800C5CBA0 /* ProvisionalURLNotChange.mm */, > A1C4FB6C1BACCE50003742D0 /* QuickLook.mm */, >@@ -4166,6 +4169,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 */, >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..c584e4f0a05b7b495255d4214cac129fd1bca1b5 >--- /dev/null >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSuspendMediaBuffering.mm >@@ -0,0 +1,65 @@ >+/* >+ * 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_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; }]; >+ >+ 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_HAVE_C_SPI
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 193691
:
359789
|
360352
|
361418
|
361422
|
363016