Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(802)

Unified Diff: third_party/WebKit/Source/modules/sensor/Sensor.cpp

Issue 2458453002: [sensors] Add Permission guard to the generic sensor apis.
Patch Set: Move permissions stuff to SensorProxy, remove aw related stuff Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/sensor/Sensor.cpp
diff --git a/third_party/WebKit/Source/modules/sensor/Sensor.cpp b/third_party/WebKit/Source/modules/sensor/Sensor.cpp
index ca613f9e1e8670fb65e75c1ba499ec3b0a9a2004..81baf6b5eddabd5ed6c96a4a80fc9d29c45c4706 100644
--- a/third_party/WebKit/Source/modules/sensor/Sensor.cpp
+++ b/third_party/WebKit/Source/modules/sensor/Sensor.cpp
@@ -14,11 +14,14 @@
#include "modules/sensor/SensorProviderProxy.h"
#include "modules/sensor/SensorReading.h"
#include "modules/sensor/SensorReadingEvent.h"
+#include "platform/UserGestureIndicator.h"
using namespace device::mojom::blink;
namespace blink {
+using mojom::blink::PermissionStatus;
+
Sensor::Sensor(ScriptState* scriptState,
const SensorOptions& sensorOptions,
ExceptionState& exceptionState,
@@ -82,10 +85,39 @@ void Sensor::start(ScriptState* scriptState, ExceptionState& exceptionState) {
return;
}
- startListening();
+ // If the algorithm is not allowed to show a popup, throw SecurityError.
+ if (!UserGestureIndicator::consumeUserGesture()) {
Mikhail 2016/11/07 08:02:02 must be moved to the beginning.
riju_ 2016/11/09 10:30:34 Done.
+ exceptionState.throwDOMException(
+ SecurityError,
+ "Must be handling a user gesture to show a permission request.");
+ return;
+ }
+
+ // Check the permission status first.
+ auto permissionStatus = m_sensorProxy->getPermissionStatus();
+
+ if (permissionStatus == PermissionStatus::ASK) {
+ m_sensorProxy->requestPermission(scriptState->getExecutionContext(),
Mikhail 2016/11/07 08:02:02 return here?
riju_ 2016/11/09 10:30:34 Done.
+ permissionStatus);
+ } else if (permissionStatus == PermissionStatus::DENIED) {
+ stopListening();
+
+ ConsoleMessage* consoleMessage = ConsoleMessage::create(
+ JSMessageSource, InfoMessageLevel, "Permission Rejected.");
+ scriptState->getExecutionContext()->addConsoleMessage(consoleMessage);
+
+ reportError(PermissionDeniedError,
+ "start() call has failed as permission was denied.");
+ } else {
+ startListening();
+ }
+
+ // Keep listening to changes.
+ m_sensorProxy->getNextPermissionChange(scriptState->getExecutionContext(),
shalamov 2016/11/04 19:00:20 This can be moved after HasPermission is completed
riju_ 2016/11/09 10:30:34 Done.
+ permissionStatus);
}
-void Sensor::stop(ScriptState*, ExceptionState& exceptionState) {
+void Sensor::stop(ScriptState* scriptState, ExceptionState& exceptionState) {
if (m_state == Sensor::SensorState::IDLE ||
m_state == Sensor::SensorState::ERRORED) {
exceptionState.throwDOMException(
@@ -95,6 +127,22 @@ void Sensor::stop(ScriptState*, ExceptionState& exceptionState) {
}
stopListening();
+
+ // Check the permission status first.
+ auto permissionStatus = m_sensorProxy->getPermissionStatus();
shalamov 2016/11/04 19:00:20 Is this required for stop()? Should we create issu
riju_ 2016/11/09 10:30:34 Will remove. https://github.com/w3c/sensors/issues
+
+ if (permissionStatus != PermissionStatus::GRANTED) {
Mikhail 2016/11/07 08:02:02 is it possible that we had permissions to start bu
riju_ 2016/11/09 10:30:34 My mistake, now spec says we don't need permission
+ ConsoleMessage* consoleMessage = ConsoleMessage::create(
+ JSMessageSource, InfoMessageLevel, "Permission Rejected.");
+ scriptState->getExecutionContext()->addConsoleMessage(consoleMessage);
+
+ reportError(PermissionDeniedError,
+ "stop() call has failed as permission was not granted.");
+ }
+
+ // Keep listening to changes.
+ m_sensorProxy->getNextPermissionChange(scriptState->getExecutionContext(),
Mikhail 2016/11/07 08:02:02 this class already has 'getExecutionContext()'
riju_ 2016/11/09 10:30:34 Moving this to the onPermissionUpdate callback, as
+ permissionStatus);
}
static String ToString(Sensor::SensorState state) {
@@ -146,14 +194,15 @@ void Sensor::initSensorProxyIfNeeded() {
if (!document || !document->frame())
return;
- m_sensorProxy =
- SensorProviderProxy::from(document->frame())->getOrCreateSensor(m_type);
+ m_sensorProxy = SensorProviderProxy::from(document->frame())
+ ->getOrCreateSensor(m_type, getExecutionContext());
}
void Sensor::contextDestroyed() {
if (m_state == Sensor::SensorState::ACTIVE ||
m_state == Sensor::SensorState::ACTIVATING)
stopListening();
+ m_sensorProxy->resetPermissionService();
}
void Sensor::onSensorInitialized() {
@@ -168,6 +217,17 @@ void Sensor::onSensorReadingChanged() {
m_polling->onSensorReadingChanged();
}
+void Sensor::onSensorPermissionChanged() {
+ // Check the permission status first.
+ auto permissionStatus = m_sensorProxy->getPermissionStatus();
+
+ if (permissionStatus != PermissionStatus::GRANTED) {
+ stopListening();
+ reportError(PermissionDeniedError,
+ "start/stop() call has failed as permission was denied.");
+ }
Mikhail 2016/11/07 08:02:02 what if permissions are granted? we probably shoul
riju_ 2016/11/09 10:30:34 Yes, provided a start() was waiting for permission
+}
+
void Sensor::onSensorError(ExceptionCode code,
const String& sanitizedMessage,
const String& unsanitizedMessage) {

Powered by Google App Engine
This is Rietveld 408576698