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 c9f902d42ad470d7f9d58be39494524c9fa69d63..845587369ec27ee0952d5d02ec0b7aa69fee1fd1 100644 |
--- a/third_party/WebKit/Source/modules/sensor/Sensor.cpp |
+++ b/third_party/WebKit/Source/modules/sensor/Sensor.cpp |
@@ -13,11 +13,14 @@ |
#include "modules/sensor/SensorPollingStrategy.h" |
#include "modules/sensor/SensorProviderProxy.h" |
#include "modules/sensor/SensorReading.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, |
@@ -72,15 +75,47 @@ void Sensor::start(ScriptState* scriptState, ExceptionState& exceptionState) { |
return; |
} |
- initSensorProxyIfNeeded(); |
+ // If the algorithm is not allowed to show a popup, throw SecurityError. |
+ if (!UserGestureIndicator::consumeUserGesture()) { |
+ exceptionState.throwDOMException( |
+ SecurityError, |
+ "Must be handling a user gesture to show a permission request."); |
+ return; |
+ } |
+ initSensorProxyIfNeeded(); |
if (!m_sensorProxy) { |
exceptionState.throwDOMException( |
InvalidStateError, "The Sensor is no longer associated to a frame."); |
return; |
} |
- startListening(); |
+ m_sensorProxy->addObserver(this); |
+ if (!m_sensorProxy->isInitialized()) { |
+ m_sensorProxy->initialize(); |
+ return; |
+ } |
+ |
+ // Check the permission status. |
+ auto permissionStatus = m_sensorProxy->getPermissionStatus(); |
+ |
+ if (permissionStatus == PermissionStatus::ASK) { |
+ m_sensorProxy->setStartPendingPermission(true); |
+ m_sensorProxy->requestPermission(scriptState->getExecutionContext(), |
+ permissionStatus); |
+ return; |
+ } |
+ if (permissionStatus == PermissionStatus::GRANTED) { |
+ startListening(); |
+ } else if (permissionStatus == PermissionStatus::DENIED) { |
+ stopListening(); |
Mikhail
2016/11/10 09:30:48
how can be sensor listening in 'idle' or 'errored'
riju_
2016/11/14 14:00:06
Done.
|
+ |
+ ConsoleMessage* consoleMessage = ConsoleMessage::create( |
+ JSMessageSource, InfoMessageLevel, "Permission Denied."); |
+ scriptState->getExecutionContext()->addConsoleMessage(consoleMessage); |
+ |
+ exceptionState.throwDOMException(NotAllowedError, "Permission Denied."); |
+ } |
} |
void Sensor::stop(ScriptState*, ExceptionState& exceptionState) { |
@@ -150,8 +185,8 @@ void Sensor::initSensorProxyIfNeeded() { |
m_sensorProxy = provider->getSensor(m_type); |
if (!m_sensorProxy) { |
- m_sensorProxy = |
- provider->createSensor(m_type, createSensorReadingFactory()); |
+ m_sensorProxy = provider->createSensor(m_type, getExecutionContext(), |
+ createSensorReadingFactory()); |
} |
} |
@@ -159,6 +194,7 @@ void Sensor::contextDestroyed() { |
if (m_state == Sensor::SensorState::ACTIVE || |
m_state == Sensor::SensorState::ACTIVATING) |
stopListening(); |
+ m_sensorProxy->resetPermissionService(); |
Mikhail
2016/11/10 09:30:48
should be handled by proxy itself
riju_
2016/11/14 14:00:06
Done.
|
} |
void Sensor::onSensorInitialized() { |
@@ -173,6 +209,22 @@ void Sensor::onSensorReadingChanged() { |
m_polling->onSensorReadingChanged(); |
} |
+void Sensor::onSensorPermissionChanged() { |
Mikhail
2016/11/10 09:30:48
all this logic should be inside proxy itself
riju_
2016/11/14 14:00:06
Done.
|
+ // Check the permission status. |
+ auto permissionStatus = m_sensorProxy->getPermissionStatus(); |
+ |
+ if (permissionStatus != PermissionStatus::GRANTED) { |
+ stopListening(); |
+ reportError(NotAllowedError, |
+ "start/stop() call has failed as permission was denied."); |
+ } else { |
+ if (m_sensorProxy->getStartPendingPermission()) { |
+ startListening(); |
+ m_sensorProxy->setStartPendingPermission(false); |
+ } |
+ } |
+} |
+ |
void Sensor::onSensorError(ExceptionCode code, |
const String& sanitizedMessage, |
const String& unsanitizedMessage) { |
@@ -228,12 +280,6 @@ void Sensor::startListening() { |
DCHECK(m_sensorProxy); |
updateState(Sensor::SensorState::ACTIVATING); |
- m_sensorProxy->addObserver(this); |
- if (!m_sensorProxy->isInitialized()) { |
- m_sensorProxy->initialize(); |
- return; |
- } |
- |
if (!m_configuration) { |
m_configuration = |
createSensorConfig(m_sensorOptions, *m_sensorProxy->defaultConfig()); |