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 add04b99327deacdb576b82b73261f851d955c05..c0e4a390620f10581a45ee9276639b38a74fa4c2 100644 |
--- a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp |
+++ b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp |
@@ -5,24 +5,99 @@ |
#include "modules/sensor/SensorProxy.h" |
#include "core/frame/LocalFrame.h" |
+#include "modules/permissions/PermissionUtils.h" |
#include "modules/sensor/SensorProviderProxy.h" |
+#include "platform/UserGestureIndicator.h" |
#include "platform/mojo/MojoHelper.h" |
#include "public/platform/Platform.h" |
+#include "wtf/RefPtr.h" |
using namespace device::mojom::blink; |
namespace blink { |
-SensorProxy::SensorProxy(SensorType sensorType, SensorProviderProxy* provider) |
+using mojom::blink::PermissionName; |
+using mojom::blink::PermissionService; |
+using mojom::blink::PermissionStatus; |
+ |
+SensorProxy::SensorProxy(SensorType sensorType, |
+ ExecutionContext* executionContext, |
+ SensorProviderProxy* provider) |
: m_type(sensorType), |
m_mode(ReportingMode::CONTINUOUS), |
m_provider(provider), |
m_clientBinding(this), |
m_state(SensorProxy::Uninitialized), |
m_reading(), |
- m_suspended(false) {} |
+ m_suspended(false), |
+ m_sensorPermission(PermissionStatus::ASK), |
+ m_executionContext(executionContext) { |
+ // Get permission service. |
shalamov
2016/11/04 19:00:20
Is this needed in constructor? Also, handleSersonE
riju_
2016/11/09 10:30:34
Moving to Initialize
|
+ PermissionService* permissionService = |
+ getPermissionService(m_executionContext); |
+ if (!permissionService) { |
+ handleSensorError( |
+ InvalidStateError, |
+ "In its current state, the global scope can't request permissions"); |
+ } |
+ |
+ // Check permissions. |
+ m_permissionService->HasPermission( |
+ createPermissionDescriptor(PermissionName::SENSORS), |
+ m_executionContext->getSecurityOrigin(), |
+ convertToBaseCallback( |
+ WTF::bind(&SensorProxy::onPermissionUpdate, wrapPersistent(this)))); |
+} |
+ |
+void SensorProxy::getNextPermissionChange(ExecutionContext* executionContext, |
+ PermissionStatus status) { |
+ m_permissionService->GetNextPermissionChange( |
+ createPermissionDescriptor(PermissionName::SENSORS), |
+ executionContext->getSecurityOrigin(), m_sensorPermission, |
+ convertToBaseCallback( |
+ WTF::bind(&SensorProxy::onPermissionUpdate, wrapPersistent(this)))); |
+} |
-SensorProxy::~SensorProxy() {} |
+void SensorProxy::requestPermission(ExecutionContext* executionContext, |
+ PermissionStatus status) { |
+ m_permissionService->RequestPermission( |
+ createPermissionDescriptor(PermissionName::SENSORS), |
+ m_executionContext->getSecurityOrigin(), |
+ UserGestureIndicator::processingUserGesture(), |
+ convertToBaseCallback( |
+ WTF::bind(&SensorProxy::onPermissionUpdate, wrapPersistent(this)))); |
+} |
+ |
+void SensorProxy::onPermissionUpdate(PermissionStatus status) { |
+ if (m_sensorPermission != status) { |
+ m_sensorPermission = status; |
+ SensorPermissionChanged(); |
+ } |
+} |
+ |
+SensorProxy::~SensorProxy() { |
+ m_permissionService.reset(); |
Mikhail
2016/11/07 08:02:02
isn't it automatically reset when destructed?
riju_
2016/11/09 10:30:34
Done.
|
+} |
+ |
+void SensorProxy::resetPermissionService() { |
+ m_permissionService.reset(); |
+} |
+ |
+PermissionService* SensorProxy::getPermissionService( |
+ ExecutionContext* executionContext) { |
+ if (!m_permissionService && |
+ connectToPermissionService(executionContext, |
+ mojo::GetProxy(&m_permissionService))) { |
+ m_permissionService.set_connection_error_handler(convertToBaseCallback( |
+ WTF::bind(&SensorProxy::permissionServiceConnectionError, |
+ wrapWeakPersistent(this)))); |
+ } |
+ return m_permissionService.get(); |
+} |
+ |
+void SensorProxy::permissionServiceConnectionError() { |
+ m_permissionService.reset(); |
+} |
void SensorProxy::dispose() { |
m_clientBinding.Close(); |
@@ -31,6 +106,7 @@ void SensorProxy::dispose() { |
DEFINE_TRACE(SensorProxy) { |
visitor->trace(m_observers); |
visitor->trace(m_provider); |
+ visitor->trace(m_executionContext); |
} |
void SensorProxy::addObserver(Observer* observer) { |
@@ -119,6 +195,11 @@ void SensorProxy::SensorReadingChanged() { |
observer->onSensorReadingChanged(); |
} |
+void SensorProxy::SensorPermissionChanged() { |
+ for (Observer* observer : m_observers) |
+ observer->onSensorPermissionChanged(); |
+} |
+ |
void SensorProxy::handleSensorError(ExceptionCode code, |
const String& sanitizedMessage, |
const String& unsanitizedMessage) { |
@@ -132,6 +213,7 @@ void SensorProxy::handleSensorError(ExceptionCode code, |
m_sharedBufferHandle.reset(); |
m_defaultConfig.reset(); |
m_clientBinding.Close(); |
+ m_permissionService.reset(); |
for (Observer* observer : m_observers) |
observer->onSensorError(code, sanitizedMessage, unsanitizedMessage); |
@@ -168,6 +250,10 @@ void SensorProxy::onSensorCreated(SensorInitParamsPtr params, |
return; |
} |
+ // Check permission now. |
+ if (m_sensorPermission == PermissionStatus::ASK) |
+ requestPermission(m_executionContext, m_sensorPermission); |
Mikhail
2016/11/04 13:05:59
here it's a bit late to check permission as sensor
riju_
2016/11/09 10:30:34
Done.
|
+ |
auto errorCallback = |
WTF::bind(&SensorProxy::handleSensorError, wrapWeakPersistent(this), |
UnknownError, String("Internal error"), String()); |