Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Unified Diff: Source/modules/gamepad/NavigatorGamepad.cpp

Issue 200783002: Gamepad API: add support for gamepadconnected and gamepaddisconnected events (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: fix missing check for event type Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/modules/gamepad/NavigatorGamepad.cpp
diff --git a/Source/modules/gamepad/NavigatorGamepad.cpp b/Source/modules/gamepad/NavigatorGamepad.cpp
index 27c1e53322ceece8349fc24a3b5d8f530ab8e7e2..161dd0629734ab2dac6b5f51ed3623f6193b2c0e 100644
--- a/Source/modules/gamepad/NavigatorGamepad.cpp
+++ b/Source/modules/gamepad/NavigatorGamepad.cpp
@@ -26,7 +26,10 @@
#include "config.h"
#include "modules/gamepad/NavigatorGamepad.h"
+#include "core/frame/DOMWindow.h"
+#include "core/frame/LocalFrame.h"
#include "core/frame/Navigator.h"
+#include "modules/gamepad/GamepadEvent.h"
#include "modules/gamepad/GamepadList.h"
#include "modules/gamepad/WebKitGamepadList.h"
#include "public/platform/Platform.h"
@@ -67,12 +70,15 @@ static void sampleGamepads(ListType* into)
}
}
-NavigatorGamepad::NavigatorGamepad()
+NavigatorGamepad::NavigatorGamepad(LocalFrame* frame)
+ : DOMWindowProperty(frame)
+ , DOMWindowLifecycleObserver(frame ? frame->domWindow() : 0)
{
}
NavigatorGamepad::~NavigatorGamepad()
{
+ blink::Platform::current()->setGamepadListener(0);
abarth-chromium 2014/03/17 18:23:46 This line sets a static field in the embedder. Ho
kbalazs 2014/03/17 23:49:27 Added a singleton mediator that implements WebGame
}
const char* NavigatorGamepad::supplementName()
@@ -84,7 +90,7 @@ NavigatorGamepad& NavigatorGamepad::from(Navigator& navigator)
{
NavigatorGamepad* supplement = static_cast<NavigatorGamepad*>(Supplement<Navigator>::from(navigator, supplementName()));
if (!supplement) {
- supplement = new NavigatorGamepad();
+ supplement = new NavigatorGamepad(navigator.frame());
provideTo(navigator, supplementName(), adoptPtr(supplement));
}
return *supplement;
@@ -116,4 +122,52 @@ GamepadList* NavigatorGamepad::gamepads()
return m_gamepads.get();
}
+void NavigatorGamepad::onGamepadConnected(unsigned index, const blink::WebGamepad& webGamepad)
+{
+ if (index >= blink::WebGamepads::itemsLengthCap || !webGamepad.connected)
+ return;
+
+ if (!m_gamepads)
+ m_gamepads = GamepadList::create();
+
+ RefPtrWillBeRawPtr<Gamepad> gamepad = m_gamepads->item(index);
+ if (!gamepad)
+ gamepad = Gamepad::create();
+ sampleGamepad(index, *gamepad, webGamepad);
+ m_gamepads->set(index, gamepad);
+
+ if (frame() && frame()->domWindow()) {
+ RefPtr<GamepadEvent> event = GamepadEvent::create(EventTypeNames::gamepadconnected, false, true, gamepad.get());
+ frame()->domWindow()->dispatchEvent(event);
+ }
+}
+
+void NavigatorGamepad::onGamepadDisconnected(unsigned index, const blink::WebGamepad& webGamepad)
+{
+ if (index >= blink::WebGamepads::itemsLengthCap)
+ return;
+
+ if (!m_gamepads)
+ m_gamepads = GamepadList::create();
+
+ RefPtrWillBeRawPtr<Gamepad> gamepad = m_gamepads->item(index);
+ if (!gamepad)
+ gamepad = Gamepad::create();
+ sampleGamepad(index, *gamepad, webGamepad);
+
+ if (frame() && frame()->domWindow()) {
+ RefPtr<GamepadEvent> event = GamepadEvent::create(EventTypeNames::gamepaddisconnected, false, true, gamepad);
+ frame()->domWindow()->dispatchEvent(event);
+ }
+}
+
+void NavigatorGamepad::didAddEventListener(DOMWindow*, const AtomicString& eventType)
+{
+ // If an event listener is added for gamepad events set ourself as listener and sample the gamepads once to start monitoring gamepad state.
+ if (eventType == EventTypeNames::gamepadconnected || eventType == EventTypeNames::gamepaddisconnected) {
+ blink::Platform::current()->setGamepadListener(this);
abarth-chromium 2014/03/17 18:23:46 Again, this sets a static field, which doesn't see
kbalazs 2014/03/17 23:49:27 Done.
+ gamepads();
+ }
+}
+
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698