/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "GamepadEventChannelParent.h" #include "GamepadPlatformService.h" #include "mozilla/dom/GamepadMonitoring.h" #include "mozilla/ipc/BackgroundParent.h" #include "nsThreadUtils.h" namespace mozilla::dom { using namespace mozilla::ipc; namespace { class SendGamepadUpdateRunnable final : public Runnable { private: ~SendGamepadUpdateRunnable() = default; RefPtr mParent; GamepadChangeEvent mEvent; public: SendGamepadUpdateRunnable(GamepadEventChannelParent* aParent, GamepadChangeEvent aEvent) : Runnable("dom::SendGamepadUpdateRunnable"), mParent(aParent), mEvent(aEvent) { MOZ_ASSERT(mParent); } NS_IMETHOD Run() override { AssertIsOnBackgroundThread(); Unused << mParent->SendGamepadUpdate(mEvent); return NS_OK; } }; } // namespace already_AddRefed GamepadEventChannelParent::Create() { return RefPtr(new GamepadEventChannelParent()) .forget(); } GamepadEventChannelParent::GamepadEventChannelParent() : mIsShutdown{false} { MOZ_DIAGNOSTIC_ASSERT(IsOnBackgroundThread()); mBackgroundEventTarget = GetCurrentEventTarget(); RefPtr service = GamepadPlatformService::GetParentService(); MOZ_ASSERT(service); service->AddChannelParent(this); } void GamepadEventChannelParent::ActorDestroy(ActorDestroyReason aWhy) { MOZ_DIAGNOSTIC_ASSERT(IsOnBackgroundThread()); MOZ_DIAGNOSTIC_ASSERT(!mIsShutdown); mIsShutdown = true; RefPtr service = GamepadPlatformService::GetParentService(); MOZ_ASSERT(service); service->RemoveChannelParent(this); } mozilla::ipc::IPCResult GamepadEventChannelParent::RecvVibrateHaptic( const Tainted& aHandle, const Tainted& aHapticIndex, const Tainted& aIntensity, const Tainted& aDuration, const Tainted& aPromiseID) { // TODO: Bug 680289, implement for standard gamepads // TODO: simplify tainted validation, see 1610570 if (SendReplyGamepadPromise(MOZ_NO_VALIDATE( aPromiseID, "This value is unused aside from being passed back to the child."))) { return IPC_OK(); } return IPC_FAIL(this, "SendReplyGamepadPromise fail."); } mozilla::ipc::IPCResult GamepadEventChannelParent::RecvStopVibrateHaptic( const Tainted& aHandle) { // TODO: Bug 680289, implement for standard gamepads return IPC_OK(); } mozilla::ipc::IPCResult GamepadEventChannelParent::RecvLightIndicatorColor( const Tainted& aHandle, const Tainted& aLightColorIndex, const Tainted& aRed, const Tainted& aGreen, const Tainted& aBlue, const Tainted& aPromiseID) { SetGamepadLightIndicatorColor(aHandle, aLightColorIndex, aRed, aGreen, aBlue); // TODO: simplify tainted validation, see 1610570 if (SendReplyGamepadPromise(MOZ_NO_VALIDATE( aPromiseID, "This value is unused aside from being passed back to the child."))) { return IPC_OK(); } return IPC_FAIL(this, "SendReplyGamepadPromise fail."); } void GamepadEventChannelParent::DispatchUpdateEvent( const GamepadChangeEvent& aEvent) { mBackgroundEventTarget->Dispatch(new SendGamepadUpdateRunnable(this, aEvent), NS_DISPATCH_NORMAL); } } // namespace mozilla::dom