1 /*
2 * Copyright 2012, The Android Open Source Project
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 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER 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 "GeolocationManager.h"
28
29 #include "GeolocationClientImpl.h"
30 #include "WebViewCore.h"
31
32 #include <Frame.h>
33 #include <GeolocationError.h>
34 #include <GeolocationPosition.h>
35 #include <JNIHelp.h>
36 #include <Page.h>
37
38 using WebCore::GeolocationClient;
39 using WebCore::GeolocationClientMock;
40
41 namespace android {
42
GeolocationManager(WebViewCore * webViewCore)43 GeolocationManager::GeolocationManager(WebViewCore* webViewCore)
44 : m_useMock(false)
45 , m_webViewCore(webViewCore)
46 {
47 }
48
client() const49 GeolocationClient* GeolocationManager::client() const
50 {
51 if (m_useMock)
52 return mockClient();
53 return realClient();
54 }
55
suspendRealClient()56 void GeolocationManager::suspendRealClient()
57 {
58 // Don't create the real client if it's not present.
59 if (m_realClient)
60 m_realClient->suspend();
61 }
62
resumeRealClient()63 void GeolocationManager::resumeRealClient()
64 {
65 // Don't create the real client if it's not present.
66 if (m_realClient)
67 m_realClient->resume();
68 }
69
resetRealClientTemporaryPermissionStates()70 void GeolocationManager::resetRealClientTemporaryPermissionStates()
71 {
72 // Don't create the real client if it's not present.
73 if (m_realClient)
74 m_realClient->resetTemporaryPermissionStates();
75 }
76
provideRealClientPermissionState(WTF::String origin,bool allow,bool remember)77 void GeolocationManager::provideRealClientPermissionState(WTF::String origin, bool allow, bool remember)
78 {
79 // Don't create the real client if it's not present.
80 if (m_realClient)
81 m_realClient->providePermissionState(origin, allow, remember);
82 }
83
setUseMock()84 void GeolocationManager::setUseMock()
85 {
86 m_useMock = true;
87 m_mockClient.clear();
88 }
89
setMockPosition(PassRefPtr<WebCore::GeolocationPosition> position)90 void GeolocationManager::setMockPosition(PassRefPtr<WebCore::GeolocationPosition> position)
91 {
92 ASSERT(m_useMock);
93 mockClient()->setPosition(position);
94 }
95
setMockError(PassRefPtr<WebCore::GeolocationError> error)96 void GeolocationManager::setMockError(PassRefPtr<WebCore::GeolocationError> error)
97 {
98 ASSERT(m_useMock);
99 mockClient()->setError(error);
100 }
101
setMockPermission(bool allowed)102 void GeolocationManager::setMockPermission(bool allowed)
103 {
104 ASSERT(m_useMock);
105 mockClient()->setPermission(allowed);
106 }
107
realClient() const108 GeolocationClientImpl* GeolocationManager::realClient() const
109 {
110 if (!m_realClient)
111 m_realClient.set(new GeolocationClientImpl(m_webViewCore));
112 return m_realClient.get();
113 }
114
mockClient() const115 GeolocationClientMock* GeolocationManager::mockClient() const
116 {
117 ASSERT(m_useMock);
118 if (!m_mockClient) {
119 m_mockClient.set(new GeolocationClientMock);
120 m_mockClient->setController(m_webViewCore->mainFrame()->page()->geolocationController());
121 }
122 return m_mockClient.get();
123 }
124
125 } // namespace android
126