Diff
Modified: trunk/Source/WebCore/ChangeLog (166442 => 166443)
--- trunk/Source/WebCore/ChangeLog 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebCore/ChangeLog 2014-03-29 01:15:49 UTC (rev 166443)
@@ -1,5 +1,17 @@
2014-03-28 Stephanie Lewis <sle...@apple.com>
+ Rename pluginDidEvaluate to better represent when it’s called.
+ Part of <rdar://problem/16061257> PluginProcess should AppNap when no plugins on active tab.
+
+ Reviewed by Anders Carlsson.
+
+ No new test because it’s just a name change.
+
+ * page/PageThrottler.h:
+ (WebCore::PageThrottler::pluginDidEvaluateWhileAudioIsPlaying):
+
+2014-03-28 Stephanie Lewis <sle...@apple.com>
+
Notification handler for telling if audio hardware is active.
https://bugs.webkit.org/show_bug.cgi?id=130743
Modified: trunk/Source/WebCore/page/PageThrottler.h (166442 => 166443)
--- trunk/Source/WebCore/page/PageThrottler.h 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebCore/page/PageThrottler.h 2014-03-29 01:15:49 UTC (rev 166443)
@@ -47,7 +47,7 @@
void setViewState(ViewState::Flags);
void didReceiveUserInput() { m_hysteresis.impulse(); }
- void pluginDidEvaluate() { m_hysteresis.impulse(); }
+ void pluginDidEvaluateWhileAudioIsPlaying() { m_hysteresis.impulse(); }
std::unique_ptr<PageActivityAssertionToken> mediaActivityToken();
std::unique_ptr<PageActivityAssertionToken> pageLoadActivityToken();
Modified: trunk/Source/WebKit2/ChangeLog (166442 => 166443)
--- trunk/Source/WebKit2/ChangeLog 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/ChangeLog 2014-03-29 01:15:49 UTC (rev 166443)
@@ -1,5 +1,48 @@
2014-03-28 Stephanie Lewis <sle...@apple.com>
+ Stop waking up the web process in the background because of plugin activity.
+ Part of <rdar://problem/16061257> PluginProcess should AppNap when no plugins on active tab.
+
+ Reviewed by Anders Carlsson.
+
+ Plugin activity in the background can constantly wake up web processes. This is only
+ necessary when audio is playing to support web apps like Pandora and youtube playing
+ in the background. Use a new api in CoreAudio to see if there is audio playing in
+ the PluginProcess.
+
+ * PluginProcess/PluginProcess.cpp:
+ (WebKit::PluginProcess::PluginProcess): Add a AudioHardwareListener
+ (WebKit::PluginProcess::createWebProcessConnection): tell web process current state
+ (WebKit::PluginProcess::audioHardwareDidBecomeActive): respond to audio hardware notifications
+ (WebKit::PluginProcess::audioHardwareDidBecomeInactive):
+ * PluginProcess/PluginProcess.h:
+ * PluginProcess/WebProcessConnection.cpp: tell WebProcess when audio state in PluginProcess
+ changes.
+ (WebKit::WebProcessConnection::audioHardwareDidBecomeActive):
+ (WebKit::WebProcessConnection::audioHardwareDidBecomeInactive):
+ * PluginProcess/WebProcessConnection.h:
+ * WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp:
+ Only invoke pageThrottler activity when playing audio
+ (WebKit::NPRuntimeObjectMap::evaluate):
+ * WebProcess/Plugins/Plugin.h: add function to get audio state
+ (WebKit::Plugin::audioIsPlayingInPluginProcess):
+ * WebProcess/Plugins/PluginProcessConnection.cpp: store audio state
+ (WebKit::PluginProcessConnection::PluginProcessConnection):
+ (WebKit::PluginProcessConnection::didReceiveMessage):
+ (WebKit::PluginProcessConnection::audioHardwareDidBecomeActive):
+ (WebKit::PluginProcessConnection::audioHardwareDidBecomeInactive):
+ * WebProcess/Plugins/PluginProcessConnection.h:
+ (WebKit::PluginProcessConnection::audioIsPlaying):
+ * WebProcess/Plugins/PluginProcessConnection.messages.in:
+ * WebProcess/Plugins/PluginProxy.cpp:
+ (WebKit::PluginProxy::audioIsPlayingInPluginProcess):
+ * WebProcess/Plugins/PluginProxy.h:
+ * WebProcess/Plugins/PluginView.cpp:
+ (WebKit::PluginView::audioIsPlayingInPluginProcess):
+ * WebProcess/Plugins/PluginView.h:
+
+2014-03-28 Stephanie Lewis <sle...@apple.com>
+
Have the plugin process track visibility of it’s plugin and sleep when none
are visible.
Part of <rdar://problem/16061257> PluginProcess should AppNap when no plugins on active tab.
Modified: trunk/Source/WebKit2/PluginProcess/PluginProcess.cpp (166442 => 166443)
--- trunk/Source/WebKit2/PluginProcess/PluginProcess.cpp 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/PluginProcess/PluginProcess.cpp 2014-03-29 01:15:49 UTC (rev 166443)
@@ -64,6 +64,7 @@
, m_visiblePluginsActivity("Visible plugins from PluginProcess activity.")
{
NetscapePlugin::setSetExceptionFunction(WebProcessConnection::setGlobalException);
+ m_audioHardwareListener = AudioHardwareListener::create(*this);
}
PluginProcess::~PluginProcess()
@@ -161,6 +162,14 @@
// Create a listening connection.
RefPtr<WebProcessConnection> connection = WebProcessConnection::create(IPC::Connection::Identifier(listeningPort));
+
+ if (m_audioHardwareListener) {
+ if (m_audioHardwareListener->hardwareActivity() == WebCore::AudioHardwareActivityType::IsActive)
+ connection->audioHardwareDidBecomeActive();
+ else if (m_audioHardwareListener->hardwareActivity() == WebCore::AudioHardwareActivityType::IsInactive)
+ connection->audioHardwareDidBecomeInactive();
+ }
+
m_webProcessConnections.append(connection.release());
IPC::Attachment clientPort(listeningPort, MACH_MSG_TYPE_MAKE_SEND);
@@ -246,6 +255,18 @@
{
m_visiblePluginsActivity.decrement();
}
+
+void PluginProcess::audioHardwareDidBecomeActive()
+{
+ for (auto& connection : m_webProcessConnections)
+ connection->audioHardwareDidBecomeActive();
+}
+
+void PluginProcess::audioHardwareDidBecomeInactive()
+{
+ for (auto& connection : m_webProcessConnections)
+ connection->audioHardwareDidBecomeInactive();
+}
} // namespace WebKit
Modified: trunk/Source/WebKit2/PluginProcess/PluginProcess.h (166442 => 166443)
--- trunk/Source/WebKit2/PluginProcess/PluginProcess.h 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/PluginProcess/PluginProcess.h 2014-03-29 01:15:49 UTC (rev 166443)
@@ -30,6 +30,7 @@
#include "ChildProcess.h"
#include <WebCore/CountedUserActivity.h>
+#include <WebCore/AudioHardwareListener.h>
#include <wtf/Forward.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/text/WTFString.h>
@@ -40,7 +41,8 @@
class WebProcessConnection;
struct PluginProcessCreationParameters;
-class PluginProcess : public ChildProcess {
+class PluginProcess : public ChildProcess, private WebCore::AudioHardwareListener::Client
+{
WTF_MAKE_NONCOPYABLE(PluginProcess);
friend class NeverDestroyed<PluginProcess>;
public:
@@ -95,6 +97,10 @@
void createWebProcessConnection();
void getSitesWithData(uint64_t callbackID);
void clearSiteData(const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID);
+
+ // AudioHardwareListenerClient
+ virtual void audioHardwareDidBecomeActive() override;
+ virtual void audioHardwareDidBecomeInactive() override;
void platformInitializePluginProcess(const PluginProcessCreationParameters&);
@@ -125,6 +131,8 @@
static void lowMemoryHandler(bool critical);
CountedUserActivity m_connectionActivity;
CountedUserActivity m_visiblePluginsActivity;
+
+ RefPtr<WebCore::AudioHardwareListener> m_audioHardwareListener;
};
} // namespace WebKit
Modified: trunk/Source/WebKit2/PluginProcess/WebProcessConnection.cpp (166442 => 166443)
--- trunk/Source/WebKit2/PluginProcess/WebProcessConnection.cpp 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/PluginProcess/WebProcessConnection.cpp 2014-03-29 01:15:49 UTC (rev 166443)
@@ -39,6 +39,7 @@
#include "PluginProcessConnectionMessages.h"
#include "PluginProxyMessages.h"
#include "WebProcessConnectionMessages.h"
+#include <WebCore/AudioHardwareListener.h>
#include <unistd.h>
#include <wtf/RunLoop.h>
@@ -348,6 +349,16 @@
PluginProcess::shared().pluginsForWebProcessDidBecomeHidden();
}
+void WebProcessConnection::audioHardwareDidBecomeActive()
+{
+ m_connection->send(Messages::PluginProcessConnection::AudioHardwareDidBecomeActive(), 0);
+}
+
+void WebProcessConnection::audioHardwareDidBecomeInactive()
+{
+ m_connection->send(Messages::PluginProcessConnection::AudioHardwareDidBecomeInactive(), 0);
+}
+
} // namespace WebKit
#endif // ENABLE(NETSCAPE_PLUGIN_API)
Modified: trunk/Source/WebKit2/PluginProcess/WebProcessConnection.h (166442 => 166443)
--- trunk/Source/WebKit2/PluginProcess/WebProcessConnection.h 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/PluginProcess/WebProcessConnection.h 2014-03-29 01:15:49 UTC (rev 166443)
@@ -57,6 +57,9 @@
void pluginDidBecomeVisible(unsigned pluginInstanceID);
void pluginDidBecomeHidden(unsigned pluginInstanceID);
+ void audioHardwareDidBecomeActive();
+ void audioHardwareDidBecomeInactive();
+
private:
WebProcessConnection(IPC::Connection::Identifier);
Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp 2014-03-29 01:15:49 UTC (rev 166443)
@@ -39,6 +39,7 @@
#include <_javascript_Core/SourceCode.h>
#include <_javascript_Core/Strong.h>
#include <_javascript_Core/StrongInlines.h>
+#include <WebCore/AudioHardwareListener.h>
#include <WebCore/DOMWrapperWorld.h>
#include <WebCore/Frame.h>
#include <WebCore/Page.h>
@@ -190,8 +191,10 @@
return false;
if (m_pluginView && !m_pluginView->isBeingDestroyed()) {
- if (Page* page = m_pluginView->frame()->page())
- page->pageThrottler().pluginDidEvaluate();
+ if (Page* page = m_pluginView->frame()->page()) {
+ if (m_pluginView->audioHardwareActivity() != WebCore::AudioHardwareActivityType::IsInactive)
+ page->pageThrottler().pluginDidEvaluateWhileAudioIsPlaying();
+ }
}
ExecState* exec = globalObject->globalExec();
Modified: trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h 2014-03-29 01:15:49 UTC (rev 166443)
@@ -26,6 +26,7 @@
#ifndef Plugin_h
#define Plugin_h
+#include <WebCore/AudioHardwareListener.h>
#include <WebCore/FindOptions.h>
#include <WebCore/GraphicsLayer.h>
#include <WebCore/URL.h>
@@ -276,6 +277,8 @@
virtual bool performDictionaryLookupAtLocation(const WebCore::FloatPoint&) = 0;
virtual String getSelectionString() const = 0;
+
+ virtual WebCore::AudioHardwareActivityType audioHardwareActivity() const { return WebCore::AudioHardwareActivityType::Unknown; }
protected:
Plugin();
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp 2014-03-29 01:15:49 UTC (rev 166443)
@@ -46,6 +46,7 @@
: m_pluginProcessConnectionManager(pluginProcessConnectionManager)
, m_pluginProcessToken(pluginProcessToken)
, m_supportsAsynchronousPluginInitialization(supportsAsynchronousPluginInitialization)
+ , m_audioHardwareActivity(WebCore::AudioHardwareActivityType::Unknown)
{
m_connection = IPC::Connection::createClientConnection(connectionIdentifier, this, RunLoop::main());
@@ -90,6 +91,11 @@
void PluginProcessConnection::didReceiveMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder)
{
+ if (!decoder.destinationID()) {
+ didReceivePluginProcessConnectionMessage(connection, decoder);
+ return;
+ }
+
ASSERT(decoder.destinationID());
PluginProxy* pluginProxy = m_plugins.get(decoder.destinationID());
@@ -138,7 +144,17 @@
{
NPRuntimeObjectMap::setGlobalException(exceptionString);
}
+
+void PluginProcessConnection::audioHardwareDidBecomeActive()
+{
+ m_audioHardwareActivity = WebCore::AudioHardwareActivityType::IsActive;
+}
+void PluginProcessConnection::audioHardwareDidBecomeInactive()
+{
+ m_audioHardwareActivity = WebCore::AudioHardwareActivityType::IsInactive;
+}
+
} // namespace WebKit
#endif // ENABLE(NETSCAPE_PLUGIN_API)
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.h (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.h 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.h 2014-03-29 01:15:49 UTC (rev 166443)
@@ -58,7 +58,8 @@
NPRemoteObjectMap* npRemoteObjectMap() const { return m_npRemoteObjectMap.get(); }
bool supportsAsynchronousPluginInitialization() const { return m_supportsAsynchronousPluginInitialization; }
-
+ WebCore::AudioHardwareActivityType audioHardwareActivity() const { return m_audioHardwareActivity; }
+
private:
PluginProcessConnection(PluginProcessConnectionManager*, uint64_t pluginProcessToken, IPC::Connection::Identifier connectionIdentifier, bool supportsAsynchronousInitialization);
@@ -69,8 +70,11 @@
virtual void didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override;
// Message handlers.
+ void didReceivePluginProcessConnectionMessage(IPC::Connection*, IPC::MessageDecoder&);
void didReceiveSyncPluginProcessConnectionMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&);
void setException(const String&);
+ void audioHardwareDidBecomeActive();
+ void audioHardwareDidBecomeInactive();
PluginProcessConnectionManager* m_pluginProcessConnectionManager;
uint64_t m_pluginProcessToken;
@@ -84,6 +88,7 @@
RefPtr<NPRemoteObjectMap> m_npRemoteObjectMap;
bool m_supportsAsynchronousPluginInitialization;
+ WebCore::AudioHardwareActivityType m_audioHardwareActivity;
};
} // namespace WebKit
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.messages.in (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.messages.in 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.messages.in 2014-03-29 01:15:49 UTC (rev 166443)
@@ -25,6 +25,10 @@
messages -> PluginProcessConnection LegacyReceiver {
# Set a global _javascript_ exception.
SetException(String exceptionString) -> ()
+
+ # Plugin process audio hardware state changed
+ AudioHardwareDidBecomeActive()
+ AudioHardwareDidBecomeInactive()
}
#endif
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp 2014-03-29 01:15:49 UTC (rev 166443)
@@ -709,6 +709,11 @@
{
return 0;
}
+
+WebCore::AudioHardwareActivityType PluginProxy::audioHardwareActivity() const
+{
+ return m_connection->audioHardwareActivity();
+}
} // namespace WebKit
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h 2014-03-29 01:15:49 UTC (rev 166443)
@@ -138,6 +138,8 @@
virtual bool performDictionaryLookupAtLocation(const WebCore::FloatPoint&) override { return false; }
virtual String getSelectionString() const override { return String(); }
+
+ virtual WebCore::AudioHardwareActivityType audioHardwareActivity() const override;
float contentsScaleFactor();
bool needsBackingStore() const;
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp 2014-03-29 01:15:49 UTC (rev 166443)
@@ -544,7 +544,12 @@
m_plugin->sendComplexTextInput(textInput);
return true;
}
-
+
+WebCore::AudioHardwareActivityType PluginView::audioHardwareActivity() const
+{
+ return m_plugin->audioHardwareActivity();
+}
+
NSObject *PluginView::accessibilityObject() const
{
if (!m_isInitialized || !m_plugin)
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h (166442 => 166443)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h 2014-03-29 01:15:47 UTC (rev 166442)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h 2014-03-29 01:15:49 UTC (rev 166443)
@@ -107,6 +107,7 @@
PassRefPtr<WebCore::SharedBuffer> liveResourceData() const;
bool performDictionaryLookupAtLocation(const WebCore::FloatPoint&);
+ WebCore::AudioHardwareActivityType audioHardwareActivity() const;
private:
PluginView(PassRefPtr<WebCore::HTMLPlugInElement>, PassRefPtr<Plugin>, const Plugin::Parameters& parameters);