Title: [170911] trunk/Source/WebCore
Revision
170911
Author
beid...@apple.com
Date
2014-07-08 23:50:35 -0700 (Tue, 08 Jul 2014)

Log Message

DOMWindows should register themselves with the GamepadManager when they have event listeners
https://bugs.webkit.org/show_bug.cgi?id=134669

Reviewed by Dean Jackson.

No new tests (No effect in a currently tested config)

By having DOMWindows register with the GamepadManager when they have/don’t have gamepad event
listeners, we accomplish two things:
1 - It’s simple for GamepadManager to dispatch gamepad events directly to the DOMWindows interested.
2 - We know when to start monitoring for gamepad connections.

* Modules/gamepad/GamepadManager.cpp:
(WebCore::GamepadManager::GamepadManager):
(WebCore::GamepadManager::registerNavigator):
(WebCore::GamepadManager::unregisterNavigator):
(WebCore::GamepadManager::registerDOMWindow):
(WebCore::GamepadManager::unregisterDOMWindow):
(WebCore::GamepadManager::maybeStartMonitoringGamepads): Start monitoring gamepads if there are any
  registered DOMWindows or NavigatorGamepads, and we aren’t already monitoring them.
(WebCore::GamepadManager::maybeStopMonitoringGamepads): Stop monitoring gamepads if there aren’t any
  registered DOMWindows or NavigatorGameads, and we have been monitoring them before now.
* Modules/gamepad/GamepadManager.h:

* dom/EventNames.h:
(WebCore::EventNames::isGamepadEventType):

* page/DOMWindow.cpp:
(WebCore::DOMWindow::DOMWindow):
(WebCore::DOMWindow::~DOMWindow): If registered for gamepad events, unregister now.
(WebCore::DOMWindow::incrementGamepadEventListenerCount): If this is the first gamepad event
  listener, register with the GamepadManager now.
(WebCore::DOMWindow::decrementGamepadEventListenerCount): If this was the last gamepad event
  listener, unregister from the GamepadManager now.
(WebCore::DOMWindow::addEventListener):
(WebCore::DOMWindow::removeEventListener):
* page/DOMWindow.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (170910 => 170911)


--- trunk/Source/WebCore/ChangeLog	2014-07-09 05:56:45 UTC (rev 170910)
+++ trunk/Source/WebCore/ChangeLog	2014-07-09 06:50:35 UTC (rev 170911)
@@ -1,3 +1,43 @@
+2014-07-08  Brady Eidson  <beid...@apple.com>
+
+        DOMWindows should register themselves with the GamepadManager when they have event listeners
+        https://bugs.webkit.org/show_bug.cgi?id=134669
+
+        Reviewed by Dean Jackson.
+
+        No new tests (No effect in a currently tested config)
+
+        By having DOMWindows register with the GamepadManager when they have/don’t have gamepad event
+        listeners, we accomplish two things:
+        1 - It’s simple for GamepadManager to dispatch gamepad events directly to the DOMWindows interested.
+        2 - We know when to start monitoring for gamepad connections.
+
+        * Modules/gamepad/GamepadManager.cpp:
+        (WebCore::GamepadManager::GamepadManager):
+        (WebCore::GamepadManager::registerNavigator):
+        (WebCore::GamepadManager::unregisterNavigator):
+        (WebCore::GamepadManager::registerDOMWindow):
+        (WebCore::GamepadManager::unregisterDOMWindow):
+        (WebCore::GamepadManager::maybeStartMonitoringGamepads): Start monitoring gamepads if there are any
+          registered DOMWindows or NavigatorGamepads, and we aren’t already monitoring them.
+        (WebCore::GamepadManager::maybeStopMonitoringGamepads): Stop monitoring gamepads if there aren’t any
+          registered DOMWindows or NavigatorGameads, and we have been monitoring them before now.
+        * Modules/gamepad/GamepadManager.h:
+
+        * dom/EventNames.h:
+        (WebCore::EventNames::isGamepadEventType):
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::DOMWindow):
+        (WebCore::DOMWindow::~DOMWindow): If registered for gamepad events, unregister now.
+        (WebCore::DOMWindow::incrementGamepadEventListenerCount): If this is the first gamepad event
+          listener, register with the GamepadManager now.
+        (WebCore::DOMWindow::decrementGamepadEventListenerCount): If this was the last gamepad event
+          listener, unregister from the GamepadManager now.
+        (WebCore::DOMWindow::addEventListener):
+        (WebCore::DOMWindow::removeEventListener):
+        * page/DOMWindow.h:
+
 2014-07-08  Sun-woo Nam  <sunny....@samsung.com>
 
         [EFL] Fix the build break when ENABLE_ENCRYPTED_MEDIA_V2 is turned on.

Modified: trunk/Source/WebCore/Modules/gamepad/GamepadManager.cpp (170910 => 170911)


