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() { |
} |