OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/geolocation/geolocation_provider.h" | 5 #include "chrome/browser/geolocation/geolocation_provider.h" |
6 | 6 |
7 #include "base/singleton.h" | 7 #include "base/singleton.h" |
| 8 #include "base/thread_restrictions.h" |
8 #include "chrome/browser/geolocation/location_arbitrator.h" | 9 #include "chrome/browser/geolocation/location_arbitrator.h" |
9 | 10 |
10 // This class is guaranteed to outlive its internal thread, so ref counting | 11 // This class is guaranteed to outlive its internal thread, so ref counting |
11 // is not required. | 12 // is not required. |
12 DISABLE_RUNNABLE_METHOD_REFCOUNT(GeolocationProvider); | 13 DISABLE_RUNNABLE_METHOD_REFCOUNT(GeolocationProvider); |
13 | 14 |
14 GeolocationProvider* GeolocationProvider::GetInstance() { | 15 GeolocationProvider* GeolocationProvider::GetInstance() { |
15 return Singleton<GeolocationProvider>::get(); | 16 return Singleton<GeolocationProvider>::get(); |
16 } | 17 } |
17 | 18 |
(...skipping 22 matching lines...) Expand all Loading... |
40 bool GeolocationProvider::RemoveObserver(GeolocationObserver* observer) { | 41 bool GeolocationProvider::RemoveObserver(GeolocationObserver* observer) { |
41 DCHECK(OnClientThread()); | 42 DCHECK(OnClientThread()); |
42 size_t remove = observers_.erase(observer); | 43 size_t remove = observers_.erase(observer); |
43 OnObserversChanged(); | 44 OnObserversChanged(); |
44 return remove > 0; | 45 return remove > 0; |
45 } | 46 } |
46 | 47 |
47 void GeolocationProvider::OnObserversChanged() { | 48 void GeolocationProvider::OnObserversChanged() { |
48 DCHECK(OnClientThread()); | 49 DCHECK(OnClientThread()); |
49 if (observers_.empty()) { | 50 if (observers_.empty()) { |
| 51 // http://crbug.com/66077: This is a bug. The geolocation thread may |
| 52 // transitively (via other threads it joins) block on long-running tasks / |
| 53 // IO. |
| 54 base::ThreadRestrictions::ScopedAllowIO allow_io; |
50 Stop(); | 55 Stop(); |
51 } else { | 56 } else { |
52 if (!IsRunning()) { | 57 if (!IsRunning()) { |
53 Start(); | 58 Start(); |
54 if (HasPermissionBeenGranted()) | 59 if (HasPermissionBeenGranted()) |
55 InformProvidersPermissionGranted(most_recent_authorized_frame_); | 60 InformProvidersPermissionGranted(most_recent_authorized_frame_); |
56 } | 61 } |
57 // The high accuracy requirement may have changed. | 62 // The high accuracy requirement may have changed. |
58 Task* task = NewRunnableMethod(this, | 63 Task* task = NewRunnableMethod(this, |
59 &GeolocationProvider::SetObserverOptions, | 64 &GeolocationProvider::SetObserverOptions, |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 return most_recent_authorized_frame_.is_valid(); | 136 return most_recent_authorized_frame_.is_valid(); |
132 } | 137 } |
133 | 138 |
134 bool GeolocationProvider::OnClientThread() const { | 139 bool GeolocationProvider::OnClientThread() const { |
135 return client_loop_->BelongsToCurrentThread(); | 140 return client_loop_->BelongsToCurrentThread(); |
136 } | 141 } |
137 | 142 |
138 bool GeolocationProvider::OnGeolocationThread() const { | 143 bool GeolocationProvider::OnGeolocationThread() const { |
139 return MessageLoop::current() == message_loop(); | 144 return MessageLoop::current() == message_loop(); |
140 } | 145 } |
OLD | NEW |