Title: [172890] trunk/Source/WebCore
Revision
172890
Author
beid...@apple.com
Date
2014-08-23 13:39:07 -0700 (Sat, 23 Aug 2014)

Log Message

Random Gamepad cleanup
https://bugs.webkit.org/show_bug.cgi?id=136193

Reviewed by Sam Weinig.

No new tests (Not tested yet, and no change in behavior anyways)

- Use DOMWindow WeakPtrs when iterating
- More references instead of pointers

* Modules/gamepad/GamepadEvent.cpp:
(WebCore::GamepadEvent::GamepadEvent):
* Modules/gamepad/GamepadEvent.h:
(WebCore::GamepadEvent::create):

* Modules/gamepad/GamepadManager.cpp:
(WebCore::GamepadManager::platformGamepadDisconnected):
(WebCore::GamepadManager::makeGamepadVisible):
* Modules/gamepad/NavigatorGamepad.cpp:
(WebCore::NavigatorGamepad::gamepadFromPlatformGamepad):
(WebCore::NavigatorGamepad::gamepadAtIndex): Deleted.
* Modules/gamepad/NavigatorGamepad.h:

* page/DOMWindow.cpp:
(WebCore::DOMWindow::DOMWindow):
* page/DOMWindow.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (172889 => 172890)


--- trunk/Source/WebCore/ChangeLog	2014-08-23 09:24:44 UTC (rev 172889)
+++ trunk/Source/WebCore/ChangeLog	2014-08-23 20:39:07 UTC (rev 172890)
@@ -1,3 +1,32 @@
+2014-08-23  Brady Eidson  <beid...@apple.com>
+
+        Random Gamepad cleanup
+        https://bugs.webkit.org/show_bug.cgi?id=136193
+
+        Reviewed by Sam Weinig.
+
+        No new tests (Not tested yet, and no change in behavior anyways)
+
+        - Use DOMWindow WeakPtrs when iterating
+        - More references instead of pointers
+
+        * Modules/gamepad/GamepadEvent.cpp:
+        (WebCore::GamepadEvent::GamepadEvent):
+        * Modules/gamepad/GamepadEvent.h:
+        (WebCore::GamepadEvent::create):
+
+        * Modules/gamepad/GamepadManager.cpp:
+        (WebCore::GamepadManager::platformGamepadDisconnected):
+        (WebCore::GamepadManager::makeGamepadVisible):
+        * Modules/gamepad/NavigatorGamepad.cpp:
+        (WebCore::NavigatorGamepad::gamepadFromPlatformGamepad):
+        (WebCore::NavigatorGamepad::gamepadAtIndex): Deleted.
+        * Modules/gamepad/NavigatorGamepad.h:
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::DOMWindow):
+        * page/DOMWindow.h:
+
 2014-08-23  Byungseon Shin  <sun.s...@lge.com>
 
         Unify GraphicsLayer::setContentsToMedia and setContentsToCanvas

Modified: trunk/Source/WebCore/Modules/gamepad/GamepadEvent.cpp (172889 => 172890)


--- trunk/Source/WebCore/Modules/gamepad/GamepadEvent.cpp	2014-08-23 09:24:44 UTC (rev 172889)
+++ trunk/Source/WebCore/Modules/gamepad/GamepadEvent.cpp	2014-08-23 20:39:07 UTC (rev 172890)
@@ -33,9 +33,9 @@
 {
 }
 
-GamepadEvent::GamepadEvent(const AtomicString& eventType, Gamepad* gamepad)
+GamepadEvent::GamepadEvent(const AtomicString& eventType, Gamepad& gamepad)
     : Event(eventType, false, false)
-    , m_gamepad(gamepad)
+    , m_gamepad(&gamepad)
 {
 }
 

Modified: trunk/Source/WebCore/Modules/gamepad/GamepadEvent.h (172889 => 172890)


--- trunk/Source/WebCore/Modules/gamepad/GamepadEvent.h	2014-08-23 09:24:44 UTC (rev 172889)
+++ trunk/Source/WebCore/Modules/gamepad/GamepadEvent.h	2014-08-23 20:39:07 UTC (rev 172890)
@@ -50,7 +50,7 @@
         return adoptRef(new GamepadEvent);
     }
 
