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 d5f7e3a72555834d45f4ecf7f755a7fe0a82e017..e4d1642a2170010bf5d15e9932af46b7d5f8c502 100644 |
--- a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp |
+++ b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp |
@@ -6,16 +6,43 @@ |
#include "core/dom/Document.h" |
#include "core/frame/LocalFrame.h" |
+#include "modules/permissions/PermissionUtils.h" |
#include "modules/sensor/SensorProviderProxy.h" |
#include "modules/sensor/SensorReadingUpdater.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; |
+ |
+namespace { |
+PermissionName GetPermissionType(SensorType type) { |
+ PermissionName permission_name = PermissionName::SENSORS; |
+ |
+ if (type == SensorType::AMBIENT_LIGHT) |
+ permission_name = PermissionName::AMBIENT_LIGHT_SENSOR; |
+ else if (type == SensorType::ACCELEROMETER) |
+ permission_name = PermissionName::ACCELEROMETER; |
+ else if (type == SensorType::GYROSCOPE) |
+ permission_name = PermissionName::GYROSCOPE; |
+ else if (type == SensorType::MAGNETOMETER) |
+ permission_name = PermissionName::MAGNETOMETER; |
+ else if (type == SensorType::ABSOLUTE_ORIENTATION) |
+ permission_name = PermissionName::ORIENTATION_SENSOR; |
+ |
+ return permission_name; |
+} |
+} |
+ |
SensorProxy::SensorProxy(SensorType sensor_type, |
+ RefPtr<SecurityOrigin> origin, |
SensorProviderProxy* provider, |
Page* page) |
: PageVisibilityObserver(page), |
@@ -24,7 +51,46 @@ SensorProxy::SensorProxy(SensorType sensor_type, |
provider_(provider), |
client_binding_(this), |
state_(SensorProxy::kUninitialized), |
- suspended_(false) {} |
+ suspended_(false), |
+ security_origin_(std::move(origin)), |
+ binding_(this), |
+ permission_subscribed_(false) {} |
+ |
+void SensorProxy::OnPermissionStatusChange(PermissionStatus status) { |
+ if (state_ == kUninitialized) |
+ return; |
+ |
+ // PermissionName permission_name = GetPermissionType(type_); |
+ |
+ switch (status) { |
+ case mojom::blink::PermissionStatus::DENIED: |
+ HandleSensorError(); |
+ // HandleSensorError(NotAllowedError, "Permission denied."); |
+ return; |
+ case mojom::blink::PermissionStatus::ASK: |
+ HandleSensorError(); |
+ // HandleSensorError(NotAllowedError, "Permission revoked."); |
+ return; |
+ case mojom::blink::PermissionStatus::GRANTED: |
+ if (IsInitializing()) { |
+ if (!permission_subscribed_) { |
+ DCHECK(!binding_.is_bound()); |
+ mojom::blink::PermissionObserverPtr observer; |
+ binding_.Bind(mojo::MakeRequest(&observer)); |
+ provider_->permission_service_->AddPermissionObserver( |
+ CreatePermissionDescriptor(PermissionName::SENSORS), |
+ security_origin_, status, std::move(observer)); |
+ permission_subscribed_ = true; |
+ } |
+ state_ = kInitialized; |
+ for (Observer* observer : observers_) |
+ observer->OnSensorInitialized(); |
+ } |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+} |
SensorProxy::~SensorProxy() {} |
@@ -230,10 +296,16 @@ void SensorProxy::OnSensorCreated(SensorInitParamsPtr params, |
reading_updater_ = SensorReadingUpdater::Create(this, mode_); |
- state_ = kInitialized; |
- |
for (Observer* observer : observers_) |
observer->OnSensorInitialized(); |
+ |
+ // PermissionName permission_name = GetPermissionType(type_); |
+ |
+ provider_->permission_service_->RequestPermission( |
+ CreatePermissionDescriptor(PermissionName::SENSORS), security_origin_, |
+ UserGestureIndicator::ProcessingUserGesture(), |
+ ConvertToBaseCallback(WTF::Bind(&SensorProxy::OnPermissionStatusChange, |
+ WrapWeakPersistent(this)))); |
} |
void SensorProxy::OnAddConfigurationCompleted( |