initial import
[vuplus_webkit] / Tools / DumpRenderTree / mac / MockGeolocationProvider.mm
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