Chromium Code Reviews| 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..8afd25665ce945712f75ed3e15b5dc70d832af8b 100644 | 
| --- a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp | 
| +++ b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp | 
| @@ -5,16 +5,25 @@ | 
| #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" | 
| 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, | 
| + RefPtr<SecurityOrigin> origin, | 
| SensorProviderProxy* provider, | 
| std::unique_ptr<SensorReadingFactory> readingFactory) | 
| : m_type(sensorType), | 
| @@ -24,7 +33,44 @@ 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)) {} | 
| + | 
| +void SensorProxy::onPermissionUpdate(PermissionStatus status) { | 
| + if (m_state == Uninitialized) | 
| + return; | 
| + | 
| + if (m_permissionStatus != status) | 
| + m_permissionStatus = status; | 
| + | 
| + switch (status) { | 
| + case mojom::blink::PermissionStatus::DENIED: | 
| + handleSensorError(NotAllowedError, "Permission denied."); | 
| + 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.
 
 | 
| + return; | 
| + case mojom::blink::PermissionStatus::ASK: | 
| + handleSensorError(NotAllowedError, "Permission revoked."); | 
| + break; | 
| + case mojom::blink::PermissionStatus::GRANTED: | 
| + if (isInitializing()) { | 
| + m_state = Initialized; | 
| + for (Observer* observer : m_observers) | 
| + observer->onSensorInitialized(); | 
| + } | 
| + break; | 
| + default: | 
| + NOTREACHED(); | 
| + } | 
| + | 
| + // Keep listening to changes. | 
| + m_permissionService->GetNextPermissionChange( | 
| + createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin, | 
| + m_permissionStatus, | 
| + convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate, | 
| + wrapWeakPersistent(this)))); | 
| +} | 
| SensorProxy::~SensorProxy() {} | 
| @@ -190,9 +236,12 @@ void SensorProxy::onSensorCreated(SensorInitParamsPtr params, | 
| m_sensor.set_connection_error_handler( | 
| convertToBaseCallback(std::move(errorCallback))); | 
| - m_state = Initialized; | 
| - for (Observer* observer : m_observers) | 
| - observer->onSensorInitialized(); | 
| + // Request permission. | 
| + m_permissionService->RequestPermission( | 
| + createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin, | 
| + UserGestureIndicator::processingUserGesture(), | 
| + convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate, | 
| + wrapWeakPersistent(this)))); | 
| } | 
| bool SensorProxy::tryReadFromBuffer(device::SensorReading& result) { |