--- trunk/Source/WebCore/Modules/gamepad/GamepadManager.cpp	2014-07-09 05:56:45 UTC (rev 170910)
+++ trunk/Source/WebCore/Modules/gamepad/GamepadManager.cpp	2014-07-09 06:50:35 UTC (rev 170911)
@@ -42,8 +42,8 @@
 }
 
 GamepadManager::GamepadManager()
+    : m_isMonitoringGamepads(false)
 {
-    GamepadProvider::shared().stopMonitoringGamepads(this);
 }
 
 void GamepadManager::platformGamepadConnected(PlatformGamepad& platformGamepad)
@@ -95,13 +95,7 @@
     m_navigators.add(navigator);
     m_gamepadBlindNavigators.add(navigator);
 
-    // FIXME: Monitoring gamepads will also be reliant on whether or not there are any
-    // connected/disconnected event listeners.
-    // Those event listeners will also need to register with the GamepadManager.
-    if (m_navigators.size() == 1) {
-        LOG(Gamepad, "GamepadManager registered first navigator, is starting gamepad monitoring");
-        GamepadProvider::shared().startMonitoringGamepads(this);
-    }
+    maybeStartMonitoringGamepads();
 }
 
 void GamepadManager::unregisterNavigator(NavigatorGamepad* navigator)
@@ -112,11 +106,49 @@
     m_navigators.remove(navigator);
     m_gamepadBlindNavigators.remove(navigator);
 
-    // FIXME: Monitoring gamepads will also be reliant on whether or not there are any
-    // connected/disconnected event listeners.
-    // Those event listeners will also need to register with the GamepadManager.
-    if (m_navigators.isEmpty()) {
-        LOG(Gamepad, "GamepadManager unregistered last navigator, is stopping gamepad monitoring");
+    maybeStopMonitoringGamepads();
+}
+
+void GamepadManager::registerDOMWindow(DOMWindow* window)
+{
+    LOG(Gamepad, "GamepadManager registering DOMWindow %p", window);
+
+    ASSERT(!m_domWindows.contains(window));
+    m_domWindows.add(window);
+
+    maybeStartMonitoringGamepads();
+}
+
+void GamepadManager::unregisterDOMWindow(DOMWindow* window)
+{
+    LOG(Gamepad, "GamepadManager unregistering DOMWindow %p", window);
+
+    ASSERT(m_domWindows.contains(window));
+    m_domWindows.remove(window);
+
+    maybeStopMonitoringGamepads();
+}
+
+void GamepadManager::maybeStartMonitoringGamepads()
+{
+    if (m_isMonitoringGamepads)
+        return;
+
+    if (!m_navigators.isEmpty() || !m_domWindows.isEmpty()) {
+        LOG(Gamepad, "GamepadManager has %i NavigatorGamepads and %i DOMWindows registered, is starting gamepad monitoring", m_navigators.size(), m_domWindows.size());
+        m_isMonitoringGamepads = true;
+        GamepadProvider::shared().startMonitoringGamepads(this);
+    }
+}
+
+void GamepadManager::maybeStopMonitoringGamepads()
+{
+    if (!m_isMonitoringGamepads)
+        return;
+
+    if (m_navigators.isEmpty() && m_domWindows.isEmpty()) {
+        LOG(Gamepad, "GamepadManager has no NavigatorGamepads or DOMWindows registered, is stopping gamepad monitoring");
+        m_isMonitoringGamepads = false;
         GamepadProvider::shared().stopMonitoringGamepads(this);
     }
 }

Modified: trunk/Source/WebCore/Modules/gamepad/GamepadManager.h (170910 => 170911)


--- trunk/Source/WebCore/Modules/gamepad/GamepadManager.h	2014-07-09 05:56:45 UTC (rev 170910)
+++ trunk/Source/WebCore/Modules/gamepad/GamepadManager.h	2014-07-09 06:50:35 UTC (rev 170911)
@@ -35,6 +35,7 @@
 
 namespace WebCore {
 
+class DOMWindow;
 class Gamepad;
 class NavigatorGamepad;
 
@@ -50,14 +51,22 @@
 
     void registerNavigator(NavigatorGamepad*);
     void unregisterNavigator(NavigatorGamepad*);
+    void registerDOMWindow(DOMWindow*);
+    void unregisterDOMWindow(DOMWindow*);
 
 private:
     GamepadManager();
 
     void makeGamepadsVisibileToBlindNavigators();
 
+    void maybeStartMonitoringGamepads();
+    void maybeStopMonitoringGamepads();
+
+    bool m_isMonitoringGamepads;
+
     HashSet<NavigatorGamepad*> m_navigators;
     HashSet<NavigatorGamepad*> m_gamepadBlindNavigators;
+    HashSet<DOMWindow*> m_domWindows;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/dom/EventNames.h (170910 => 170911)


--- trunk/Source/WebCore/dom/EventNames.h	2014-07-09 05:56:45 UTC (rev 170910)
+++ trunk/Source/WebCore/dom/EventNames.h	2014-07-09 06:50:35 UTC (rev 170911)
@@ -281,6 +281,11 @@
     macro(gesturechange) \
     macro(gestureend) \
     /* End of ENABLE(IOS_GESTURE_EVENTS) */ \
+    \
+    /* ENABLE(GAMEPAD) */ \
+    macro(gamepadconnected) \
+    macro(gamepaddisconnected) \
+    /* End of ENABLE(GAMEPAD) */ \
 
 // end of DOM_EVENT_NAMES_FOR_EACH
 
@@ -319,6 +324,14 @@
         names.append(touchcancelEvent);
         return names;
     }
