Verify HostZoomMapImpl lives on the UI thread.
By spamming it with DCHECK_CURRENTLY_ON() everywhere. Since no DCHECKs
failed, delete the lock and all the related code that assume the class
can be accessed on other threads. Add threading checks to ZoomController
as well.
Change-Id: I04f8315eaebd5839889a771fd5c13bf43c4d8f31
Reviewed-on: https://chromium-review.googlesource.com/762529
Reviewed-by: James MacLean <[email protected]>
Commit-Queue: Lei Zhang <[email protected]>
Cr-Commit-Position: refs/heads/master@{#517891}
diff --git a/content/browser/host_zoom_map_impl.cc b/content/browser/host_zoom_map_impl.cc
index 788ed10..f4518184 100644
--- a/content/browser/host_zoom_map_impl.cc
+++ b/content/browser/host_zoom_map_impl.cc
@@ -52,6 +52,7 @@
} // namespace
GURL HostZoomMap::GetURLFromEntry(const NavigationEntry* entry) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
switch (entry->GetPageType()) {
case PAGE_TYPE_ERROR:
return GURL(kUnreachableWebDataURL);
@@ -63,6 +64,7 @@
}
HostZoomMap* HostZoomMap::GetDefaultForBrowserContext(BrowserContext* context) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
StoragePartition* partition =
BrowserContext::GetDefaultStoragePartition(context);
DCHECK(partition);
@@ -70,6 +72,7 @@
}
HostZoomMap* HostZoomMap::Get(SiteInstance* instance) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
StoragePartition* partition = BrowserContext::GetStoragePartition(
instance->GetBrowserContext(), instance);
DCHECK(partition);
@@ -77,6 +80,7 @@
}
HostZoomMap* HostZoomMap::GetForWebContents(const WebContents* contents) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
// TODO(wjmaclean): Update this behaviour to work with OOPIF.
// See crbug.com/528407.
StoragePartition* partition =
@@ -89,6 +93,7 @@
// Helper function for setting/getting zoom levels for WebContents without
// having to import HostZoomMapImpl everywhere.
double HostZoomMap::GetZoomLevel(const WebContents* web_contents) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
HostZoomMapImpl* host_zoom_map = static_cast<HostZoomMapImpl*>(
HostZoomMap::GetForWebContents(web_contents));
return host_zoom_map->GetZoomLevelForWebContents(
@@ -96,6 +101,7 @@
}
bool HostZoomMap::PageScaleFactorIsOne(const WebContents* web_contents) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
HostZoomMapImpl* host_zoom_map = static_cast<HostZoomMapImpl*>(
HostZoomMap::GetForWebContents(web_contents));
return host_zoom_map->PageScaleFactorIsOneForWebContents(
@@ -103,6 +109,7 @@
}
void HostZoomMap::SetZoomLevel(const WebContents* web_contents, double level) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
HostZoomMapImpl* host_zoom_map = static_cast<HostZoomMapImpl*>(
HostZoomMap::GetForWebContents(web_contents));
host_zoom_map->SetZoomLevelForWebContents(
@@ -111,6 +118,7 @@
void HostZoomMap::SendErrorPageZoomLevelRefresh(
const WebContents* web_contents) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
HostZoomMapImpl* host_zoom_map =
static_cast<HostZoomMapImpl*>(HostZoomMap::GetDefaultForBrowserContext(
web_contents->GetBrowserContext()));
@@ -120,44 +128,32 @@
HostZoomMapImpl::HostZoomMapImpl()
: default_zoom_level_(0.0),
store_last_modified_(false),
- clock_(new base::DefaultClock) {}
+ clock_(std::make_unique<base::DefaultClock>()) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+}
void HostZoomMapImpl::CopyFrom(HostZoomMap* copy_interface) {
- // This can only be called on the UI thread to avoid deadlocks, otherwise
- // UI: a.CopyFrom(b);
- // IO: b.CopyFrom(a);
- // can deadlock.
DCHECK_CURRENTLY_ON(BrowserThread::UI);
HostZoomMapImpl* copy = static_cast<HostZoomMapImpl*>(copy_interface);
- base::AutoLock auto_lock(lock_);
- base::AutoLock copy_auto_lock(copy->lock_);
- host_zoom_levels_.
- insert(copy->host_zoom_levels_.begin(), copy->host_zoom_levels_.end());
- for (SchemeHostZoomLevels::const_iterator i(copy->
- scheme_host_zoom_levels_.begin());
- i != copy->scheme_host_zoom_levels_.end(); ++i) {
- scheme_host_zoom_levels_[i->first] = HostZoomLevels();
- scheme_host_zoom_levels_[i->first].
- insert(i->second.begin(), i->second.end());
+ host_zoom_levels_.insert(copy->host_zoom_levels_.begin(),
+ copy->host_zoom_levels_.end());
+ for (const auto& it : copy->scheme_host_zoom_levels_) {
+ const std::string& host = it.first;
+ scheme_host_zoom_levels_[host] = HostZoomLevels();
+ scheme_host_zoom_levels_[host].insert(it.second.begin(), it.second.end());
}
default_zoom_level_ = copy->default_zoom_level_;
}
double HostZoomMapImpl::GetZoomLevelForHost(const std::string& host) const {
- base::AutoLock auto_lock(lock_);
- return GetZoomLevelForHostInternal(host);
-}
-
-double HostZoomMapImpl::GetZoomLevelForHostInternal(
- const std::string& host) const {
- HostZoomLevels::const_iterator i(host_zoom_levels_.find(host));
- return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second.level;
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ const auto it = host_zoom_levels_.find(host);
+ return it != host_zoom_levels_.end() ? it->second.level : default_zoom_level_;
}
bool HostZoomMapImpl::HasZoomLevel(const std::string& scheme,
const std::string& host) const {
- base::AutoLock auto_lock(lock_);
-
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
SchemeHostZoomLevels::const_iterator scheme_iterator(
scheme_host_zoom_levels_.find(scheme));
@@ -166,13 +162,13 @@
? scheme_iterator->second
: host_zoom_levels_;
- HostZoomLevels::const_iterator i(zoom_levels.find(host));
- return i != zoom_levels.end();
+ return base::ContainsKey(zoom_levels, host);
}
-double HostZoomMapImpl::GetZoomLevelForHostAndSchemeInternal(
+double HostZoomMapImpl::GetZoomLevelForHostAndScheme(
const std::string& scheme,
const std::string& host) const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
SchemeHostZoomLevels::const_iterator scheme_iterator(
scheme_host_zoom_levels_.find(scheme));
if (scheme_iterator != scheme_host_zoom_levels_.end()) {
@@ -181,51 +177,43 @@
return i->second.level;
}
- return GetZoomLevelForHostInternal(host);
-}
-
-double HostZoomMapImpl::GetZoomLevelForHostAndScheme(
- const std::string& scheme,
- const std::string& host) const {
- base::AutoLock auto_lock(lock_);
- return GetZoomLevelForHostAndSchemeInternal(scheme, host);
+ return GetZoomLevelForHost(host);
}
HostZoomMap::ZoomLevelVector HostZoomMapImpl::GetAllZoomLevels() const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
HostZoomMap::ZoomLevelVector result;
- {
- base::AutoLock auto_lock(lock_);
- result.reserve(host_zoom_levels_.size() + scheme_host_zoom_levels_.size());
- for (const auto& entry : host_zoom_levels_) {
+ result.reserve(host_zoom_levels_.size() + scheme_host_zoom_levels_.size());
+ for (const auto& entry : host_zoom_levels_) {
+ ZoomLevelChange change = {
+ HostZoomMap::ZOOM_CHANGED_FOR_HOST,
+ entry.first, // host
+ std::string(), // scheme
+ entry.second.level, // zoom level
+ entry.second.last_modified // last modified
+ };
+ result.push_back(change);
+ }
+ for (const auto& scheme_entry : scheme_host_zoom_levels_) {
+ const std::string& scheme = scheme_entry.first;
+ const HostZoomLevels& host_zoom_levels = scheme_entry.second;
+ for (const auto& entry : host_zoom_levels) {
ZoomLevelChange change = {
- HostZoomMap::ZOOM_CHANGED_FOR_HOST,
+ HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST,
entry.first, // host
- std::string(), // scheme
+ scheme, // scheme
entry.second.level, // zoom level
entry.second.last_modified // last modified
};
result.push_back(change);
}
- for (const auto& scheme_entry : scheme_host_zoom_levels_) {
- const std::string& scheme = scheme_entry.first;
- const HostZoomLevels& host_zoom_levels = scheme_entry.second;
- for (const auto& entry : host_zoom_levels) {
- ZoomLevelChange change = {
- HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST,
- entry.first, // host
- scheme, // scheme
- entry.second.level, // zoom level
- entry.second.last_modified // last modified
- };
- result.push_back(change);
- }
- }
}
return result;
}
void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host,
double level) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
base::Time last_modified =
store_last_modified_ ? clock_->Now() : base::Time();
SetZoomLevelForHostInternal(host, level, last_modified);
@@ -234,6 +222,7 @@
void HostZoomMapImpl::InitializeZoomLevelForHost(const std::string& host,
double level,
base::Time last_modified) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
SetZoomLevelForHostInternal(host, level, last_modified);
}
@@ -242,16 +231,12 @@
base::Time last_modified) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- {
- base::AutoLock auto_lock(lock_);
-
- if (ZoomValuesEqual(level, default_zoom_level_)) {
- host_zoom_levels_.erase(host);
- } else {
- ZoomLevel& zoomLevel = host_zoom_levels_[host];
- zoomLevel.level = level;
- zoomLevel.last_modified = last_modified;
- }
+ if (ZoomValuesEqual(level, default_zoom_level_)) {
+ host_zoom_levels_.erase(host);
+ } else {
+ ZoomLevel& zoomLevel = host_zoom_levels_[host];
+ zoomLevel.level = level;
+ zoomLevel.last_modified = last_modified;
}
// TODO(wjmaclean) Should we use a GURL here? crbug.com/384486
@@ -270,12 +255,9 @@
const std::string& host,
double level) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- {
- base::AutoLock auto_lock(lock_);
- // No last_modified timestamp for scheme and host because they are
- // not persistet and are used for special cases only.
- scheme_host_zoom_levels_[scheme][host].level = level;
- }
+ // No last_modified timestamp for scheme and host because they are
+ // not persistet and are used for special cases only.
+ scheme_host_zoom_levels_[scheme][host].level = level;
SendZoomLevelChange(scheme, host, level);
@@ -303,14 +285,11 @@
default_zoom_level_ = level;
// First, remove all entries that match the new default zoom level.
- {
- base::AutoLock auto_lock(lock_);
- for (auto it = host_zoom_levels_.begin(); it != host_zoom_levels_.end(); ) {
- if (ZoomValuesEqual(it->second.level, default_zoom_level_))
- it = host_zoom_levels_.erase(it);
- else
- it++;
- }
+ for (auto it = host_zoom_levels_.begin(); it != host_zoom_levels_.end();) {
+ if (ZoomValuesEqual(it->second.level, default_zoom_level_))
+ it = host_zoom_levels_.erase(it);
+ else
+ it++;
}
// Second, update zoom levels for all pages that do not have an overriding
@@ -362,11 +341,13 @@
std::unique_ptr<HostZoomMap::Subscription>
HostZoomMapImpl::AddZoomLevelChangedCallback(
const ZoomLevelChangedCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
return zoom_level_changed_callbacks_.Add(callback);
}
double HostZoomMapImpl::GetZoomLevelForWebContents(
const WebContentsImpl& web_contents_impl) const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
int render_process_id =
web_contents_impl.GetRenderViewHost()->GetProcess()->GetID();
int routing_id = web_contents_impl.GetRenderViewHost()->GetRoutingID();
@@ -391,6 +372,7 @@
void HostZoomMapImpl::SetZoomLevelForWebContents(
const WebContentsImpl& web_contents_impl,
double level) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
int render_process_id =
web_contents_impl.GetRenderViewHost()->GetProcess()->GetID();
int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID();
@@ -417,6 +399,7 @@
int render_view_id,
double level,
const std::string& host) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (UsesTemporaryZoomLevel(render_process_id, render_view_id))
SetTemporaryZoomLevel(render_process_id, render_view_id, level);
else
@@ -426,11 +409,9 @@
void HostZoomMapImpl::SetPageScaleFactorIsOneForView(int render_process_id,
int render_view_id,
bool is_one) {
- {
- base::AutoLock auto_lock(lock_);
- view_page_scale_factors_are_one_[RenderViewKey(render_process_id,
- render_view_id)] = is_one;
- }
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ view_page_scale_factors_are_one_[RenderViewKey(render_process_id,
+ render_view_id)] = is_one;
HostZoomMap::ZoomLevelChange change;
change.mode = HostZoomMap::PAGE_SCALE_IS_ONE_CHANGED;
zoom_level_changed_callbacks_.Notify(change);
@@ -438,40 +419,36 @@
bool HostZoomMapImpl::PageScaleFactorIsOneForWebContents(
const WebContentsImpl& web_contents_impl) const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents_impl.GetRenderViewHost()->GetProcess())
return true;
- base::AutoLock auto_lock(lock_);
- auto found = view_page_scale_factors_are_one_.find(RenderViewKey(
+
+ const auto it = view_page_scale_factors_are_one_.find(RenderViewKey(
web_contents_impl.GetRenderViewHost()->GetProcess()->GetID(),
web_contents_impl.GetRenderViewHost()->GetRoutingID()));
- if (found == view_page_scale_factors_are_one_.end())
- return true;
- return found->second;
+ return it != view_page_scale_factors_are_one_.end() ? it->second : true;
}
void HostZoomMapImpl::ClearPageScaleFactorIsOneForView(int render_process_id,
int render_view_id) {
- base::AutoLock auto_lock(lock_);
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
view_page_scale_factors_are_one_.erase(
RenderViewKey(render_process_id, render_view_id));
}
bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id,
int render_view_id) const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
RenderViewKey key(render_process_id, render_view_id);
-
- base::AutoLock auto_lock(lock_);
return base::ContainsKey(temporary_zoom_levels_, key);
}
double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id,
int render_view_id) const {
- base::AutoLock auto_lock(lock_);
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
RenderViewKey key(render_process_id, render_view_id);
- if (!base::ContainsKey(temporary_zoom_levels_, key))
- return 0;
-
- return temporary_zoom_levels_.find(key)->second;
+ const auto it = temporary_zoom_levels_.find(key);
+ return it != temporary_zoom_levels_.end() ? it->second : 0;
}
void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id,
@@ -479,11 +456,8 @@
double level) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- {
- RenderViewKey key(render_process_id, render_view_id);
- base::AutoLock auto_lock(lock_);
- temporary_zoom_levels_[key] = level;
- }
+ RenderViewKey key(render_process_id, render_view_id);
+ temporary_zoom_levels_[key] = level;
WebContentsImpl* web_contents =
static_cast<WebContentsImpl*>(WebContents::FromRenderViewHost(
@@ -501,20 +475,21 @@
double HostZoomMapImpl::GetZoomLevelForView(const GURL& url,
int render_process_id,
int render_view_id) const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
RenderViewKey key(render_process_id, render_view_id);
- base::AutoLock auto_lock(lock_);
if (base::ContainsKey(temporary_zoom_levels_, key))
return temporary_zoom_levels_.find(key)->second;
- return GetZoomLevelForHostAndSchemeInternal(url.scheme(),
- net::GetHostOrSpecFromURL(url));
+ return GetZoomLevelForHostAndScheme(url.scheme(),
+ net::GetHostOrSpecFromURL(url));
}
void HostZoomMapImpl::ClearZoomLevels(base::Time delete_begin,
base::Time delete_end) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
double default_zoom_level = GetDefaultZoomLevel();
- for (auto& zoom_level : GetAllZoomLevels()) {
+ for (const auto& zoom_level : GetAllZoomLevels()) {
if (zoom_level.scheme.empty() && delete_begin <= zoom_level.last_modified &&
(delete_end.is_null() || zoom_level.last_modified < delete_end)) {
SetZoomLevelForHost(zoom_level.host, default_zoom_level);
@@ -523,19 +498,19 @@
}
void HostZoomMapImpl::SetStoreLastModified(bool store_last_modified) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
store_last_modified_ = store_last_modified;
}
void HostZoomMapImpl::ClearTemporaryZoomLevel(int render_process_id,
int render_view_id) {
- {
- base::AutoLock auto_lock(lock_);
- RenderViewKey key(render_process_id, render_view_id);
- TemporaryZoomLevels::iterator it = temporary_zoom_levels_.find(key);
- if (it == temporary_zoom_levels_.end())
- return;
- temporary_zoom_levels_.erase(it);
- }
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ RenderViewKey key(render_process_id, render_view_id);
+ TemporaryZoomLevels::iterator it = temporary_zoom_levels_.find(key);
+ if (it == temporary_zoom_levels_.end())
+ return;
+
+ temporary_zoom_levels_.erase(it);
WebContentsImpl* web_contents =
static_cast<WebContentsImpl*>(WebContents::FromRenderViewHost(
RenderViewHost::FromID(render_process_id, render_view_id)));
@@ -546,6 +521,7 @@
void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme,
const std::string& host,
double level) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
// We'll only send to WebContents not using temporary zoom levels. The one
// other case of interest is where the renderer is hosting a plugin document;
// that should be reflected in our temporary zoom level map, but we will
@@ -566,6 +542,7 @@
}
void HostZoomMapImpl::SendErrorPageZoomLevelRefresh() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
GURL error_url(kUnreachableWebDataURL);
std::string host = net::GetHostOrSpecFromURL(error_url);
double error_page_zoom_level = GetZoomLevelForHost(host);
@@ -575,6 +552,7 @@
void HostZoomMapImpl::WillCloseRenderView(int render_process_id,
int render_view_id) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
ClearTemporaryZoomLevel(render_process_id, render_view_id);
ClearPageScaleFactorIsOneForView(render_process_id, render_view_id);
}