GamepadEventChannelChild.cpp (1992B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 #include "GamepadEventChannelChild.h" 7 8 #include "mozilla/dom/GamepadManager.h" 9 #include "mozilla/dom/Promise.h" 10 11 namespace mozilla::dom { 12 13 namespace { 14 15 class GamepadUpdateRunnable final : public Runnable { 16 public: 17 explicit GamepadUpdateRunnable(const GamepadChangeEvent& aGamepadEvent) 18 : Runnable("dom::GamepadUpdateRunnable"), mEvent(aGamepadEvent) {} 19 NS_IMETHOD Run() override { 20 RefPtr<GamepadManager> svc(GamepadManager::GetService()); 21 if (svc) { 22 svc->Update(mEvent); 23 } 24 return NS_OK; 25 } 26 27 protected: 28 GamepadChangeEvent mEvent; 29 }; 30 31 } // namespace 32 33 already_AddRefed<GamepadEventChannelChild> GamepadEventChannelChild::Create() { 34 return RefPtr<GamepadEventChannelChild>(new GamepadEventChannelChild()) 35 .forget(); 36 } 37 38 mozilla::ipc::IPCResult GamepadEventChannelChild::RecvGamepadUpdate( 39 const GamepadChangeEvent& aGamepadEvent) { 40 DebugOnly<nsresult> rv = 41 NS_DispatchToMainThread(new GamepadUpdateRunnable(aGamepadEvent)); 42 NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "NS_DispatchToMainThread failed"); 43 return IPC_OK(); 44 } 45 46 void GamepadEventChannelChild::AddPromise(const uint32_t& aID, 47 dom::Promise* aPromise) { 48 MOZ_ASSERT(!mPromiseList.Contains(aID)); 49 mPromiseList.InsertOrUpdate(aID, RefPtr{aPromise}); 50 } 51 52 mozilla::ipc::IPCResult GamepadEventChannelChild::RecvReplyGamepadPromise( 53 const uint32_t& aPromiseID) { 54 RefPtr<dom::Promise> p; 55 if (!mPromiseList.Get(aPromiseID, getter_AddRefs(p))) { 56 MOZ_CRASH("We should always have a promise."); 57 } 58 59 p->MaybeResolve(true); 60 mPromiseList.Remove(aPromiseID); 61 return IPC_OK(); 62 } 63 64 } // namespace mozilla::dom