Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/sensor/Sensor.h" | 5 #include "modules/sensor/Sensor.h" |
| 6 | 6 |
| 7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
| 8 #include "core/dom/ExceptionCode.h" | 8 #include "core/dom/ExceptionCode.h" |
| 9 #include "core/dom/ExecutionContextTask.h" | 9 #include "core/dom/ExecutionContextTask.h" |
| 10 #include "core/inspector/ConsoleMessage.h" | 10 #include "core/inspector/ConsoleMessage.h" |
| 11 #include "device/generic_sensor/public/interfaces/sensor.mojom-blink.h" | 11 #include "device/generic_sensor/public/interfaces/sensor.mojom-blink.h" |
| 12 #include "modules/sensor/SensorErrorEvent.h" | 12 #include "modules/sensor/SensorErrorEvent.h" |
| 13 #include "modules/sensor/SensorPollingStrategy.h" | 13 #include "modules/sensor/SensorPollingStrategy.h" |
| 14 #include "modules/sensor/SensorProviderProxy.h" | 14 #include "modules/sensor/SensorProviderProxy.h" |
| 15 #include "modules/sensor/SensorReading.h" | 15 #include "modules/sensor/SensorReading.h" |
| 16 #include "platform/UserGestureIndicator.h" | |
| 16 | 17 |
| 17 using namespace device::mojom::blink; | 18 using namespace device::mojom::blink; |
| 18 | 19 |
| 19 namespace blink { | 20 namespace blink { |
| 20 | 21 |
| 22 using mojom::blink::PermissionStatus; | |
| 23 | |
| 21 Sensor::Sensor(ScriptState* scriptState, | 24 Sensor::Sensor(ScriptState* scriptState, |
| 22 const SensorOptions& sensorOptions, | 25 const SensorOptions& sensorOptions, |
| 23 ExceptionState& exceptionState, | 26 ExceptionState& exceptionState, |
| 24 SensorType type) | 27 SensorType type) |
| 25 : ActiveScriptWrappable(this), | 28 : ActiveScriptWrappable(this), |
| 26 ContextLifecycleObserver(scriptState->getExecutionContext()), | 29 ContextLifecycleObserver(scriptState->getExecutionContext()), |
| 27 PageVisibilityObserver( | 30 PageVisibilityObserver( |
| 28 toDocument(scriptState->getExecutionContext())->page()), | 31 toDocument(scriptState->getExecutionContext())->page()), |
| 29 m_sensorOptions(sensorOptions), | 32 m_sensorOptions(sensorOptions), |
| 30 m_type(type), | 33 m_type(type), |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 | 68 |
| 66 void Sensor::start(ScriptState* scriptState, ExceptionState& exceptionState) { | 69 void Sensor::start(ScriptState* scriptState, ExceptionState& exceptionState) { |
| 67 if (m_state != Sensor::SensorState::IDLE && | 70 if (m_state != Sensor::SensorState::IDLE && |
| 68 m_state != Sensor::SensorState::ERRORED) { | 71 m_state != Sensor::SensorState::ERRORED) { |
| 69 exceptionState.throwDOMException( | 72 exceptionState.throwDOMException( |
| 70 InvalidStateError, | 73 InvalidStateError, |
| 71 "Cannot start because SensorState is not idle or errored"); | 74 "Cannot start because SensorState is not idle or errored"); |
| 72 return; | 75 return; |
| 73 } | 76 } |
| 74 | 77 |
| 78 // If the algorithm is not allowed to show a popup, throw SecurityError. | |
| 79 if (!UserGestureIndicator::consumeUserGesture()) { | |
| 80 exceptionState.throwDOMException( | |
| 81 SecurityError, | |
| 82 "Must be handling a user gesture to show a permission request."); | |
| 83 return; | |
| 84 } | |
| 85 | |
| 75 initSensorProxyIfNeeded(); | 86 initSensorProxyIfNeeded(); |
| 76 | |
| 77 if (!m_sensorProxy) { | 87 if (!m_sensorProxy) { |
| 78 exceptionState.throwDOMException( | 88 exceptionState.throwDOMException( |
| 79 InvalidStateError, "The Sensor is no longer associated to a frame."); | 89 InvalidStateError, "The Sensor is no longer associated to a frame."); |
| 80 return; | 90 return; |
| 81 } | 91 } |
| 82 | 92 |
| 83 startListening(); | 93 m_sensorProxy->addObserver(this); |
| 94 if (!m_sensorProxy->isInitialized()) { | |
| 95 m_sensorProxy->initialize(); | |
| 96 return; | |
| 97 } | |
| 98 | |
| 99 // Check the permission status. | |
| 100 auto permissionStatus = m_sensorProxy->getPermissionStatus(); | |
| 101 | |
| 102 if (permissionStatus == PermissionStatus::ASK) { | |
| 103 m_sensorProxy->setStartPendingPermission(true); | |
| 104 m_sensorProxy->requestPermission(scriptState->getExecutionContext(), | |
| 105 permissionStatus); | |
| 106 return; | |
| 107 } | |
| 108 if (permissionStatus == PermissionStatus::GRANTED) { | |
| 109 startListening(); | |
| 110 } else if (permissionStatus == PermissionStatus::DENIED) { | |
| 111 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.
| |
| 112 | |
| 113 ConsoleMessage* consoleMessage = ConsoleMessage::create( | |
| 114 JSMessageSource, InfoMessageLevel, "Permission Denied."); | |
| 115 scriptState->getExecutionContext()->addConsoleMessage(consoleMessage); | |
| 116 | |
| 117 exceptionState.throwDOMException(NotAllowedError, "Permission Denied."); | |
| 118 } | |
| 84 } | 119 } |
| 85 | 120 |
| 86 void Sensor::stop(ScriptState*, ExceptionState& exceptionState) { | 121 void Sensor::stop(ScriptState*, ExceptionState& exceptionState) { |
| 87 if (m_state == Sensor::SensorState::IDLE || | 122 if (m_state == Sensor::SensorState::IDLE || |
| 88 m_state == Sensor::SensorState::ERRORED) { | 123 m_state == Sensor::SensorState::ERRORED) { |
| 89 exceptionState.throwDOMException( | 124 exceptionState.throwDOMException( |
| 90 InvalidStateError, | 125 InvalidStateError, |
| 91 "Cannot stop because SensorState is either idle or errored"); | 126 "Cannot stop because SensorState is either idle or errored"); |
| 92 return; | 127 return; |
| 93 } | 128 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 143 return; | 178 return; |
| 144 | 179 |
| 145 Document* document = toDocument(getExecutionContext()); | 180 Document* document = toDocument(getExecutionContext()); |
| 146 if (!document || !document->frame()) | 181 if (!document || !document->frame()) |
| 147 return; | 182 return; |
| 148 | 183 |
| 149 auto provider = SensorProviderProxy::from(document->frame()); | 184 auto provider = SensorProviderProxy::from(document->frame()); |
| 150 m_sensorProxy = provider->getSensor(m_type); | 185 m_sensorProxy = provider->getSensor(m_type); |
| 151 | 186 |
| 152 if (!m_sensorProxy) { | 187 if (!m_sensorProxy) { |
| 153 m_sensorProxy = | 188 m_sensorProxy = provider->createSensor(m_type, getExecutionContext(), |
| 154 provider->createSensor(m_type, createSensorReadingFactory()); | 189 createSensorReadingFactory()); |
| 155 } | 190 } |
| 156 } | 191 } |
| 157 | 192 |
| 158 void Sensor::contextDestroyed() { | 193 void Sensor::contextDestroyed() { |
| 159 if (m_state == Sensor::SensorState::ACTIVE || | 194 if (m_state == Sensor::SensorState::ACTIVE || |
| 160 m_state == Sensor::SensorState::ACTIVATING) | 195 m_state == Sensor::SensorState::ACTIVATING) |
| 161 stopListening(); | 196 stopListening(); |
| 197 m_sensorProxy->resetPermissionService(); | |
|
Mikhail
2016/11/10 09:30:48
should be handled by proxy itself
riju_
2016/11/14 14:00:06
Done.
| |
| 162 } | 198 } |
| 163 | 199 |
| 164 void Sensor::onSensorInitialized() { | 200 void Sensor::onSensorInitialized() { |
| 165 if (m_state != Sensor::SensorState::ACTIVATING) | 201 if (m_state != Sensor::SensorState::ACTIVATING) |
| 166 return; | 202 return; |
| 167 | 203 |
| 168 startListening(); | 204 startListening(); |
| 169 } | 205 } |
| 170 | 206 |
| 171 void Sensor::onSensorReadingChanged() { | 207 void Sensor::onSensorReadingChanged() { |
| 172 if (m_polling) | 208 if (m_polling) |
| 173 m_polling->onSensorReadingChanged(); | 209 m_polling->onSensorReadingChanged(); |
| 174 } | 210 } |
| 175 | 211 |
| 212 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.
| |
| 213 // Check the permission status. | |
| 214 auto permissionStatus = m_sensorProxy->getPermissionStatus(); | |
| 215 | |
| 216 if (permissionStatus != PermissionStatus::GRANTED) { | |
| 217 stopListening(); | |
| 218 reportError(NotAllowedError, | |
| 219 "start/stop() call has failed as permission was denied."); | |
| 220 } else { | |
| 221 if (m_sensorProxy->getStartPendingPermission()) { | |
| 222 startListening(); | |
| 223 m_sensorProxy->setStartPendingPermission(false); | |
| 224 } | |
| 225 } | |
| 226 } | |
| 227 | |
| 176 void Sensor::onSensorError(ExceptionCode code, | 228 void Sensor::onSensorError(ExceptionCode code, |
| 177 const String& sanitizedMessage, | 229 const String& sanitizedMessage, |
| 178 const String& unsanitizedMessage) { | 230 const String& unsanitizedMessage) { |
| 179 reportError(code, sanitizedMessage, unsanitizedMessage); | 231 reportError(code, sanitizedMessage, unsanitizedMessage); |
| 180 } | 232 } |
| 181 | 233 |
| 182 void Sensor::onStartRequestCompleted(bool result) { | 234 void Sensor::onStartRequestCompleted(bool result) { |
| 183 if (m_state != Sensor::SensorState::ACTIVATING) | 235 if (m_state != Sensor::SensorState::ACTIVATING) |
| 184 return; | 236 return; |
| 185 | 237 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 m_sensorProxy->suspend(); | 273 m_sensorProxy->suspend(); |
| 222 } else { | 274 } else { |
| 223 m_sensorProxy->resume(); | 275 m_sensorProxy->resume(); |
| 224 } | 276 } |
| 225 } | 277 } |
| 226 | 278 |
| 227 void Sensor::startListening() { | 279 void Sensor::startListening() { |
| 228 DCHECK(m_sensorProxy); | 280 DCHECK(m_sensorProxy); |
| 229 updateState(Sensor::SensorState::ACTIVATING); | 281 updateState(Sensor::SensorState::ACTIVATING); |
| 230 | 282 |
| 231 m_sensorProxy->addObserver(this); | |
| 232 if (!m_sensorProxy->isInitialized()) { | |
| 233 m_sensorProxy->initialize(); | |
| 234 return; | |
| 235 } | |
| 236 | |
| 237 if (!m_configuration) { | 283 if (!m_configuration) { |
| 238 m_configuration = | 284 m_configuration = |
| 239 createSensorConfig(m_sensorOptions, *m_sensorProxy->defaultConfig()); | 285 createSensorConfig(m_sensorOptions, *m_sensorProxy->defaultConfig()); |
| 240 DCHECK(m_configuration); | 286 DCHECK(m_configuration); |
| 241 } | 287 } |
| 242 | 288 |
| 243 auto startCallback = | 289 auto startCallback = |
| 244 WTF::bind(&Sensor::onStartRequestCompleted, wrapWeakPersistent(this)); | 290 WTF::bind(&Sensor::onStartRequestCompleted, wrapWeakPersistent(this)); |
| 245 m_sensorProxy->addConfiguration(m_configuration->Clone(), | 291 m_sensorProxy->addConfiguration(m_configuration->Clone(), |
| 246 std::move(startCallback)); | 292 std::move(startCallback)); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 void Sensor::notifyStateChanged() { | 376 void Sensor::notifyStateChanged() { |
| 331 dispatchEvent(Event::create(EventTypeNames::statechange)); | 377 dispatchEvent(Event::create(EventTypeNames::statechange)); |
| 332 } | 378 } |
| 333 | 379 |
| 334 void Sensor::notifyError(DOMException* error) { | 380 void Sensor::notifyError(DOMException* error) { |
| 335 dispatchEvent( | 381 dispatchEvent( |
| 336 SensorErrorEvent::create(EventTypeNames::error, std::move(error))); | 382 SensorErrorEvent::create(EventTypeNames::error, std::move(error))); |
| 337 } | 383 } |
| 338 | 384 |
| 339 } // namespace blink | 385 } // namespace blink |
| OLD | NEW |