OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * Copyright (C) 2012 Apple Inc. All Rights Reserved. | 3 * Copyright (C) 2012 Apple Inc. All Rights Reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 14 matching lines...) Expand all Loading... | |
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 */ | 30 */ |
31 | 31 |
32 #include "config.h" | 32 #include "config.h" |
33 #include "GeolocationClientMock.h" | 33 #include "GeolocationClientMock.h" |
34 | 34 |
35 #include "core/dom/Document.h" | |
35 #include "modules/geolocation/GeolocationController.h" | 36 #include "modules/geolocation/GeolocationController.h" |
36 #include "modules/geolocation/GeolocationError.h" | 37 #include "modules/geolocation/GeolocationError.h" |
37 #include "modules/geolocation/GeolocationPosition.h" | 38 #include "modules/geolocation/GeolocationPosition.h" |
38 | 39 |
39 namespace blink { | 40 namespace blink { |
40 | 41 |
41 GeolocationClientMock::GeolocationClientMock() | 42 GeolocationClientMock* GeolocationClientMock::from(Document* document) |
42 : m_hasError(false) | |
43 , m_controllerTimer(this, &GeolocationClientMock::controllerTimerFired) | |
44 , m_permissionTimer(this, &GeolocationClientMock::permissionTimerFired) | |
45 , m_isActive(false) | |
46 , m_permissionState(PermissionStateUnset) | |
47 { | 43 { |
44 GeolocationClientMock* supplement = static_cast<GeolocationClientMock*>(Will BeHeapSupplement<Document>::from(*document, supplementName())); | |
45 if (!supplement) { | |
46 supplement = new GeolocationClientMock(document); | |
47 WillBeHeapSupplement<Document>::provideTo(*document, supplementName(), a doptPtrWillBeNoop(supplement)); | |
48 document->setServiceProvider(supplement); | |
Marijn Kruisselbrink
2015/09/30 19:56:55
The constructor of GeolocationClientMock would hav
Sam McNally
2015/10/01 01:54:50
Done.
| |
49 } | |
50 return supplement; | |
51 } | |
52 | |
53 GeolocationClientMock::GeolocationClientMock(ExecutionContext* context) | |
54 : m_context(context) | |
55 , m_permissionState(permission::STATUS_ASK) | |
56 , m_geolocationBinding(this) | |
57 , m_permissionBinding(this) | |
58 { | |
59 m_context->setServiceProvider(this); | |
48 } | 60 } |
49 | 61 |
50 GeolocationClientMock::~GeolocationClientMock() | 62 GeolocationClientMock::~GeolocationClientMock() |
51 { | 63 { |
52 ASSERT(!m_isActive); | 64 if (m_context->serviceProvider() == this) |
65 m_context->setServiceProvider(nullptr); | |
53 } | 66 } |
54 | 67 |
55 void GeolocationClientMock::setPosition(GeolocationPosition* position) | 68 void GeolocationClientMock::setPosition(GeolocationPosition* position) |
56 { | 69 { |
57 m_lastPosition = position; | 70 m_lastPosition = geolocation::Geoposition::New(); |
58 clearError(); | 71 m_lastPosition->latitude = position->latitude(); |
59 asyncUpdateController(); | 72 m_lastPosition->longitude = position->longitude(); |
73 m_lastPosition->altitude = position->canProvideAltitude() ? position->altitu de() : -10000.; | |
74 m_lastPosition->accuracy = position->accuracy(); | |
75 m_lastPosition->altitude_accuracy = position->canProvideAltitudeAccuracy() ? position->altitudeAccuracy() : -1; | |
76 m_lastPosition->heading = position->canProvideHeading() ? position->heading( ) : -1; | |
77 m_lastPosition->speed = position->canProvideSpeed() ? position->speed() : -1 ; | |
78 m_lastPosition->timestamp = position->timestamp(); | |
79 m_lastPosition->error_message = ""; | |
80 m_lastPosition->valid = true; | |
81 runGeolocationCallbacks(); | |
60 } | 82 } |
61 | 83 |
62 void GeolocationClientMock::setPositionUnavailableError(const String& errorMessa ge) | 84 void GeolocationClientMock::setPositionUnavailableError(const String& errorMessa ge) |
63 { | 85 { |
64 m_hasError = true; | 86 m_lastPosition = geolocation::Geoposition::New(); |
65 m_errorMessage = errorMessage; | 87 m_lastPosition->error_code = geolocation::Geoposition::ERROR_CODE_POSITION_U NAVAILABLE; |
66 m_lastPosition = nullptr; | 88 m_lastPosition->error_message = errorMessage.utf8().data(); |
67 asyncUpdateController(); | 89 runGeolocationCallbacks(); |
68 } | 90 } |
69 | 91 |
70 void GeolocationClientMock::setPermission(bool allowed) | 92 void GeolocationClientMock::setPermission(bool allowed) |
71 { | 93 { |
72 m_permissionState = allowed ? PermissionStateAllowed : PermissionStateDenied ; | 94 m_permissionState = allowed ? permission::STATUS_GRANTED : permission::STATU S_DENIED; |
73 asyncUpdatePermission(); | 95 runPermissionCallbacks(); |
74 } | 96 } |
75 | 97 |
76 int GeolocationClientMock::numberOfPendingPermissionRequests() const | 98 int GeolocationClientMock::numberOfPendingPermissionRequests() const |
77 { | 99 { |
78 return m_pendingPermissions.size(); | 100 return m_pendingPermissions.size(); |
79 } | 101 } |
80 | 102 |
81 void GeolocationClientMock::requestPermission(Geolocation* geolocation) | 103 void GeolocationClientMock::SetHighAccuracy(bool highAccuracy) |
82 { | |
83 m_pendingPermissions.add(geolocation); | |
84 if (m_permissionState != PermissionStateUnset) | |
85 asyncUpdatePermission(); | |
86 } | |
87 | |
88 void GeolocationClientMock::cancelPermissionRequest(Geolocation* geolocation) | |
89 { | |
90 // Called from Geolocation::disconnectFrame() in response to LocalFrame dest ruction. | |
91 m_pendingPermissions.remove(geolocation); | |
92 if (m_pendingPermissions.isEmpty() && m_permissionTimer.isActive()) | |
93 m_permissionTimer.stop(); | |
94 } | |
95 | |
96 void GeolocationClientMock::controllerForTestAdded(GeolocationController* contro ller) | |
97 { | |
98 m_controllers.add(controller); | |
99 } | |
100 | |
101 void GeolocationClientMock::controllerForTestRemoved(GeolocationController* cont roller) | |
102 { | |
103 m_controllers.remove(controller); | |
104 } | |
105 | |
106 void GeolocationClientMock::asyncUpdatePermission() | |
107 { | |
108 ASSERT(m_permissionState != PermissionStateUnset); | |
109 if (!m_permissionTimer.isActive()) | |
110 m_permissionTimer.startOneShot(0, FROM_HERE); | |
111 } | |
112 | |
113 void GeolocationClientMock::permissionTimerFired(Timer<GeolocationClientMock>* t imer) | |
114 { | |
115 ASSERT_UNUSED(timer, timer == &m_permissionTimer); | |
116 ASSERT(m_permissionState != PermissionStateUnset); | |
117 bool allowed = m_permissionState == PermissionStateAllowed; | |
118 GeolocationSet::iterator end = m_pendingPermissions.end(); | |
119 | |
120 // Once permission has been set (or denied) on a Geolocation object, there c an be | |
121 // no further requests for permission to the mock. Consequently the callback s | |
122 // which fire synchronously from Geolocation::setIsAllowed() cannot reentran tly modify | |
123 // m_pendingPermissions. | |
124 for (GeolocationSet::iterator it = m_pendingPermissions.begin(); it != end; ++it) | |
125 (*it)->setIsAllowed(allowed); | |
126 m_pendingPermissions.clear(); | |
127 } | |
128 | |
129 void GeolocationClientMock::startUpdating() | |
130 { | |
131 ASSERT(!m_isActive); | |
132 m_isActive = true; | |
133 asyncUpdateController(); | |
134 } | |
135 | |
136 void GeolocationClientMock::stopUpdating() | |
137 { | |
138 ASSERT(m_isActive); | |
139 m_isActive = false; | |
140 m_controllerTimer.stop(); | |
141 } | |
142 | |
143 void GeolocationClientMock::setEnableHighAccuracy(bool) | |
144 { | 104 { |
145 // FIXME: We need to add some tests regarding "high accuracy" mode. | 105 // FIXME: We need to add some tests regarding "high accuracy" mode. |
146 // See https://bugs.webkit.org/show_bug.cgi?id=49438 | 106 // See https://bugs.webkit.org/show_bug.cgi?id=49438 |
147 } | 107 } |
148 | 108 |
149 GeolocationPosition* GeolocationClientMock::lastPosition() | 109 void GeolocationClientMock::QueryNextPosition(const QueryNextPositionCallback& c allback) |
150 { | 110 { |
151 return m_lastPosition.get(); | 111 m_pendingGeolocations.append(callback); |
112 runGeolocationCallbacks(); | |
152 } | 113 } |
153 | 114 |
154 void GeolocationClientMock::asyncUpdateController() | 115 void GeolocationClientMock::HasPermission(permission::Name permission, |
116 const mojo::String& origin, | |
117 const HasPermissionCallback& callback) | |
155 { | 118 { |
156 if (m_isActive && !m_controllerTimer.isActive()) | 119 callback.Run(permission::STATUS_ASK); |
157 m_controllerTimer.startOneShot(0, FROM_HERE); | |
158 } | 120 } |
159 | 121 |
160 void GeolocationClientMock::controllerTimerFired(Timer<GeolocationClientMock>* t imer) | 122 void GeolocationClientMock::RequestPermission(permission::Name permission, |
123 const mojo::String& origin, | |
124 bool userGesture, | |
125 const RequestPermissionCallback& callback) | |
161 { | 126 { |
162 ASSERT_UNUSED(timer, timer == &m_controllerTimer); | 127 m_pendingPermissions.append(callback); |
163 | 128 runPermissionCallbacks(); |
164 // Make a copy of the set of controllers since it might be modified while it erating. | |
165 GeolocationControllers controllers = m_controllers; | |
166 if (m_lastPosition.get()) { | |
167 ASSERT(!m_hasError); | |
168 for (GeolocationControllers::iterator it = controllers.begin(); it != co ntrollers.end(); ++it) | |
169 (*it)->positionChanged(m_lastPosition.get()); | |
170 } else if (m_hasError) { | |
171 for (GeolocationControllers::iterator it = controllers.begin(); it != co ntrollers.end(); ++it) | |
172 (*it)->errorOccurred(GeolocationError::create(GeolocationError::Posi tionUnavailable, m_errorMessage)); | |
173 } | |
174 } | 129 } |
175 | 130 |
176 void GeolocationClientMock::clearError() | 131 void GeolocationClientMock::RequestPermissions(mojo::Array<permission::Name> per missions, |
132 const mojo::String& origin, | |
133 bool userGesture, | |
134 const RequestPermissionsCallback& callback) | |
177 { | 135 { |
178 m_hasError = false; | 136 } |
179 m_errorMessage = String(); | 137 |
138 void GeolocationClientMock::RevokePermission(permission::Name permission, | |
139 const mojo::String& origin, | |
140 const RevokePermissionCallback& callback) | |
141 { | |
142 } | |
143 | |
144 void GeolocationClientMock::GetNextPermissionChange( | |
145 permission::Name permission, | |
146 const mojo::String& origin, | |
147 permission::Status lastKnownStatus, | |
148 const GetNextPermissionChangeCallback& callback) | |
149 { | |
150 } | |
151 | |
152 void GeolocationClientMock::ConnectToService(const mojo::String& interfaceName, mojo::ScopedMessagePipeHandle pipe) | |
153 { | |
Marijn Kruisselbrink
2015/09/30 19:56:55
While there is only one feature that uses mojo fro
Sam McNally
2015/10/01 01:54:50
This is a bit of a quick and nasty ServiceProvider
| |
154 if (interfaceName == geolocation::GeolocationService::Name_) | |
155 m_geolocationBinding.Bind(pipe.Pass()); | |
156 else if (interfaceName == permission::PermissionService::Name_) | |
157 m_permissionBinding.Bind(pipe.Pass()); | |
158 } | |
159 | |
160 void GeolocationClientMock::runGeolocationCallbacks() | |
161 { | |
162 if (m_pendingGeolocations.isEmpty() || !m_lastPosition) | |
163 return; | |
164 | |
165 for (const auto& callback : m_pendingGeolocations) | |
166 callback.Run(m_lastPosition.Clone()); | |
167 m_pendingGeolocations.clear(); | |
168 m_lastPosition = nullptr; | |
169 } | |
170 | |
171 void GeolocationClientMock::runPermissionCallbacks() | |
172 { | |
173 if (m_pendingPermissions.isEmpty() || m_permissionState == permission::STATU S_ASK) | |
174 return; | |
175 | |
176 for (const auto& pendingPermission : m_pendingPermissions) | |
177 pendingPermission.Run(m_permissionState); | |
178 m_permissionState = permission::STATUS_ASK; | |
179 m_pendingPermissions.clear(); | |
180 } | 180 } |
181 | 181 |
182 DEFINE_TRACE(GeolocationClientMock) | 182 DEFINE_TRACE(GeolocationClientMock) |
183 { | 183 { |
184 #if ENABLE(OILPAN) | 184 WillBeHeapSupplement<Document>::trace(visitor); |
185 visitor->trace(m_controllers); | |
186 #endif | |
187 visitor->trace(m_lastPosition); | |
188 visitor->trace(m_pendingPermissions); | 185 visitor->trace(m_pendingPermissions); |
189 GeolocationClient::trace(visitor); | 186 visitor->trace(m_pendingGeolocations); |
190 } | 187 } |
191 | 188 |
192 } // namespace blink | 189 } // namespace blink |
OLD | NEW |