 Chromium Code Reviews
 Chromium Code Reviews Issue 2458453002:
   [sensors] Add Permission guard to the generic sensor apis.
    
  
    Issue 2458453002:
   [sensors] Add Permission guard to the generic sensor apis. 
  | Index: third_party/WebKit/Source/modules/sensor/SensorProxy.cpp | 
| diff --git a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp | 
| index e3b01f30c0d560100a8eb40e5720b98fa23a2870..b67d4336a591e9fd198988095b98b2d8838d80c4 100644 | 
| --- a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp | 
| +++ b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp | 
| @@ -5,16 +5,26 @@ | 
| #include "modules/sensor/SensorProxy.h" | 
| #include "core/frame/LocalFrame.h" | 
| +#include "modules/permissions/PermissionUtils.h" | 
| #include "modules/sensor/SensorProviderProxy.h" | 
| #include "modules/sensor/SensorReading.h" | 
| +#include "platform/UserGestureIndicator.h" | 
| #include "platform/mojo/MojoHelper.h" | 
| +#include "platform/weborigin/SecurityOrigin.h" | 
| #include "public/platform/Platform.h" | 
| +#include "wtf/RefPtr.h" | 
| using namespace device::mojom::blink; | 
| namespace blink { | 
| +using mojom::blink::PermissionName; | 
| +using mojom::blink::PermissionService; | 
| +using mojom::blink::PermissionStatus; | 
| + | 
| SensorProxy::SensorProxy(SensorType sensorType, | 
| + PermissionService* permissionService, | 
| + PassRefPtr<SecurityOrigin> origin, | 
| SensorProviderProxy* provider, | 
| std::unique_ptr<SensorReadingFactory> readingFactory) | 
| : m_type(sensorType), | 
| @@ -24,7 +34,24 @@ SensorProxy::SensorProxy(SensorType sensorType, | 
| m_state(SensorProxy::Uninitialized), | 
| m_suspended(false), | 
| m_readingFactory(std::move(readingFactory)), | 
| - m_maximumFrequency(0.0) {} | 
| + m_maximumFrequency(0.0), | 
| + m_permissionStatus(PermissionStatus::ASK), | 
| + m_permissionService(permissionService), | 
| + m_securityOrigin(std::move(origin)) {} | 
| 
Mikhail
2016/11/15 14:03:18
no need to move PassRefPtr, I think PassRefPtr its
 
riju_
2016/11/16 12:38:25
Done.
 | 
| + | 
| +void SensorProxy::onPermissionUpdate(PermissionStatus status) { | 
| + if (m_permissionStatus != status) { | 
| + m_permissionStatus = status; | 
| + SensorPermissionChanged(); | 
| + } | 
| + | 
| + // Keep listening to changes. | 
| + m_permissionService->GetNextPermissionChange( | 
| + createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin, | 
| + m_permissionStatus, | 
| + convertToBaseCallback( | 
| + WTF::bind(&SensorProxy::onPermissionUpdate, wrapPersistent(this)))); | 
| +} | 
| SensorProxy::~SensorProxy() {} | 
| @@ -56,11 +83,14 @@ void SensorProxy::initialize() { | 
| return; | 
| } | 
| - m_state = Initializing; | 
| - auto callback = convertToBaseCallback( | 
| - WTF::bind(&SensorProxy::onSensorCreated, wrapWeakPersistent(this))); | 
| - m_provider->sensorProvider()->GetSensor(m_type, mojo::GetProxy(&m_sensor), | 
| - callback); | 
| + // Request permission. | 
| + if (m_permissionStatus == PermissionStatus::ASK) { | 
| 
Mikhail
2016/11/15 14:03:18
what if (m_permissionStatus != PermissionStatus::A
 
riju_
2016/11/16 12:38:25
Done.
 | 
| + m_permissionService->RequestPermission( | 
| 
shalamov
2016/11/14 14:40:06
Can be garbage, if invalidated.
 
riju_
2016/11/16 12:38:25
Acknowledged.
 | 
| + createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin, | 
| + UserGestureIndicator::processingUserGesture(), | 
| + convertToBaseCallback( | 
| + WTF::bind(&SensorProxy::onPermissionUpdate, wrapPersistent(this)))); | 
| + } | 
| } | 
| void SensorProxy::addConfiguration( | 
| @@ -128,6 +158,19 @@ void SensorProxy::SensorReadingChanged() { | 
| observer->onSensorReadingChanged(); | 
| } | 
| +void SensorProxy::SensorPermissionChanged() { | 
| + // If Permission is revoked throw error and reset connection. | 
| + if (m_permissionStatus != PermissionStatus::GRANTED) { | 
| + m_provider->onPermissionServiceConnectionError(); | 
| 
shalamov
2016/11/14 14:40:06
This will invalidate permission proxy when permiss
 
Mikhail
2016/11/15 14:03:18
we should prepare implementation for more granular
 
riju_
2016/11/16 12:38:25
Acknowledged.
 
riju_
2016/11/16 12:38:25
My bad, handleSensorError() is called now
 | 
| + } else { | 
| + m_state = Initializing; | 
| 
shalamov
2016/11/14 14:40:07
Can there be a case when we get "GRANTED" and prox
 
Mikhail
2016/11/15 14:03:18
we should not assign m_state here. What if SensorP
 
riju_
2016/11/16 12:38:26
Added a check now, so that we don't call GetProxy
 | 
| + auto callback = convertToBaseCallback( | 
| + WTF::bind(&SensorProxy::onSensorCreated, wrapWeakPersistent(this))); | 
| + m_provider->sensorProvider()->GetSensor(m_type, mojo::GetProxy(&m_sensor), | 
| + callback); | 
| + } | 
| +} | 
| + | 
| void SensorProxy::handleSensorError(ExceptionCode code, | 
| String sanitizedMessage, | 
| String unsanitizedMessage) { |