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
95
96
97
98
99
100
101
102
103
content / browser / device_posture / device_posture_provider_impl.cc [blame]
// Copyright 2021 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/device_posture/device_posture_provider_impl.h"
#include "base/functional/bind.h"
#include "content/browser/device_posture/device_posture_platform_provider.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace content {
// static
DevicePostureProviderImpl* DevicePostureProviderImpl::GetOrCreate(
WebContents* web_contents) {
CHECK(web_contents);
WebContentsUserData<DevicePostureProviderImpl>::CreateForWebContents(
web_contents);
return WebContentsUserData<DevicePostureProviderImpl>::FromWebContents(
web_contents);
}
DevicePostureProviderImpl::DevicePostureProviderImpl(WebContents* web_contents)
: WebContentsUserData<DevicePostureProviderImpl>(*web_contents) {
platform_provider_ = DevicePosturePlatformProvider::Create(web_contents);
// We need to listen to disconnections so that if there is nobody interested
// in posture changes we can shutdown the native backends.
posture_clients_.set_disconnect_handler(base::BindRepeating(
&DevicePostureProviderImpl::OnRemoteDisconnect, base::Unretained(this)));
}
DevicePostureProviderImpl::~DevicePostureProviderImpl() = default;
void DevicePostureProviderImpl::Bind(
mojo::PendingReceiver<blink::mojom::DevicePostureProvider> receiver) {
receivers_.Add(this, std::move(receiver));
}
DevicePosturePlatformProvider* DevicePostureProviderImpl::platform_provider()
const {
return platform_provider_.get();
}
void DevicePostureProviderImpl::AddListenerAndGetCurrentPosture(
mojo::PendingRemote<blink::mojom::DevicePostureClient> client,
AddListenerAndGetCurrentPostureCallback callback) {
if (posture_clients_.empty()) {
platform_provider_->AddObserver(this);
}
posture_clients_.Add(std::move(client));
blink::mojom::DevicePostureType posture =
platform_provider_->GetDevicePosture();
std::move(callback).Run(posture);
}
void DevicePostureProviderImpl::OverrideDevicePostureForEmulation(
blink::mojom::DevicePostureType emulated_posture) {
// Notify the related clients about the new posture.
is_posture_emulated_ = true;
for (auto& client : posture_clients_) {
client->OnPostureChanged(emulated_posture);
}
}
void DevicePostureProviderImpl::DisableDevicePostureOverrideForEmulation() {
// If the posture is not being overridden, bail out earlier to avoid
// needlessly calling OnPostureChanged().
if (!is_posture_emulated_) {
return;
}
// Restore the original posture from the platform.
is_posture_emulated_ = false;
for (auto& client : posture_clients_) {
client->OnPostureChanged(platform_provider_->GetDevicePosture());
}
}
void DevicePostureProviderImpl::OnDevicePostureChanged(
const blink::mojom::DevicePostureType& posture) {
// If we receive a posture change from the platform but we're emulating it we
// shouldn't notify the clients.
if (is_posture_emulated_) {
return;
}
for (auto& client : posture_clients_) {
client->OnPostureChanged(posture);
}
}
void DevicePostureProviderImpl::OnRemoteDisconnect(
mojo::RemoteSetElementId id) {
if (posture_clients_.empty()) {
// We're not interested in receiving posture changes.
platform_provider_->RemoveObserver(this);
}
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(DevicePostureProviderImpl);
} // namespace content