Title: [166443] trunk/Source
Revision
166443
Author
sle...@apple.com
Date
2014-03-28 18:15:49 -0700 (Fri, 28 Mar 2014)

Log Message

Source/WebCore: 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):

Source/WebKit2: 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:

Modified Paths

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);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to