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 97a2ac7816d10a66751af9bc6f937313047db003..065ad2cdac1ea22b37a345344b96eada8b197a3f 100644 |
| --- a/content/browser/host_zoom_map_impl.cc |
| +++ b/content/browser/host_zoom_map_impl.cc |
| @@ -5,6 +5,7 @@ |
| #include "content/browser/host_zoom_map_impl.h" |
| #include <cmath> |
| +#include <set> |
| #include "base/strings/string_piece.h" |
| #include "base/strings/utf_string_conversions.h" |
| @@ -17,6 +18,7 @@ |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/notification_types.h" |
| #include "content/public/browser/resource_context.h" |
| +#include "content/public/browser/web_contents.h" |
| #include "content/public/common/page_zoom.h" |
| #include "net/base/net_util.h" |
| @@ -39,6 +41,9 @@ HostZoomMapImpl::HostZoomMapImpl() |
| registrar_.Add( |
| this, NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, |
| NotificationService::AllSources()); |
| + registrar_.Add( |
| + this, NOTIFICATION_WEB_CONTENTS_NO_TEMPORARY_ZOOM_LEVEL, |
| + NotificationService::AllSources()); |
| } |
| void HostZoomMapImpl::CopyFrom(HostZoomMap* copy_interface) { |
| @@ -122,6 +127,12 @@ HostZoomMap::ZoomLevelVector HostZoomMapImpl::GetAllZoomLevels() const { |
| void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host, |
| double level) { |
| + SetZoomLevelForHost(host, 0, level); |
| +} |
| + |
| +void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host, |
| + int zoom_id, |
| + double level) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| { |
| @@ -133,21 +144,14 @@ 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; |
| change.zoom_level = level; |
| + CallZoomCallback(zoom_id); |
| zoom_level_changed_callbacks_.Notify(change); |
| } |
| @@ -160,16 +164,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; |
| @@ -194,6 +189,12 @@ HostZoomMapImpl::AddZoomLevelChangedCallback( |
| return zoom_level_changed_callbacks_.Add(callback); |
| } |
| +void HostZoomMapImpl::AddZoomCallback( |
| + int zoom_id, |
| + const base::Callback<void(void)>& callback) { |
| + zoom_callback_map_[zoom_id] = callback; |
| +} |
| + |
| double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, |
| int render_view_id) const { |
| base::AutoLock auto_lock(lock_); |
| @@ -208,6 +209,8 @@ double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, |
| void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, |
| int render_view_id, |
| + const std::string& host, |
| + int zoom_id, |
| double level) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| @@ -217,11 +220,7 @@ void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, |
| 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); |
| - } |
| + temporary_zoom_levels_[i].zoom_level = level; |
| break; |
| } |
| } |
| @@ -237,8 +236,10 @@ void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, |
| HostZoomMap::ZoomLevelChange change; |
| change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; |
| + change.host = host; |
| change.zoom_level = level; |
| + CallZoomCallback(zoom_id); |
| zoom_level_changed_callbacks_.Notify(change); |
| } |
| @@ -251,14 +252,16 @@ void HostZoomMapImpl::Observe(int type, |
| 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; |
| - } |
| - } |
| + EraseTemporaryZoomLevel(render_process_id, render_view_id); |
| + break; |
| + } |
| + case NOTIFICATION_WEB_CONTENTS_NO_TEMPORARY_ZOOM_LEVEL: { |
| + base::AutoLock auto_lock(lock_); |
| + int render_view_id = |
| + Source<WebContents>(source)->GetRenderViewHost()->GetRoutingID(); |
| + int render_process_id = |
| + Source<WebContents>(source)->GetRenderProcessHost()->GetID(); |
| + EraseTemporaryZoomLevel(render_process_id, render_view_id); |
| break; |
| } |
| default: |
| @@ -266,6 +269,47 @@ void HostZoomMapImpl::Observe(int type, |
| } |
| } |
| +void HostZoomMapImpl::EraseTemporaryZoomLevel(int render_process_id, |
| + int render_view_id) { |
| + 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; |
| + } |
| + } |
| +} |
| + |
| +void HostZoomMapImpl::CallZoomCallback(int zoom_id) { |
| + std::map<int, base::Callback<void(void)> >::iterator it = |
| + zoom_callback_map_.find(zoom_id); |
| + if (it != zoom_callback_map_.end()) { |
|
Fady Samuel
2014/04/10 14:27:25
Preferred early exit.
if (it == zoom_callback_map
paulmeyer
2014/04/10 15:11:49
Done.
|
| + it->second.Run(); |
| + zoom_callback_map_.erase(it); |
| + } |
| +} |
| + |
| +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) { |
| + int render_process_id = render_process_host->GetID(); |
| + std::set<int> exceptions; |
| + for (size_t i = 0; i != temporary_zoom_levels_.size(); ++i) { |
| + if (temporary_zoom_levels_[i].render_process_id == render_process_id) { |
|
Fady Samuel
2014/04/10 14:27:25
Braces unnecessary.
paulmeyer
2014/04/10 15:11:49
Done.
|
| + exceptions.insert(temporary_zoom_levels_[i].render_view_id); |
| + } |
| + } |
| + render_process_host->Send(new ViewMsg_SetZoomLevelForCurrentURL( |
| + scheme, host, level, exceptions)); |
| + } |
| + } |
| +} |
| + |
| HostZoomMapImpl::~HostZoomMapImpl() { |
| } |