1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/xr/service/isolated_device_provider.h"
#include "base/functional/bind.h"
#include "content/browser/xr/service/xr_device_service.h"
#include "content/browser/xr/xr_utils.h"
#include "content/public/browser/xr_integration_client.h"
namespace {
constexpr int kMaxRetries = 3;
}
namespace content {
void IsolatedVRDeviceProvider::Initialize(
device::VRDeviceProviderClient* client,
content::WebContents* initializing_web_contents) {
client_ = client;
SetupDeviceProvider();
}
bool IsolatedVRDeviceProvider::Initialized() {
return initialized_;
}
void IsolatedVRDeviceProvider::OnDeviceAdded(
mojo::PendingRemote<device::mojom::XRRuntime> device,
device::mojom::XRDeviceDataPtr device_data,
device::mojom::XRDeviceId device_id) {
client_->AddRuntime(device_id, std::move(device_data), std::move(device));
active_device_ids_.insert(device_id);
}
void IsolatedVRDeviceProvider::OnDeviceRemoved(device::mojom::XRDeviceId id) {
client_->RemoveRuntime(id);
active_device_ids_.erase(id);
}
void IsolatedVRDeviceProvider::OnServerError() {
// An error occurred - any devices we have added are now disconnected and
// should be removed.
for (auto& id : active_device_ids_) {
client_->RemoveRuntime(id);
}
active_device_ids_.clear();
// At this point, XRRuntimeManagerImpl may be blocked waiting for us to return
// that we've enumerated all runtimes/devices. If we lost the connection to
// the service, we'll try again. If we've already tried too many times,
// then just assume we won't ever get devices, so report we are done now.
// This will unblock WebXR/WebVR promises so they can reject indicating we
// never found devices.
if (!initialized_ && retry_count_ >= kMaxRetries) {
OnDevicesEnumerated();
} else {
device_provider_.reset();
receiver_.reset();
retry_count_++;
SetupDeviceProvider();
}
}
void IsolatedVRDeviceProvider::OnDevicesEnumerated() {
if (!initialized_) {
initialized_ = true;
client_->OnProviderInitialized();
}
// Either we've hit the max retries and given up (in which case we don't have
// a device provider which could error out and cause us to retry) or we've
// successfully gotten the device provider again after a retry, and we should
// reset our count in case it gets disconnected.
retry_count_ = 0;
}
void IsolatedVRDeviceProvider::SetupDeviceProvider() {
GetXRDeviceService()->BindRuntimeProvider(
device_provider_.BindNewPipeAndPassReceiver(),
CreateXRDeviceServiceHost());
device_provider_.set_disconnect_handler(base::BindOnce(
&IsolatedVRDeviceProvider::OnServerError, base::Unretained(this)));
device_provider_->RequestDevices(receiver_.BindNewPipeAndPassRemote());
}
IsolatedVRDeviceProvider::IsolatedVRDeviceProvider() = default;
// Default destructor handles renderer_host_map_ cleanup.
IsolatedVRDeviceProvider::~IsolatedVRDeviceProvider() = default;
} // namespace content
|