Index: content/browser/host_zoom_map_impl.cc |
diff --git a/content/browser/host_zoom_map_impl.cc b/content/browser/host_zoom_map_impl.cc |
index c52d54f8f86074dcb63890c56c5ba94462b843b3..1b5f7a2f7d752a25cd4fef01246b7a277c975823 100644 |
--- a/content/browser/host_zoom_map_impl.cc |
+++ b/content/browser/host_zoom_map_impl.cc |
@@ -27,6 +27,27 @@ static const char* kHostZoomMapKeyName = "content_host_zoom_map"; |
namespace content { |
+namespace { |
+ |
+std::string GetHostFromProcessView(int render_process_id, int render_view_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ RenderViewHost* render_view_host = |
+ RenderViewHost::FromID(render_process_id, render_view_id); |
+ if (!render_view_host) |
+ return std::string(); |
+ |
+ WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); |
+ |
+ NavigationEntry* entry = |
+ web_contents->GetController().GetLastCommittedEntry(); |
+ if (!entry) |
+ return std::string(); |
+ |
+ return net::GetHostOrSpecFromURL(entry->GetURL()); |
+} |
+ |
+} // namespace |
+ |
HostZoomMap* HostZoomMap::GetForBrowserContext(BrowserContext* context) { |
HostZoomMapImpl* rv = static_cast<HostZoomMapImpl*>( |
context->GetUserData(kHostZoomMapKeyName)); |
@@ -87,6 +108,22 @@ double HostZoomMapImpl::GetZoomLevelForHost(const std::string& host) const { |
return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second; |
} |
+bool HostZoomMapImpl::HasZoomLevel(const std::string& scheme, |
+ const std::string& host) const { |
+ base::AutoLock auto_lock(lock_); |
+ |
+ SchemeHostZoomLevels::const_iterator scheme_iterator( |
+ scheme_host_zoom_levels_.find(scheme)); |
+ |
+ const HostZoomLevels& zoom_levels = |
+ (scheme_iterator != scheme_host_zoom_levels_.end()) |
+ ? scheme_iterator->second |
+ : host_zoom_levels_; |
+ |
+ HostZoomLevels::const_iterator i(zoom_levels.find(host)); |
+ return i != zoom_levels.end(); |
+} |
+ |
double HostZoomMapImpl::GetZoomLevelForHostAndScheme( |
const std::string& scheme, |
const std::string& host) const { |
@@ -152,16 +189,9 @@ void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host, |
host_zoom_levels_[host] = level; |
} |
- // Notify renderers from this browser context. |
- for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); |
- !i.IsAtEnd(); i.Advance()) { |
- RenderProcessHost* render_process_host = i.GetCurrentValue(); |
- if (HostZoomMap::GetForBrowserContext( |
- render_process_host->GetBrowserContext()) == this) { |
- render_process_host->Send( |
- new ViewMsg_SetZoomLevelForCurrentURL(std::string(), host, level)); |
- } |
- } |
+ // TODO(wjmaclean) Should we use a GURL here? crbug.com/384486 |
+ SendZoomLevelChange(std::string(), host, level); |
+ |
HostZoomMap::ZoomLevelChange change; |
change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST; |
change.host = host; |
@@ -179,16 +209,7 @@ void HostZoomMapImpl::SetZoomLevelForHostAndScheme(const std::string& scheme, |
scheme_host_zoom_levels_[scheme][host] = level; |
} |
- // Notify renderers from this browser context. |
- for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); |
- !i.IsAtEnd(); i.Advance()) { |
- RenderProcessHost* render_process_host = i.GetCurrentValue(); |
- if (HostZoomMap::GetForBrowserContext( |
- render_process_host->GetBrowserContext()) == this) { |
- render_process_host->Send( |
- new ViewMsg_SetZoomLevelForCurrentURL(scheme, host, level)); |
- } |
- } |
+ SendZoomLevelChange(scheme, host, level); |
HostZoomMap::ZoomLevelChange change; |
change.mode = HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST; |
@@ -271,45 +292,20 @@ void HostZoomMapImpl::SetZoomLevelForView(int render_process_id, |
bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id, |
int render_view_id) const { |
- TemporaryZoomLevel zoom_level(render_process_id, render_view_id); |
+ RenderViewKey key(render_process_id, render_view_id); |
base::AutoLock auto_lock(lock_); |
- TemporaryZoomLevels::const_iterator it = std::find( |
- temporary_zoom_levels_.begin(), temporary_zoom_levels_.end(), zoom_level); |
- return it != temporary_zoom_levels_.end(); |
-} |
- |
-void HostZoomMapImpl::SetUsesTemporaryZoomLevel( |
- int render_process_id, |
- int render_view_id, |
- bool uses_temporary_zoom_level) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- TemporaryZoomLevel zoom_level( |
- render_process_id, render_view_id, default_zoom_level_); |
- |
- base::AutoLock auto_lock(lock_); |
- TemporaryZoomLevels::iterator it = std::find( |
- temporary_zoom_levels_.begin(), temporary_zoom_levels_.end(), zoom_level); |
- if (uses_temporary_zoom_level) { |
- if (it == temporary_zoom_levels_.end()) |
- temporary_zoom_levels_.push_back(zoom_level); |
- } else if (it != temporary_zoom_levels_.end()) { |
- temporary_zoom_levels_.erase(it); |
- } |
+ return ContainsKey(temporary_zoom_levels_, key); |
} |
double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, |
int render_view_id) const { |
base::AutoLock auto_lock(lock_); |
- for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { |
- if (temporary_zoom_levels_[i].render_process_id == render_process_id && |
- temporary_zoom_levels_[i].render_view_id == render_view_id) { |
- return temporary_zoom_levels_[i].zoom_level; |
- } |
- } |
+ RenderViewKey key(render_process_id, render_view_id); |
+ if (!ContainsKey(temporary_zoom_levels_, key)) |
+ return 0; |
- return 0; |
+ return temporary_zoom_levels_.find(key)->second; |
} |
void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, |
@@ -318,28 +314,18 @@ void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
{ |
+ RenderViewKey key(render_process_id, render_view_id); |
base::AutoLock auto_lock(lock_); |
- size_t i; |
- for (i = 0; i < temporary_zoom_levels_.size(); ++i) { |
- if (temporary_zoom_levels_[i].render_process_id == render_process_id && |
- temporary_zoom_levels_[i].render_view_id == render_view_id) { |
- if (level) { |
- temporary_zoom_levels_[i].zoom_level = level; |
- } else { |
- temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i); |
- } |
- break; |
- } |
- } |
- |
- if (level && i == temporary_zoom_levels_.size()) { |
- TemporaryZoomLevel temp(render_process_id, render_view_id, level); |
- temporary_zoom_levels_.push_back(temp); |
- } |
+ temporary_zoom_levels_[key] = level; |
} |
+ RenderViewHost* host = |
+ RenderViewHost::FromID(render_process_id, render_view_id); |
+ host->Send(new ViewMsg_SetZoomLevelForView(render_view_id, true, level)); |
+ |
HostZoomMap::ZoomLevelChange change; |
change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; |
+ change.host = GetHostFromProcessView(render_process_id, render_view_id); |
change.zoom_level = level; |
zoom_level_changed_callbacks_.Notify(change); |
@@ -350,18 +336,10 @@ void HostZoomMapImpl::Observe(int type, |
const NotificationDetails& details) { |
switch (type) { |
case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { |
- base::AutoLock auto_lock(lock_); |
int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); |
int render_process_id = |
Source<RenderViewHost>(source)->GetProcess()->GetID(); |
- |
- for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { |
- if (temporary_zoom_levels_[i].render_process_id == render_process_id && |
- temporary_zoom_levels_[i].render_view_id == render_view_id) { |
- temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i); |
- break; |
- } |
- } |
+ ClearTemporaryZoomLevel(render_process_id, render_view_id); |
break; |
} |
default: |
@@ -369,28 +347,42 @@ void HostZoomMapImpl::Observe(int type, |
} |
} |
-HostZoomMapImpl::~HostZoomMapImpl() { |
-} |
- |
-HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, |
- int view_id, |
- double level) |
- : render_process_id(process_id), |
- render_view_id(view_id), |
- zoom_level(level) { |
+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); |
+ } |
+ RenderViewHost* host = |
+ RenderViewHost::FromID(render_process_id, render_view_id); |
+ DCHECK(host); |
+ // Send a new zoom level, host-specific if one exists. |
+ host->Send(new ViewMsg_SetZoomLevelForView( |
+ render_view_id, |
+ false, |
+ GetZoomLevelForHost( |
+ GetHostFromProcessView(render_process_id, render_view_id)))); |
} |
-HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, |
- int view_id) |
- : render_process_id(process_id), |
- render_view_id(view_id), |
- zoom_level(0.0) { |
+void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme, |
+ const std::string& host, |
+ double level) { |
+ for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); |
+ !i.IsAtEnd(); i.Advance()) { |
+ RenderProcessHost* render_process_host = i.GetCurrentValue(); |
+ if (HostZoomMap::GetForBrowserContext( |
+ render_process_host->GetBrowserContext()) == this) { |
+ render_process_host->Send( |
+ new ViewMsg_SetZoomLevelForCurrentURL(scheme, host, level)); |
+ } |
+ } |
} |
-bool HostZoomMapImpl::TemporaryZoomLevel::operator==( |
- const TemporaryZoomLevel& other) const { |
- return other.render_process_id == render_process_id && |
- other.render_view_id == render_view_id; |
+HostZoomMapImpl::~HostZoomMapImpl() { |
} |
} // namespace content |