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) { |