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

Side by Side 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 unified diff | Download patch
OLDNEW
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 "modules/sensor/SensorReadingEvent.h" 16 #include "modules/sensor/SensorReadingEvent.h"
17 #include "platform/UserGestureIndicator.h"
17 18
18 using namespace device::mojom::blink; 19 using namespace device::mojom::blink;
19 20
20 namespace blink { 21 namespace blink {
21 22
23 using mojom::blink::PermissionStatus;
24
22 Sensor::Sensor(ScriptState* scriptState, 25 Sensor::Sensor(ScriptState* scriptState,
23 const SensorOptions& sensorOptions, 26 const SensorOptions& sensorOptions,
24 ExceptionState& exceptionState, 27 ExceptionState& exceptionState,
25 SensorType type) 28 SensorType type)
26 : ActiveScriptWrappable(this), 29 : ActiveScriptWrappable(this),
27 ContextLifecycleObserver(scriptState->getExecutionContext()), 30 ContextLifecycleObserver(scriptState->getExecutionContext()),
28 PageVisibilityObserver( 31 PageVisibilityObserver(
29 toDocument(scriptState->getExecutionContext())->page()), 32 toDocument(scriptState->getExecutionContext())->page()),
30 m_sensorOptions(sensorOptions), 33 m_sensorOptions(sensorOptions),
31 m_type(type), 34 m_type(type),
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 70
68 void Sensor::start(ScriptState* scriptState, ExceptionState& exceptionState) { 71 void Sensor::start(ScriptState* scriptState, ExceptionState& exceptionState) {
69 if (m_state != Sensor::SensorState::IDLE && 72 if (m_state != Sensor::SensorState::IDLE &&
70 m_state != Sensor::SensorState::ERRORED) { 73 m_state != Sensor::SensorState::ERRORED) {
71 exceptionState.throwDOMException( 74 exceptionState.throwDOMException(
72 InvalidStateError, 75 InvalidStateError,
73 "Cannot start because SensorState is not idle or errored"); 76 "Cannot start because SensorState is not idle or errored");
74 return; 77 return;
75 } 78 }
76 79
77 initSensorProxyIfNeeded(); 80 initSensorProxyIfNeeded();
shalamov 2016/11/04 19:00:20 This will request sensor from SensorProvider and i
riju_ 2016/11/09 10:30:34 If there is no proxy, we can't call proxy->somePer
78 81
79 if (!m_sensorProxy) { 82 if (!m_sensorProxy) {
80 exceptionState.throwDOMException( 83 exceptionState.throwDOMException(
81 InvalidStateError, "The Sensor is no longer associated to a frame."); 84 InvalidStateError, "The Sensor is no longer associated to a frame.");
82 return; 85 return;
83 } 86 }
84 87
85 startListening(); 88 // If the algorithm is not allowed to show a popup, throw SecurityError.
89 if (!UserGestureIndicator::consumeUserGesture()) {
Mikhail 2016/11/07 08:02:02 must be moved to the beginning.
riju_ 2016/11/09 10:30:34 Done.
90 exceptionState.throwDOMException(
91 SecurityError,
92 "Must be handling a user gesture to show a permission request.");
93 return;
94 }
95
96 // Check the permission status first.
97 auto permissionStatus = m_sensorProxy->getPermissionStatus();
98
99 if (permissionStatus == PermissionStatus::ASK) {
100 m_sensorProxy->requestPermission(scriptState->getExecutionContext(),
Mikhail 2016/11/07 08:02:02 return here?
riju_ 2016/11/09 10:30:34 Done.
101 permissionStatus);
102 } else if (permissionStatus == PermissionStatus::DENIED) {
103 stopListening();
104
105 ConsoleMessage* consoleMessage = ConsoleMessage::create(
106 JSMessageSource, InfoMessageLevel, "Permission Rejected.");
107 scriptState->getExecutionContext()->addConsoleMessage(consoleMessage);
108
109 reportError(PermissionDeniedError,
110 "start() call has failed as permission was denied.");
111 } else {
112 startListening();
113 }
114
115 // Keep listening to changes.
116 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.
117 permissionStatus);
86 } 118 }
87 119
88 void Sensor::stop(ScriptState*, ExceptionState& exceptionState) { 120 void Sensor::stop(ScriptState* scriptState, ExceptionState& exceptionState) {
89 if (m_state == Sensor::SensorState::IDLE || 121 if (m_state == Sensor::SensorState::IDLE ||
90 m_state == Sensor::SensorState::ERRORED) { 122 m_state == Sensor::SensorState::ERRORED) {
91 exceptionState.throwDOMException( 123 exceptionState.throwDOMException(
92 InvalidStateError, 124 InvalidStateError,
93 "Cannot stop because SensorState is either idle or errored"); 125 "Cannot stop because SensorState is either idle or errored");
94 return; 126 return;
95 } 127 }
96 128
97 stopListening(); 129 stopListening();
130
131 // Check the permission status first.
132 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
133
134 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
135 ConsoleMessage* consoleMessage = ConsoleMessage::create(
136 JSMessageSource, InfoMessageLevel, "Permission Rejected.");
137 scriptState->getExecutionContext()->addConsoleMessage(consoleMessage);
138
139 reportError(PermissionDeniedError,
140 "stop() call has failed as permission was not granted.");
141 }
142
143 // Keep listening to changes.
144 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
145 permissionStatus);
98 } 146 }
99 147
100 static String ToString(Sensor::SensorState state) { 148 static String ToString(Sensor::SensorState state) {
101 switch (state) { 149 switch (state) {
102 case Sensor::SensorState::IDLE: 150 case Sensor::SensorState::IDLE:
103 return "idle"; 151 return "idle";
104 case Sensor::SensorState::ACTIVATING: 152 case Sensor::SensorState::ACTIVATING:
105 return "activating"; 153 return "activating";
106 case Sensor::SensorState::ACTIVE: 154 case Sensor::SensorState::ACTIVE:
107 return "active"; 155 return "active";
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 } 187 }
140 188
141 void Sensor::initSensorProxyIfNeeded() { 189 void Sensor::initSensorProxyIfNeeded() {
142 if (m_sensorProxy) 190 if (m_sensorProxy)
143 return; 191 return;
144 192
145 Document* document = toDocument(getExecutionContext()); 193 Document* document = toDocument(getExecutionContext());
146 if (!document || !document->frame()) 194 if (!document || !document->frame())
147 return; 195 return;
148 196
149 m_sensorProxy = 197 m_sensorProxy = SensorProviderProxy::from(document->frame())
150 SensorProviderProxy::from(document->frame())->getOrCreateSensor(m_type); 198 ->getOrCreateSensor(m_type, getExecutionContext());
151 } 199 }
152 200
153 void Sensor::contextDestroyed() { 201 void Sensor::contextDestroyed() {
154 if (m_state == Sensor::SensorState::ACTIVE || 202 if (m_state == Sensor::SensorState::ACTIVE ||
155 m_state == Sensor::SensorState::ACTIVATING) 203 m_state == Sensor::SensorState::ACTIVATING)
156 stopListening(); 204 stopListening();
205 m_sensorProxy->resetPermissionService();
157 } 206 }
158 207
159 void Sensor::onSensorInitialized() { 208 void Sensor::onSensorInitialized() {
160 if (m_state != Sensor::SensorState::ACTIVATING) 209 if (m_state != Sensor::SensorState::ACTIVATING)
161 return; 210 return;
162 211
163 startListening(); 212 startListening();
164 } 213 }
165 214
166 void Sensor::onSensorReadingChanged() { 215 void Sensor::onSensorReadingChanged() {
167 if (m_polling) 216 if (m_polling)
168 m_polling->onSensorReadingChanged(); 217 m_polling->onSensorReadingChanged();
169 } 218 }
170 219
220 void Sensor::onSensorPermissionChanged() {
221 // Check the permission status first.
222 auto permissionStatus = m_sensorProxy->getPermissionStatus();
223
224 if (permissionStatus != PermissionStatus::GRANTED) {
225 stopListening();
226 reportError(PermissionDeniedError,
227 "start/stop() call has failed as permission was denied.");
228 }
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
229 }
230
171 void Sensor::onSensorError(ExceptionCode code, 231 void Sensor::onSensorError(ExceptionCode code,
172 const String& sanitizedMessage, 232 const String& sanitizedMessage,
173 const String& unsanitizedMessage) { 233 const String& unsanitizedMessage) {
174 reportError(code, sanitizedMessage, unsanitizedMessage); 234 reportError(code, sanitizedMessage, unsanitizedMessage);
175 } 235 }
176 236
177 void Sensor::onStartRequestCompleted(bool result) { 237 void Sensor::onStartRequestCompleted(bool result) {
178 if (m_state != Sensor::SensorState::ACTIVATING) 238 if (m_state != Sensor::SensorState::ACTIVATING)
179 return; 239 return;
180 240
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 void Sensor::notifyStateChanged() { 391 void Sensor::notifyStateChanged() {
332 dispatchEvent(Event::create(EventTypeNames::statechange)); 392 dispatchEvent(Event::create(EventTypeNames::statechange));
333 } 393 }
334 394
335 void Sensor::notifyError(DOMException* error) { 395 void Sensor::notifyError(DOMException* error) {
336 dispatchEvent( 396 dispatchEvent(
337 SensorErrorEvent::create(EventTypeNames::error, std::move(error))); 397 SensorErrorEvent::create(EventTypeNames::error, std::move(error)));
338 } 398 }
339 399
340 } // namespace blink 400 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698