15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/geolocation/GeolocationController.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/inspector/InspectorController.h"
31f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/page/Page.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/geolocation/GeolocationClient.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/geolocation/GeolocationError.h"
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "modules/geolocation/GeolocationInspectorAgent.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/geolocation/GeolocationPosition.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)GeolocationController::GeolocationController(LocalFrame& frame, GeolocationClient* client)
40f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    : PageLifecycleObserver(frame.page())
41bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    , m_client(client)
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_hasClientForTest(false)
43f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    , m_isClientUpdating(false)
44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    , m_inspectorAgent(nullptr)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
46f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // FIXME: Once GeolocationInspectorAgent is per frame, there will be a 1:1 relationship between
47f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // it and this class. Until then, there's one GeolocationInspectorAgent per page that the main
48f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // frame is responsible for creating.
49f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (frame.isMainFrame()) {
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        OwnPtrWillBeRawPtr<GeolocationInspectorAgent> geolocationAgent(GeolocationInspectorAgent::create());
51f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_inspectorAgent = geolocationAgent.get();
52f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        frame.page()->inspectorController().registerModuleAgent(geolocationAgent.release());
53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    } else if (frame.page()->mainFrame()->isLocalFrame()) {
545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_inspectorAgent = GeolocationController::from(frame.page()->deprecatedLocalMainFrame())->m_inspectorAgent;
55f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    }
56f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
57c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // m_inspectorAgent is 0 for out of process iframe instantiations, since inspector is currently unable
58c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // to handle that scenario.
59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_inspectorAgent)
60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_inspectorAgent->addController(this);
61f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!frame.isMainFrame() && frame.page()->mainFrame()->isLocalFrame()) {
63f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // internals.setGeolocationClientMock is per page.
645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        GeolocationController* mainController = GeolocationController::from(frame.page()->deprecatedLocalMainFrame());
65f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (mainController->hasClientForTest())
66f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            setClientForTest(mainController->client());
67f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
70f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void GeolocationController::startUpdatingIfNeeded()
71f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
72f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_isClientUpdating)
73f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return;
74f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_isClientUpdating = true;
75f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_client->startUpdating();
76f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
77f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
78f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void GeolocationController::stopUpdatingIfNeeded()
79f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
80f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!m_isClientUpdating)
81f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return;
82f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_isClientUpdating = false;
83f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_client->stopUpdating();
84f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
85f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GeolocationController::~GeolocationController()
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_observers.isEmpty());
89c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if !ENABLE(OILPAN)
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (page() && m_inspectorAgent) {
91c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_inspectorAgent->removeController(this);
92c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_inspectorAgent = nullptr;
93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
94f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_hasClientForTest) {
96f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_client->controllerForTestRemoved(this);
97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_hasClientForTest = false;
98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)PassOwnPtrWillBeRawPtr<GeolocationController> GeolocationController::create(LocalFrame& frame, GeolocationClient* client)
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return adoptPtrWillBeNoop(new GeolocationController(frame, client));
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationController::addObserver(Geolocation* observer, bool enableHighAccuracy)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This may be called multiple times with the same observer, though removeObserver()
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is called only once with each.
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool wasEmpty = m_observers.isEmpty();
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_observers.add(observer);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (enableHighAccuracy)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_highAccuracyObservers.add(observer);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    if (m_client) {
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (enableHighAccuracy)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_client->setEnableHighAccuracy(true);
119f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (wasEmpty && page() && page()->visibilityState() == PageVisibilityStateVisible)
120f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            startUpdatingIfNeeded();
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationController::removeObserver(Geolocation* observer)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_observers.contains(observer))
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_observers.remove(observer);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_highAccuracyObservers.remove(observer);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_client) {
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_observers.isEmpty())
134f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            stopUpdatingIfNeeded();
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (m_highAccuracyObservers.isEmpty())
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_client->setEnableHighAccuracy(false);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationController::requestPermission(Geolocation* geolocation)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_client)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_client->requestPermission(geolocation);
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationController::cancelPermissionRequest(Geolocation* geolocation)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_client)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_client->cancelPermissionRequest(geolocation);
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationController::positionChanged(GeolocationPosition* position)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    position = m_inspectorAgent->overrideGeolocationPosition(position);
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!position) {
1565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        errorOccurred(GeolocationError::create(GeolocationError::PositionUnavailable, "PositionUnavailable"));
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastPosition = position;
1605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    HeapVector<Member<Geolocation> > observersVector;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    copyToVector(m_observers, observersVector);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < observersVector.size(); ++i)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        observersVector[i]->positionChanged();
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationController::errorOccurred(GeolocationError* error)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    HeapVector<Member<Geolocation> > observersVector;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    copyToVector(m_observers, observersVector);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < observersVector.size(); ++i)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        observersVector[i]->setError(error);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GeolocationPosition* GeolocationController::lastPosition()
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_lastPosition.get())
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_lastPosition.get();
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_client)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_client->lastPosition();
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void GeolocationController::setClientForTest(GeolocationClient* client)
18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
187f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (m_hasClientForTest)
188f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_client->controllerForTestRemoved(this);
18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_client = client;
19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hasClientForTest = true;
191f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
192f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    client->controllerForTestAdded(this);
19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
195bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void GeolocationController::pageVisibilityChanged()
196bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
197bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (m_observers.isEmpty() || !m_client)
198bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return;
199bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
200f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (page() && page()->visibilityState() == PageVisibilityStateVisible)
201f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        startUpdatingIfNeeded();
202bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    else
203f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        stopUpdatingIfNeeded();
204bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
205bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const char* GeolocationController::supplementName()
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return "GeolocationController";
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void GeolocationController::trace(Visitor* visitor)
2125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    visitor->trace(m_client);
2145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_lastPosition);
2155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_observers);
2165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_highAccuracyObservers);
217c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_inspectorAgent);
2185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    WillBeHeapSupplement<LocalFrame>::trace(visitor);
2195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
2205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
221f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void provideGeolocationTo(LocalFrame& frame, GeolocationClient* client)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    WillBeHeapSupplement<LocalFrame>::provideTo(frame, GeolocationController::supplementName(), GeolocationController::create(frame, client));
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
226c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
227