15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Apple Inc. All Rights Reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "GeolocationClientMock.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/geolocation/GeolocationController.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/geolocation/GeolocationError.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/geolocation/GeolocationPosition.h" 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GeolocationClientMock::GeolocationClientMock() 42f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) : m_hasError(false) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_controllerTimer(this, &GeolocationClientMock::controllerTimerFired) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_permissionTimer(this, &GeolocationClientMock::permissionTimerFired) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isActive(false) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_permissionState(PermissionStateUnset) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GeolocationClientMock::~GeolocationClientMock() 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_isActive); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void GeolocationClientMock::setPosition(GeolocationPosition* position) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastPosition = position; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearError(); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) asyncUpdateController(); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::setPositionUnavailableError(const String& errorMessage) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_hasError = true; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_errorMessage = errorMessage; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastPosition = nullptr; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) asyncUpdateController(); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::setPermission(bool allowed) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_permissionState = allowed ? PermissionStateAllowed : PermissionStateDenied; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) asyncUpdatePermission(); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int GeolocationClientMock::numberOfPendingPermissionRequests() const 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return m_pendingPermissions.size(); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::requestPermission(Geolocation* geolocation) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_pendingPermissions.add(geolocation); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_permissionState != PermissionStateUnset) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) asyncUpdatePermission(); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::cancelPermissionRequest(Geolocation* geolocation) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // Called from Geolocation::disconnectFrame() in response to LocalFrame destruction. 9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_pendingPermissions.remove(geolocation); 9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_pendingPermissions.isEmpty() && m_permissionTimer.isActive()) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_permissionTimer.stop(); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void GeolocationClientMock::controllerForTestAdded(GeolocationController* controller) 97f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 98f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_controllers.add(controller); 99f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 101f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void GeolocationClientMock::controllerForTestRemoved(GeolocationController* controller) 102f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 103f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_controllers.remove(controller); 104f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 105f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::asyncUpdatePermission() 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_permissionState != PermissionStateUnset); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_permissionTimer.isActive()) 110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_permissionTimer.startOneShot(0, FROM_HERE); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void GeolocationClientMock::permissionTimerFired(Timer<GeolocationClientMock>* timer) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_UNUSED(timer, timer == &m_permissionTimer); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_permissionState != PermissionStateUnset); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool allowed = m_permissionState == PermissionStateAllowed; 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) GeolocationSet::iterator end = m_pendingPermissions.end(); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Once permission has been set (or denied) on a Geolocation object, there can be 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // no further requests for permission to the mock. Consequently the callbacks 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // which fire synchronously from Geolocation::setIsAllowed() cannot reentrantly modify 12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // m_pendingPermissions. 12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (GeolocationSet::iterator it = m_pendingPermissions.begin(); it != end; ++it) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (*it)->setIsAllowed(allowed); 12609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_pendingPermissions.clear(); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::startUpdating() 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_isActive); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isActive = true; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) asyncUpdateController(); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::stopUpdating() 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_isActive); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isActive = false; 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_controllerTimer.stop(); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::setEnableHighAccuracy(bool) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We need to add some tests regarding "high accuracy" mode. 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See https://bugs.webkit.org/show_bug.cgi?id=49438 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GeolocationPosition* GeolocationClientMock::lastPosition() 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_lastPosition.get(); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::asyncUpdateController() 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_isActive && !m_controllerTimer.isActive()) 157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_controllerTimer.startOneShot(0, FROM_HERE); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::controllerTimerFired(Timer<GeolocationClientMock>* timer) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_UNUSED(timer, timer == &m_controllerTimer); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 164f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // Make a copy of the set of controllers since it might be modified while iterating. 1655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) GeolocationControllers controllers = m_controllers; 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_lastPosition.get()) { 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_hasError); 1685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (GeolocationControllers::iterator it = controllers.begin(); it != controllers.end(); ++it) 169f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) (*it)->positionChanged(m_lastPosition.get()); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (m_hasError) { 1715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (GeolocationControllers::iterator it = controllers.begin(); it != controllers.end(); ++it) 1725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) (*it)->errorOccurred(GeolocationError::create(GeolocationError::PositionUnavailable, m_errorMessage)); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void GeolocationClientMock::clearError() 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_hasError = false; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_errorMessage = String(); 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid GeolocationClientMock::trace(Visitor* visitor) 1837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if ENABLE(OILPAN) 1857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_controllers); 1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif 1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_lastPosition); 1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_pendingPermissions); 1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci GeolocationClient::trace(visitor); 1907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 193