Home | History | Annotate | Download | only in mock
      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. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "GeolocationServiceMock.h"
     28 
     29 #if ENABLE(GEOLOCATION)
     30 
     31 #include "Logging.h"
     32 #include "Geolocation.h"
     33 #include "Geoposition.h"
     34 #include "PositionError.h"
     35 #include "PositionOptions.h"
     36 
     37 namespace WebCore {
     38 
     39 GeolocationServiceMock::GeolocationServiceSet* GeolocationServiceMock::s_instances = 0;
     40 RefPtr<Geoposition>* GeolocationServiceMock::s_lastPosition;
     41 RefPtr<PositionError>* GeolocationServiceMock::s_lastError;
     42 
     43 GeolocationService* GeolocationServiceMock::create(GeolocationServiceClient* client)
     44 {
     45     initStatics();
     46     return new GeolocationServiceMock(client);
     47 }
     48 
     49 GeolocationServiceMock::GeolocationServiceMock(GeolocationServiceClient* client)
     50     : GeolocationService(client)
     51     , m_timer(this, &GeolocationServiceMock::timerFired)
     52     , m_isActive(false)
     53 {
     54     s_instances->add(this);
     55 }
     56 
     57 GeolocationServiceMock::~GeolocationServiceMock()
     58 {
     59     GeolocationServiceSet::iterator iter = s_instances->find(this);
     60     ASSERT(iter != s_instances->end());
     61     s_instances->remove(iter);
     62     cleanUpStatics();
     63 }
     64 
     65 void GeolocationServiceMock::setPosition(PassRefPtr<Geoposition> position)
     66 {
     67     initStatics();
     68     GeolocationService::useMock();
     69     *s_lastPosition = position;
     70     *s_lastError = 0;
     71     makeGeolocationCallbackFromAllInstances();
     72 }
     73 
     74 void GeolocationServiceMock::setError(PassRefPtr<PositionError> error)
     75 {
     76     initStatics();
     77     GeolocationService::useMock();
     78     *s_lastError = error;
     79     *s_lastPosition = 0;
     80     makeGeolocationCallbackFromAllInstances();
     81 }
     82 
     83 bool GeolocationServiceMock::startUpdating(PositionOptions*)
     84 {
     85     m_isActive = true;
     86     m_timer.startOneShot(0);
     87     return true;
     88 }
     89 
     90 void GeolocationServiceMock::stopUpdating()
     91 {
     92     m_isActive = false;
     93 }
     94 
     95 void GeolocationServiceMock::timerFired(Timer<GeolocationServiceMock>* timer)
     96 {
     97     ASSERT_UNUSED(timer, timer == &m_timer);
     98     makeGeolocationCallback();
     99 }
    100 
    101 void GeolocationServiceMock::makeGeolocationCallbackFromAllInstances()
    102 {
    103     GeolocationServiceSet::const_iterator end = s_instances->end();
    104     for (GeolocationServiceSet::const_iterator iter = s_instances->begin(); iter != end; ++iter)
    105         (*iter)->makeGeolocationCallback();
    106 }
    107 
    108 void GeolocationServiceMock::makeGeolocationCallback()
    109 {
    110     if (!m_isActive)
    111         return;
    112 
    113     if (*s_lastPosition)
    114         positionChanged();
    115     else if (*s_lastError)
    116         errorOccurred();
    117 }
    118 
    119 void GeolocationServiceMock::initStatics()
    120 {
    121     if (s_instances == 0) {
    122         s_instances = new GeolocationServiceSet;
    123         s_lastPosition = new RefPtr<Geoposition>;
    124         s_lastError = new RefPtr<PositionError>;
    125     }
    126 }
    127 
    128 void GeolocationServiceMock::cleanUpStatics()
    129 {
    130     if (s_instances->size() == 0) {
    131         delete s_instances;
    132         s_instances = 0;
    133         delete s_lastPosition;
    134         delete s_lastError;
    135     }
    136 }
    137 
    138 } // namespace WebCore
    139 
    140 #endif
    141