blob: fe903291604e9e076f40f60c0903939dbdccfd4b [file] [log] [blame]
// Copyright 2016 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.
#include "device/vr/vr_display_impl.h"
#include <utility>
#include "base/bind.h"
#include "device/vr/vr_device.h"
#include "device/vr/vr_device_manager.h"
#include "device/vr/vr_service_impl.h"
namespace device {
VRDisplayImpl::VRDisplayImpl(device::VRDevice* device,
int render_frame_process_id,
int render_frame_routing_id,
mojom::VRServiceClient* service_client,
mojom::VRDisplayInfoPtr display_info)
: binding_(this),
device_(device),
render_frame_process_id_(render_frame_process_id),
render_frame_routing_id_(render_frame_routing_id),
weak_ptr_factory_(this) {
device_->AddDisplay(this);
mojom::VRDisplayPtr display;
binding_.Bind(mojo::MakeRequest(&display));
service_client->OnDisplayConnected(
std::move(display), mojo::MakeRequest(&client_), std::move(display_info));
}
VRDisplayImpl::~VRDisplayImpl() {
device_->RemoveDisplay(this);
}
void VRDisplayImpl::OnChanged(mojom::VRDisplayInfoPtr vr_device_info) {
client_->OnChanged(std::move(vr_device_info));
}
void VRDisplayImpl::OnExitPresent() {
client_->OnExitPresent();
}
void VRDisplayImpl::OnBlur() {
client_->OnBlur();
}
void VRDisplayImpl::OnFocus() {
client_->OnFocus();
}
void VRDisplayImpl::OnActivate(mojom::VRDisplayEventReason reason,
const base::Callback<void(bool)>& on_handled) {
client_->OnActivate(reason, on_handled);
}
void VRDisplayImpl::OnDeactivate(mojom::VRDisplayEventReason reason) {
client_->OnDeactivate(reason);
}
void VRDisplayImpl::RequestPresent(mojom::VRSubmitFrameClientPtr submit_client,
mojom::VRPresentationProviderRequest request,
RequestPresentCallback callback) {
if (!device_->IsAccessAllowed(this)) {
std::move(callback).Run(false);
return;
}
device_->RequestPresent(
std::move(submit_client), std::move(request),
base::Bind(&VRDisplayImpl::RequestPresentResult,
weak_ptr_factory_.GetWeakPtr(), base::Passed(&callback)));
}
void VRDisplayImpl::RequestPresentResult(RequestPresentCallback callback,
bool success) {
if (success)
device_->SetPresentingDisplay(this);
std::move(callback).Run(success);
}
void VRDisplayImpl::ExitPresent() {
if (device_->CheckPresentingDisplay(this))
device_->ExitPresent();
}
void VRDisplayImpl::GetNextMagicWindowPose(
GetNextMagicWindowPoseCallback callback) {
if (!device_->IsAccessAllowed(this)) {
std::move(callback).Run(nullptr);
return;
}
device_->GetNextMagicWindowPose(this, std::move(callback));
}
void VRDisplayImpl::SetListeningForActivate(bool listening) {
listening_for_activate_ = listening;
device_->OnListeningForActivateChanged(this);
}
} // namespace device