mozilla::ipc::IPCResult VRManagerParent::RecvCreateVRServiceTestController(const nsCString& aID, const uint32_t& aPromiseID) { uint32_t controllerIdx = 0; nsTArray<VRControllerInfo> controllerInfoArray; impl::VRControllerPuppet* controllerPuppet = nullptr; VRManager* vm = VRManager::Get(); // Get VRControllerPuppet from VRManager vm->GetVRControllerInfo(controllerInfoArray); for (auto& controllerInfo : controllerInfoArray) { if (controllerInfo.GetType() == VRDeviceType::Puppet) { if (controllerIdx == mControllerTestID) { controllerPuppet = static_cast<impl::VRControllerPuppet*>( vm->GetController(controllerInfo.GetControllerID()).get()); break; } ++controllerIdx; } } MOZ_ASSERT(controllerPuppet); MOZ_ASSERT(mControllerTestID < 2); // We have only two controllers in VRSystemManagerPuppet. if (!mVRControllerTests.Get(mControllerTestID, nullptr)) { mVRControllerTests.Put(mControllerTestID, controllerPuppet); } if (SendReplyCreateVRServiceTestController(aID, aPromiseID, mControllerTestID)) { ++mControllerTestID; return IPC_OK(); } return IPC_FAIL(this, "SendReplyCreateVRServiceTestController fail"); }
mozilla::ipc::IPCResult VRManagerParent::RecvCreateVRServiceTestController(const nsCString& aID, const uint32_t& aPromiseID) { uint32_t controllerIdx = 1; // ID's are 1 based nsTArray<VRControllerInfo> controllerInfoArray; impl::VRControllerPuppet* controllerPuppet = nullptr; VRManager* vm = VRManager::Get(); /** * When running headless mochitests on some of our automated test * infrastructure, 2d display vsyncs are not always generated. * In this case, the test controllers can't be created immediately * after the VR display was created as the state of the VR displays * are updated during vsync. * To workaround, we produce a vsync manually. */ vm->NotifyVsync(TimeStamp::Now()); // Get VRControllerPuppet from VRManager vm->GetVRControllerInfo(controllerInfoArray); for (auto& controllerInfo : controllerInfoArray) { if (controllerInfo.GetType() == VRDeviceType::Puppet) { if (controllerIdx == mControllerTestID) { controllerPuppet = static_cast<impl::VRControllerPuppet*>( vm->GetController(controllerInfo.GetControllerID()).get()); break; } ++controllerIdx; } } // We might not have a controllerPuppet if the test did // not create a VR display first. if (!controllerPuppet) { // We send a device ID of "0" to indicate failure if (SendReplyCreateVRServiceTestController(aID, aPromiseID, 0)) { return IPC_OK(); } } else { if (!mVRControllerTests.Get(mControllerTestID, nullptr)) { mVRControllerTests.Put(mControllerTestID, controllerPuppet); } if (SendReplyCreateVRServiceTestController(aID, aPromiseID, mControllerTestID)) { ++mControllerTestID; return IPC_OK(); } } return IPC_FAIL(this, "SendReplyCreateVRServiceTestController fail"); }