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

Side by Side Diff: Source/modules/geolocation/Geolocation.cpp

Issue 297143003: Set default values for timeout and maximumAge of PositionOptions (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Change <limits> to <limits.h> Created 6 years, 6 months 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
« no previous file with comments | « Source/modules/geolocation/Geolocation.h ('k') | Source/modules/geolocation/PositionOptions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 m_timer.stop(); 112 m_timer.stop();
113 m_timer.startOneShot(0, FROM_HERE); 113 m_timer.startOneShot(0, FROM_HERE);
114 } 114 }
115 115
116 void Geolocation::GeoNotifier::setUseCachedPosition() 116 void Geolocation::GeoNotifier::setUseCachedPosition()
117 { 117 {
118 m_useCachedPosition = true; 118 m_useCachedPosition = true;
119 m_timer.startOneShot(0, FROM_HERE); 119 m_timer.startOneShot(0, FROM_HERE);
120 } 120 }
121 121
122 bool Geolocation::GeoNotifier::hasZeroTimeout() const
123 {
124 return m_options->hasTimeout() && m_options->timeout() == 0;
125 }
126
127 void Geolocation::GeoNotifier::runSuccessCallback(Geoposition* position) 122 void Geolocation::GeoNotifier::runSuccessCallback(Geoposition* position)
128 { 123 {
129 // If we are here and the Geolocation permission is not approved, something has 124 // If we are here and the Geolocation permission is not approved, something has
130 // gone horribly wrong. 125 // gone horribly wrong.
131 if (!m_geolocation->isAllowed()) 126 if (!m_geolocation->isAllowed())
132 CRASH(); 127 CRASH();
133 128
134 m_successCallback->handleEvent(position); 129 m_successCallback->handleEvent(position);
135 } 130 }
136 131
137 void Geolocation::GeoNotifier::runErrorCallback(PositionError* error) 132 void Geolocation::GeoNotifier::runErrorCallback(PositionError* error)
138 { 133 {
139 if (m_errorCallback) 134 if (m_errorCallback)
140 m_errorCallback->handleEvent(error); 135 m_errorCallback->handleEvent(error);
141 } 136 }
142 137
143 void Geolocation::GeoNotifier::startTimerIfNeeded() 138 void Geolocation::GeoNotifier::startTimer()
144 { 139 {
145 if (m_options->hasTimeout()) 140 m_timer.startOneShot(m_options->timeout() / 1000.0, FROM_HERE);
146 m_timer.startOneShot(m_options->timeout() / 1000.0, FROM_HERE);
147 } 141 }
148 142
149 void Geolocation::GeoNotifier::stopTimer() 143 void Geolocation::GeoNotifier::stopTimer()
150 { 144 {
151 m_timer.stop(); 145 m_timer.stop();
152 } 146 }
153 147
154 void Geolocation::GeoNotifier::timerFired(Timer<GeoNotifier>*) 148 void Geolocation::GeoNotifier::timerFired(Timer<GeoNotifier>*)
155 { 149 {
156 m_timer.stop(); 150 m_timer.stop();
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 } 337 }
344 338
345 void Geolocation::startRequest(GeoNotifier *notifier) 339 void Geolocation::startRequest(GeoNotifier *notifier)
346 { 340 {
347 // Check whether permissions have already been denied. Note that if this is the case, 341 // Check whether permissions have already been denied. Note that if this is the case,
348 // the permission state can not change again in the lifetime of this page. 342 // the permission state can not change again in the lifetime of this page.
349 if (isDenied()) 343 if (isDenied())
350 notifier->setFatalError(PositionError::create(PositionError::PERMISSION_ DENIED, permissionDeniedErrorMessage)); 344 notifier->setFatalError(PositionError::create(PositionError::PERMISSION_ DENIED, permissionDeniedErrorMessage));
351 else if (haveSuitableCachedPosition(notifier->options())) 345 else if (haveSuitableCachedPosition(notifier->options()))
352 notifier->setUseCachedPosition(); 346 notifier->setUseCachedPosition();
353 else if (notifier->hasZeroTimeout()) 347 else if (!notifier->options()->timeout())
354 notifier->startTimerIfNeeded(); 348 notifier->startTimer();
355 else if (!isAllowed()) { 349 else if (!isAllowed()) {
356 // if we don't yet have permission, request for permission before callin g startUpdating() 350 // if we don't yet have permission, request for permission before callin g startUpdating()
357 m_pendingForPermissionNotifiers.add(notifier); 351 m_pendingForPermissionNotifiers.add(notifier);
358 requestPermission(); 352 requestPermission();
359 } else if (startUpdating(notifier)) 353 } else if (startUpdating(notifier))
360 notifier->startTimerIfNeeded(); 354 notifier->startTimer();
361 else 355 else
362 notifier->setFatalError(PositionError::create(PositionError::POSITION_UN AVAILABLE, failedToStartServiceErrorMessage)); 356 notifier->setFatalError(PositionError::create(PositionError::POSITION_UN AVAILABLE, failedToStartServiceErrorMessage));
363 } 357 }
364 358
365 void Geolocation::fatalErrorOccurred(Geolocation::GeoNotifier* notifier) 359 void Geolocation::fatalErrorOccurred(Geolocation::GeoNotifier* notifier)
366 { 360 {
367 // This request has failed fatally. Remove it from our lists. 361 // This request has failed fatally. Remove it from our lists.
368 m_oneShots.remove(notifier); 362 m_oneShots.remove(notifier);
369 m_watchers.remove(notifier); 363 m_watchers.remove(notifier);
370 364
(...skipping 30 matching lines...) Expand all
401 GeoNotifierSet::const_iterator end = m_requestsAwaitingCachedPosition.end(); 395 GeoNotifierSet::const_iterator end = m_requestsAwaitingCachedPosition.end();
402 for (GeoNotifierSet::const_iterator iter = m_requestsAwaitingCachedPosition. begin(); iter != end; ++iter) { 396 for (GeoNotifierSet::const_iterator iter = m_requestsAwaitingCachedPosition. begin(); iter != end; ++iter) {
403 GeoNotifier* notifier = iter->get(); 397 GeoNotifier* notifier = iter->get();
404 notifier->runSuccessCallback(lastPosition()); 398 notifier->runSuccessCallback(lastPosition());
405 399
406 // If this is a one-shot request, stop it. Otherwise, if the watch still 400 // If this is a one-shot request, stop it. Otherwise, if the watch still
407 // exists, start the service to get updates. 401 // exists, start the service to get updates.
408 if (m_oneShots.contains(notifier)) 402 if (m_oneShots.contains(notifier))
409 m_oneShots.remove(notifier); 403 m_oneShots.remove(notifier);
410 else if (m_watchers.contains(notifier)) { 404 else if (m_watchers.contains(notifier)) {
411 if (notifier->hasZeroTimeout() || startUpdating(notifier)) 405 if (!notifier->options()->timeout() || startUpdating(notifier))
412 notifier->startTimerIfNeeded(); 406 notifier->startTimer();
413 else 407 else
414 notifier->setFatalError(PositionError::create(PositionError::POS ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); 408 notifier->setFatalError(PositionError::create(PositionError::POS ITION_UNAVAILABLE, failedToStartServiceErrorMessage));
415 } 409 }
416 } 410 }
417 411
418 m_requestsAwaitingCachedPosition.clear(); 412 m_requestsAwaitingCachedPosition.clear();
419 413
420 if (!hasListeners()) 414 if (!hasListeners())
421 stopUpdating(); 415 stopUpdating();
422 } 416 }
423 417
424 void Geolocation::requestTimedOut(GeoNotifier* notifier) 418 void Geolocation::requestTimedOut(GeoNotifier* notifier)
425 { 419 {
426 // If this is a one-shot request, stop it. 420 // If this is a one-shot request, stop it.
427 m_oneShots.remove(notifier); 421 m_oneShots.remove(notifier);
428 422
429 if (!hasListeners()) 423 if (!hasListeners())
430 stopUpdating(); 424 stopUpdating();
431 } 425 }
432 426
433 bool Geolocation::haveSuitableCachedPosition(PositionOptions* options) 427 bool Geolocation::haveSuitableCachedPosition(PositionOptions* options)
434 { 428 {
435 Geoposition* cachedPosition = lastPosition(); 429 Geoposition* cachedPosition = lastPosition();
436 if (!cachedPosition) 430 if (!cachedPosition)
437 return false; 431 return false;
438 if (!options->hasMaximumAge())
439 return true;
440 if (!options->maximumAge()) 432 if (!options->maximumAge())
441 return false; 433 return false;
442 DOMTimeStamp currentTimeMillis = convertSecondsToDOMTimeStamp(currentTime()) ; 434 DOMTimeStamp currentTimeMillis = convertSecondsToDOMTimeStamp(currentTime()) ;
443 return cachedPosition->timestamp() > currentTimeMillis - options->maximumAge (); 435 return cachedPosition->timestamp() > currentTimeMillis - options->maximumAge ();
444 } 436 }
445 437
446 void Geolocation::clearWatch(int watchID) 438 void Geolocation::clearWatch(int watchID)
447 { 439 {
448 if (watchID <= 0) 440 if (watchID <= 0)
449 return; 441 return;
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 // While we iterate through the list, we need not worry about list being mod ified as the permission 683 // While we iterate through the list, we need not worry about list being mod ified as the permission
692 // is already set to Yes/No and no new listeners will be added to the pendin g list 684 // is already set to Yes/No and no new listeners will be added to the pendin g list
693 GeoNotifierSet::const_iterator end = m_pendingForPermissionNotifiers.end(); 685 GeoNotifierSet::const_iterator end = m_pendingForPermissionNotifiers.end();
694 for (GeoNotifierSet::const_iterator iter = m_pendingForPermissionNotifiers.b egin(); iter != end; ++iter) { 686 for (GeoNotifierSet::const_iterator iter = m_pendingForPermissionNotifiers.b egin(); iter != end; ++iter) {
695 GeoNotifier* notifier = iter->get(); 687 GeoNotifier* notifier = iter->get();
696 688
697 if (isAllowed()) { 689 if (isAllowed()) {
698 // start all pending notification requests as permission granted. 690 // start all pending notification requests as permission granted.
699 // The notifier is always ref'ed by m_oneShots or m_watchers. 691 // The notifier is always ref'ed by m_oneShots or m_watchers.
700 if (startUpdating(notifier)) 692 if (startUpdating(notifier))
701 notifier->startTimerIfNeeded(); 693 notifier->startTimer();
702 else 694 else
703 notifier->setFatalError(PositionError::create(PositionError::POS ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); 695 notifier->setFatalError(PositionError::create(PositionError::POS ITION_UNAVAILABLE, failedToStartServiceErrorMessage));
704 } else { 696 } else {
705 notifier->setFatalError(PositionError::create(PositionError::PERMISS ION_DENIED, permissionDeniedErrorMessage)); 697 notifier->setFatalError(PositionError::create(PositionError::PERMISS ION_DENIED, permissionDeniedErrorMessage));
706 } 698 }
707 } 699 }
708 } 700 }
709 701
710 } // namespace WebCore 702 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/modules/geolocation/Geolocation.h ('k') | Source/modules/geolocation/PositionOptions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698