NavigatorGamepad.cpp [plain text]
#include "config.h"
#include "NavigatorGamepad.h"
#if ENABLE(GAMEPAD)
#include "DocumentLoader.h"
#include "Frame.h"
#include "Gamepad.h"
#include "GamepadManager.h"
#include "GamepadProvider.h"
#include "Navigator.h"
#include "PlatformGamepad.h"
#include <wtf/NeverDestroyed.h>
#include <wtf/RunLoop.h>
namespace WebCore {
NavigatorGamepad::NavigatorGamepad()
: m_navigationStart(std::numeric_limits<double>::infinity())
{
GamepadManager::shared().registerNavigator(this);
}
NavigatorGamepad::~NavigatorGamepad()
{
GamepadManager::shared().unregisterNavigator(this);
}
const char* NavigatorGamepad::supplementName()
{
return "NavigatorGamepad";
}
NavigatorGamepad* NavigatorGamepad::from(Navigator* navigator)
{
NavigatorGamepad* supplement = static_cast<NavigatorGamepad*>(Supplement<Navigator>::from(navigator, supplementName()));
if (!supplement) {
auto newSupplement = std::make_unique<NavigatorGamepad>();
supplement = newSupplement.get();
provideTo(navigator, supplementName(), WTF::move(newSupplement));
if (Frame* frame = navigator->frame()) {
if (DocumentLoader* documentLoader = frame->loader().documentLoader())
supplement->m_navigationStart = documentLoader->timing()->navigationStart();
}
}
return supplement;
}
Gamepad* NavigatorGamepad::gamepadAtIndex(unsigned index)
{
if (index >= m_gamepads.size())
return nullptr;
return m_gamepads[index].get();
}
const Vector<RefPtr<Gamepad>>& NavigatorGamepad::getGamepads(Navigator* navigator)
{
return NavigatorGamepad::from(navigator)->gamepads();
}
const Vector<RefPtr<Gamepad>>& NavigatorGamepad::gamepads()
{
if (m_gamepads.isEmpty())
return m_gamepads;
const Vector<PlatformGamepad*>& platformGamepads = GamepadProvider::shared().platformGamepads();
for (unsigned i = 0; i < platformGamepads.size(); ++i) {
if (!platformGamepads[i]) {
ASSERT(!m_gamepads[i]);
continue;
}
ASSERT(m_gamepads[i]);
m_gamepads[i]->updateFromPlatformGamepad(*platformGamepads[i]);
}
return m_gamepads;
}
void NavigatorGamepad::gamepadsBecameVisible()
{
const Vector<PlatformGamepad*>& platformGamepads = GamepadProvider::shared().platformGamepads();
m_gamepads.resize(platformGamepads.size());
for (unsigned i = 0; i < platformGamepads.size(); ++i) {
if (!platformGamepads[i])
continue;
m_gamepads[i] = Gamepad::create(*platformGamepads[i]);
}
}
void NavigatorGamepad::gamepadConnected(PlatformGamepad& platformGamepad)
{
if (m_gamepads.isEmpty()) {
gamepadsBecameVisible();
return;
}
unsigned index = platformGamepad.index();
ASSERT(GamepadProvider::shared().platformGamepads()[index] == &platformGamepad);
ASSERT(index <= m_gamepads.size());
if (index < m_gamepads.size())
m_gamepads[index] = Gamepad::create(platformGamepad);
else if (index == m_gamepads.size())
m_gamepads.append(Gamepad::create(platformGamepad));
}
void NavigatorGamepad::gamepadDisconnected(PlatformGamepad& platformGamepad)
{
if (!m_gamepads.size())
return;
ASSERT(platformGamepad.index() < m_gamepads.size());
ASSERT(m_gamepads[platformGamepad.index()]);
m_gamepads[platformGamepad.index()] = nullptr;
}
}
#endif // ENABLE(GAMEPAD)