Index: chrome/browser/geolocation/geolocation_provider.cc |
diff --git a/chrome/browser/geolocation/geolocation_provider.cc b/chrome/browser/geolocation/geolocation_provider.cc |
index 97e9049defad902ef6ac7447ebd1b9bce8f86092..3756af7807014978c33174824957cf9782b17246 100644 |
--- a/chrome/browser/geolocation/geolocation_provider.cc |
+++ b/chrome/browser/geolocation/geolocation_provider.cc |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/geolocation/geolocation_provider.h" |
#include "base/singleton.h" |
+#include "base/thread_restrictions.h" |
#include "chrome/browser/geolocation/location_arbitrator.h" |
// This class is guaranteed to outlive its internal thread, so ref counting |
@@ -47,6 +48,10 @@ bool GeolocationProvider::RemoveObserver(GeolocationObserver* observer) { |
void GeolocationProvider::OnObserversChanged() { |
DCHECK(OnClientThread()); |
if (observers_.empty()) { |
+ // http://crbug.com/66077: This is a bug. The geolocation thread may |
+ // transitively (via other threads it joins) block on long-running tasks / |
+ // IO. |
+ base::ThreadRestrictions::ScopedAllowIO allow_io; |
Stop(); |
} else { |
if (!IsRunning()) { |