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