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