Chromium Code Reviews| 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 86 Geolocation* Geolocation::create(ExecutionContext* context) | 86 Geolocation* Geolocation::create(ExecutionContext* context) |
| 87 { | 87 { |
| 88 Geolocation* geolocation = new Geolocation(context); | 88 Geolocation* geolocation = new Geolocation(context); |
| 89 geolocation->suspendIfNeeded(); | 89 geolocation->suspendIfNeeded(); |
| 90 return geolocation; | 90 return geolocation; |
| 91 } | 91 } |
| 92 | 92 |
| 93 Geolocation::Geolocation(ExecutionContext* context) | 93 Geolocation::Geolocation(ExecutionContext* context) |
| 94 : ActiveDOMObject(context) | 94 : ActiveDOMObject(context) |
| 95 , m_geolocationPermission(PermissionUnknown) | 95 , m_geolocationPermission(PermissionUnknown) |
| 96 , m_controller(new GeolocationController(this)) | |
|
Marijn Kruisselbrink
2015/09/30 19:56:55
Unless I'm missing something, the change to lifeti
Sam McNally
2015/10/01 01:54:50
For a real CL it's worth splitting this up, but I
Marijn Kruisselbrink
2015/10/01 03:36:09
But changing the ownership and lifetime management
Sam McNally
2015/10/02 05:12:37
Changing ownership of GeolocationController depend
| |
| 96 { | 97 { |
| 97 } | 98 } |
| 98 | 99 |
| 99 Geolocation::~Geolocation() | 100 Geolocation::~Geolocation() |
| 100 { | 101 { |
| 101 ASSERT(m_geolocationPermission != PermissionRequested); | 102 ASSERT(m_geolocationPermission != PermissionRequested); |
| 102 } | 103 } |
| 103 | 104 |
| 104 DEFINE_TRACE(Geolocation) | 105 DEFINE_TRACE(Geolocation) |
| 105 { | 106 { |
| 106 visitor->trace(m_oneShots); | 107 visitor->trace(m_oneShots); |
| 107 visitor->trace(m_watchers); | 108 visitor->trace(m_watchers); |
| 108 visitor->trace(m_pendingForPermissionNotifiers); | 109 visitor->trace(m_pendingForPermissionNotifiers); |
| 109 visitor->trace(m_lastPosition); | 110 visitor->trace(m_lastPosition); |
| 110 visitor->trace(m_requestsAwaitingCachedPosition); | 111 visitor->trace(m_requestsAwaitingCachedPosition); |
| 112 visitor->trace(m_controller); | |
| 111 ActiveDOMObject::trace(visitor); | 113 ActiveDOMObject::trace(visitor); |
| 112 } | 114 } |
| 113 | 115 |
| 114 Document* Geolocation::document() const | 116 Document* Geolocation::document() const |
| 115 { | 117 { |
| 116 return toDocument(executionContext()); | 118 return toDocument(executionContext()); |
| 117 } | 119 } |
| 118 | 120 |
| 119 LocalFrame* Geolocation::frame() const | 121 LocalFrame* Geolocation::frame() const |
| 120 { | 122 { |
| 121 return document() ? document()->frame() : 0; | 123 return document() ? document()->frame() : 0; |
| 122 } | 124 } |
| 123 | 125 |
| 124 void Geolocation::stop() | 126 void Geolocation::stop() |
| 125 { | 127 { |
| 126 LocalFrame* frame = this->frame(); | 128 LocalFrame* frame = this->frame(); |
| 127 if (frame && m_geolocationPermission == PermissionRequested) | 129 if (frame && m_geolocationPermission == PermissionRequested) |
| 128 GeolocationController::from(frame)->cancelPermissionRequest(this); | 130 m_controller->cancelPermissionRequest(); |
| 129 | 131 |
| 130 // The frame may be moving to a new page and we want to get the permissions from the new page's client. | 132 // The frame may be moving to a new page and we want to get the permissions from the new page's client. |
| 131 m_geolocationPermission = PermissionUnknown; | 133 m_geolocationPermission = PermissionUnknown; |
| 132 cancelAllRequests(); | 134 cancelAllRequests(); |
| 133 stopUpdating(); | 135 stopUpdating(); |
| 134 m_pendingForPermissionNotifiers.clear(); | 136 m_pendingForPermissionNotifiers.clear(); |
| 135 } | 137 } |
| 136 | 138 |
| 137 Geoposition* Geolocation::lastPosition() | 139 Geoposition* Geolocation::lastPosition() |
| 138 { | 140 { |
| 139 LocalFrame* frame = this->frame(); | 141 m_lastPosition = createGeoposition(m_controller->lastPosition()); |
| 140 if (!frame) | |
| 141 return 0; | |
| 142 | |
| 143 m_lastPosition = createGeoposition(GeolocationController::from(frame)->lastP osition()); | |
| 144 | 142 |
| 145 return m_lastPosition.get(); | 143 return m_lastPosition.get(); |
| 146 } | 144 } |
| 147 | 145 |
| 148 void Geolocation::recordOriginTypeAccess() const | 146 void Geolocation::recordOriginTypeAccess() const |
| 149 { | 147 { |
| 150 ASSERT(frame()); | 148 ASSERT(frame()); |
| 151 | 149 |
| 152 Document* document = this->document(); | 150 Document* document = this->document(); |
| 153 ASSERT(document); | 151 ASSERT(document); |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 460 | 458 |
| 461 // Maintain a reference to the cached notifiers until their timer fires. | 459 // Maintain a reference to the cached notifiers until their timer fires. |
| 462 copyToSet(oneShotsWithCachedPosition, m_oneShots); | 460 copyToSet(oneShotsWithCachedPosition, m_oneShots); |
| 463 } | 461 } |
| 464 | 462 |
| 465 void Geolocation::requestPermission() | 463 void Geolocation::requestPermission() |
| 466 { | 464 { |
| 467 if (m_geolocationPermission != PermissionUnknown) | 465 if (m_geolocationPermission != PermissionUnknown) |
| 468 return; | 466 return; |
| 469 | 467 |
| 470 LocalFrame* frame = this->frame(); | |
| 471 if (!frame) | |
| 472 return; | |
| 473 | |
| 474 m_geolocationPermission = PermissionRequested; | 468 m_geolocationPermission = PermissionRequested; |
| 475 | 469 |
| 476 // Ask the embedder: it maintains the geolocation challenge policy itself. | 470 // Ask the embedder: it maintains the geolocation challenge policy itself. |
| 477 GeolocationController::from(frame)->requestPermission(this); | 471 m_controller->requestPermission(); |
| 478 } | 472 } |
| 479 | 473 |
| 480 void Geolocation::makeSuccessCallbacks() | 474 void Geolocation::makeSuccessCallbacks() |
| 481 { | 475 { |
| 482 ASSERT(lastPosition()); | 476 ASSERT(lastPosition()); |
| 483 ASSERT(isAllowed()); | 477 ASSERT(isAllowed()); |
| 484 | 478 |
| 485 GeoNotifierVector oneShotsCopy; | 479 GeoNotifierVector oneShotsCopy; |
| 486 copyToVector(m_oneShots, oneShotsCopy); | 480 copyToVector(m_oneShots, oneShotsCopy); |
| 487 | 481 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 515 makeSuccessCallbacks(); | 509 makeSuccessCallbacks(); |
| 516 } | 510 } |
| 517 | 511 |
| 518 void Geolocation::setError(GeolocationError* error) | 512 void Geolocation::setError(GeolocationError* error) |
| 519 { | 513 { |
| 520 handleError(createPositionError(error)); | 514 handleError(createPositionError(error)); |
| 521 } | 515 } |
| 522 | 516 |
| 523 bool Geolocation::startUpdating(GeoNotifier* notifier) | 517 bool Geolocation::startUpdating(GeoNotifier* notifier) |
| 524 { | 518 { |
| 525 LocalFrame* frame = this->frame(); | 519 m_controller->startUpdating(notifier->options().enableHighAccuracy()); |
| 526 if (!frame) | |
| 527 return false; | |
| 528 | |
| 529 GeolocationController::from(frame)->addObserver(this, notifier->options().en ableHighAccuracy()); | |
| 530 return true; | 520 return true; |
| 531 } | 521 } |
| 532 | 522 |
| 533 void Geolocation::stopUpdating() | 523 void Geolocation::stopUpdating() |
| 534 { | 524 { |
| 535 LocalFrame* frame = this->frame(); | 525 m_controller->stopUpdating(); |
| 536 if (!frame) | |
| 537 return; | |
| 538 | |
| 539 GeolocationController::from(frame)->removeObserver(this); | |
| 540 } | 526 } |
| 541 | 527 |
| 542 void Geolocation::handlePendingPermissionNotifiers() | 528 void Geolocation::handlePendingPermissionNotifiers() |
| 543 { | 529 { |
| 544 // While we iterate through the list, we need not worry about list being mod ified as the permission | 530 // While we iterate through the list, we need not worry about list being mod ified as the permission |
| 545 // is already set to Yes/No and no new listeners will be added to the pendin g list. | 531 // is already set to Yes/No and no new listeners will be added to the pendin g list. |
| 546 for (GeoNotifier* notifier : m_pendingForPermissionNotifiers) { | 532 for (GeoNotifier* notifier : m_pendingForPermissionNotifiers) { |
| 547 if (isAllowed()) { | 533 if (isAllowed()) { |
| 548 // start all pending notification requests as permission granted. | 534 // start all pending notification requests as permission granted. |
| 549 // The notifier is always ref'ed by m_oneShots or m_watchers. | 535 // The notifier is always ref'ed by m_oneShots or m_watchers. |
| 550 if (startUpdating(notifier)) | 536 if (startUpdating(notifier)) |
| 551 notifier->startTimer(); | 537 notifier->startTimer(); |
| 552 else | 538 else |
| 553 notifier->setFatalError(PositionError::create(PositionError::POS ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); | 539 notifier->setFatalError(PositionError::create(PositionError::POS ITION_UNAVAILABLE, failedToStartServiceErrorMessage)); |
| 554 } else { | 540 } else { |
| 555 notifier->setFatalError(PositionError::create(PositionError::PERMISS ION_DENIED, permissionDeniedErrorMessage)); | 541 notifier->setFatalError(PositionError::create(PositionError::PERMISS ION_DENIED, permissionDeniedErrorMessage)); |
| 556 } | 542 } |
| 557 } | 543 } |
| 558 } | 544 } |
| 559 | 545 |
| 560 } // namespace blink | 546 } // namespace blink |
| OLD | NEW |