Home | History | Annotate | Download | only in mac
      1 /*
      2  * Copyright (C) 2010 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 #import "MockGeolocationProvider.h"
     27 
     28 
     29 @implementation MockGeolocationProvider
     30 
     31 + (MockGeolocationProvider *)shared
     32 {
     33     static MockGeolocationProvider *provider = [[MockGeolocationProvider alloc] init];
     34     return provider;
     35 }
     36 
     37 - (void)dealloc
     38 {
     39     ASSERT(_registeredViews.isEmpty());
     40 
     41     [_lastPosition release];
     42     [_error release];
     43     [super dealloc];
     44 }
     45 
     46 - (void)setPosition:(WebGeolocationPosition *)position
     47 {
     48     if (_lastPosition != position) {
     49         [_lastPosition release];
     50         _lastPosition = [position retain];
     51     }
     52 
     53     [_error release];
     54     _error = 0;
     55 
     56     if (!_timer)
     57         _timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(timerFired) userInfo:0 repeats:NO];
     58 }
     59 
     60 - (void)setError:(NSError *)error
     61 {
     62     if (_error != error) {
     63         [_error release];
     64         _error = [error retain];
     65     }
     66 
     67     [_lastPosition release];
     68     _lastPosition = 0;
     69 
     70     if (!_timer)
     71         _timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(timerFired) userInfo:0 repeats:NO];
     72 }
     73 
     74 - (void)registerWebView:(WebView *)webView
     75 {
     76     _registeredViews.add(webView);
     77 
     78     if (!_timer)
     79         _timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(timerFired) userInfo:0 repeats:NO];
     80 }
     81 
     82 - (void)unregisterWebView:(WebView *)webView
     83 {
     84     _registeredViews.remove(webView);
     85 }
     86 
     87 - (WebGeolocationPosition *)lastPosition
     88 {
     89     return _lastPosition;
     90 }
     91 
     92 - (void)stopTimer
     93 {
     94     [_timer invalidate];
     95     _timer = 0;
     96 }
     97 
     98 - (void)timerFired
     99 {
    100     _timer = 0;
    101 
    102     // Expect that views won't be (un)registered while iterating.
    103     HashSet<WebView*> views = _registeredViews;
    104     for (HashSet<WebView*>::iterator iter = views.begin(); iter != views.end(); ++iter) {
    105         if (_error)
    106             [*iter _geolocationDidFailWithError:_error];
    107         else
    108             [*iter _geolocationDidChangePosition:_lastPosition];
    109     }
    110 }
    111 
    112 @end
    113