WebKit Bugzilla
Attachment 361422 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 for landing
bug-193691-20190207112859.patch (text/plain), 26.15 KB, created by
Jer Noble
on 2019-02-07 11:29:00 PST
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
Jer Noble
Created:
2019-02-07 11:29:00 PST
Size:
26.15 KB
patch
obsolete
>Subversion Revision: 241104 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 7778c320ac8ca1bcfae510d4bf88906608c9196d..973bd061fe7961c76c7cb88742bafb6d73a3994d 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 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-06 Yusuke Suzuki <ysuzuki@apple.com> > > [JSC] PrivateName to PublicName hash table is wasteful >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 7b02752206eed9ff4ea22aaa5383abd08c6301fc..f83f4b59672a0ee7f3adc69ac46f8e1b93bff448 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 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-06 Keith Rollin <krollin@apple.com> > > Really enable the automatic checking and regenerations of .xcfilelists during builds >diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp >index 31f442bf75292b1c30bbf9ad2c2a234e8fd1b00d..7569f615cd5c740ecde1d76abb91c48c77656c4f 100644 >--- a/Source/WebCore/dom/Document.cpp >+++ b/Source/WebCore/dom/Document.cpp >@@ -1738,6 +1738,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 18fefe50a93b913ee03e9c2c5eb23ddebda6a721..37ddd50411c9d310b1fee83a69a25ede1cb694d4 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 78be183006dd7855d3ffb2b3d97aa3f22229c249..bcc1d8dbe09d2c7533c639ddfcd1a4a828eadd4e 100644 >--- a/Source/WebCore/page/Page.cpp >+++ b/Source/WebCore/page/Page.cpp >@@ -1760,6 +1760,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 9464a8ddaf07a543f0b868ab083649caff7204b7..ff9275387d0c3c0d59f01f0bd03531d938a0b24a 100644 >--- a/Source/WebCore/page/Page.h >+++ b/Source/WebCore/page/Page.h >@@ -614,7 +614,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); >@@ -967,6 +970,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 757c958bf0a8e5bd8f3349636aab44d67fbfd4e9..1d865610781fd7fc7eb42088b5466e4bbda9df99 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >@@ -7112,6 +7112,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 8df5c25344c23f031d1d1ba05f3962aaa85fc8b0..e6c95e20ae6a0f08ab506385dde3a91bc217c856 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.h >+++ b/Source/WebKit/UIProcess/WebProcessProxy.h >@@ -253,6 +253,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); >@@ -322,13 +329,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 de34617e40fc26758000fc4ec9b590d2c9acf449..35c9b82c4385a4a7eff33a6a9d51abe841207de3 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.cpp >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.cpp >@@ -684,6 +684,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 a1a0294aa5a6d5af92380413dddc4e33a2ff3ff8..1bfacb13e8129a20c7235a02731a312d08e72cbf 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.h >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.h >@@ -1145,6 +1145,9 @@ public: > return sendSync(WTFMove(message), WTFMove(reply), m_pageID, Seconds::infinity(), IPC::SendSyncOption::InformPlatformProcessWillSuspend); > } > >+ 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 2822050e4ab51a284912befc4d03ab252a0efdcf..bc13103ed67345ba65aa2b8524074014faa92eba 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 235db7729e159cd17fdd120c9949cec32538f5d7..ef58d3a1268782786c06fb090a1cf262c26d49df 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 1cb00718d6e1749739462096534708c648e7e9d5..772149f74ec87a8fd467818a60bfb2793c3c4dc6 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 Eric Carlson. >+ >+ * 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 95dc51dfba14f4619c08421f708b5ce9312670b1..82d6f3a26c220208097b2c9829043a917fe74d76 100644 >--- a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >+++ b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >@@ -784,6 +784,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 */; }; >@@ -2105,6 +2106,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>"; }; >@@ -2559,6 +2561,7 @@ > CD227E43211A4D5D00D285AF /* PreferredAudioBufferSize.mm */, > 7C1AF7931E8DCBAB002645B9 /* PrepareForMoveToWindow.mm */, > 41882F0221010A70002FF288 /* ProcessPreWarming.mm */, >+ CDA4438D21F7A47700379489 /* ProcessSuspendMediaBuffering.mm */, > 518C1152205B04F9001FF4AE /* ProcessSwapOnNavigation.mm */, > 5798E2AF1CAF5C2800C5CBA0 /* ProvisionalURLNotChange.mm */, > A1C4FB6C1BACCE50003742D0 /* QuickLook.mm */, >@@ -4194,6 +4197,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..6dd32de39fb6d5420c11c729110e6feaad1bd50f >--- /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_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; }]; >+ >+ 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
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