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

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

Issue 319863003: Enable Oilpan for modules/geolocation by default. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 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 | Annotate | Revision Log
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 11 matching lines...) Expand all
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28 #include "config.h" 28 #include "config.h"
29 #include "modules/geolocation/Geolocation.h" 29 #include "modules/geolocation/Geolocation.h"
30 30
31 #include "core/dom/Document.h" 31 #include "core/dom/Document.h"
32 #include "wtf/CurrentTime.h"
33
34 #include "modules/geolocation/Coordinates.h" 32 #include "modules/geolocation/Coordinates.h"
35 #include "modules/geolocation/GeolocationController.h" 33 #include "modules/geolocation/GeolocationController.h"
36 #include "modules/geolocation/GeolocationError.h" 34 #include "modules/geolocation/GeolocationError.h"
37 #include "modules/geolocation/GeolocationPosition.h" 35 #include "modules/geolocation/GeolocationPosition.h"
36 #include "wtf/CurrentTime.h"
38 37
39 namespace WebCore { 38 namespace WebCore {
40 39
41 static const char permissionDeniedErrorMessage[] = "User denied Geolocation"; 40 static const char permissionDeniedErrorMessage[] = "User denied Geolocation";
42 static const char failedToStartServiceErrorMessage[] = "Failed to start Geolocat ion service"; 41 static const char failedToStartServiceErrorMessage[] = "Failed to start Geolocat ion service";
43 static const char framelessDocumentErrorMessage[] = "Geolocation cannot be used in frameless documents"; 42 static const char framelessDocumentErrorMessage[] = "Geolocation cannot be used in frameless documents";
44 43
45 static PassRefPtrWillBeRawPtr<Geoposition> createGeoposition(GeolocationPosition * position) 44 static Geoposition* createGeoposition(GeolocationPosition* position)
46 { 45 {
47 if (!position) 46 if (!position)
48 return nullptr; 47 return nullptr;
49 48
50 RefPtrWillBeRawPtr<Coordinates> coordinates = Coordinates::create( 49 Coordinates* coordinates = Coordinates::create(
51 position->latitude(), 50 position->latitude(),
52 position->longitude(), 51 position->longitude(),
53 position->canProvideAltitude(), 52 position->canProvideAltitude(),
54 position->altitude(), 53 position->altitude(),
55 position->accuracy(), 54 position->accuracy(),
56 position->canProvideAltitudeAccuracy(), 55 position->canProvideAltitudeAccuracy(),
57 position->altitudeAccuracy(), 56 position->altitudeAccuracy(),
58 position->canProvideHeading(), 57 position->canProvideHeading(),
59 position->heading(), 58 position->heading(),
60 position->canProvideSpeed(), 59 position->canProvideSpeed(),
61 position->speed()); 60 position->speed());
62 return Geoposition::create(coordinates.release(), convertSecondsToDOMTimeSta mp(position->timestamp())); 61 return Geoposition::create(coordinates, convertSecondsToDOMTimeStamp(positio n->timestamp()));
63 } 62 }
64 63
65 static PassRefPtrWillBeRawPtr<PositionError> createPositionError(GeolocationErro r* error) 64 static PositionError* createPositionError(GeolocationError* error)
66 { 65 {
67 PositionError::ErrorCode code = PositionError::POSITION_UNAVAILABLE; 66 PositionError::ErrorCode code = PositionError::POSITION_UNAVAILABLE;
68 switch (error->code()) { 67 switch (error->code()) {
69 case GeolocationError::PermissionDenied: 68 case GeolocationError::PermissionDenied:
70 code = PositionError::PERMISSION_DENIED; 69 code = PositionError::PERMISSION_DENIED;
71 break; 70 break;
72 case GeolocationError::PositionUnavailable: 71 case GeolocationError::PositionUnavailable:
73 code = PositionError::POSITION_UNAVAILABLE; 72 code = PositionError::POSITION_UNAVAILABLE;
74 break; 73 break;
75 } 74 }
76 75
77 return PositionError::create(code, error->message()); 76 return PositionError::create(code, error->message());
78 } 77 }
79 78
80 Geolocation::GeoNotifier::GeoNotifier(Geolocation* geolocation, PassOwnPtr<Posit ionCallback> successCallback, PassOwnPtr<PositionErrorCallback> errorCallback, P assRefPtrWillBeRawPtr<PositionOptions> options) 79 Geolocation::GeoNotifier::GeoNotifier(Geolocation* geolocation, PassOwnPtr<Posit ionCallback> successCallback, PassOwnPtr<PositionErrorCallback> errorCallback, P ositionOptions* options)
81 : m_geolocation(geolocation) 80 : m_geolocation(geolocation)
82 , m_successCallback(successCallback) 81 , m_successCallback(successCallback)
83 , m_errorCallback(errorCallback) 82 , m_errorCallback(errorCallback)
84 , m_options(options) 83 , m_options(options)
85 , m_timer(this, &Geolocation::GeoNotifier::timerFired) 84 , m_timer(this, &Geolocation::GeoNotifier::timerFired)
86 , m_useCachedPosition(false) 85 , m_useCachedPosition(false)
87 { 86 {
88 ASSERT(m_geolocation); 87 ASSERT(m_geolocation);
89 ASSERT(m_successCallback); 88 ASSERT(m_successCallback);
90 // If no options were supplied from JS, we should have created a default set 89 // If no options were supplied from JS, we should have created a default set
91 // of options in JSGeolocationCustom.cpp. 90 // of options in JSGeolocationCustom.cpp.
92 ASSERT(m_options); 91 ASSERT(m_options);
93 } 92 }
94 93
95 void Geolocation::GeoNotifier::trace(Visitor* visitor) 94 void Geolocation::GeoNotifier::trace(Visitor* visitor)
96 { 95 {
97 visitor->trace(m_geolocation); 96 visitor->trace(m_geolocation);
98 visitor->trace(m_options); 97 visitor->trace(m_options);
99 visitor->trace(m_fatalError); 98 visitor->trace(m_fatalError);
100 } 99 }
101 100
102 void Geolocation::GeoNotifier::setFatalError(PassRefPtrWillBeRawPtr<PositionErro r> error) 101 void Geolocation::GeoNotifier::setFatalError(PositionError* error)
103 { 102 {
104 // If a fatal error has already been set, stick with it. This makes sure tha t 103 // If a fatal error has already been set, stick with it. This makes sure tha t
105 // when permission is denied, this is the error reported, as required by the 104 // when permission is denied, this is the error reported, as required by the
106 // spec. 105 // spec.
107 if (m_fatalError) 106 if (m_fatalError)
108 return; 107 return;
109 108
110 m_fatalError = error; 109 m_fatalError = error;
111 // An existing timer may not have a zero timeout. 110 // An existing timer may not have a zero timeout.
112 m_timer.stop(); 111 m_timer.stop();
(...skipping 29 matching lines...) Expand all
142 141
143 void Geolocation::GeoNotifier::stopTimer() 142 void Geolocation::GeoNotifier::stopTimer()
144 { 143 {
145 m_timer.stop(); 144 m_timer.stop();
146 } 145 }
147 146
148 void Geolocation::GeoNotifier::timerFired(Timer<GeoNotifier>*) 147 void Geolocation::GeoNotifier::timerFired(Timer<GeoNotifier>*)
149 { 148 {
150 m_timer.stop(); 149 m_timer.stop();
151 150
152 // Protect this GeoNotifier object, since it
153 // could be deleted by a call to clearWatch in a callback.
154 RefPtrWillBeRawPtr<GeoNotifier> protect(this);
155
156 // Test for fatal error first. This is required for the case where the Local Frame is 151 // Test for fatal error first. This is required for the case where the Local Frame is
157 // disconnected and requests are cancelled. 152 // disconnected and requests are cancelled.
158 if (m_fatalError) { 153 if (m_fatalError) {
159 runErrorCallback(m_fatalError.get()); 154 runErrorCallback(m_fatalError.get());
160 // This will cause this notifier to be deleted. 155 // This will cause this notifier to be deleted.
161 m_geolocation->fatalErrorOccurred(this); 156 m_geolocation->fatalErrorOccurred(this);
162 return; 157 return;
163 } 158 }
164 159
165 if (m_useCachedPosition) { 160 if (m_useCachedPosition) {
166 // Clear the cached position flag in case this is a watch request, which 161 // Clear the cached position flag in case this is a watch request, which
167 // will continue to run. 162 // will continue to run.
168 m_useCachedPosition = false; 163 m_useCachedPosition = false;
169 m_geolocation->requestUsesCachedPosition(this); 164 m_geolocation->requestUsesCachedPosition(this);
170 return; 165 return;
171 } 166 }
172 167
173 if (m_errorCallback) { 168 if (m_errorCallback)
174 RefPtrWillBeRawPtr<PositionError> error = PositionError::create(Position Error::TIMEOUT, "Timeout expired"); 169 m_errorCallback->handleEvent(PositionError::create(PositionError::TIMEOU T, "Timeout expired"));
175 m_errorCallback->handleEvent(error.get());
176 }
177 m_geolocation->requestTimedOut(this); 170 m_geolocation->requestTimedOut(this);
178 } 171 }
179 172
180 void Geolocation::Watchers::trace(Visitor* visitor) 173 void Geolocation::Watchers::trace(Visitor* visitor)
181 { 174 {
182 visitor->trace(m_idToNotifierMap); 175 visitor->trace(m_idToNotifierMap);
183 visitor->trace(m_notifierToIdMap); 176 visitor->trace(m_notifierToIdMap);
184 } 177 }
185 178
186 bool Geolocation::Watchers::add(int id, PassRefPtrWillBeRawPtr<GeoNotifier> prpN otifier) 179 bool Geolocation::Watchers::add(int id, GeoNotifier* notifier)
187 { 180 {
188 ASSERT(id > 0); 181 ASSERT(id > 0);
189 RefPtrWillBeRawPtr<GeoNotifier> notifier = prpNotifier; 182 if (!m_idToNotifierMap.add(id, notifier).isNewEntry)
190
191 if (!m_idToNotifierMap.add(id, notifier.get()).isNewEntry)
192 return false; 183 return false;
193 m_notifierToIdMap.set(notifier.release(), id); 184 m_notifierToIdMap.set(notifier, id);
194 return true; 185 return true;
195 } 186 }
196 187
197 Geolocation::GeoNotifier* Geolocation::Watchers::find(int id) 188 Geolocation::GeoNotifier* Geolocation::Watchers::find(int id)
198 { 189 {
199 ASSERT(id > 0); 190 ASSERT(id > 0);
200 IdToNotifierMap::iterator iter = m_idToNotifierMap.find(id); 191 IdToNotifierMap::iterator iter = m_idToNotifierMap.find(id);
201 if (iter == m_idToNotifierMap.end()) 192 if (iter == m_idToNotifierMap.end())
202 return 0; 193 return 0;
203 return iter->value.get(); 194 return iter->value.get();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 bool Geolocation::Watchers::isEmpty() const 227 bool Geolocation::Watchers::isEmpty() const
237 { 228 {
238 return m_idToNotifierMap.isEmpty(); 229 return m_idToNotifierMap.isEmpty();
239 } 230 }
240 231
241 void Geolocation::Watchers::getNotifiersVector(GeoNotifierVector& copy) const 232 void Geolocation::Watchers::getNotifiersVector(GeoNotifierVector& copy) const
242 { 233 {
243 copyValuesToVector(m_idToNotifierMap, copy); 234 copyValuesToVector(m_idToNotifierMap, copy);
244 } 235 }
245 236
246 PassRefPtrWillBeRawPtr<Geolocation> Geolocation::create(ExecutionContext* contex t) 237 Geolocation* Geolocation::create(ExecutionContext* context)
247 { 238 {
248 RefPtrWillBeRawPtr<Geolocation> geolocation = adoptRefWillBeNoop(new Geoloca tion(context)); 239 Geolocation* geolocation = new Geolocation(context);
249 geolocation->suspendIfNeeded(); 240 geolocation->suspendIfNeeded();
250 return geolocation.release(); 241 return geolocation;
251 } 242 }
252 243
253 Geolocation::Geolocation(ExecutionContext* context) 244 Geolocation::Geolocation(ExecutionContext* context)
254 : ActiveDOMObject(context) 245 : ActiveDOMObject(context)
255 , m_allowGeolocation(Unknown) 246 , m_allowGeolocation(Unknown)
256 { 247 {
257 ScriptWrappable::init(this); 248 ScriptWrappable::init(this);
258 } 249 }
259 250
260 Geolocation::~Geolocation() 251 Geolocation::~Geolocation()
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 { 288 {
298 LocalFrame* frame = this->frame(); 289 LocalFrame* frame = this->frame();
299 if (!frame) 290 if (!frame)
300 return 0; 291 return 0;
301 292
302 m_lastPosition = createGeoposition(GeolocationController::from(frame)->lastP osition()); 293 m_lastPosition = createGeoposition(GeolocationController::from(frame)->lastP osition());
303 294
304 return m_lastPosition.get(); 295 return m_lastPosition.get();
305 } 296 }
306 297
307 void Geolocation::getCurrentPosition(PassOwnPtr<PositionCallback> successCallbac k, PassOwnPtr<PositionErrorCallback> errorCallback, PassRefPtrWillBeRawPtr<Posit ionOptions> options) 298 void Geolocation::getCurrentPosition(PassOwnPtr<PositionCallback> successCallbac k, PassOwnPtr<PositionErrorCallback> errorCallback, PositionOptions* options)
308 { 299 {
309 if (!frame()) 300 if (!frame())
310 return; 301 return;
311 302
312 RefPtrWillBeRawPtr<GeoNotifier> notifier = GeoNotifier::create(this, success Callback, errorCallback, options); 303 GeoNotifier* notifier = GeoNotifier::create(this, successCallback, errorCall back, options);
313 startRequest(notifier.get()); 304 startRequest(notifier);
314 305
315 m_oneShots.add(notifier); 306 m_oneShots.add(notifier);
316 } 307 }
317 308
318 int Geolocation::watchPosition(PassOwnPtr<PositionCallback> successCallback, Pas sOwnPtr<PositionErrorCallback> errorCallback, PassRefPtrWillBeRawPtr<PositionOpt ions> options) 309 int Geolocation::watchPosition(PassOwnPtr<PositionCallback> successCallback, Pas sOwnPtr<PositionErrorCallback> errorCallback, PositionOptions* options)
319 { 310 {
320 if (!frame()) 311 if (!frame())
321 return 0; 312 return 0;
322 313
323 RefPtrWillBeRawPtr<GeoNotifier> notifier = GeoNotifier::create(this, success Callback, errorCallback, options); 314 GeoNotifier* notifier = GeoNotifier::create(this, successCallback, errorCall back, options);
324 startRequest(notifier.get()); 315 startRequest(notifier);
325 316
326 int watchID; 317 int watchID;
327 // Keep asking for the next id until we're given one that we don't already h ave. 318 // Keep asking for the next id until we're given one that we don't already h ave.
328 do { 319 do {
329 watchID = executionContext()->circularSequentialID(); 320 watchID = executionContext()->circularSequentialID();
330 } while (!m_watchers.add(watchID, notifier)); 321 } while (!m_watchers.add(watchID, notifier));
331 return watchID; 322 return watchID;
332 } 323 }
333 324
334 void Geolocation::startRequest(GeoNotifier *notifier) 325 void Geolocation::startRequest(GeoNotifier *notifier)
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 if (GeoNotifier* notifier = m_watchers.find(watchID)) 429 if (GeoNotifier* notifier = m_watchers.find(watchID))
439 m_pendingForPermissionNotifiers.remove(notifier); 430 m_pendingForPermissionNotifiers.remove(notifier);
440 m_watchers.remove(watchID); 431 m_watchers.remove(watchID);
441 432
442 if (!hasListeners()) 433 if (!hasListeners())
443 stopUpdating(); 434 stopUpdating();
444 } 435 }
445 436
446 void Geolocation::setIsAllowed(bool allowed) 437 void Geolocation::setIsAllowed(bool allowed)
447 { 438 {
448 // Protect the Geolocation object from garbage collection during a callback.
449 RefPtrWillBeRawPtr<Geolocation> protect(this);
450
451 // This may be due to either a new position from the service, or a cached 439 // This may be due to either a new position from the service, or a cached
452 // position. 440 // position.
453 m_allowGeolocation = allowed ? Yes : No; 441 m_allowGeolocation = allowed ? Yes : No;
454 442
455 // Permission request was made during the startRequest process 443 // Permission request was made during the startRequest process
456 if (!m_pendingForPermissionNotifiers.isEmpty()) { 444 if (!m_pendingForPermissionNotifiers.isEmpty()) {
457 handlePendingPermissionNotifiers(); 445 handlePendingPermissionNotifiers();
458 m_pendingForPermissionNotifiers.clear(); 446 m_pendingForPermissionNotifiers.clear();
459 return; 447 return;
460 } 448 }
461 449
462 if (!isAllowed()) { 450 if (!isAllowed()) {
463 RefPtrWillBeRawPtr<PositionError> error = PositionError::create(Position Error::PERMISSION_DENIED, permissionDeniedErrorMessage); 451 PositionError* error = PositionError::create(PositionError::PERMISSION_D ENIED, permissionDeniedErrorMessage);
464 error->setIsFatal(true); 452 error->setIsFatal(true);
465 handleError(error.get()); 453 handleError(error);
466 m_requestsAwaitingCachedPosition.clear(); 454 m_requestsAwaitingCachedPosition.clear();
467 return; 455 return;
468 } 456 }
469 457
470 // If the service has a last position, use it to call back for all requests. 458 // If the service has a last position, use it to call back for all requests.
471 // If any of the requests are waiting for permission for a cached position, 459 // If any of the requests are waiting for permission for a cached position,
472 // the position from the service will be at least as fresh. 460 // the position from the service will be at least as fresh.
473 if (lastPosition()) 461 if (lastPosition())
474 makeSuccessCallbacks(); 462 makeSuccessCallbacks();
475 else 463 else
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 ASSERT(isAllowed()); 631 ASSERT(isAllowed());
644 632
645 // Stop all currently running timers. 633 // Stop all currently running timers.
646 stopTimers(); 634 stopTimers();
647 635
648 makeSuccessCallbacks(); 636 makeSuccessCallbacks();
649 } 637 }
650 638
651 void Geolocation::setError(GeolocationError* error) 639 void Geolocation::setError(GeolocationError* error)
652 { 640 {
653 RefPtrWillBeRawPtr<PositionError> positionError = createPositionError(error) ; 641 handleError(createPositionError(error));
654 handleError(positionError.get());
655 } 642 }
656 643
657 bool Geolocation::startUpdating(GeoNotifier* notifier) 644 bool Geolocation::startUpdating(GeoNotifier* notifier)
658 { 645 {
659 LocalFrame* frame = this->frame(); 646 LocalFrame* frame = this->frame();
660 if (!frame) 647 if (!frame)
661 return false; 648 return false;
662 649
663 GeolocationController::from(frame)->addObserver(this, notifier->options()->e nableHighAccuracy()); 650 GeolocationController::from(frame)->addObserver(this, notifier->options()->e nableHighAccuracy());
664 return true; 651 return true;
(...skipping 23 matching lines...) Expand all
688 notifier->startTimer(); 675 notifier->startTimer();
689 else 676 else
690 notifier->setFatalError(PositionError::create(PositionError::POS ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); 677 notifier->setFatalError(PositionError::create(PositionError::POS ITION_UNAVAILABLE, failedToStartServiceErrorMessage));
691 } else { 678 } else {
692 notifier->setFatalError(PositionError::create(PositionError::PERMISS ION_DENIED, permissionDeniedErrorMessage)); 679 notifier->setFatalError(PositionError::create(PositionError::PERMISS ION_DENIED, permissionDeniedErrorMessage));
693 } 680 }
694 } 681 }
695 } 682 }
696 683
697 } // namespace WebCore 684 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698