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