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..7620fd4400d47b3367f76bfdc92ca5f486327e86 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,32 @@ 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; |
| + if (isInitializing()) |
|
Mikhail
2016/11/21 14:29:41
what if this came after permission has already bee
|
| + initialize(); |
| + } |
| + |
| + // If permission is revoked, throw error. |
| + if (isInitialized() && m_permissionStatus != PermissionStatus::GRANTED) |
| + handleSensorError(NotAllowedError, "Permission not granted."); |
| + |
| + // Keep listening to changes. |
| + m_permissionService->GetNextPermissionChange( |
| + createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin, |
| + m_permissionStatus, |
| + convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate, |
| + wrapWeakPersistent(this)))); |
| +} |
| SensorProxy::~SensorProxy() {} |
| @@ -48,7 +82,7 @@ void SensorProxy::removeObserver(Observer* observer) { |
| } |
| void SensorProxy::initialize() { |
| - if (m_state != Uninitialized) |
| + if (m_state == Initialized) |
| return; |
| if (!m_provider->sensorProvider()) { |
| @@ -57,10 +91,28 @@ void SensorProxy::initialize() { |
| } |
| m_state = Initializing; |
| - auto callback = convertToBaseCallback( |
| - WTF::bind(&SensorProxy::onSensorCreated, wrapWeakPersistent(this))); |
| - m_provider->sensorProvider()->GetSensor(m_type, mojo::GetProxy(&m_sensor), |
| - callback); |
| + |
| + switch (m_permissionStatus) { |
| + case PermissionStatus::ASK: |
| + // Request permission. |
| + m_permissionService->RequestPermission( |
| + createPermissionDescriptor(PermissionName::SENSORS), m_securityOrigin, |
| + UserGestureIndicator::processingUserGesture(), |
| + convertToBaseCallback(WTF::bind(&SensorProxy::onPermissionUpdate, |
| + wrapWeakPersistent(this)))); |
| + break; |
| + case PermissionStatus::DENIED: |
| + 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.
|
| + break; |
| + case PermissionStatus::GRANTED: |
| + m_provider->sensorProvider()->GetSensor( |
| + m_type, mojo::GetProxy(&m_sensor), |
| + convertToBaseCallback(WTF::bind(&SensorProxy::onSensorCreated, |
| + wrapWeakPersistent(this)))); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + } |
| } |
| void SensorProxy::addConfiguration( |