Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: third_party/WebKit/Source/modules/sensor/SensorProxy.cpp

Issue 2458453002: [sensors] Add Permission guard to the generic sensor apis.
Patch Set: Pass only origin to provider Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/sensor/SensorProxy.h" 5 #include "modules/sensor/SensorProxy.h"
6 6
7 #include "core/frame/LocalFrame.h" 7 #include "core/frame/LocalFrame.h"
8 #include "modules/permissions/PermissionUtils.h"
8 #include "modules/sensor/SensorProviderProxy.h" 9 #include "modules/sensor/SensorProviderProxy.h"
9 #include "modules/sensor/SensorReading.h" 10 #include "modules/sensor/SensorReading.h"
11 #include "platform/UserGestureIndicator.h"
10 #include "platform/mojo/MojoHelper.h" 12 #include "platform/mojo/MojoHelper.h"
13 #include "platform/weborigin/SecurityOrigin.h"
11 #include "public/platform/Platform.h" 14 #include "public/platform/Platform.h"
12 15
13 using namespace device::mojom::blink; 16 using namespace device::mojom::blink;
14 17
15 namespace blink { 18 namespace blink {
16 19
20 using mojom::blink::PermissionName;
21 using mojom::blink::PermissionService;
22 using mojom::blink::PermissionStatus;
23
17 SensorProxy::SensorProxy(SensorType sensorType, 24 SensorProxy::SensorProxy(SensorType sensorType,
25 PermissionService* permissionService,
26 RefPtr<SecurityOrigin> origin,
18 SensorProviderProxy* provider, 27 SensorProviderProxy* provider,
19 std::unique_ptr<SensorReadingFactory> readingFactory) 28 std::unique_ptr<SensorReadingFactory> readingFactory)
20 : m_type(sensorType), 29 : m_type(sensorType),
21 m_mode(ReportingMode::CONTINUOUS), 30 m_mode(ReportingMode::CONTINUOUS),
22 m_provider(provider), 31 m_provider(provider),
23 m_clientBinding(this), 32 m_clientBinding(this),
24 m_state(SensorProxy::Uninitialized), 33 m_state(SensorProxy::Uninitialized),
25 m_suspended(false), 34 m_suspended(false),
26 m_readingFactory(std::move(readingFactory)), 35 m_readingFactory(std::move(readingFactory)),
27 m_maximumFrequency(0.0) {} 36 m_maximumFrequency(0.0),
37 m_permissionStatus(PermissionStatus::ASK),
38 m_permissionService(permissionService),
39 m_securityOrigin(std::move(origin)) {}
40
41 void SensorProxy::onPermissionUpdate(PermissionStatus status) {
42 if (m_state == Uninitialized)
43 return;
44
45 if (m_permissionStatus != status) {
46 m_permissionStatus = status;
47 if (isInitializing())
Mikhail 2016/11/21 14:29:41 what if this came after permission has already bee
48 initialize();
49 }
50
51 // If permission is revoked, throw error.
52 if (isInitialized() && m_permissionStatus != PermissionStatus::GRANTED)
53 handleSensorError(NotAllowedError, "Permission not granted.");
54
55 // Keep listening to changes.
56 m_permissionService->GetNextPermissionChange(
57 createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin,
58 m_permissionStatus,
59 convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate,
60 wrapWeakPersistent(this))));
61 }
28 62
29 SensorProxy::~SensorProxy() {} 63 SensorProxy::~SensorProxy() {}
30 64
31 void SensorProxy::dispose() { 65 void SensorProxy::dispose() {
32 m_clientBinding.Close(); 66 m_clientBinding.Close();
33 } 67 }
34 68
35 DEFINE_TRACE(SensorProxy) { 69 DEFINE_TRACE(SensorProxy) {
36 visitor->trace(m_reading); 70 visitor->trace(m_reading);
37 visitor->trace(m_observers); 71 visitor->trace(m_observers);
38 visitor->trace(m_provider); 72 visitor->trace(m_provider);
39 } 73 }
40 74
41 void SensorProxy::addObserver(Observer* observer) { 75 void SensorProxy::addObserver(Observer* observer) {
42 if (!m_observers.contains(observer)) 76 if (!m_observers.contains(observer))
43 m_observers.add(observer); 77 m_observers.add(observer);
44 } 78 }
45 79
46 void SensorProxy::removeObserver(Observer* observer) { 80 void SensorProxy::removeObserver(Observer* observer) {
47 m_observers.remove(observer); 81 m_observers.remove(observer);
48 } 82 }
49 83
50 void SensorProxy::initialize() { 84 void SensorProxy::initialize() {
51 if (m_state != Uninitialized) 85 if (m_state == Initialized)
52 return; 86 return;
53 87
54 if (!m_provider->sensorProvider()) { 88 if (!m_provider->sensorProvider()) {
55 handleSensorError(); 89 handleSensorError();
56 return; 90 return;
57 } 91 }
58 92
59 m_state = Initializing; 93 m_state = Initializing;
60 auto callback = convertToBaseCallback( 94
61 WTF::bind(&SensorProxy::onSensorCreated, wrapWeakPersistent(this))); 95 switch (m_permissionStatus) {
62 m_provider->sensorProvider()->GetSensor(m_type, mojo::GetProxy(&m_sensor), 96 case PermissionStatus::ASK:
63 callback); 97 // Request permission.
98 m_permissionService->RequestPermission(
99 createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin,
100 UserGestureIndicator::processingUserGesture(),
101 convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate,
102 wrapWeakPersistent(this))));
103 break;
104 case PermissionStatus::DENIED:
105 handleSensorError(NotAllowedError, "Permission not granted.");
Mikhail 2016/11/21 14:29:41 so, state will be still "Initializing"?
riju_ 2016/11/23 09:02:28 handleSensorError resets m_state to Uninitialized.
106 break;
107 case PermissionStatus::GRANTED:
108 m_provider->sensorProvider()->GetSensor(
109 m_type, mojo::GetProxy(&m_sensor),
110 convertToBaseCallback(WTF::bind(&SensorProxy::onSensorCreated,
111 wrapWeakPersistent(this))));
112 break;
113 default:
114 NOTREACHED();
115 }
64 } 116 }
65 117
66 void SensorProxy::addConfiguration( 118 void SensorProxy::addConfiguration(
67 SensorConfigurationPtr configuration, 119 SensorConfigurationPtr configuration,
68 std::unique_ptr<Function<void(bool)>> callback) { 120 std::unique_ptr<Function<void(bool)>> callback) {
69 DCHECK(isInitialized()); 121 DCHECK(isInitialized());
70 m_sensor->AddConfiguration(std::move(configuration), 122 m_sensor->AddConfiguration(std::move(configuration),
71 convertToBaseCallback(std::move(callback))); 123 convertToBaseCallback(std::move(callback)));
72 } 124 }
73 125
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 const device::OneWriterSeqLock& seqlock = buffer->seqlock.value(); 254 const device::OneWriterSeqLock& seqlock = buffer->seqlock.value();
203 auto version = seqlock.ReadBegin(); 255 auto version = seqlock.ReadBegin();
204 auto readingData = buffer->reading; 256 auto readingData = buffer->reading;
205 if (seqlock.ReadRetry(version)) 257 if (seqlock.ReadRetry(version))
206 return false; 258 return false;
207 result = readingData; 259 result = readingData;
208 return true; 260 return true;
209 } 261 }
210 262
211 } // namespace blink 263 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698