Diff
Modified: branches/safari-608.1.24-branch/Source/WebKit/ChangeLog (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/ChangeLog 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/ChangeLog 2019-05-15 05:24:03 UTC (rev 245319)
@@ -1,3 +1,62 @@
+2019-05-14 Kocsen Chung <[email protected]>
+
+ Cherry-pick r245255. rdar://problem/50141840
+
+ Take out MediaPlayback UI assertion when any WebProcess is playing audible media
+ https://bugs.webkit.org/show_bug.cgi?id=197798
+
+ Reviewed by Chris Dumez.
+
+ To keep the system from suspending the UIProcess (and all the other constellation of processes that
+ are necessary to play media), take a UIProcess assertion with the MediaPlayback reason whenever there
+ is a WebContent process that is playing audible media.
+
+ * Platform/spi/ios/AssertionServicesSPI.h:
+ * UIProcess/ProcessAssertion.h:
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::updatePlayingMediaDidChange):
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::setWebProcessIsPlayingAudibleMedia):
+ (WebKit::WebProcessPool::clearWebProcessIsPlayingAudibleMedia):
+ * UIProcess/WebProcessPool.h:
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::webPageMediaStateDidChange):
+ * UIProcess/WebProcessProxy.h:
+ * UIProcess/ios/ProcessAssertionIOS.mm:
+ (WebKit::toBKSProcessAssertionReason):
+ (WebKit::ProcessAssertion::ProcessAssertion):
+ * WebProcess/WebProcess.h:
+
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@245255 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2019-05-13 Jer Noble <[email protected]>
+
+ Take out MediaPlayback UI assertion when any WebProcess is playing audible media
+ https://bugs.webkit.org/show_bug.cgi?id=197798
+
+ Reviewed by Chris Dumez.
+
+ To keep the system from suspending the UIProcess (and all the other constellation of processes that
+ are necessary to play media), take a UIProcess assertion with the MediaPlayback reason whenever there
+ is a WebContent process that is playing audible media.
+
+ * Platform/spi/ios/AssertionServicesSPI.h:
+ * UIProcess/ProcessAssertion.h:
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::updatePlayingMediaDidChange):
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::setWebProcessIsPlayingAudibleMedia):
+ (WebKit::WebProcessPool::clearWebProcessIsPlayingAudibleMedia):
+ * UIProcess/WebProcessPool.h:
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::webPageMediaStateDidChange):
+ * UIProcess/WebProcessProxy.h:
+ * UIProcess/ios/ProcessAssertionIOS.mm:
+ (WebKit::toBKSProcessAssertionReason):
+ (WebKit::ProcessAssertion::ProcessAssertion):
+ * WebProcess/WebProcess.h:
+
2019-05-14 Alan Coon <[email protected]>
Cherry-pick r245298. rdar://problem/50665984
Modified: branches/safari-608.1.24-branch/Source/WebKit/Platform/spi/ios/AssertionServicesSPI.h (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/Platform/spi/ios/AssertionServicesSPI.h 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/Platform/spi/ios/AssertionServicesSPI.h 2019-05-15 05:24:03 UTC (rev 245319)
@@ -69,6 +69,7 @@
typedef uint32_t BKSProcessAssertionFlags;
enum {
+ BKSProcessAssertionReasonMediaPlayback = 1,
BKSProcessAssertionReasonFinishTask = 4,
BKSProcessAssertionReasonExtension = 13,
BKSProcessAssertionReasonFinishTaskUnbounded = 10004,
Modified: branches/safari-608.1.24-branch/Source/WebKit/UIProcess/ProcessAssertion.h (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/UIProcess/ProcessAssertion.h 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/UIProcess/ProcessAssertion.h 2019-05-15 05:24:03 UTC (rev 245319)
@@ -52,6 +52,7 @@
Extension,
FinishTask,
FinishTaskUnbounded,
+ MediaPlayback,
};
class ProcessAssertion : public CanMakeWeakPtr<ProcessAssertion> {
Modified: branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebPageProxy.cpp (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebPageProxy.cpp 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebPageProxy.cpp 2019-05-15 05:24:03 UTC (rev 245319)
@@ -1038,6 +1038,7 @@
#endif
stopAllURLSchemeTasks();
+ updatePlayingMediaDidChange(MediaProducer::IsNotPlaying);
}
bool WebPageProxy::tryClose()
@@ -7053,6 +7054,8 @@
m_pageLoadState.reset(transaction);
}
+ updatePlayingMediaDidChange(MediaProducer::IsNotPlaying);
+
// FIXME: <rdar://problem/38676604> In case of process swaps, the old process should gracefully suspend instead of terminating.
m_process->processTerminated();
}
@@ -8074,7 +8077,8 @@
ASSERT(focusManager);
focusManager->updatePlaybackAttributesFromMediaState(this, sourceElementID, newState);
#endif
- updatePlayingMediaDidChange(newState);
+ if (!m_isClosed)
+ updatePlayingMediaDidChange(newState);
}
void WebPageProxy::updatePlayingMediaDidChange(MediaProducer::MediaStateFlags newState)
@@ -8112,6 +8116,8 @@
if ((oldState & MediaProducer::HasAudioOrVideo) != (m_mediaState & MediaProducer::HasAudioOrVideo))
videoControlsManagerDidChange();
+
+ m_process->webPageMediaStateDidChange(*this);
}
void WebPageProxy::videoControlsManagerDidChange()
Modified: branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessPool.cpp (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessPool.cpp 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessPool.cpp 2019-05-15 05:24:03 UTC (rev 245319)
@@ -1100,6 +1100,7 @@
void WebProcessPool::disconnectProcess(WebProcessProxy* process)
{
ASSERT(m_processes.contains(process));
+ ASSERT(!m_processesPlayingAudibleMedia.contains(process->coreProcessIdentifier()));
if (m_prewarmedProcess == process) {
ASSERT(m_prewarmedProcess->isPrewarmed());
@@ -2575,4 +2576,40 @@
}
+void WebProcessPool::setWebProcessIsPlayingAudibleMedia(WebCore::ProcessIdentifier processID)
+{
+ auto* process = WebProcessProxy::processForIdentifier(processID);
+ ASSERT(process);
+
+ RELEASE_LOG(ProcessSuspension, "Web process pid %u is now playing audible media", (unsigned)process->processIdentifier());
+
+ if (m_processesPlayingAudibleMedia.isEmpty()) {
+ RELEASE_LOG(ProcessSuspension, "The number of processes playing audible media is now one. Taking UI process assertion.");
+
+ ASSERT(!m_uiProcessMediaPlaybackAssertion);
+ m_uiProcessMediaPlaybackAssertion = std::make_unique<ProcessAssertion>(getCurrentProcessID(), "WebKit Media Playback"_s, AssertionState::Foreground, AssertionReason::MediaPlayback);
+ }
+
+ auto result = m_processesPlayingAudibleMedia.add(processID, nullptr);
+ ASSERT(result.isNewEntry);
+ result.iterator->value = std::make_unique<ProcessAssertion>(process->processIdentifier(), "WebKit Media Playback"_s, AssertionState::Foreground, AssertionReason::MediaPlayback);
+}
+
+void WebProcessPool::clearWebProcessIsPlayingAudibleMedia(WebCore::ProcessIdentifier processID)
+{
+ auto result = m_processesPlayingAudibleMedia.take(processID);
+ ASSERT_UNUSED(result, result);
+
+ auto* process = WebProcessProxy::processForIdentifier(processID);
+ ASSERT(process);
+ RELEASE_LOG(ProcessSuspension, "Web process pid %u is no longer playing audible media", (unsigned)process->processIdentifier());
+
+ if (m_processesPlayingAudibleMedia.isEmpty()) {
+ RELEASE_LOG(ProcessSuspension, "The number of processes playing audible media now zero. Releasing UI process assertion.");
+
+ ASSERT(m_uiProcessMediaPlaybackAssertion);
+ m_uiProcessMediaPlaybackAssertion = nullptr;
+ }
+}
+
} // namespace WebKit
Modified: branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessPool.h (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessPool.h 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessPool.h 2019-05-15 05:24:03 UTC (rev 245319)
@@ -505,6 +505,9 @@
void setWebProcessHasUploads(WebCore::ProcessIdentifier);
void clearWebProcessHasUploads(WebCore::ProcessIdentifier);
+ void setWebProcessIsPlayingAudibleMedia(WebCore::ProcessIdentifier);
+ void clearWebProcessIsPlayingAudibleMedia(WebCore::ProcessIdentifier);
+
void disableDelayedWebProcessLaunch() { m_isDelayedWebProcessLaunchDisabled = true; }
void removeCredential(WebCore::Credential&&, WebCore::ProtectionSpace&&, CompletionHandler<void()>&&);
@@ -790,6 +793,10 @@
HashMap<WebCore::ProcessIdentifier, std::unique_ptr<ProcessAssertion>> m_processesWithUploads;
std::unique_ptr<ProcessAssertion> m_uiProcessUploadAssertion;
+
+ HashMap<WebCore::ProcessIdentifier, std::unique_ptr<ProcessAssertion>> m_processesPlayingAudibleMedia;
+ std::unique_ptr<ProcessAssertion> m_uiProcessMediaPlaybackAssertion;
+
#if PLATFORM(IOS)
// FIXME: Delayed process launch is currently disabled on iOS for performance reasons (rdar://problem/49074131).
bool m_isDelayedWebProcessLaunchDisabled { true };
Modified: branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-05-15 05:24:03 UTC (rev 245319)
@@ -1216,7 +1216,20 @@
UNUSED_PARAM(state);
#endif
}
-
+
+void WebProcessProxy::webPageMediaStateDidChange(WebPageProxy&)
+{
+ bool newHasAudibleWebPage = WTF::anyOf(m_pageMap.values(), [] (auto& page) { return page->isPlayingAudio(); });
+ if (m_hasAudibleWebPage == newHasAudibleWebPage)
+ return;
+ m_hasAudibleWebPage = newHasAudibleWebPage;
+
+ if (m_hasAudibleWebPage)
+ processPool().setWebProcessIsPlayingAudibleMedia(coreProcessIdentifier());
+ else
+ processPool().clearWebProcessIsPlayingAudibleMedia(coreProcessIdentifier());
+}
+
void WebProcessProxy::setIsHoldingLockedFiles(bool isHoldingLockedFiles)
{
if (!isHoldingLockedFiles) {
Modified: branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessProxy.h (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessProxy.h 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/UIProcess/WebProcessProxy.h 2019-05-15 05:24:03 UTC (rev 245319)
@@ -306,6 +306,8 @@
void processWasUnexpectedlyUnsuspended(CompletionHandler<void()>&&);
#endif
+ void webPageMediaStateDidChange(WebPageProxy&);
+
protected:
static uint64_t generatePageID();
WebProcessProxy(WebProcessPool&, WebsiteDataStore*, IsPrewarmed);
@@ -485,6 +487,7 @@
unsigned m_suspendedPageCount { 0 };
bool m_hasCommittedAnyProvisionalLoads { false };
bool m_isPrewarmed;
+ bool m_hasAudibleWebPage { false };
#if PLATFORM(WATCHOS)
ProcessThrottler::BackgroundActivityToken m_backgroundActivityTokenForFullscreenFormControls;
Modified: branches/safari-608.1.24-branch/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm (245318 => 245319)
--- branches/safari-608.1.24-branch/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm 2019-05-15 05:23:57 UTC (rev 245318)
+++ branches/safari-608.1.24-branch/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm 2019-05-15 05:24:03 UTC (rev 245319)
@@ -181,6 +181,8 @@
return BKSProcessAssertionReasonFinishTask;
case AssertionReason::FinishTaskUnbounded:
return BKSProcessAssertionReasonFinishTaskUnbounded;
+ case AssertionReason::MediaPlayback:
+ return BKSProcessAssertionReasonMediaPlayback;
}
}