+
+#if ENABLE(GAMEPAD)
+    inline bool isGamepadEventType(const AtomicString& eventType) const
+    {
+        return eventType == gamepadconnectedEvent
+            || eventType == gamepaddisconnectedEvent;
+    }
+#endif
 };
 
 inline EventNames& eventNames()

Modified: trunk/Source/WebCore/page/DOMWindow.cpp (170910 => 170911)


--- trunk/Source/WebCore/page/DOMWindow.cpp	2014-07-09 05:56:45 UTC (rev 170910)
+++ trunk/Source/WebCore/page/DOMWindow.cpp	2014-07-09 06:50:35 UTC (rev 170911)
@@ -124,6 +124,10 @@
 #include "RequestAnimationFrameCallback.h"
 #endif
 
+#if ENABLE(GAMEPAD)
+#include "GamepadManager.h"
+#endif
+
 #if PLATFORM(IOS)
 #if ENABLE(GEOLOCATION)
 #include "NavigatorGeolocation.h"
@@ -395,6 +399,9 @@
 #if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS)
     , m_touchEventListenerCount(0)
 #endif
+#if ENABLE(GAMEPAD)
+    , m_gamepadEventListenerCount(0)
+#endif
 {
     ASSERT(frame());
     ASSERT(DOMWindow::document());
@@ -441,6 +448,11 @@
 
     removeAllUnloadEventListeners(this);
     removeAllBeforeUnloadEventListeners(this);
+
+#if ENABLE(GAMEPAD)
+    if (m_gamepadEventListenerCount)
+        GamepadManager::shared().unregisterDOMWindow(this);
+#endif
 }
 
 DOMWindow* DOMWindow::toDOMWindow()
@@ -501,6 +513,22 @@
         properties[i]->willDetachGlobalObjectFromFrame();
 }
 
+#if ENABLE(GAMEPAD)
+void DOMWindow::incrementGamepadEventListenerCount()
+{
+    if (++m_gamepadEventListenerCount == 1)
+        GamepadManager::shared().registerDOMWindow(this);
+}
+
+void DOMWindow::decrementGamepadEventListenerCount()
+{
+    ASSERT(m_gamepadEventListenerCount);
+
+    if (!--m_gamepadEventListenerCount)
+        GamepadManager::shared().unregisterDOMWindow(this);
+}
+#endif
+
 void DOMWindow::registerProperty(DOMWindowProperty* property)
 {
     m_properties.add(property);
@@ -1708,7 +1736,10 @@
     else if (eventNames().isGestureEventType(eventType))
         ++m_touchEventListenerCount;
 #endif
-
+#if ENABLE(GAMEPAD)
+    else if (eventNames().isGamepadEventType(eventType))
+        incrementGamepadEventListenerCount();
+#endif
 #if ENABLE(PROXIMITY_EVENTS)
     else if (eventType == eventNames().webkitdeviceproximityEvent) {
         if (DeviceProximityController* controller = DeviceProximityController::from(page()))
@@ -1798,7 +1829,10 @@
         --m_touchEventListenerCount;
     }
 #endif
-
+#if ENABLE(GAMEPAD)
+    else if (eventNames().isGamepadEventType(eventType))
+        decrementGamepadEventListenerCount();
+#endif
 #if ENABLE(PROXIMITY_EVENTS)
     else if (eventType == eventNames().webkitdeviceproximityEvent) {
         if (DeviceProximityController* controller = DeviceProximityController::from(page()))

Modified: trunk/Source/WebCore/page/DOMWindow.h (170910 => 170911)


--- trunk/Source/WebCore/page/DOMWindow.h	2014-07-09 05:56:45 UTC (rev 170910)
+++ trunk/Source/WebCore/page/DOMWindow.h	2014-07-09 06:50:35 UTC (rev 170911)
@@ -465,6 +465,11 @@
         void reconnectDOMWindowProperties();
         void willDestroyDocumentInFrame();
 
+#if ENABLE(GAMEPAD)
+        void incrementGamepadEventListenerCount();
+        void decrementGamepadEventListenerCount();
+#endif
+
         bool m_shouldPrintWhenFinishedLoading;
         bool m_suspendedForPageCache;
 
@@ -497,6 +502,9 @@
         unsigned m_touchEventListenerCount;
 #endif
 
+#if ENABLE(GAMEPAD)
+        unsigned m_gamepadEventListenerCount;
+#endif
         mutable RefPtr<Storage> m_sessionStorage;
         mutable RefPtr<Storage> m_localStorage;
         mutable RefPtr<DOMApplicationCache> m_applicationCache;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to