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

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: Request for permission, in onSensorCreated() 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;
Mikhail 2016/11/22 21:24:41 looks like 'm_permissionStatus' is not needed and
riju_ 2016/11/23 09:02:28 I would like to be always sure that SensorProxy st
47
48 // If permission is revoked, throw error.
49 if (m_permissionStatus != PermissionStatus::GRANTED) {
Mikhail 2016/11/22 21:24:40 can it be ASK again?
Mikhail 2016/11/22 21:24:41 == Denied
riju_ 2016/11/23 09:02:28 Acknowledged.
riju_ 2016/11/23 09:02:28 Acknowledged.
50 handleSensorError(NotAllowedError, "Permission not granted.");
Mikhail 2016/11/22 21:24:41 return here (no need to subscribe for further noti
riju_ 2016/11/23 09:02:29 Acknowledged.
51 } else {
52 if (isInitializing()) {
53 m_state = Initialized;
54 for (Observer* observer : m_observers)
55 observer->onSensorInitialized();
56 }
57 }
58
59 // Keep listening to changes.
60 m_permissionService->GetNextPermissionChange(
Mikhail 2016/11/22 21:24:41 can we drop this subscription at 'handleSensorErro
riju_ 2016/11/23 09:02:28 resetPermissionService() will now be called if DEN
61 createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin,
62 m_permissionStatus,
63 convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate,
64 wrapWeakPersistent(this))));
65 }
28 66
29 SensorProxy::~SensorProxy() {} 67 SensorProxy::~SensorProxy() {}
30 68
31 void SensorProxy::dispose() { 69 void SensorProxy::dispose() {
32 m_clientBinding.Close(); 70 m_clientBinding.Close();
33 } 71 }
34 72
35 DEFINE_TRACE(SensorProxy) { 73 DEFINE_TRACE(SensorProxy) {
36 visitor->trace(m_reading); 74 visitor->trace(m_reading);
37 visitor->trace(m_observers); 75 visitor->trace(m_observers);
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 221
184 m_maximumFrequency = params->maximum_frequency; 222 m_maximumFrequency = params->maximum_frequency;
185 DCHECK(m_maximumFrequency <= SensorConfiguration::kMaxAllowedFrequency); 223 DCHECK(m_maximumFrequency <= SensorConfiguration::kMaxAllowedFrequency);
186 224
187 auto errorCallback = 225 auto errorCallback =
188 WTF::bind(&SensorProxy::handleSensorError, wrapWeakPersistent(this), 226 WTF::bind(&SensorProxy::handleSensorError, wrapWeakPersistent(this),
189 UnknownError, String("Internal error"), String()); 227 UnknownError, String("Internal error"), String());
190 m_sensor.set_connection_error_handler( 228 m_sensor.set_connection_error_handler(
191 convertToBaseCallback(std::move(errorCallback))); 229 convertToBaseCallback(std::move(errorCallback)));
192 230
193 m_state = Initialized; 231 // Request permission.
194 for (Observer* observer : m_observers) 232 m_permissionService->RequestPermission(
195 observer->onSensorInitialized(); 233 createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin,
234 UserGestureIndicator::processingUserGesture(),
235 convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate,
236 wrapWeakPersistent(this))));
196 } 237 }
197 238
198 bool SensorProxy::tryReadFromBuffer(device::SensorReading& result) { 239 bool SensorProxy::tryReadFromBuffer(device::SensorReading& result) {
199 DCHECK(isInitialized()); 240 DCHECK(isInitialized());
200 const ReadingBuffer* buffer = 241 const ReadingBuffer* buffer =
201 static_cast<const ReadingBuffer*>(m_sharedBuffer.get()); 242 static_cast<const ReadingBuffer*>(m_sharedBuffer.get());
202 const device::OneWriterSeqLock& seqlock = buffer->seqlock.value(); 243 const device::OneWriterSeqLock& seqlock = buffer->seqlock.value();
203 auto version = seqlock.ReadBegin(); 244 auto version = seqlock.ReadBegin();
204 auto readingData = buffer->reading; 245 auto readingData = buffer->reading;
205 if (seqlock.ReadRetry(version)) 246 if (seqlock.ReadRetry(version))
206 return false; 247 return false;
207 result = readingData; 248 result = readingData;
208 return true; 249 return true;
209 } 250 }
210 251
211 } // namespace blink 252 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698