Chromium Code Reviews| 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..7ec41653a5db304481b62a736936dacb11bf4074 100644 |
| --- a/content/browser/host_zoom_map_impl.cc |
| +++ b/content/browser/host_zoom_map_impl.cc |
| @@ -87,6 +87,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 +168,8 @@ 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)); |
| - } |
| - } |
| + SendZoomLevelChange(std::string(), host, level); |
| + |
| HostZoomMap::ZoomLevelChange change; |
| change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST; |
| change.host = host; |
| @@ -179,16 +187,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,75 +270,63 @@ 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; |
| } |
| +namespace { |
|
jam
2014/06/12 21:35:52
nit: in general, there's usually one anonymous nam
wjmaclean
2014/06/13 16:00:16
Done.
|
| + |
| +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); |
| + DCHECK(web_contents); |
|
jam
2014/06/12 21:35:52
this is unnecessary. in release builds, it does no
wjmaclean
2014/06/13 16:00:16
Done.
|
| + |
| + NavigationEntry* entry = |
| + web_contents->GetController().GetLastCommittedEntry(); |
| + if (!entry) |
| + return std::string(); |
| + |
| + return net::GetHostOrSpecFromURL(entry->GetURL()); |
| +} |
| + |
| +} // namespace |
| + |
| void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, |
| int render_view_id, |
| double level) { |
| 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); |
| + DCHECK(host); |
|
jam
2014/06/12 21:35:52
ditto
wjmaclean
2014/06/13 16:00:16
Done.
|
| + 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 +337,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 +348,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 |