Bug 1574682 - Implement VREventObserver::NotifyEnumerationCompleted r=imanol

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Kearwood "Kip" Gilbert 2019-08-23 06:30:56 +00:00
parent 21217d8174
commit 291ee2b5f1
4 changed files with 30 additions and 0 deletions

View File

@ -162,5 +162,7 @@ void VREventObserver::NotifyPresentationGenerationChanged(uint32_t aDisplayID) {
}
}
void VREventObserver::NotifyEnumerationCompleted() {}
} // namespace dom
} // namespace mozilla

View File

@ -30,6 +30,7 @@ class VREventObserver final : public gfx::VRManagerEventObserver {
void NotifyVRDisplayDisconnect(uint32_t aDisplayID) override;
void NotifyVRDisplayPresentChange(uint32_t aDisplayID) override;
void NotifyPresentationGenerationChanged(uint32_t aDisplayID) override;
void NotifyEnumerationCompleted() override;
void DisconnectFromOwner();
void UpdateSpentTimeIn2DTelemetry(bool aUpdate);

View File

@ -38,6 +38,7 @@ VRManagerChild::VRManagerChild()
: mDisplaysInitialized(false),
mMessageLoop(MessageLoop::current()),
mFrameRequestCallbackCounter(0),
mWaitingForEnumeration(false),
mBackend(layers::LayersBackend::LAYERS_NONE) {
MOZ_ASSERT(NS_IsMainThread());
@ -235,6 +236,12 @@ mozilla::ipc::IPCResult VRManagerChild::RecvUpdateDisplayInfo(
nav->NotifyVRDisplaysUpdated();
}
mNavigatorCallbacks.Clear();
if (mWaitingForEnumeration) {
nsContentUtils::AddScriptRunner(NewRunnableMethod<>(
"gfx::VRManagerChild::NotifyEnumerationCompletedInternal", this,
&VRManagerChild::NotifyEnumerationCompletedInternal));
mWaitingForEnumeration = false;
}
return IPC_OK();
}
@ -297,6 +304,14 @@ bool VRManagerChild::RefreshVRDisplaysWithCallback(uint64_t aWindowId) {
return success;
}
bool VRManagerChild::EnumerateVRDisplays() {
bool success = SendRefreshDisplays();
if (success) {
mWaitingForEnumeration = true;
}
return success;
}
PVRLayerChild* VRManagerChild::CreateVRLayer(uint32_t aDisplayID,
nsIEventTarget* aTarget,
uint32_t aGroup) {
@ -461,6 +476,14 @@ void VRManagerChild::NotifyPresentationGenerationChangedInternal(
}
}
void VRManagerChild::NotifyEnumerationCompletedInternal() {
nsTArray<RefPtr<VRManagerEventObserver>> listeners;
listeners = mListeners;
for (auto& listener : listeners) {
listener->NotifyEnumerationCompleted();
}
}
void VRManagerChild::FireDOMVRDisplayConnectEventsForLoad(
VRManagerEventObserver* aObserver) {
// We need to fire the VRDisplayConnect event when a page is loaded

View File

@ -40,6 +40,7 @@ class VRManagerEventObserver {
virtual void NotifyVRDisplayPresentChange(uint32_t aDisplayID) = 0;
virtual void NotifyPresentationGenerationChanged(uint32_t aDisplayID) = 0;
virtual bool GetStopActivityStatus() const = 0;
virtual void NotifyEnumerationCompleted() = 0;
protected:
virtual ~VRManagerEventObserver() = default;
@ -62,6 +63,7 @@ class VRManagerChild : public PVRManagerChild {
void GetVRDisplays(nsTArray<RefPtr<VRDisplayClient>>& aDisplays);
bool RefreshVRDisplaysWithCallback(uint64_t aWindowId);
bool EnumerateVRDisplays();
void AddPromise(const uint32_t& aID, dom::Promise* aPromise);
static void InitSameProcess();
@ -136,6 +138,7 @@ class VRManagerChild : public PVRManagerChild {
void FireDOMVRDisplayConnectEventsForLoadInternal(
uint32_t aDisplayID, VRManagerEventObserver* aObserver);
void NotifyPresentationGenerationChangedInternal(uint32_t aDisplayID);
void NotifyEnumerationCompletedInternal();
nsTArray<RefPtr<VRDisplayClient>> mDisplays;
bool mDisplaysInitialized;
@ -153,6 +156,7 @@ class VRManagerChild : public PVRManagerChild {
mozilla::TimeStamp mStartTimeStamp;
nsTArray<RefPtr<VRManagerEventObserver>> mListeners;
bool mWaitingForEnumeration;
layers::LayersBackend mBackend;
RefPtr<layers::SyncObjectClient> mSyncObject;