/* * Copyright (C) 2009 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "MockGeolocationService.h" #include "Geoposition.h" #include "PositionError.h" #include "PositionOptions.h" namespace WebCore { MockGeolocationService::MockGeolocationServiceSet MockGeolocationService::s_instances; RefPtr MockGeolocationService::s_lastPosition = 0; RefPtr MockGeolocationService::s_lastError = 0; GeolocationService* MockGeolocationService::create(GeolocationServiceClient* client) { return new MockGeolocationService(client); } MockGeolocationService::MockGeolocationService(GeolocationServiceClient* client) : GeolocationService(client) , m_timer(this, &MockGeolocationService::timerFired) { s_instances.add(this); } MockGeolocationService::~MockGeolocationService() { MockGeolocationServiceSet::iterator iter = s_instances.find(this); ASSERT(iter != s_instances.end()); s_instances.remove(iter); } void MockGeolocationService::setPosition(PassRefPtr position) { s_lastPosition = position; s_lastError = 0; makeGeolocationCallbackFromAllInstances(); } void MockGeolocationService::setError(PassRefPtr error) { s_lastError = error; s_lastPosition = 0; makeGeolocationCallbackFromAllInstances(); } bool MockGeolocationService::startUpdating(PositionOptions*) { m_timer.startOneShot(0); return true; } void MockGeolocationService::timerFired(Timer* timer) { ASSERT(timer == &m_timer); makeGeolocationCallback(); } void MockGeolocationService::makeGeolocationCallbackFromAllInstances() { MockGeolocationServiceSet::const_iterator end = s_instances.end(); for (MockGeolocationServiceSet::const_iterator iter = s_instances.begin(); iter != end; ++iter) { (*iter)->makeGeolocationCallback(); } } void MockGeolocationService::makeGeolocationCallback() { if (s_lastPosition) { positionChanged(); } else if (s_lastError) { errorOccurred(); } } } // namespace WebCore