Bug 1299928 - Part 6: Making GamepadManager is only run at the same process at VRMangerChild; r?kip draft
authorDaosheng Mu <daoshengmu@gmail.com>
Tue, 11 Oct 2016 10:45:25 +0800
changeset 425943 8a352c8a5dabc6a737c5007910ceb4fc3417f4be
parent 425942 9f7ce0e6804a02aeef9b6f7147c701af499cc652
child 534016 4f92da675e7c7028d7e21bcb65138f9b52894293
push id32537
push userbmo:dmu@mozilla.com
push dateMon, 17 Oct 2016 10:06:25 +0000
reviewerskip
bugs1299928
milestone52.0a1
Bug 1299928 - Part 6: Making GamepadManager is only run at the same process at VRMangerChild; r?kip MozReview-Commit-ID: HrPHptVNgtq
dom/gamepad/GamepadManager.cpp
gfx/vr/ipc/VRManagerChild.cpp
gfx/vr/ipc/VRManagerChild.h
--- a/dom/gamepad/GamepadManager.cpp
+++ b/dom/gamepad/GamepadManager.cpp
@@ -620,16 +620,17 @@ GamepadManager::ActorCreated(PBackground
   MOZ_ASSERT(initedChild == child);
   child->SendGamepadListenerAdded();
   mChannelChildren.AppendElement(child);
 
 #if defined(XP_WIN) || defined(XP_MACOSX) || defined(XP_LINUX)
   // Construct VRManagerChannel and ask adding the connected
   // VR controllers to GamepadManager
   mVRChannelChild = gfx::VRManagerChild::Get();
+  mVRChannelChild->SetGamepadManager(this);
   mVRChannelChild->SendControllerListenerAdded();
 #endif
 }
 
 //Override nsIIPCBackgroundChildCreateCallback
 void
 GamepadManager::ActorFailed()
 {
--- a/gfx/vr/ipc/VRManagerChild.cpp
+++ b/gfx/vr/ipc/VRManagerChild.cpp
@@ -481,24 +481,21 @@ VRManagerChild::RecvNotifyVRVSync(const 
   }
 
   return true;
 }
 
 bool
 VRManagerChild::RecvGamepadUpdate(const GamepadChangeEvent& aGamepadEvent)
 {
-  // VRManagerChild could be at other processes,
-  // but GamepadManager is only allowed to be run at Content process.
-  if (XRE_IsContentProcess()) {
-    RefPtr<dom::GamepadManager> serivce(dom::GamepadManager::GetService());
-
-    if (serivce) {
-      serivce->Update(aGamepadEvent);
-    }
+  // VRManagerChild could be at other processes, but GamepadManager
+  // only exists at the content process or the parent process
+  // in non-e10s mode.
+  if (mGamepadManager) {
+      mGamepadManager->Update(aGamepadEvent);
   }
 
   return true;
 }
 
 void
 VRManagerChild::RunFrameRequestCallbacks()
 {
@@ -587,10 +584,18 @@ VRManagerChild::RemoveListener(dom::VREv
 }
 
 void
 VRManagerChild::FatalError(const char* const aName, const char* const aMsg) const
 {
   dom::ContentChild::FatalErrorIfNotUsingGPUProcess(aName, aMsg, OtherPid());
 }
 
+void
+VRManagerChild::SetGamepadManager(dom::GamepadManager* aGamepadManager)
+{
+  MOZ_ASSERT(aGamepadManager);
+
+  mGamepadManager = aGamepadManager;
+}
+
 } // namespace gfx
 } // namespace mozilla
--- a/gfx/vr/ipc/VRManagerChild.h
+++ b/gfx/vr/ipc/VRManagerChild.h
@@ -12,16 +12,17 @@
 #include "mozilla/ipc/SharedMemory.h"   // for SharedMemory, etc
 #include "ThreadSafeRefcountingWithMainThreadDestruction.h"
 #include "mozilla/layers/ISurfaceAllocator.h"  // for ISurfaceAllocator
 #include "mozilla/layers/LayersTypes.h"  // for LayersBackend
 #include "mozilla/layers/TextureForwarder.h"
 
 namespace mozilla {
 namespace dom {
+class GamepadManager;
 class Navigator;
 class VRDisplay;
 class VREventObserver;
 } // namespace dom
 namespace layers {
 class PCompositableChild;
 class TextureClient;
 }
@@ -72,16 +73,19 @@ public:
 
   virtual MessageLoop* GetMessageLoop() const override { return mMessageLoop; }
   virtual base::ProcessId GetParentPid() const override { return OtherPid(); }
 
   nsresult ScheduleFrameRequestCallback(mozilla::dom::FrameRequestCallback& aCallback,
     int32_t *aHandle);
   void CancelFrameRequestCallback(int32_t aHandle);
   void RunFrameRequestCallbacks();
+  // GamepadManager has to be set by the content side to make sure we are using
+  // the same singleton GamepadManager from the same process.
+  void SetGamepadManager(dom::GamepadManager* aGamepadManager);
 
   void UpdateDisplayInfo(nsTArray<VRDisplayInfo>& aDisplayUpdates);
   void FireDOMVRDisplayConnectEvent();
   void FireDOMVRDisplayDisconnectEvent();
   void FireDOMVRDisplayPresentChangeEvent();
 
   virtual void FatalError(const char* const aName, const char* const aMsg) const override;
 
@@ -146,16 +150,17 @@ private:
   * Notify id of Texture When host side end its use. Transaction id is used to
   * make sure if there is no newer usage.
   */
   void NotifyNotUsed(uint64_t aTextureId, uint64_t aFwdTransactionId);
 
   nsTArray<RefPtr<VRDisplayClient> > mDisplays;
   bool mDisplaysInitialized;
   nsTArray<dom::Navigator*> mNavigatorCallbacks;
+  dom::GamepadManager* mGamepadManager;
 
   int32_t mInputFrameID;
 
   MessageLoop* mMessageLoop;
 
   struct FrameRequest;
 
   nsTArray<FrameRequest> mFrameRequestCallbacks;