void Geolocation::setIsAllowed(bool allowed) { // Protect the Geolocation object from garbage collection during a callback. RefPtr<Geolocation> protect(this); // This may be due to either a new position from the service, or a cached // position. m_allowGeolocation = allowed ? Yes : No; // Permission request was made during the startRequest process if (!m_pendingForPermissionNotifiers.isEmpty()) { handlePendingPermissionNotifiers(); m_pendingForPermissionNotifiers.clear(); return; } if (!isAllowed()) { RefPtr<PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage); error->setIsFatal(true); handleError(error.get()); m_requestsAwaitingCachedPosition.clear(); return; } // If the service has a last position, use it to call back for all requests. // If any of the requests are waiting for permission for a cached position, // the position from the service will be at least as fresh. if (lastPosition()) makeSuccessCallbacks(); else makeCachedPositionCallbacks(); }
void Geolocation::setIsAllowed(bool allowed) { // This may be due to either a new position from the service, or a cached // position. m_allowGeolocation = allowed ? Yes : No; #if ENABLE(CLIENT_BASED_GEOLOCATION) if (m_startRequestPermissionNotifier) { if (isAllowed()) { // Permission request was made during the startUpdating process m_startRequestPermissionNotifier->startTimerIfNeeded(); m_startRequestPermissionNotifier = 0; if (!m_frame) return; Page* page = m_frame->page(); if (!page) return; page->geolocationController()->addObserver(this); } else { m_startRequestPermissionNotifier->setFatalError(PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage)); m_oneShots.add(m_startRequestPermissionNotifier); m_startRequestPermissionNotifier = 0; } return; } #endif if (!isAllowed()) { RefPtr<PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage); error->setIsFatal(true); handleError(error.get()); m_requestsAwaitingCachedPosition.clear(); return; } // If the service has a last position, use it to call back for all requests. // If any of the requests are waiting for permission for a cached position, // the position from the service will be at least as fresh. if (lastPosition()) makeSuccessCallbacks(); else makeCachedPositionCallbacks(); }
void Geolocation::requestUsesCachedPosition(GeoNotifier* notifier) { // This is called asynchronously, so the permissions could have been denied // since we last checked in startRequest. if (isDenied()) { notifier->setFatalError(PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage)); return; } m_requestsAwaitingCachedPosition.add(notifier); // If permissions are allowed, make the callback if (isAllowed()) { makeCachedPositionCallbacks(); return; } // Request permissions, which may be synchronous or asynchronous. requestPermission(); }