Diff
Modified: trunk/Source/WebCore/ChangeLog (204523 => 204524)
--- trunk/Source/WebCore/ChangeLog 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebCore/ChangeLog 2016-08-16 21:44:25 UTC (rev 204524)
@@ -1,3 +1,28 @@
+2016-08-16 Brady Eidson <[email protected]>
+
+ Cleanup WK2 platform gamepad handling.
+ https://bugs.webkit.org/show_bug.cgi?id=160871
+
+ Reviewed by Alex Christensen.
+
+ No new tests (No currently testable change in behavior).
+
+ This patch does a few things:
+ 1 - Separates the concepts of "monitoring gamepads" and "monitoring gamepad inputs"
+ 2 - Uses this new concept to much more cleanly handle the case where we are not currently
+ monitoring gamepad inputs because an interested WKWebView is not front and center.
+ 3 - Pre-populates the "initial set of gamepads" in WebProcesses that start listening for gamepads.
+
+ * platform/gamepad/GamepadProviderClient.h:
+ (WebCore::GamepadProviderClient::setInitialConnectedGamepads):
+
+ * platform/gamepad/mac/HIDGamepadProvider.cpp:
+ (WebCore::HIDGamepadProvider::HIDGamepadProvider):
+ (WebCore::HIDGamepadProvider::stopMonitoringInput):
+ (WebCore::HIDGamepadProvider::startMonitoringInput):
+ (WebCore::HIDGamepadProvider::connectionDelayTimerFired):
+ * platform/gamepad/mac/HIDGamepadProvider.h:
+
2016-08-16 Chris Dumez <[email protected]>
querySelector() / querySelectorAll() should always throw a SyntaxError when failing to parse selector string
Modified: trunk/Source/WebCore/platform/gamepad/GamepadProviderClient.h (204523 => 204524)
--- trunk/Source/WebCore/platform/gamepad/GamepadProviderClient.h 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebCore/platform/gamepad/GamepadProviderClient.h 2016-08-16 21:44:25 UTC (rev 204524)
@@ -27,6 +27,8 @@
#if ENABLE(GAMEPAD)
+#include <wtf/Vector.h>
+
namespace WebCore {
class PlatformGamepad;
@@ -35,6 +37,7 @@
public:
virtual ~GamepadProviderClient() { }
+ virtual void setInitialConnectedGamepads(const Vector<PlatformGamepad*>&) { }
virtual void platformGamepadConnected(PlatformGamepad&) = 0;
virtual void platformGamepadDisconnected(PlatformGamepad&) = 0;
virtual void platformGamepadInputActivity() = 0;
Modified: trunk/Source/WebCore/platform/gamepad/mac/HIDGamepadProvider.cpp (204523 => 204524)
--- trunk/Source/WebCore/platform/gamepad/mac/HIDGamepadProvider.cpp 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebCore/platform/gamepad/mac/HIDGamepadProvider.cpp 2016-08-16 21:44:25 UTC (rev 204524)
@@ -96,6 +96,20 @@
IOHIDManagerSetDeviceMatchingMultiple(m_manager.get(), matchingArray.get());
IOHIDManagerRegisterDeviceMatchingCallback(m_manager.get(), deviceAddedCallback, this);
IOHIDManagerRegisterDeviceRemovalCallback(m_manager.get(), deviceRemovedCallback, this);
+
+ startMonitoringInput();
+}
+
+void HIDGamepadProvider::stopMonitoringInput()
+{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
+ IOHIDManagerRegisterInputValueCallback(m_manager.get(), nullptr, nullptr);
+#pragma clang diagnostic pop
+}
+
+void HIDGamepadProvider::startMonitoringInput()
+{
IOHIDManagerRegisterInputValueCallback(m_manager.get(), deviceValuesChangedCallback, this);
}
@@ -111,6 +125,9 @@
void HIDGamepadProvider::connectionDelayTimerFired()
{
m_shouldDispatchCallbacks = true;
+
+ for (auto* client : m_clients)
+ client->setInitialConnectedGamepads(m_gamepadVector);
}
void HIDGamepadProvider::openAndScheduleManager()
Modified: trunk/Source/WebCore/platform/gamepad/mac/HIDGamepadProvider.h (204523 => 204524)
--- trunk/Source/WebCore/platform/gamepad/mac/HIDGamepadProvider.h 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebCore/platform/gamepad/mac/HIDGamepadProvider.h 2016-08-16 21:44:25 UTC (rev 204524)
@@ -51,6 +51,9 @@
WEBCORE_EXPORT void stopMonitoringGamepads(GamepadProviderClient&) final;
const Vector<PlatformGamepad*>& platformGamepads() final { return m_gamepadVector; }
+ WEBCORE_EXPORT void stopMonitoringInput();
+ WEBCORE_EXPORT void startMonitoringInput();
+
void deviceAdded(IOHIDDeviceRef);
void deviceRemoved(IOHIDDeviceRef);
void valuesChanged(IOHIDValueRef);
Modified: trunk/Source/WebKit2/ChangeLog (204523 => 204524)
--- trunk/Source/WebKit2/ChangeLog 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/ChangeLog 2016-08-16 21:44:25 UTC (rev 204524)
@@ -1,3 +1,50 @@
+2016-08-16 Brady Eidson <[email protected]>
+
+ Cleanup WK2 platform gamepad handling.
+ https://bugs.webkit.org/show_bug.cgi?id=160871
+
+ Reviewed by Alex Christensen.
+
+ This patch does a few things:
+ 1 - Separates the concepts of "monitoring gamepads" and "monitoring gamepad inputs"
+ 2 - Uses this new concept to much more cleanly handle the case where we are not currently
+ monitoring gamepad inputs because an interested WKWebView is not front and center.
+ 3 - Pre-populates the "initial set of gamepads" in WebProcesses that start listening for gamepads.
+
+ * Platform/Logging.h:
+
+ * UIProcess/Gamepad/UIGamepadProvider.cpp:
+ (WebKit::UIGamepadProvider::gamepadSyncTimerFired):
+ (WebKit::UIGamepadProvider::setInitialConnectedGamepads):
+ (WebKit::UIGamepadProvider::processPoolStoppedUsingGamepads):
+ (WebKit::UIGamepadProvider::viewBecameActive):
+ (WebKit::UIGamepadProvider::viewBecameInactive):
+ (WebKit::UIGamepadProvider::stopMonitoringGamepads):
+ (WebKit::UIGamepadProvider::snapshotGamepads):
+ (WebKit::UIGamepadProvider::platformStopMonitoringInput):
+ (WebKit::UIGamepadProvider::platformStartMonitoringInput):
+ (WebKit::UIGamepadProvider::UIGamepadProvider): Deleted.
+ (WebKit::UIGamepadProvider::scheduleDisableGamepadMonitoring): Deleted.
+ (WebKit::UIGamepadProvider::disableMonitoringTimerFired): Deleted.
+ * UIProcess/Gamepad/UIGamepadProvider.h:
+
+ * UIProcess/Gamepad/mac/UIGamepadProviderHID.cpp:
+ (WebKit::UIGamepadProvider::platformStopMonitoringInput):
+ (WebKit::UIGamepadProvider::platformStartMonitoringInput):
+
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::setInitialConnectedGamepads):
+ * UIProcess/WebProcessPool.h:
+
+ * WebProcess/Gamepad/WebGamepadProvider.cpp:
+ (WebKit::WebGamepadProvider::setInitialGamepads):
+ * WebProcess/Gamepad/WebGamepadProvider.h:
+
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::setInitialGamepads):
+ * WebProcess/WebProcess.h:
+ * WebProcess/WebProcess.messages.in:
+
2016-08-15 Simon Fraser <[email protected]>
[iOS] Add iPad viewport and form tests, and revert the iPad-testing part of r202132
Modified: trunk/Source/WebKit2/Platform/Logging.h (204523 => 204524)
--- trunk/Source/WebKit2/Platform/Logging.h 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/Platform/Logging.h 2016-08-16 21:44:25 UTC (rev 204524)
@@ -43,6 +43,7 @@
#define WEBKIT2_LOG_CHANNELS(M) \
M(ContextMenu) \
+ M(Gamepad) \
M(IDB) \
M(IconDatabase) \
M(IndexedDB) \
Modified: trunk/Source/WebKit2/UIProcess/Gamepad/UIGamepadProvider.cpp (204523 => 204524)
--- trunk/Source/WebKit2/UIProcess/Gamepad/UIGamepadProvider.cpp 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/UIProcess/Gamepad/UIGamepadProvider.cpp 2016-08-16 21:44:25 UTC (rev 204524)
@@ -48,7 +48,6 @@
UIGamepadProvider::UIGamepadProvider()
: m_gamepadSyncTimer(RunLoop::main(), this, &UIGamepadProvider::gamepadSyncTimerFired)
- , m_disableMonitoringTimer(RunLoop::main(), this, &UIGamepadProvider::disableMonitoringTimerFired)
{
}
@@ -64,17 +63,7 @@
if (!webPageProxy || !m_processPoolsUsingGamepads.contains(&webPageProxy->process().processPool()))
return;
- Vector<GamepadData> gamepadDatas;
- gamepadDatas.reserveInitialCapacity(m_gamepads.size());
-
- for (auto& gamepad : m_gamepads) {
- if (gamepad)
- gamepadDatas.uncheckedAppend(gamepad->gamepadData());
- else
- gamepadDatas.uncheckedAppend({ });
- }
-
- webPageProxy->gamepadActivity(gamepadDatas);
+ webPageProxy->gamepadActivity(snapshotGamepads());
}
void UIGamepadProvider::scheduleGamepadStateSync()
@@ -90,6 +79,24 @@
m_gamepadSyncTimer.startOneShot(maximumGamepadUpdateInterval);
}
+void UIGamepadProvider::setInitialConnectedGamepads(const Vector<PlatformGamepad*>& initialGamepads)
+{
+ ASSERT(!m_hasInitialGamepads);
+
+ m_gamepads.resize(initialGamepads.size());
+
+ for (auto* gamepad : initialGamepads) {
+ if (!gamepad)
+ continue;
+ m_gamepads[gamepad->index()] = std::make_unique<UIGamepad>(*gamepad);
+ }
+
+ for (auto& pool : m_processPoolsUsingGamepads)
+ pool->setInitialConnectedGamepads(m_gamepads);
+
+ m_hasInitialGamepads = true;
+}
+
void UIGamepadProvider::platformGamepadConnected(PlatformGamepad& gamepad)
{
if (m_gamepads.size() <= gamepad.index())
@@ -152,7 +159,7 @@
m_processPoolsUsingGamepads.remove(&pool);
if (m_isMonitoringGamepads && !platformWebPageProxyForGamepadInput())
- scheduleDisableGamepadMonitoring();
+ platformStopMonitoringInput();
scheduleGamepadStateSync();
}
@@ -162,8 +169,11 @@
if (!m_processPoolsUsingGamepads.contains(&page.process().processPool()))
return;
- m_disableMonitoringTimer.stop();
- startMonitoringGamepads();
+ if (!m_isMonitoringGamepads)
+ startMonitoringGamepads();
+
+ if (platformWebPageProxyForGamepadInput())
+ platformStartMonitoringInput();
}
void UIGamepadProvider::viewBecameInactive(WebPageProxy& page)
@@ -170,20 +180,9 @@
{
auto pageForGamepadInput = platformWebPageProxyForGamepadInput();
if (pageForGamepadInput == &page)
- scheduleDisableGamepadMonitoring();
+ platformStopMonitoringInput();
}
-void UIGamepadProvider::scheduleDisableGamepadMonitoring()
-{
- if (!m_disableMonitoringTimer.isActive())
- m_disableMonitoringTimer.startOneShot(0);
-}
-
-void UIGamepadProvider::disableMonitoringTimerFired()
-{
- stopMonitoringGamepads();
-}
-
void UIGamepadProvider::startMonitoringGamepads()
{
if (m_isMonitoringGamepads)
@@ -200,8 +199,24 @@
m_isMonitoringGamepads = false;
platformStopMonitoringGamepads();
+ m_gamepads.clear();
}
+Vector<GamepadData> UIGamepadProvider::snapshotGamepads()
+{
+ Vector<GamepadData> gamepadDatas;
+ gamepadDatas.reserveInitialCapacity(m_gamepads.size());
+
+ for (auto& gamepad : m_gamepads) {
+ if (gamepad)
+ gamepadDatas.uncheckedAppend(gamepad->gamepadData());
+ else
+ gamepadDatas.uncheckedAppend({ });
+ }
+
+ return gamepadDatas;
+}
+
#if !PLATFORM(MAC)
void UIGamepadProvider::platformStartMonitoringGamepads()
@@ -227,6 +242,14 @@
// FIXME: Implement for other platforms
}
+void UIGamepadProvider::platformStopMonitoringInput()
+{
+}
+
+void UIGamepadProvider::platformStartMonitoringInput()
+{
+}
+
#endif // !PLATFORM(MAC)
}
Modified: trunk/Source/WebKit2/UIProcess/Gamepad/UIGamepadProvider.h (204523 => 204524)
--- trunk/Source/WebKit2/UIProcess/Gamepad/UIGamepadProvider.h 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/UIProcess/Gamepad/UIGamepadProvider.h 2016-08-16 21:44:25 UTC (rev 204524)
@@ -64,7 +64,10 @@
void platformStopMonitoringGamepads();
const Vector<WebCore::PlatformGamepad*>& platformGamepads();
WebPageProxy* platformWebPageProxyForGamepadInput();
+ void platformStopMonitoringInput();
+ void platformStartMonitoringInput();
+ void setInitialConnectedGamepads(const Vector<WebCore::PlatformGamepad*>&) final;
void platformGamepadConnected(WebCore::PlatformGamepad&) final;
void platformGamepadDisconnected(WebCore::PlatformGamepad&) final;
void platformGamepadInputActivity() final;
@@ -72,8 +75,7 @@
void scheduleGamepadStateSync();
void gamepadSyncTimerFired();
- void scheduleDisableGamepadMonitoring();
- void disableMonitoringTimerFired();
+ Vector<GamepadData> snapshotGamepads();
HashSet<WebProcessPool*> m_processPoolsUsingGamepads;
@@ -80,9 +82,9 @@
Vector<std::unique_ptr<UIGamepad>> m_gamepads;
RunLoop::Timer<UIGamepadProvider> m_gamepadSyncTimer;
- RunLoop::Timer<UIGamepadProvider> m_disableMonitoringTimer;
bool m_isMonitoringGamepads { false };
+ bool m_hasInitialGamepads { false };
};
}
Modified: trunk/Source/WebKit2/UIProcess/Gamepad/mac/UIGamepadProviderHID.cpp (204523 => 204524)
--- trunk/Source/WebKit2/UIProcess/Gamepad/mac/UIGamepadProviderHID.cpp 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/UIProcess/Gamepad/mac/UIGamepadProviderHID.cpp 2016-08-16 21:44:25 UTC (rev 204524)
@@ -51,6 +51,16 @@
return HIDGamepadProvider::singleton().platformGamepads();
}
+void UIGamepadProvider::platformStopMonitoringInput()
+{
+ return HIDGamepadProvider::singleton().stopMonitoringInput();
}
+void UIGamepadProvider::platformStartMonitoringInput()
+{
+ return HIDGamepadProvider::singleton().startMonitoringInput();
+}
+
+}
+
#endif // ENABLE(GAMEPAD)
Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp (204523 => 204524)
--- trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp 2016-08-16 21:44:25 UTC (rev 204524)
@@ -1286,6 +1286,20 @@
process->send(Messages::WebProcess::GamepadDisconnected(gamepad.index()), 0);
}
+void WebProcessPool::setInitialConnectedGamepads(const Vector<std::unique_ptr<UIGamepad>>& gamepads)
+{
+ Vector<GamepadData> gamepadDatas;
+ gamepadDatas.resize(gamepads.size());
+ for (size_t i = 0; i < gamepads.size(); ++i) {
+ if (!gamepads[i])
+ continue;
+ gamepadDatas[i] = gamepads[i]->gamepadData();
+ }
+
+ for (auto& process : m_processesUsingGamepads)
+ process->send(Messages::WebProcess::SetInitialGamepads(gamepadDatas), 0);
+}
+
#endif // ENABLE(GAMEPAD)
void WebProcessPool::garbageCollectJavaScriptObjects()
Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.h (204523 => 204524)
--- trunk/Source/WebKit2/UIProcess/WebProcessPool.h 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.h 2016-08-16 21:44:25 UTC (rev 204524)
@@ -370,6 +370,8 @@
#if ENABLE(GAMEPAD)
void gamepadConnected(const UIGamepad&);
void gamepadDisconnected(const UIGamepad&);
+
+ void setInitialConnectedGamepads(const Vector<std::unique_ptr<UIGamepad>>&);
#endif
private:
Modified: trunk/Source/WebKit2/WebProcess/Gamepad/WebGamepadProvider.cpp (204523 => 204524)
--- trunk/Source/WebKit2/WebProcess/Gamepad/WebGamepadProvider.cpp 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/WebProcess/Gamepad/WebGamepadProvider.cpp 2016-08-16 21:44:25 UTC (rev 204524)
@@ -53,6 +53,21 @@
{
}
+void WebGamepadProvider::setInitialGamepads(const Vector<GamepadData>& gamepadDatas)
+{
+ ASSERT(m_gamepads.isEmpty());
+
+ m_gamepads.resize(gamepadDatas.size());
+ m_rawGamepads.resize(gamepadDatas.size());
+ for (size_t i = 0; i < gamepadDatas.size(); ++i) {
+ if (gamepadDatas[i].isNull())
+ continue;
+
+ m_gamepads[i] = std::make_unique<WebGamepad>(gamepadDatas[i]);
+ m_rawGamepads[i] = m_gamepads[i].get();
+ }
+}
+
void WebGamepadProvider::gamepadConnected(const GamepadData& gamepadData)
{
if (m_gamepads.size() <= gamepadData.index) {
Modified: trunk/Source/WebKit2/WebProcess/Gamepad/WebGamepadProvider.h (204523 => 204524)
--- trunk/Source/WebKit2/WebProcess/Gamepad/WebGamepadProvider.h 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/WebProcess/Gamepad/WebGamepadProvider.h 2016-08-16 21:44:25 UTC (rev 204524)
@@ -46,6 +46,8 @@
void gamepadDisconnected(unsigned index);
void gamepadActivity(const Vector<GamepadData>&);
+ void setInitialGamepads(const Vector<GamepadData>&);
+
private:
friend NeverDestroyed<WebGamepadProvider>;
WebGamepadProvider();
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (204523 => 204524)
--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2016-08-16 21:44:25 UTC (rev 204524)
@@ -1030,6 +1030,11 @@
#if ENABLE(GAMEPAD)
+void WebProcess::setInitialGamepads(const Vector<WebKit::GamepadData>& gamepadDatas)
+{
+ WebGamepadProvider::singleton().setInitialGamepads(gamepadDatas);
+}
+
void WebProcess::gamepadConnected(const GamepadData& gamepadData)
{
WebGamepadProvider::singleton().gamepadConnected(gamepadData);
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (204523 => 204524)
--- trunk/Source/WebKit2/WebProcess/WebProcess.h 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h 2016-08-16 21:44:25 UTC (rev 204524)
@@ -276,6 +276,7 @@
void mainThreadPing();
#if ENABLE(GAMEPAD)
+ void setInitialGamepads(const Vector<GamepadData>&);
void gamepadConnected(const GamepadData&);
void gamepadDisconnected(unsigned index);
#endif
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.messages.in (204523 => 204524)
--- trunk/Source/WebKit2/WebProcess/WebProcess.messages.in 2016-08-16 21:18:44 UTC (rev 204523)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.messages.in 2016-08-16 21:44:25 UTC (rev 204524)
@@ -103,6 +103,7 @@
MainThreadPing()
#if ENABLE(GAMEPAD)
+ SetInitialGamepads(Vector<WebKit::GamepadData> gamepadDatas)
GamepadConnected(struct WebKit::GamepadData gamepadData)
GamepadDisconnected(unsigned index)
#endif