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

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: Handle Denied and Ask differently, add permissionService.reset() 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
48 switch (status) {
49 case mojom::blink::PermissionStatus::DENIED:
50 handleSensorError(NotAllowedError, "Permission denied.");
51 m_provider->resetPermissionService();
shalamov 2016/11/23 12:37:49 This will invalidate permission service in proxy,
riju_ 2016/11/29 07:19:47 Done.
52 return;
53 case mojom::blink::PermissionStatus::ASK:
54 handleSensorError(NotAllowedError, "Permission revoked.");
55 break;
56 case mojom::blink::PermissionStatus::GRANTED:
57 if (isInitializing()) {
58 m_state = Initialized;
59 for (Observer* observer : m_observers)
60 observer->onSensorInitialized();
61 }
62 break;
63 default:
64 NOTREACHED();
65 }
66
67 // Keep listening to changes.
68 m_permissionService->GetNextPermissionChange(
69 createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin,
70 m_permissionStatus,
71 convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate,
72 wrapWeakPersistent(this))));
73 }
28 74
29 SensorProxy::~SensorProxy() {} 75 SensorProxy::~SensorProxy() {}
30 76
31 void SensorProxy::dispose() { 77 void SensorProxy::dispose() {
32 m_clientBinding.Close(); 78 m_clientBinding.Close();
33 } 79 }
34 80
35 DEFINE_TRACE(SensorProxy) { 81 DEFINE_TRACE(SensorProxy) {
36 visitor->trace(m_reading); 82 visitor->trace(m_reading);
37 visitor->trace(m_observers); 83 visitor->trace(m_observers);
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 229
184 m_maximumFrequency = params->maximum_frequency; 230 m_maximumFrequency = params->maximum_frequency;
185 DCHECK(m_maximumFrequency <= SensorConfiguration::kMaxAllowedFrequency); 231 DCHECK(m_maximumFrequency <= SensorConfiguration::kMaxAllowedFrequency);
186 232
187 auto errorCallback = 233 auto errorCallback =
188 WTF::bind(&SensorProxy::handleSensorError, wrapWeakPersistent(this), 234 WTF::bind(&SensorProxy::handleSensorError, wrapWeakPersistent(this),
189 UnknownError, String("Internal error"), String()); 235 UnknownError, String("Internal error"), String());
190 m_sensor.set_connection_error_handler( 236 m_sensor.set_connection_error_handler(
191 convertToBaseCallback(std::move(errorCallback))); 237 convertToBaseCallback(std::move(errorCallback)));
192 238
193 m_state = Initialized; 239 // Request permission.
194 for (Observer* observer : m_observers) 240 m_permissionService->RequestPermission(
195 observer->onSensorInitialized(); 241 createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin,
242 UserGestureIndicator::processingUserGesture(),
243 convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate,
244 wrapWeakPersistent(this))));
196 } 245 }
197 246
198 bool SensorProxy::tryReadFromBuffer(device::SensorReading& result) { 247 bool SensorProxy::tryReadFromBuffer(device::SensorReading& result) {
199 DCHECK(isInitialized()); 248 DCHECK(isInitialized());
200 const ReadingBuffer* buffer = 249 const ReadingBuffer* buffer =
201 static_cast<const ReadingBuffer*>(m_sharedBuffer.get()); 250 static_cast<const ReadingBuffer*>(m_sharedBuffer.get());
202 const device::OneWriterSeqLock& seqlock = buffer->seqlock.value(); 251 const device::OneWriterSeqLock& seqlock = buffer->seqlock.value();
203 auto version = seqlock.ReadBegin(); 252 auto version = seqlock.ReadBegin();
204 auto readingData = buffer->reading; 253 auto readingData = buffer->reading;
205 if (seqlock.ReadRetry(version)) 254 if (seqlock.ReadRetry(version))
206 return false; 255 return false;
207 result = readingData; 256 result = readingData;
208 return true; 257 return true;
209 } 258 }
210 259
211 } // namespace blink 260 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698