Changeset 204524 in webkit
- Timestamp:
- Aug 16, 2016 2:44:25 PM (8 years ago)
- Location:
- trunk/Source
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r204522 r204524 1 2016-08-16 Brady Eidson <beidson@apple.com> 2 3 Cleanup WK2 platform gamepad handling. 4 https://bugs.webkit.org/show_bug.cgi?id=160871 5 6 Reviewed by Alex Christensen. 7 8 No new tests (No currently testable change in behavior). 9 10 This patch does a few things: 11 1 - Separates the concepts of "monitoring gamepads" and "monitoring gamepad inputs" 12 2 - Uses this new concept to much more cleanly handle the case where we are not currently 13 monitoring gamepad inputs because an interested WKWebView is not front and center. 14 3 - Pre-populates the "initial set of gamepads" in WebProcesses that start listening for gamepads. 15 16 * platform/gamepad/GamepadProviderClient.h: 17 (WebCore::GamepadProviderClient::setInitialConnectedGamepads): 18 19 * platform/gamepad/mac/HIDGamepadProvider.cpp: 20 (WebCore::HIDGamepadProvider::HIDGamepadProvider): 21 (WebCore::HIDGamepadProvider::stopMonitoringInput): 22 (WebCore::HIDGamepadProvider::startMonitoringInput): 23 (WebCore::HIDGamepadProvider::connectionDelayTimerFired): 24 * platform/gamepad/mac/HIDGamepadProvider.h: 25 1 26 2016-08-16 Chris Dumez <cdumez@apple.com> 2 27 -
trunk/Source/WebCore/platform/gamepad/GamepadProviderClient.h
r204509 r204524 28 28 #if ENABLE(GAMEPAD) 29 29 30 #include <wtf/Vector.h> 31 30 32 namespace WebCore { 31 33 … … 36 38 virtual ~GamepadProviderClient() { } 37 39 40 virtual void setInitialConnectedGamepads(const Vector<PlatformGamepad*>&) { } 38 41 virtual void platformGamepadConnected(PlatformGamepad&) = 0; 39 42 virtual void platformGamepadDisconnected(PlatformGamepad&) = 0; -
trunk/Source/WebCore/platform/gamepad/mac/HIDGamepadProvider.cpp
r204509 r204524 97 97 IOHIDManagerRegisterDeviceMatchingCallback(m_manager.get(), deviceAddedCallback, this); 98 98 IOHIDManagerRegisterDeviceRemovalCallback(m_manager.get(), deviceRemovedCallback, this); 99 100 startMonitoringInput(); 101 } 102 103 void HIDGamepadProvider::stopMonitoringInput() 104 { 105 #pragma clang diagnostic push 106 #pragma clang diagnostic ignored "-Wnonnull" 107 IOHIDManagerRegisterInputValueCallback(m_manager.get(), nullptr, nullptr); 108 #pragma clang diagnostic pop 109 } 110 111 void HIDGamepadProvider::startMonitoringInput() 112 { 99 113 IOHIDManagerRegisterInputValueCallback(m_manager.get(), deviceValuesChangedCallback, this); 100 114 } … … 112 126 { 113 127 m_shouldDispatchCallbacks = true; 128 129 for (auto* client : m_clients) 130 client->setInitialConnectedGamepads(m_gamepadVector); 114 131 } 115 132 -
trunk/Source/WebCore/platform/gamepad/mac/HIDGamepadProvider.h
r204509 r204524 52 52 const Vector<PlatformGamepad*>& platformGamepads() final { return m_gamepadVector; } 53 53 54 WEBCORE_EXPORT void stopMonitoringInput(); 55 WEBCORE_EXPORT void startMonitoringInput(); 56 54 57 void deviceAdded(IOHIDDeviceRef); 55 58 void deviceRemoved(IOHIDDeviceRef); -
trunk/Source/WebKit2/ChangeLog
r204523 r204524 1 2016-08-16 Brady Eidson <beidson@apple.com> 2 3 Cleanup WK2 platform gamepad handling. 4 https://bugs.webkit.org/show_bug.cgi?id=160871 5 6 Reviewed by Alex Christensen. 7 8 This patch does a few things: 9 1 - Separates the concepts of "monitoring gamepads" and "monitoring gamepad inputs" 10 2 - Uses this new concept to much more cleanly handle the case where we are not currently 11 monitoring gamepad inputs because an interested WKWebView is not front and center. 12 3 - Pre-populates the "initial set of gamepads" in WebProcesses that start listening for gamepads. 13 14 * Platform/Logging.h: 15 16 * UIProcess/Gamepad/UIGamepadProvider.cpp: 17 (WebKit::UIGamepadProvider::gamepadSyncTimerFired): 18 (WebKit::UIGamepadProvider::setInitialConnectedGamepads): 19 (WebKit::UIGamepadProvider::processPoolStoppedUsingGamepads): 20 (WebKit::UIGamepadProvider::viewBecameActive): 21 (WebKit::UIGamepadProvider::viewBecameInactive): 22 (WebKit::UIGamepadProvider::stopMonitoringGamepads): 23 (WebKit::UIGamepadProvider::snapshotGamepads): 24 (WebKit::UIGamepadProvider::platformStopMonitoringInput): 25 (WebKit::UIGamepadProvider::platformStartMonitoringInput): 26 (WebKit::UIGamepadProvider::UIGamepadProvider): Deleted. 27 (WebKit::UIGamepadProvider::scheduleDisableGamepadMonitoring): Deleted. 28 (WebKit::UIGamepadProvider::disableMonitoringTimerFired): Deleted. 29 * UIProcess/Gamepad/UIGamepadProvider.h: 30 31 * UIProcess/Gamepad/mac/UIGamepadProviderHID.cpp: 32 (WebKit::UIGamepadProvider::platformStopMonitoringInput): 33 (WebKit::UIGamepadProvider::platformStartMonitoringInput): 34 35 * UIProcess/WebProcessPool.cpp: 36 (WebKit::WebProcessPool::setInitialConnectedGamepads): 37 * UIProcess/WebProcessPool.h: 38 39 * WebProcess/Gamepad/WebGamepadProvider.cpp: 40 (WebKit::WebGamepadProvider::setInitialGamepads): 41 * WebProcess/Gamepad/WebGamepadProvider.h: 42 43 * WebProcess/WebProcess.cpp: 44 (WebKit::WebProcess::setInitialGamepads): 45 * WebProcess/WebProcess.h: 46 * WebProcess/WebProcess.messages.in: 47 1 48 2016-08-15 Simon Fraser <simon.fraser@apple.com> 2 49 -
trunk/Source/WebKit2/Platform/Logging.h
r204509 r204524 44 44 #define WEBKIT2_LOG_CHANNELS(M) \ 45 45 M(ContextMenu) \ 46 M(Gamepad) \ 46 47 M(IDB) \ 47 48 M(IconDatabase) \ -
trunk/Source/WebKit2/UIProcess/Gamepad/UIGamepadProvider.cpp
r204509 r204524 49 49 UIGamepadProvider::UIGamepadProvider() 50 50 : m_gamepadSyncTimer(RunLoop::main(), this, &UIGamepadProvider::gamepadSyncTimerFired) 51 , m_disableMonitoringTimer(RunLoop::main(), this, &UIGamepadProvider::disableMonitoringTimerFired)52 51 { 53 52 } … … 65 64 return; 66 65 66 webPageProxy->gamepadActivity(snapshotGamepads()); 67 } 68 69 void UIGamepadProvider::scheduleGamepadStateSync() 70 { 71 if (!m_isMonitoringGamepads || m_gamepadSyncTimer.isActive()) 72 return; 73 74 if (m_gamepads.isEmpty() || m_processPoolsUsingGamepads.isEmpty()) { 75 m_gamepadSyncTimer.stop(); 76 return; 77 } 78 79 m_gamepadSyncTimer.startOneShot(maximumGamepadUpdateInterval); 80 } 81 82 void UIGamepadProvider::setInitialConnectedGamepads(const Vector<PlatformGamepad*>& initialGamepads) 83 { 84 ASSERT(!m_hasInitialGamepads); 85 86 m_gamepads.resize(initialGamepads.size()); 87 88 for (auto* gamepad : initialGamepads) { 89 if (!gamepad) 90 continue; 91 m_gamepads[gamepad->index()] = std::make_unique<UIGamepad>(*gamepad); 92 } 93 94 for (auto& pool : m_processPoolsUsingGamepads) 95 pool->setInitialConnectedGamepads(m_gamepads); 96 97 m_hasInitialGamepads = true; 98 } 99 100 void UIGamepadProvider::platformGamepadConnected(PlatformGamepad& gamepad) 101 { 102 if (m_gamepads.size() <= gamepad.index()) 103 m_gamepads.resize(gamepad.index() + 1); 104 105 ASSERT(!m_gamepads[gamepad.index()]); 106 m_gamepads[gamepad.index()] = std::make_unique<UIGamepad>(gamepad); 107 108 scheduleGamepadStateSync(); 109 110 for (auto& pool : m_processPoolsUsingGamepads) 111 pool->gamepadConnected(*m_gamepads[gamepad.index()]); 112 } 113 114 void UIGamepadProvider::platformGamepadDisconnected(PlatformGamepad& gamepad) 115 { 116 ASSERT(gamepad.index() < m_gamepads.size()); 117 ASSERT(m_gamepads[gamepad.index()]); 118 119 std::unique_ptr<UIGamepad> disconnectedGamepad = WTFMove(m_gamepads[gamepad.index()]); 120 121 scheduleGamepadStateSync(); 122 123 for (auto& pool : m_processPoolsUsingGamepads) 124 pool->gamepadDisconnected(*disconnectedGamepad); 125 } 126 127 void UIGamepadProvider::platformGamepadInputActivity() 128 { 129 auto platformGamepads = this->platformGamepads(); 130 ASSERT(platformGamepads.size() == m_gamepads.size()); 131 132 for (size_t i = 0; i < platformGamepads.size(); ++i) { 133 if (!platformGamepads[i]) { 134 ASSERT(!m_gamepads[i]); 135 continue; 136 } 137 138 ASSERT(m_gamepads[i]); 139 m_gamepads[i]->updateFromPlatformGamepad(*platformGamepads[i]); 140 } 141 142 scheduleGamepadStateSync(); 143 } 144 145 void UIGamepadProvider::processPoolStartedUsingGamepads(WebProcessPool& pool) 146 { 147 ASSERT(!m_processPoolsUsingGamepads.contains(&pool)); 148 m_processPoolsUsingGamepads.add(&pool); 149 150 if (!m_isMonitoringGamepads && platformWebPageProxyForGamepadInput()) 151 startMonitoringGamepads(); 152 153 scheduleGamepadStateSync(); 154 } 155 156 void UIGamepadProvider::processPoolStoppedUsingGamepads(WebProcessPool& pool) 157 { 158 ASSERT(m_processPoolsUsingGamepads.contains(&pool)); 159 m_processPoolsUsingGamepads.remove(&pool); 160 161 if (m_isMonitoringGamepads && !platformWebPageProxyForGamepadInput()) 162 platformStopMonitoringInput(); 163 164 scheduleGamepadStateSync(); 165 } 166 167 void UIGamepadProvider::viewBecameActive(WebPageProxy& page) 168 { 169 if (!m_processPoolsUsingGamepads.contains(&page.process().processPool())) 170 return; 171 172 if (!m_isMonitoringGamepads) 173 startMonitoringGamepads(); 174 175 if (platformWebPageProxyForGamepadInput()) 176 platformStartMonitoringInput(); 177 } 178 179 void UIGamepadProvider::viewBecameInactive(WebPageProxy& page) 180 { 181 auto pageForGamepadInput = platformWebPageProxyForGamepadInput(); 182 if (pageForGamepadInput == &page) 183 platformStopMonitoringInput(); 184 } 185 186 void UIGamepadProvider::startMonitoringGamepads() 187 { 188 if (m_isMonitoringGamepads) 189 return; 190 191 m_isMonitoringGamepads = true; 192 platformStartMonitoringGamepads(); 193 } 194 195 void UIGamepadProvider::stopMonitoringGamepads() 196 { 197 if (!m_isMonitoringGamepads) 198 return; 199 200 m_isMonitoringGamepads = false; 201 platformStopMonitoringGamepads(); 202 m_gamepads.clear(); 203 } 204 205 Vector<GamepadData> UIGamepadProvider::snapshotGamepads() 206 { 67 207 Vector<GamepadData> gamepadDatas; 68 208 gamepadDatas.reserveInitialCapacity(m_gamepads.size()); … … 75 215 } 76 216 77 webPageProxy->gamepadActivity(gamepadDatas); 78 } 79 80 void UIGamepadProvider::scheduleGamepadStateSync() 81 { 82 if (!m_isMonitoringGamepads || m_gamepadSyncTimer.isActive()) 83 return; 84 85 if (m_gamepads.isEmpty() || m_processPoolsUsingGamepads.isEmpty()) { 86 m_gamepadSyncTimer.stop(); 87 return; 88 } 89 90 m_gamepadSyncTimer.startOneShot(maximumGamepadUpdateInterval); 91 } 92 93 void UIGamepadProvider::platformGamepadConnected(PlatformGamepad& gamepad) 94 { 95 if (m_gamepads.size() <= gamepad.index()) 96 m_gamepads.resize(gamepad.index() + 1); 97 98 ASSERT(!m_gamepads[gamepad.index()]); 99 m_gamepads[gamepad.index()] = std::make_unique<UIGamepad>(gamepad); 100 101 scheduleGamepadStateSync(); 102 103 for (auto& pool : m_processPoolsUsingGamepads) 104 pool->gamepadConnected(*m_gamepads[gamepad.index()]); 105 } 106 107 void UIGamepadProvider::platformGamepadDisconnected(PlatformGamepad& gamepad) 108 { 109 ASSERT(gamepad.index() < m_gamepads.size()); 110 ASSERT(m_gamepads[gamepad.index()]); 111 112 std::unique_ptr<UIGamepad> disconnectedGamepad = WTFMove(m_gamepads[gamepad.index()]); 113 114 scheduleGamepadStateSync(); 115 116 for (auto& pool : m_processPoolsUsingGamepads) 117 pool->gamepadDisconnected(*disconnectedGamepad); 118 } 119 120 void UIGamepadProvider::platformGamepadInputActivity() 121 { 122 auto platformGamepads = this->platformGamepads(); 123 ASSERT(platformGamepads.size() == m_gamepads.size()); 124 125 for (size_t i = 0; i < platformGamepads.size(); ++i) { 126 if (!platformGamepads[i]) { 127 ASSERT(!m_gamepads[i]); 128 continue; 129 } 130 131 ASSERT(m_gamepads[i]); 132 m_gamepads[i]->updateFromPlatformGamepad(*platformGamepads[i]); 133 } 134 135 scheduleGamepadStateSync(); 136 } 137 138 void UIGamepadProvider::processPoolStartedUsingGamepads(WebProcessPool& pool) 139 { 140 ASSERT(!m_processPoolsUsingGamepads.contains(&pool)); 141 m_processPoolsUsingGamepads.add(&pool); 142 143 if (!m_isMonitoringGamepads && platformWebPageProxyForGamepadInput()) 144 startMonitoringGamepads(); 145 146 scheduleGamepadStateSync(); 147 } 148 149 void UIGamepadProvider::processPoolStoppedUsingGamepads(WebProcessPool& pool) 150 { 151 ASSERT(m_processPoolsUsingGamepads.contains(&pool)); 152 m_processPoolsUsingGamepads.remove(&pool); 153 154 if (m_isMonitoringGamepads && !platformWebPageProxyForGamepadInput()) 155 scheduleDisableGamepadMonitoring(); 156 157 scheduleGamepadStateSync(); 158 } 159 160 void UIGamepadProvider::viewBecameActive(WebPageProxy& page) 161 { 162 if (!m_processPoolsUsingGamepads.contains(&page.process().processPool())) 163 return; 164 165 m_disableMonitoringTimer.stop(); 166 startMonitoringGamepads(); 167 } 168 169 void UIGamepadProvider::viewBecameInactive(WebPageProxy& page) 170 { 171 auto pageForGamepadInput = platformWebPageProxyForGamepadInput(); 172 if (pageForGamepadInput == &page) 173 scheduleDisableGamepadMonitoring(); 174 } 175 176 void UIGamepadProvider::scheduleDisableGamepadMonitoring() 177 { 178 if (!m_disableMonitoringTimer.isActive()) 179 m_disableMonitoringTimer.startOneShot(0); 180 } 181 182 void UIGamepadProvider::disableMonitoringTimerFired() 183 { 184 stopMonitoringGamepads(); 185 } 186 187 void UIGamepadProvider::startMonitoringGamepads() 188 { 189 if (m_isMonitoringGamepads) 190 return; 191 192 m_isMonitoringGamepads = true; 193 platformStartMonitoringGamepads(); 194 } 195 196 void UIGamepadProvider::stopMonitoringGamepads() 197 { 198 if (!m_isMonitoringGamepads) 199 return; 200 201 m_isMonitoringGamepads = false; 202 platformStopMonitoringGamepads(); 217 return gamepadDatas; 203 218 } 204 219 … … 228 243 } 229 244 245 void UIGamepadProvider::platformStopMonitoringInput() 246 { 247 } 248 249 void UIGamepadProvider::platformStartMonitoringInput() 250 { 251 } 252 230 253 #endif // !PLATFORM(MAC) 231 254 -
trunk/Source/WebKit2/UIProcess/Gamepad/UIGamepadProvider.h
r204509 r204524 65 65 const Vector<WebCore::PlatformGamepad*>& platformGamepads(); 66 66 WebPageProxy* platformWebPageProxyForGamepadInput(); 67 void platformStopMonitoringInput(); 68 void platformStartMonitoringInput(); 67 69 70 void setInitialConnectedGamepads(const Vector<WebCore::PlatformGamepad*>&) final; 68 71 void platformGamepadConnected(WebCore::PlatformGamepad&) final; 69 72 void platformGamepadDisconnected(WebCore::PlatformGamepad&) final; … … 73 76 void gamepadSyncTimerFired(); 74 77 75 void scheduleDisableGamepadMonitoring(); 76 void disableMonitoringTimerFired(); 78 Vector<GamepadData> snapshotGamepads(); 77 79 78 80 HashSet<WebProcessPool*> m_processPoolsUsingGamepads; … … 81 83 82 84 RunLoop::Timer<UIGamepadProvider> m_gamepadSyncTimer; 83 RunLoop::Timer<UIGamepadProvider> m_disableMonitoringTimer;84 85 85 86 bool m_isMonitoringGamepads { false }; 87 bool m_hasInitialGamepads { false }; 86 88 }; 87 89 -
trunk/Source/WebKit2/UIProcess/Gamepad/mac/UIGamepadProviderHID.cpp
r204509 r204524 52 52 } 53 53 54 void UIGamepadProvider::platformStopMonitoringInput() 55 { 56 return HIDGamepadProvider::singleton().stopMonitoringInput(); 57 } 58 59 void UIGamepadProvider::platformStartMonitoringInput() 60 { 61 return HIDGamepadProvider::singleton().startMonitoringInput(); 62 } 63 54 64 } 55 65 -
trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp
r204509 r204524 1287 1287 } 1288 1288 1289 void WebProcessPool::setInitialConnectedGamepads(const Vector<std::unique_ptr<UIGamepad>>& gamepads) 1290 { 1291 Vector<GamepadData> gamepadDatas; 1292 gamepadDatas.resize(gamepads.size()); 1293 for (size_t i = 0; i < gamepads.size(); ++i) { 1294 if (!gamepads[i]) 1295 continue; 1296 gamepadDatas[i] = gamepads[i]->gamepadData(); 1297 } 1298 1299 for (auto& process : m_processesUsingGamepads) 1300 process->send(Messages::WebProcess::SetInitialGamepads(gamepadDatas), 0); 1301 } 1302 1289 1303 #endif // ENABLE(GAMEPAD) 1290 1304 -
trunk/Source/WebKit2/UIProcess/WebProcessPool.h
r204509 r204524 371 371 void gamepadConnected(const UIGamepad&); 372 372 void gamepadDisconnected(const UIGamepad&); 373 374 void setInitialConnectedGamepads(const Vector<std::unique_ptr<UIGamepad>>&); 373 375 #endif 374 376 -
trunk/Source/WebKit2/WebProcess/Gamepad/WebGamepadProvider.cpp
r204509 r204524 52 52 WebGamepadProvider::~WebGamepadProvider() 53 53 { 54 } 55 56 void WebGamepadProvider::setInitialGamepads(const Vector<GamepadData>& gamepadDatas) 57 { 58 ASSERT(m_gamepads.isEmpty()); 59 60 m_gamepads.resize(gamepadDatas.size()); 61 m_rawGamepads.resize(gamepadDatas.size()); 62 for (size_t i = 0; i < gamepadDatas.size(); ++i) { 63 if (gamepadDatas[i].isNull()) 64 continue; 65 66 m_gamepads[i] = std::make_unique<WebGamepad>(gamepadDatas[i]); 67 m_rawGamepads[i] = m_gamepads[i].get(); 68 } 54 69 } 55 70 -
trunk/Source/WebKit2/WebProcess/Gamepad/WebGamepadProvider.h
r204509 r204524 47 47 void gamepadActivity(const Vector<GamepadData>&); 48 48 49 void setInitialGamepads(const Vector<GamepadData>&); 50 49 51 private: 50 52 friend NeverDestroyed<WebGamepadProvider>; -
trunk/Source/WebKit2/WebProcess/WebProcess.cpp
r204509 r204524 1031 1031 #if ENABLE(GAMEPAD) 1032 1032 1033 void WebProcess::setInitialGamepads(const Vector<WebKit::GamepadData>& gamepadDatas) 1034 { 1035 WebGamepadProvider::singleton().setInitialGamepads(gamepadDatas); 1036 } 1037 1033 1038 void WebProcess::gamepadConnected(const GamepadData& gamepadData) 1034 1039 { -
trunk/Source/WebKit2/WebProcess/WebProcess.h
r204509 r204524 277 277 278 278 #if ENABLE(GAMEPAD) 279 void setInitialGamepads(const Vector<GamepadData>&); 279 280 void gamepadConnected(const GamepadData&); 280 281 void gamepadDisconnected(unsigned index); -
trunk/Source/WebKit2/WebProcess/WebProcess.messages.in
r204509 r204524 104 104 105 105 #if ENABLE(GAMEPAD) 106 SetInitialGamepads(Vector<WebKit::GamepadData> gamepadDatas) 106 107 GamepadConnected(struct WebKit::GamepadData gamepadData) 107 108 GamepadDisconnected(unsigned index)
Note: See TracChangeset
for help on using the changeset viewer.