1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// found in the LICENSE file. 4197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 5197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "config.h" 6197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "modules/geolocation/GeoNotifier.h" 7197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "modules/geolocation/Geolocation.h" 9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "modules/geolocation/PositionError.h" 10197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "modules/geolocation/PositionOptions.h" 11197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 13197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciGeoNotifier::GeoNotifier(Geolocation* geolocation, PositionCallback* successCallback, PositionErrorCallback* errorCallback, PositionOptions* options) 15197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // FIXME : m_geolocation should be removed, it makes circular dependancy. 16197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch : m_geolocation(geolocation) 17197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_successCallback(successCallback) 18197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_errorCallback(errorCallback) 19197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_options(options) 20197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_timer(this, &GeoNotifier::timerFired) 21197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_useCachedPosition(false) 22197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 23197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(m_geolocation); 24197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(m_successCallback); 25197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(m_options); 26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 27197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 28197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GeoNotifier::trace(Visitor* visitor) 29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_geolocation); 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_successCallback); 327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_errorCallback); 33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_options); 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_fatalError); 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 37197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GeoNotifier::setFatalError(PositionError* error) 38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // If a fatal error has already been set, stick with it. This makes sure that 40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // when permission is denied, this is the error reported, as required by the 41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // spec. 42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_fatalError) 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_fatalError = error; 46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // An existing timer may not have a zero timeout. 47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_timer.stop(); 48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_timer.startOneShot(0, FROM_HERE); 49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 51197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GeoNotifier::setUseCachedPosition() 52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_useCachedPosition = true; 54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_timer.startOneShot(0, FROM_HERE); 55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 57197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GeoNotifier::runSuccessCallback(Geoposition* position) 58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_successCallback->handleEvent(position); 60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 62197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GeoNotifier::runErrorCallback(PositionError* error) 63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_errorCallback) 65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_errorCallback->handleEvent(error); 66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 68197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GeoNotifier::startTimer() 69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_timer.startOneShot(m_options->timeout() / 1000.0, FROM_HERE); 71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 73197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GeoNotifier::stopTimer() 74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_timer.stop(); 76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 78197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GeoNotifier::timerFired(Timer<GeoNotifier>*) 79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 80197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_timer.stop(); 81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Test for fatal error first. This is required for the case where the LocalFrame is 83197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // disconnected and requests are cancelled. 84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_fatalError) { 85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch runErrorCallback(m_fatalError.get()); 86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // This will cause this notifier to be deleted. 87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_geolocation->fatalErrorOccurred(this); 88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_useCachedPosition) { 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Clear the cached position flag in case this is a watch request, which 93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // will continue to run. 94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_useCachedPosition = false; 95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_geolocation->requestUsesCachedPosition(this); 96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_errorCallback) 100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_errorCallback->handleEvent(PositionError::create(PositionError::TIMEOUT, "Timeout expired")); 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_geolocation->requestTimedOut(this); 102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 105