| 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 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 Document* Geolocation::document() const | 274 Document* Geolocation::document() const |
| 275 { | 275 { |
| 276 return toDocument(executionContext()); | 276 return toDocument(executionContext()); |
| 277 } | 277 } |
| 278 | 278 |
| 279 LocalFrame* Geolocation::frame() const | 279 LocalFrame* Geolocation::frame() const |
| 280 { | 280 { |
| 281 return document() ? document()->frame() : 0; | 281 return document() ? document()->frame() : 0; |
| 282 } | 282 } |
| 283 | 283 |
| 284 Page* Geolocation::page() const | |
| 285 { | |
| 286 return document() ? document()->page() : 0; | |
| 287 } | |
| 288 | |
| 289 void Geolocation::stop() | 284 void Geolocation::stop() |
| 290 { | 285 { |
| 291 Page* page = this->page(); | 286 LocalFrame* frame = this->frame(); |
| 292 if (page && m_allowGeolocation == InProgress) | 287 if (frame && m_allowGeolocation == InProgress) |
| 293 GeolocationController::from(page)->cancelPermissionRequest(this); | 288 GeolocationController::from(frame)->cancelPermissionRequest(this); |
| 294 // The frame may be moving to a new page and we want to get the permissions
from the new page's client. | 289 // The frame may be moving to a new page and we want to get the permissions
from the new page's client. |
| 295 m_allowGeolocation = Unknown; | 290 m_allowGeolocation = Unknown; |
| 296 cancelAllRequests(); | 291 cancelAllRequests(); |
| 297 stopUpdating(); | 292 stopUpdating(); |
| 298 m_pendingForPermissionNotifiers.clear(); | 293 m_pendingForPermissionNotifiers.clear(); |
| 299 } | 294 } |
| 300 | 295 |
| 301 Geoposition* Geolocation::lastPosition() | 296 Geoposition* Geolocation::lastPosition() |
| 302 { | 297 { |
| 303 Page* page = this->page(); | 298 LocalFrame* frame = this->frame(); |
| 304 if (!page) | 299 if (!frame) |
| 305 return 0; | 300 return 0; |
| 306 | 301 |
| 307 m_lastPosition = createGeoposition(GeolocationController::from(page)->lastPo
sition()); | 302 m_lastPosition = createGeoposition(GeolocationController::from(frame)->lastP
osition()); |
| 308 | 303 |
| 309 return m_lastPosition.get(); | 304 return m_lastPosition.get(); |
| 310 } | 305 } |
| 311 | 306 |
| 312 void Geolocation::getCurrentPosition(PassOwnPtr<PositionCallback> successCallbac
k, PassOwnPtr<PositionErrorCallback> errorCallback, PassRefPtrWillBeRawPtr<Posit
ionOptions> options) | 307 void Geolocation::getCurrentPosition(PassOwnPtr<PositionCallback> successCallbac
k, PassOwnPtr<PositionErrorCallback> errorCallback, PassRefPtrWillBeRawPtr<Posit
ionOptions> options) |
| 313 { | 308 { |
| 314 if (!frame()) | 309 if (!frame()) |
| 315 return; | 310 return; |
| 316 | 311 |
| 317 RefPtrWillBeRawPtr<GeoNotifier> notifier = GeoNotifier::create(this, success
Callback, errorCallback, options); | 312 RefPtrWillBeRawPtr<GeoNotifier> notifier = GeoNotifier::create(this, success
Callback, errorCallback, options); |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 | 593 |
| 599 // Maintain a reference to the cached notifiers until their timer fires. | 594 // Maintain a reference to the cached notifiers until their timer fires. |
| 600 copyToSet(oneShotsWithCachedPosition, m_oneShots); | 595 copyToSet(oneShotsWithCachedPosition, m_oneShots); |
| 601 } | 596 } |
| 602 | 597 |
| 603 void Geolocation::requestPermission() | 598 void Geolocation::requestPermission() |
| 604 { | 599 { |
| 605 if (m_allowGeolocation > Unknown) | 600 if (m_allowGeolocation > Unknown) |
| 606 return; | 601 return; |
| 607 | 602 |
| 608 Page* page = this->page(); | 603 LocalFrame* frame = this->frame(); |
| 609 if (!page) | 604 if (!frame) |
| 610 return; | 605 return; |
| 611 | 606 |
| 612 m_allowGeolocation = InProgress; | 607 m_allowGeolocation = InProgress; |
| 613 | 608 |
| 614 // Ask the embedder: it maintains the geolocation challenge policy itself. | 609 // Ask the embedder: it maintains the geolocation challenge policy itself. |
| 615 GeolocationController::from(page)->requestPermission(this); | 610 GeolocationController::from(frame)->requestPermission(this); |
| 616 } | 611 } |
| 617 | 612 |
| 618 void Geolocation::makeSuccessCallbacks() | 613 void Geolocation::makeSuccessCallbacks() |
| 619 { | 614 { |
| 620 ASSERT(lastPosition()); | 615 ASSERT(lastPosition()); |
| 621 ASSERT(isAllowed()); | 616 ASSERT(isAllowed()); |
| 622 | 617 |
| 623 GeoNotifierVector oneShotsCopy; | 618 GeoNotifierVector oneShotsCopy; |
| 624 copyToVector(m_oneShots, oneShotsCopy); | 619 copyToVector(m_oneShots, oneShotsCopy); |
| 625 | 620 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 654 } | 649 } |
| 655 | 650 |
| 656 void Geolocation::setError(GeolocationError* error) | 651 void Geolocation::setError(GeolocationError* error) |
| 657 { | 652 { |
| 658 RefPtrWillBeRawPtr<PositionError> positionError = createPositionError(error)
; | 653 RefPtrWillBeRawPtr<PositionError> positionError = createPositionError(error)
; |
| 659 handleError(positionError.get()); | 654 handleError(positionError.get()); |
| 660 } | 655 } |
| 661 | 656 |
| 662 bool Geolocation::startUpdating(GeoNotifier* notifier) | 657 bool Geolocation::startUpdating(GeoNotifier* notifier) |
| 663 { | 658 { |
| 664 Page* page = this->page(); | 659 LocalFrame* frame = this->frame(); |
| 665 if (!page) | 660 if (!frame) |
| 666 return false; | 661 return false; |
| 667 | 662 |
| 668 GeolocationController::from(page)->addObserver(this, notifier->options()->en
ableHighAccuracy()); | 663 GeolocationController::from(frame)->addObserver(this, notifier->options()->e
nableHighAccuracy()); |
| 669 return true; | 664 return true; |
| 670 } | 665 } |
| 671 | 666 |
| 672 void Geolocation::stopUpdating() | 667 void Geolocation::stopUpdating() |
| 673 { | 668 { |
| 674 Page* page = this->page(); | 669 LocalFrame* frame = this->frame(); |
| 675 if (!page) | 670 if (!frame) |
| 676 return; | 671 return; |
| 677 | 672 |
| 678 GeolocationController::from(page)->removeObserver(this); | 673 GeolocationController::from(frame)->removeObserver(this); |
| 679 } | 674 } |
| 680 | 675 |
| 681 void Geolocation::handlePendingPermissionNotifiers() | 676 void Geolocation::handlePendingPermissionNotifiers() |
| 682 { | 677 { |
| 683 // While we iterate through the list, we need not worry about list being mod
ified as the permission | 678 // While we iterate through the list, we need not worry about list being mod
ified as the permission |
| 684 // is already set to Yes/No and no new listeners will be added to the pendin
g list | 679 // is already set to Yes/No and no new listeners will be added to the pendin
g list |
| 685 GeoNotifierSet::const_iterator end = m_pendingForPermissionNotifiers.end(); | 680 GeoNotifierSet::const_iterator end = m_pendingForPermissionNotifiers.end(); |
| 686 for (GeoNotifierSet::const_iterator iter = m_pendingForPermissionNotifiers.b
egin(); iter != end; ++iter) { | 681 for (GeoNotifierSet::const_iterator iter = m_pendingForPermissionNotifiers.b
egin(); iter != end; ++iter) { |
| 687 GeoNotifier* notifier = iter->get(); | 682 GeoNotifier* notifier = iter->get(); |
| 688 | 683 |
| 689 if (isAllowed()) { | 684 if (isAllowed()) { |
| 690 // start all pending notification requests as permission granted. | 685 // start all pending notification requests as permission granted. |
| 691 // The notifier is always ref'ed by m_oneShots or m_watchers. | 686 // The notifier is always ref'ed by m_oneShots or m_watchers. |
| 692 if (startUpdating(notifier)) | 687 if (startUpdating(notifier)) |
| 693 notifier->startTimer(); | 688 notifier->startTimer(); |
| 694 else | 689 else |
| 695 notifier->setFatalError(PositionError::create(PositionError::POS
ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); | 690 notifier->setFatalError(PositionError::create(PositionError::POS
ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); |
| 696 } else { | 691 } else { |
| 697 notifier->setFatalError(PositionError::create(PositionError::PERMISS
ION_DENIED, permissionDeniedErrorMessage)); | 692 notifier->setFatalError(PositionError::create(PositionError::PERMISS
ION_DENIED, permissionDeniedErrorMessage)); |
| 698 } | 693 } |
| 699 } | 694 } |
| 700 } | 695 } |
| 701 | 696 |
| 702 } // namespace WebCore | 697 } // namespace WebCore |
| OLD | NEW |