-    static PassRefPtr<GamepadEvent> create(const AtomicString& eventType, Gamepad* gamepad)
+    static PassRefPtr<GamepadEvent> create(const AtomicString& eventType, Gamepad& gamepad)
     {
         return adoptRef(new GamepadEvent(eventType, gamepad));
     }
@@ -66,7 +66,7 @@
 
 private:
     GamepadEvent();
-    explicit GamepadEvent(const AtomicString& eventType, Gamepad*);
+    explicit GamepadEvent(const AtomicString& eventType, Gamepad&);
     GamepadEvent(const AtomicString& eventType, const GamepadEventInit&);
 
     RefPtr<Gamepad> m_gamepad;

Modified: trunk/Source/WebCore/Modules/gamepad/GamepadManager.cpp (172889 => 172890)


--- trunk/Source/WebCore/Modules/gamepad/GamepadManager.cpp	2014-08-23 09:24:44 UTC (rev 172889)
+++ trunk/Source/WebCore/Modules/gamepad/GamepadManager.cpp	2014-08-23 20:39:07 UTC (rev 172890)
@@ -77,18 +77,21 @@
 
 void GamepadManager::platformGamepadDisconnected(PlatformGamepad& platformGamepad)
 {
-    Vector<DOMWindow*> domWindowVector;
-    copyToVector(m_domWindows, domWindowVector);
+    Vector<WeakPtr<DOMWindow>> weakWindows;
+    for (auto* domWindow : m_domWindows)
+        weakWindows.append(domWindow->createWeakPtr());
 
     HashSet<NavigatorGamepad*> notifiedNavigators;
 
     // Handle the disconnect for all DOMWindows with event listeners and their Navigators.
-    for (auto* window : domWindowVector) {
+    for (auto& window : weakWindows) {
         // Event dispatch might have made this window go away.
-        if (!m_domWindows.contains(window))
+        if (!window)
             continue;
 
-        NavigatorGamepad* navigator = navigatorGamepadFromDOMWindow(window);
+        // This DOMWindow's Navigator might not be accessible. e.g. The DOMWindow might be in the back/forward cache.
+        // If this happens the DOMWindow will not get this gamepaddisconnected event.
+        NavigatorGamepad* navigator = navigatorGamepadFromDOMWindow(window.get());
         if (!navigator)
             continue;
 
@@ -96,8 +99,7 @@
         if (m_gamepadBlindNavigators.contains(navigator))
             continue;
 
-        RefPtr<Gamepad> gamepad = navigator->gamepadAtIndex(platformGamepad.index());
-        ASSERT(gamepad);
+        Ref<Gamepad> gamepad(navigator->gamepadFromPlatformGamepad(platformGamepad));
 
         navigator->gamepadDisconnected(platformGamepad);
         notifiedNavigators.add(navigator);
@@ -132,21 +134,23 @@
     for (auto* navigator : navigatorSet)
         navigator->gamepadConnected(platformGamepad);
 
-    Vector<DOMWindow*> domWindowVector;
-    copyToVector(domWindowSet, domWindowVector);
+    Vector<WeakPtr<DOMWindow>> weakWindows;
+    for (auto* domWindow : m_domWindows)
+        weakWindows.append(domWindow->createWeakPtr());
 
-    for (auto* window : domWindowVector) {
+    for (auto& window : weakWindows) {
         // Event dispatch might have made this window go away.
-        if (!m_domWindows.contains(window))
+        if (!window)
             continue;
 
-        NavigatorGamepad* navigator = navigatorGamepadFromDOMWindow(window);
+        // This DOMWindow's Navigator might not be accessible. e.g. The DOMWindow might be in the back/forward cache.
+        // If this happens the DOMWindow will not get this gamepadconnected event.
+        // The new gamepad will still be visibile to it once it is restored from the back/forward cache.
+        NavigatorGamepad* navigator = navigatorGamepadFromDOMWindow(window.get());
         if (!navigator)
             continue;
 
-        RefPtr<Gamepad> gamepad = navigator->gamepadAtIndex(platformGamepad.index());
-        ASSERT(gamepad);
-
+        Ref<Gamepad> gamepad(navigator->gamepadFromPlatformGamepad(platformGamepad));
         window->dispatchEvent(GamepadEvent::create(eventNames().gamepadconnectedEvent, gamepad.get()), window->document());
     }
 }

Modified: trunk/Source/WebCore/Modules/gamepad/NavigatorGamepad.cpp (172889 => 172890)


--- trunk/Source/WebCore/Modules/gamepad/NavigatorGamepad.cpp	2014-08-23 09:24:44 UTC (rev 172889)
+++ trunk/Source/WebCore/Modules/gamepad/NavigatorGamepad.cpp	2014-08-23 20:39:07 UTC (rev 172890)
@@ -72,11 +72,13 @@
     return supplement;
 }
 
-Gamepad* NavigatorGamepad::gamepadAtIndex(unsigned index)
+PassRef<Gamepad> NavigatorGamepad::gamepadFromPlatformGamepad(PlatformGamepad& platformGamepad)
 {
-    if (index >= m_gamepads.size())
-        return nullptr;
-    return m_gamepads[index].get();
+    unsigned index = platformGamepad.index();
+    if (index >= m_gamepads.size() || !m_gamepads[index])
+        return adoptRef(*Gamepad::create(platformGamepad).leakRef());
+
+    return *m_gamepads[index];
 }
 
 const Vector<RefPtr<Gamepad>>& NavigatorGamepad::getGamepads(Navigator* navigator)

Modified: trunk/Source/WebCore/Modules/gamepad/NavigatorGamepad.h (172889 => 172890)


--- trunk/Source/WebCore/Modules/gamepad/NavigatorGamepad.h	2014-08-23 09:24:44 UTC (rev 172889)
+++ trunk/Source/WebCore/Modules/gamepad/NavigatorGamepad.h	2014-08-23 20:39:07 UTC (rev 172890)
@@ -53,7 +53,7 @@
     void gamepadConnected(PlatformGamepad&);
     void gamepadDisconnected(PlatformGamepad&);
 
-    Gamepad* gamepadAtIndex(unsigned index);
+    PassRef<Gamepad> gamepadFromPlatformGamepad(PlatformGamepad&);
 
 private:
     static const char* supplementName();

Modified: trunk/Source/WebCore/page/DOMWindow.cpp (172889 => 172890)


--- trunk/Source/WebCore/page/DOMWindow.cpp	2014-08-23 09:24:44 UTC (rev 172889)
+++ trunk/Source/WebCore/page/DOMWindow.cpp	2014-08-23 20:39:07 UTC (rev 172890)
@@ -393,6 +393,7 @@
     , m_shouldPrintWhenFinishedLoading(false)
     , m_suspendedForPageCache(false)
     , m_lastPageStatus(PageStatusNone)
+    , m_weakPtrFactory(this)
 #if PLATFORM(IOS)
     , m_scrollEventListenerCount(0)
 #endif

Modified: trunk/Source/WebCore/page/DOMWindow.h (172889 => 172890)


--- trunk/Source/WebCore/page/DOMWindow.h	2014-08-23 09:24:44 UTC (rev 172889)
+++ trunk/Source/WebCore/page/DOMWindow.h	2014-08-23 20:39:07 UTC (rev 172890)
@@ -34,6 +34,7 @@
 #include "Supplementable.h"
 #include <functional>
 #include <memory>
+#include <wtf/WeakPtr.h>
 
 namespace Inspector {
 class ScriptCallStack;
@@ -445,6 +446,8 @@
         void enableSuddenTermination();
         void disableSuddenTermination();
 
+        WeakPtr<DOMWindow> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
+
     private:
         explicit DOMWindow(Document*);
 
@@ -494,6 +497,8 @@
         enum PageStatus { PageStatusNone, PageStatusShown, PageStatusHidden };
         PageStatus m_lastPageStatus;
 
+        WeakPtrFactory<DOMWindow> m_weakPtrFactory;
+
 #if PLATFORM(IOS)
         unsigned m_scrollEventListenerCount;
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to