28d522d960474e699f8c1799e591cdec45c56b11
[WebKit-https.git] / Source / WebCore / page / GeolocationController.cpp
1 /*
2  * Copyright (C) 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "GeolocationController.h"
28 #include "GeolocationPosition.h"
29
30 #if ENABLE(CLIENT_BASED_GEOLOCATION)
31
32 #include "GeolocationClient.h"
33
34 namespace WebCore {
35
36 GeolocationController::GeolocationController(Page* page, GeolocationClient* client)
37     : m_page(page)
38     , m_client(client)
39 {
40 }
41
42 GeolocationController::~GeolocationController()
43 {
44     if (m_client)
45         m_client->geolocationDestroyed();
46 }
47
48 void GeolocationController::addObserver(Geolocation* observer, bool enableHighAccuracy)
49 {
50     // This may be called multiple times with the same observer, though removeObserver()
51     // is called only once with each.
52     bool wasEmpty = m_observers.isEmpty();
53     m_observers.add(observer);
54     if (enableHighAccuracy)
55         m_highAccuracyObservers.add(observer);
56
57     if (m_client) {        
58         if (enableHighAccuracy)
59             m_client->setEnableHighAccuracy(true);
60         if (wasEmpty)
61             m_client->startUpdating();
62     }
63 }
64
65 void GeolocationController::removeObserver(Geolocation* observer)
66 {
67     if (!m_observers.contains(observer))
68         return;
69
70     m_observers.remove(observer);
71     m_highAccuracyObservers.remove(observer);
72
73     if (m_client) {
74         if (m_observers.isEmpty())
75             m_client->stopUpdating();
76         else if (m_highAccuracyObservers.isEmpty())
77             m_client->setEnableHighAccuracy(false);
78     }
79 }
80
81 void GeolocationController::requestPermission(Geolocation* geolocation)
82 {
83     if (m_client)
84         m_client->requestPermission(geolocation);
85 }
86
87 void GeolocationController::cancelPermissionRequest(Geolocation* geolocation)
88 {
89     if (m_client)
90         m_client->cancelPermissionRequest(geolocation);
91 }
92
93 void GeolocationController::positionChanged(GeolocationPosition* position)
94 {
95     m_lastPosition = position;
96     Vector<RefPtr<Geolocation> > observersVector;
97     copyToVector(m_observers, observersVector);
98     for (size_t i = 0; i < observersVector.size(); ++i)
99         observersVector[i]->positionChanged();
100 }
101
102 void GeolocationController::errorOccurred(GeolocationError* error)
103 {
104     Vector<RefPtr<Geolocation> > observersVector;
105     copyToVector(m_observers, observersVector);
106     for (size_t i = 0; i < observersVector.size(); ++i)
107         observersVector[i]->setError(error);
108 }
109
110 GeolocationPosition* GeolocationController::lastPosition()
111 {
112     if (m_lastPosition.get())
113         return m_lastPosition.get();
114
115     if (!m_client)
116         return 0;
117
118     return m_client->lastPosition();
119 }
120
121 } // namespace WebCore
122
123 #endif // ENABLE(CLIENT_BASED_GEOLOCATION)