blob: e5879aea3124d23550289fa47852679182cc3893 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_VR_VR_DEVICE_BASE_H
#define DEVICE_VR_VR_DEVICE_BASE_H
#include "base/callback.h"
#include "base/macros.h"
#include "device/vr/vr_device.h"
#include "device/vr/vr_export.h"
#include "device/vr/vr_service.mojom.h"
namespace device {
class VRDisplayImpl;
// Represents one of the platform's VR devices. Owned by the respective
// VRDeviceProvider.
// TODO(mthiesse, crbug.com/769373): Remove DEVICE_VR_EXPORT.
class DEVICE_VR_EXPORT VRDeviceBase : public VRDevice {
public:
VRDeviceBase();
~VRDeviceBase() override;
// VRDevice Implementation
unsigned int GetId() const override;
void PauseTracking() override;
void ResumeTracking() override;
void Blur() override;
void Focus() override;
void OnExitPresent() override;
mojom::VRDisplayInfoPtr GetVRDisplayInfo() final;
void SetMagicWindowEnabled(bool enabled) final;
virtual void RequestPresent(
VRDisplayImpl* display,
mojom::VRSubmitFrameClientPtr submit_client,
mojom::VRPresentationProviderRequest request,
mojom::VRRequestPresentOptionsPtr present_options,
mojom::VRDisplayHost::RequestPresentCallback callback);
virtual void ExitPresent();
bool IsFallbackDevice() override;
void AddDisplay(VRDisplayImpl* display);
void RemoveDisplay(VRDisplayImpl* display);
bool IsAccessAllowed(VRDisplayImpl* display);
bool CheckPresentingDisplay(VRDisplayImpl* display);
void OnListeningForActivateChanged(VRDisplayImpl* display);
void OnFrameFocusChanged(VRDisplayImpl* display);
void GetMagicWindowPose(
mojom::VRMagicWindowProvider::GetPoseCallback callback);
VRDisplayImpl* GetPresentingDisplay() { return presenting_display_; }
protected:
void SetPresentingDisplay(VRDisplayImpl* display);
void SetVRDisplayInfo(mojom::VRDisplayInfoPtr display_info);
void OnActivate(mojom::VRDisplayEventReason reason,
base::Callback<void(bool)> on_handled);
private:
void UpdateListeningForActivate(VRDisplayImpl* display);
virtual void OnListeningForActivate(bool listening);
virtual void OnMagicWindowPoseRequest(
mojom::VRMagicWindowProvider::GetPoseCallback callback);
std::set<VRDisplayImpl*> displays_;
VRDisplayImpl* presenting_display_ = nullptr;
VRDisplayImpl* listening_for_activate_diplay_ = nullptr;
// On Android display activate is triggered after the Device ON flow that
// pauses Chrome, which unfocuses the webvr page, which lets us know that that
// page is no longer listening to displayActivate. We then have a race between
// blink-side getting focus back and letting us know the page is listening for
// displayactivate, and the browser sending displayactivate.
// We resolve this by remembering which display was last listening for
// displayactivate most recently, and sending the activation there so long as
// the WebContents it belongs to is focused and nothing has more recently
// started listening for displayactivate.
// This is safe because if the page is /actually/ not listening for activate
// anymore, the displayactivate signal will just be ignored.
VRDisplayImpl* last_listening_for_activate_diplay_ = nullptr;
mojom::VRDisplayInfoPtr display_info_;
unsigned int id_;
static unsigned int next_id_;
bool magic_window_enabled_ = true;
DISALLOW_COPY_AND_ASSIGN(VRDeviceBase);
};
} // namespace device
#endif // DEVICE_VR_VR_DEVICE_BASE_H