OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All Rights Reserved. |
3 * Copyright (C) 2009 Torch Mobile, Inc. | 3 * Copyright (C) 2009 Torch Mobile, Inc. |
4 * Copyright 2010, The Android Open Source Project | 4 * Copyright 2010, The Android Open Source Project |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 | 147 |
148 // It is required by canAccessFeatureRequiringSecureOrigin() but isn't | 148 // It is required by canAccessFeatureRequiringSecureOrigin() but isn't |
149 // actually used. This could be used later if a warning is shown in the | 149 // actually used. This could be used later if a warning is shown in the |
150 // developer console. | 150 // developer console. |
151 String insecureOriginMsg; | 151 String insecureOriginMsg; |
152 UseCounter::Feature counter = document->securityOrigin()->canAccessFeatureRe
quiringSecureOrigin(insecureOriginMsg) | 152 UseCounter::Feature counter = document->securityOrigin()->canAccessFeatureRe
quiringSecureOrigin(insecureOriginMsg) |
153 ? UseCounter::GeolocationSecureOrigin : UseCounter::GeolocationInsecureO
rigin; | 153 ? UseCounter::GeolocationSecureOrigin : UseCounter::GeolocationInsecureO
rigin; |
154 UseCounter::count(document, counter); | 154 UseCounter::count(document, counter); |
155 } | 155 } |
156 | 156 |
157 void Geolocation::getCurrentPosition(PositionCallback* successCallback, Position
ErrorCallback* errorCallback, const Dictionary& options) | 157 void Geolocation::getCurrentPosition(PositionCallback* successCallback, Position
ErrorCallback* errorCallback, const PositionOptions& options) |
158 { | 158 { |
159 if (!frame()) | 159 if (!frame()) |
160 return; | 160 return; |
161 | 161 |
162 recordOriginTypeAccess(); | 162 recordOriginTypeAccess(); |
163 | 163 |
164 GeoNotifier* notifier = GeoNotifier::create(this, successCallback, errorCall
back, PositionOptions::create(options)); | 164 GeoNotifier* notifier = GeoNotifier::create(this, successCallback, errorCall
back, options); |
165 startRequest(notifier); | 165 startRequest(notifier); |
166 | 166 |
167 m_oneShots.add(notifier); | 167 m_oneShots.add(notifier); |
168 } | 168 } |
169 | 169 |
170 int Geolocation::watchPosition(PositionCallback* successCallback, PositionErrorC
allback* errorCallback, const Dictionary& options) | 170 int Geolocation::watchPosition(PositionCallback* successCallback, PositionErrorC
allback* errorCallback, const PositionOptions& options) |
171 { | 171 { |
172 if (!frame()) | 172 if (!frame()) |
173 return 0; | 173 return 0; |
174 | 174 |
175 recordOriginTypeAccess(); | 175 recordOriginTypeAccess(); |
176 | 176 |
177 GeoNotifier* notifier = GeoNotifier::create(this, successCallback, errorCall
back, PositionOptions::create(options)); | 177 GeoNotifier* notifier = GeoNotifier::create(this, successCallback, errorCall
back, options); |
178 startRequest(notifier); | 178 startRequest(notifier); |
179 | 179 |
180 int watchID; | 180 int watchID; |
181 // Keep asking for the next id until we're given one that we don't already h
ave. | 181 // Keep asking for the next id until we're given one that we don't already h
ave. |
182 do { | 182 do { |
183 watchID = executionContext()->circularSequentialID(); | 183 watchID = executionContext()->circularSequentialID(); |
184 } while (!m_watchers.add(watchID, notifier)); | 184 } while (!m_watchers.add(watchID, notifier)); |
185 return watchID; | 185 return watchID; |
186 } | 186 } |
187 | 187 |
188 void Geolocation::startRequest(GeoNotifier *notifier) | 188 void Geolocation::startRequest(GeoNotifier *notifier) |
189 { | 189 { |
190 // Check whether permissions have already been denied. Note that if this is
the case, | 190 // Check whether permissions have already been denied. Note that if this is
the case, |
191 // the permission state can not change again in the lifetime of this page. | 191 // the permission state can not change again in the lifetime of this page. |
192 if (isDenied()) | 192 if (isDenied()) |
193 notifier->setFatalError(PositionError::create(PositionError::PERMISSION_
DENIED, permissionDeniedErrorMessage)); | 193 notifier->setFatalError(PositionError::create(PositionError::PERMISSION_
DENIED, permissionDeniedErrorMessage)); |
194 else if (haveSuitableCachedPosition(notifier->options())) | 194 else if (haveSuitableCachedPosition(notifier->options())) |
195 notifier->setUseCachedPosition(); | 195 notifier->setUseCachedPosition(); |
196 else if (!notifier->options()->timeout()) | 196 else if (!notifier->options().timeout()) |
197 notifier->startTimer(); | 197 notifier->startTimer(); |
198 else if (!isAllowed()) { | 198 else if (!isAllowed()) { |
199 // if we don't yet have permission, request for permission before callin
g startUpdating() | 199 // if we don't yet have permission, request for permission before callin
g startUpdating() |
200 m_pendingForPermissionNotifiers.add(notifier); | 200 m_pendingForPermissionNotifiers.add(notifier); |
201 requestPermission(); | 201 requestPermission(); |
202 } else if (startUpdating(notifier)) | 202 } else if (startUpdating(notifier)) |
203 notifier->startTimer(); | 203 notifier->startTimer(); |
204 else | 204 else |
205 notifier->setFatalError(PositionError::create(PositionError::POSITION_UN
AVAILABLE, failedToStartServiceErrorMessage)); | 205 notifier->setFatalError(PositionError::create(PositionError::POSITION_UN
AVAILABLE, failedToStartServiceErrorMessage)); |
206 } | 206 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 // asynchronously, so we don't need to worry about it being modified from | 242 // asynchronously, so we don't need to worry about it being modified from |
243 // the callbacks. | 243 // the callbacks. |
244 for (GeoNotifier* notifier : m_requestsAwaitingCachedPosition) { | 244 for (GeoNotifier* notifier : m_requestsAwaitingCachedPosition) { |
245 notifier->runSuccessCallback(lastPosition()); | 245 notifier->runSuccessCallback(lastPosition()); |
246 | 246 |
247 // If this is a one-shot request, stop it. Otherwise, if the watch still | 247 // If this is a one-shot request, stop it. Otherwise, if the watch still |
248 // exists, start the service to get updates. | 248 // exists, start the service to get updates. |
249 if (m_oneShots.contains(notifier)) | 249 if (m_oneShots.contains(notifier)) |
250 m_oneShots.remove(notifier); | 250 m_oneShots.remove(notifier); |
251 else if (m_watchers.contains(notifier)) { | 251 else if (m_watchers.contains(notifier)) { |
252 if (!notifier->options()->timeout() || startUpdating(notifier)) | 252 if (!notifier->options().timeout() || startUpdating(notifier)) |
253 notifier->startTimer(); | 253 notifier->startTimer(); |
254 else | 254 else |
255 notifier->setFatalError(PositionError::create(PositionError::POS
ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); | 255 notifier->setFatalError(PositionError::create(PositionError::POS
ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); |
256 } | 256 } |
257 } | 257 } |
258 | 258 |
259 m_requestsAwaitingCachedPosition.clear(); | 259 m_requestsAwaitingCachedPosition.clear(); |
260 | 260 |
261 if (!hasListeners()) | 261 if (!hasListeners()) |
262 stopUpdating(); | 262 stopUpdating(); |
263 } | 263 } |
264 | 264 |
265 void Geolocation::requestTimedOut(GeoNotifier* notifier) | 265 void Geolocation::requestTimedOut(GeoNotifier* notifier) |
266 { | 266 { |
267 // If this is a one-shot request, stop it. | 267 // If this is a one-shot request, stop it. |
268 m_oneShots.remove(notifier); | 268 m_oneShots.remove(notifier); |
269 | 269 |
270 if (!hasListeners()) | 270 if (!hasListeners()) |
271 stopUpdating(); | 271 stopUpdating(); |
272 } | 272 } |
273 | 273 |
274 bool Geolocation::haveSuitableCachedPosition(PositionOptions* options) | 274 bool Geolocation::haveSuitableCachedPosition(const PositionOptions& options) |
275 { | 275 { |
276 Geoposition* cachedPosition = lastPosition(); | 276 Geoposition* cachedPosition = lastPosition(); |
277 if (!cachedPosition) | 277 if (!cachedPosition) |
278 return false; | 278 return false; |
279 if (!options->maximumAge()) | 279 if (!options.maximumAge()) |
280 return false; | 280 return false; |
281 DOMTimeStamp currentTimeMillis = convertSecondsToDOMTimeStamp(currentTime())
; | 281 DOMTimeStamp currentTimeMillis = convertSecondsToDOMTimeStamp(currentTime())
; |
282 return cachedPosition->timestamp() > currentTimeMillis - options->maximumAge
(); | 282 return cachedPosition->timestamp() > currentTimeMillis - options.maximumAge(
); |
283 } | 283 } |
284 | 284 |
285 void Geolocation::clearWatch(int watchID) | 285 void Geolocation::clearWatch(int watchID) |
286 { | 286 { |
287 if (watchID <= 0) | 287 if (watchID <= 0) |
288 return; | 288 return; |
289 | 289 |
290 if (GeoNotifier* notifier = m_watchers.find(watchID)) | 290 if (GeoNotifier* notifier = m_watchers.find(watchID)) |
291 m_pendingForPermissionNotifiers.remove(notifier); | 291 m_pendingForPermissionNotifiers.remove(notifier); |
292 m_watchers.remove(watchID); | 292 m_watchers.remove(watchID); |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 { | 491 { |
492 handleError(createPositionError(error)); | 492 handleError(createPositionError(error)); |
493 } | 493 } |
494 | 494 |
495 bool Geolocation::startUpdating(GeoNotifier* notifier) | 495 bool Geolocation::startUpdating(GeoNotifier* notifier) |
496 { | 496 { |
497 LocalFrame* frame = this->frame(); | 497 LocalFrame* frame = this->frame(); |
498 if (!frame) | 498 if (!frame) |
499 return false; | 499 return false; |
500 | 500 |
501 GeolocationController::from(frame)->addObserver(this, notifier->options()->e
nableHighAccuracy()); | 501 GeolocationController::from(frame)->addObserver(this, notifier->options().en
ableHighAccuracy()); |
502 return true; | 502 return true; |
503 } | 503 } |
504 | 504 |
505 void Geolocation::stopUpdating() | 505 void Geolocation::stopUpdating() |
506 { | 506 { |
507 LocalFrame* frame = this->frame(); | 507 LocalFrame* frame = this->frame(); |
508 if (!frame) | 508 if (!frame) |
509 return; | 509 return; |
510 | 510 |
511 GeolocationController::from(frame)->removeObserver(this); | 511 GeolocationController::from(frame)->removeObserver(this); |
(...skipping 11 matching lines...) Expand all Loading... |
523 notifier->startTimer(); | 523 notifier->startTimer(); |
524 else | 524 else |
525 notifier->setFatalError(PositionError::create(PositionError::POS
ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); | 525 notifier->setFatalError(PositionError::create(PositionError::POS
ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); |
526 } else { | 526 } else { |
527 notifier->setFatalError(PositionError::create(PositionError::PERMISS
ION_DENIED, permissionDeniedErrorMessage)); | 527 notifier->setFatalError(PositionError::create(PositionError::PERMISS
ION_DENIED, permissionDeniedErrorMessage)); |
528 } | 528 } |
529 } | 529 } |
530 } | 530 } |
531 | 531 |
532 } // namespace blink | 532 } // namespace blink |
OLD | NEW |