Bug 1570151 - WebXR: Implement VRManagerEventObserver r=imanol

In order to support multiple API's (WebVR + WebXR) being enabled simultaneously, a new class, gfx::VRManagerEventObserver, implements a pure virtual interface to be shared by both the WebVR and WebXR observers of XR device related events.

Differential Revision: https://phabricator.services.mozilla.com/D39985

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Kearwood "Kip" Gilbert 2019-08-07 08:29:32 +00:00
parent c6612d3e41
commit 936585e4fc
4 changed files with 44 additions and 36 deletions

View File

@ -8,7 +8,6 @@
#include "nsContentUtils.h"
#include "nsGlobalWindow.h"
#include "VRManagerChild.h"
#include "mozilla/Telemetry.h"
@ -83,7 +82,7 @@ void VREventObserver::StopActivity() {
vmc->StopActivity();
}
bool VREventObserver::GetStopActivityStatus() { return mStopActivity; }
bool VREventObserver::GetStopActivityStatus() const { return mStopActivity; }
void VREventObserver::NotifyAfterLoad() {
if (VRManagerChild::IsCreated()) {

View File

@ -9,32 +9,33 @@
#include "mozilla/dom/VRDisplayEventBinding.h"
#include "nsISupportsImpl.h" // for NS_INLINE_DECL_REFCOUNTING
#include "VRManagerChild.h"
class nsGlobalWindowInner;
namespace mozilla {
namespace dom {
class VREventObserver final {
class VREventObserver final : public gfx::VRManagerEventObserver {
public:
NS_INLINE_DECL_REFCOUNTING(VREventObserver)
NS_INLINE_DECL_REFCOUNTING(VREventObserver, override)
explicit VREventObserver(nsGlobalWindowInner* aGlobalWindow);
void NotifyAfterLoad();
void NotifyVRDisplayMounted(uint32_t aDisplayID);
void NotifyVRDisplayUnmounted(uint32_t aDisplayID);
void NotifyVRDisplayMounted(uint32_t aDisplayID) override;
void NotifyVRDisplayUnmounted(uint32_t aDisplayID) override;
void NotifyVRDisplayNavigation(uint32_t aDisplayID);
void NotifyVRDisplayRequested(uint32_t aDisplayID);
void NotifyVRDisplayConnect(uint32_t aDisplayID);
void NotifyVRDisplayDisconnect(uint32_t aDisplayID);
void NotifyVRDisplayPresentChange(uint32_t aDisplayID);
void NotifyPresentationGenerationChanged(uint32_t aDisplayID);
void NotifyVRDisplayConnect(uint32_t aDisplayID) override;
void NotifyVRDisplayDisconnect(uint32_t aDisplayID) override;
void NotifyVRDisplayPresentChange(uint32_t aDisplayID) override;
void NotifyPresentationGenerationChanged(uint32_t aDisplayID) override;
void DisconnectFromOwner();
void UpdateSpentTimeIn2DTelemetry(bool aUpdate);
void StartActivity();
void StopActivity();
bool GetStopActivityStatus();
bool GetStopActivityStatus() const override;
private:
~VREventObserver();

View File

@ -22,8 +22,8 @@
using namespace mozilla::dom;
namespace {
const nsTArray<RefPtr<dom::VREventObserver>>::index_type kNoIndex =
nsTArray<RefPtr<dom::VREventObserver>>::NoIndex;
const nsTArray<RefPtr<VRManagerEventObserver>>::index_type kNoIndex =
nsTArray<RefPtr<VRManagerEventObserver>>::NoIndex;
} // namespace
namespace mozilla {
@ -408,8 +408,7 @@ void VRManagerChild::FireDOMVRDisplayPresentChangeEvent(uint32_t aDisplayID) {
void VRManagerChild::FireDOMVRDisplayMountedEventInternal(uint32_t aDisplayID) {
// Iterate over a copy of mListeners, as dispatched events may modify it.
nsTArray<RefPtr<dom::VREventObserver>> listeners;
listeners = mListeners;
nsTArray<RefPtr<VRManagerEventObserver>> listeners(mListeners);
for (auto& listener : listeners) {
listener->NotifyVRDisplayMounted(aDisplayID);
}
@ -418,8 +417,7 @@ void VRManagerChild::FireDOMVRDisplayMountedEventInternal(uint32_t aDisplayID) {
void VRManagerChild::FireDOMVRDisplayUnmountedEventInternal(
uint32_t aDisplayID) {
// Iterate over a copy of mListeners, as dispatched events may modify it.
nsTArray<RefPtr<dom::VREventObserver>> listeners;
listeners = mListeners;
nsTArray<RefPtr<VRManagerEventObserver>> listeners(mListeners);
for (auto& listener : listeners) {
listener->NotifyVRDisplayUnmounted(aDisplayID);
}
@ -427,8 +425,7 @@ void VRManagerChild::FireDOMVRDisplayUnmountedEventInternal(
void VRManagerChild::FireDOMVRDisplayConnectEventInternal(uint32_t aDisplayID) {
// Iterate over a copy of mListeners, as dispatched events may modify it.
nsTArray<RefPtr<dom::VREventObserver>> listeners;
listeners = mListeners;
nsTArray<RefPtr<VRManagerEventObserver>> listeners(mListeners);
for (auto& listener : listeners) {
listener->NotifyVRDisplayConnect(aDisplayID);
}
@ -437,8 +434,7 @@ void VRManagerChild::FireDOMVRDisplayConnectEventInternal(uint32_t aDisplayID) {
void VRManagerChild::FireDOMVRDisplayDisconnectEventInternal(
uint32_t aDisplayID) {
// Iterate over a copy of mListeners, as dispatched events may modify it.
nsTArray<RefPtr<dom::VREventObserver>> listeners;
listeners = mListeners;
nsTArray<RefPtr<VRManagerEventObserver>> listeners(mListeners);
for (auto& listener : listeners) {
listener->NotifyVRDisplayDisconnect(aDisplayID);
}
@ -447,29 +443,27 @@ void VRManagerChild::FireDOMVRDisplayDisconnectEventInternal(
void VRManagerChild::FireDOMVRDisplayPresentChangeEventInternal(
uint32_t aDisplayID) {
// Iterate over a copy of mListeners, as dispatched events may modify it.
nsTArray<RefPtr<dom::VREventObserver>> listeners;
listeners = mListeners;
nsTArray<RefPtr<VRManagerEventObserver>> listeners(mListeners);
for (auto& listener : listeners) {
listener->NotifyVRDisplayPresentChange(aDisplayID);
}
}
void VRManagerChild::FireDOMVRDisplayConnectEventsForLoadInternal(
uint32_t aDisplayID, dom::VREventObserver* aObserver) {
uint32_t aDisplayID, VRManagerEventObserver* aObserver) {
aObserver->NotifyVRDisplayConnect(aDisplayID);
}
void VRManagerChild::NotifyPresentationGenerationChangedInternal(
uint32_t aDisplayID) {
nsTArray<RefPtr<dom::VREventObserver>> listeners;
listeners = mListeners;
nsTArray<RefPtr<VRManagerEventObserver>> listeners;
for (auto& listener : listeners) {
listener->NotifyPresentationGenerationChanged(aDisplayID);
}
}
void VRManagerChild::FireDOMVRDisplayConnectEventsForLoad(
dom::VREventObserver* aObserver) {
VRManagerEventObserver* aObserver) {
// We need to fire the VRDisplayConnect event when a page is loaded
// for each VR Display that has already been enumerated
nsTArray<RefPtr<VRDisplayClient>> displays;
@ -478,7 +472,7 @@ void VRManagerChild::FireDOMVRDisplayConnectEventsForLoad(
const VRDisplayInfo& info = display->GetDisplayInfo();
if (info.GetIsConnected()) {
nsContentUtils::AddScriptRunner(NewRunnableMethod<
uint32_t, RefPtr<dom::VREventObserver>>(
uint32_t, RefPtr<VRManagerEventObserver>>(
"gfx::VRManagerChild::FireDOMVRDisplayConnectEventsForLoadInternal",
this, &VRManagerChild::FireDOMVRDisplayConnectEventsForLoadInternal,
info.GetDisplayID(), aObserver));
@ -486,7 +480,7 @@ void VRManagerChild::FireDOMVRDisplayConnectEventsForLoad(
}
}
void VRManagerChild::AddListener(dom::VREventObserver* aObserver) {
void VRManagerChild::AddListener(VRManagerEventObserver* aObserver) {
MOZ_ASSERT(aObserver);
if (mListeners.IndexOf(aObserver) != kNoIndex) {
@ -499,7 +493,7 @@ void VRManagerChild::AddListener(dom::VREventObserver* aObserver) {
}
}
void VRManagerChild::RemoveListener(dom::VREventObserver* aObserver) {
void VRManagerChild::RemoveListener(VRManagerEventObserver* aObserver) {
MOZ_ASSERT(aObserver);
mListeners.RemoveElement(aObserver);

View File

@ -22,7 +22,6 @@ class Promise;
class GamepadManager;
class Navigator;
class VRDisplay;
class VREventObserver;
} // namespace dom
namespace layers {
class SyncObjectClient;
@ -31,6 +30,21 @@ namespace gfx {
class VRLayerChild;
class VRDisplayClient;
class VRManagerEventObserver {
public:
NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING
virtual void NotifyVRDisplayMounted(uint32_t aDisplayID) = 0;
virtual void NotifyVRDisplayUnmounted(uint32_t aDisplayID) = 0;
virtual void NotifyVRDisplayConnect(uint32_t aDisplayID) = 0;
virtual void NotifyVRDisplayDisconnect(uint32_t aDisplayID) = 0;
virtual void NotifyVRDisplayPresentChange(uint32_t aDisplayID) = 0;
virtual void NotifyPresentationGenerationChanged(uint32_t aDisplayID) = 0;
virtual bool GetStopActivityStatus() const = 0;
protected:
virtual ~VRManagerEventObserver() = default;
};
class VRManagerChild : public PVRManagerChild {
friend class PVRManagerChild;
@ -40,9 +54,9 @@ class VRManagerChild : public PVRManagerChild {
static VRManagerChild* Get();
// Indicate that an observer wants to receive VR events.
void AddListener(dom::VREventObserver* aObserver);
void AddListener(VRManagerEventObserver* aObserver);
// Indicate that an observer should no longer receive VR events.
void RemoveListener(dom::VREventObserver* aObserver);
void RemoveListener(VRManagerEventObserver* aObserver);
void StartActivity();
void StopActivity();
@ -80,7 +94,7 @@ class VRManagerChild : public PVRManagerChild {
void FireDOMVRDisplayConnectEvent(uint32_t aDisplayID);
void FireDOMVRDisplayDisconnectEvent(uint32_t aDisplayID);
void FireDOMVRDisplayPresentChangeEvent(uint32_t aDisplayID);
void FireDOMVRDisplayConnectEventsForLoad(dom::VREventObserver* aObserver);
void FireDOMVRDisplayConnectEventsForLoad(VRManagerEventObserver* aObserver);
virtual void HandleFatalError(const char* aMsg) const override;
@ -120,7 +134,7 @@ class VRManagerChild : public PVRManagerChild {
void FireDOMVRDisplayDisconnectEventInternal(uint32_t aDisplayID);
void FireDOMVRDisplayPresentChangeEventInternal(uint32_t aDisplayID);
void FireDOMVRDisplayConnectEventsForLoadInternal(
uint32_t aDisplayID, dom::VREventObserver* aObserver);
uint32_t aDisplayID, VRManagerEventObserver* aObserver);
void NotifyPresentationGenerationChangedInternal(uint32_t aDisplayID);
nsTArray<RefPtr<VRDisplayClient>> mDisplays;
@ -138,7 +152,7 @@ class VRManagerChild : public PVRManagerChild {
int32_t mFrameRequestCallbackCounter;
mozilla::TimeStamp mStartTimeStamp;
nsTArray<RefPtr<dom::VREventObserver>> mListeners;
nsTArray<RefPtr<VRManagerEventObserver>> mListeners;
layers::LayersBackend mBackend;
RefPtr<layers::SyncObjectClient> mSyncObject;