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..99b4abc74659e2270527d5f944f6ffb7553249ff 100644 |
| --- a/content/browser/host_zoom_map_impl.cc |
| +++ b/content/browser/host_zoom_map_impl.cc |
| @@ -4,13 +4,16 @@ |
| #include "content/browser/host_zoom_map_impl.h" |
| +#include <algorithm> |
| #include <cmath> |
| #include "base/strings/string_piece.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/values.h" |
| +#include "content/browser/frame_host/navigation_entry_impl.h" |
| #include "content/browser/renderer_host/render_process_host_impl.h" |
| #include "content/browser/renderer_host/render_view_host_impl.h" |
| +#include "content/browser/web_contents/web_contents_impl.h" |
| #include "content/common/view_messages.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/browser_thread.h" |
| @@ -34,6 +37,22 @@ HostZoomMap* HostZoomMap::GetForBrowserContext(BrowserContext* context) { |
| return rv; |
| } |
| +// Helper function for setting/getting zoom levels for WebContents without |
| +// having to import HostZoomMapImpl everywhere. |
| +double HostZoomMap::GetZoomLevel(const WebContents* web_contents) { |
| + HostZoomMapImpl* host_zoom_map = static_cast<HostZoomMapImpl*>( |
| + HostZoomMap::GetForBrowserContext(web_contents->GetBrowserContext())); |
| + return host_zoom_map->GetZoomLevelForWebContents( |
| + *static_cast<const WebContentsImpl*>(web_contents)); |
| +} |
| + |
| +void HostZoomMap::SetZoomLevel(const WebContents* web_contents, double level) { |
| + HostZoomMapImpl* host_zoom_map = static_cast<HostZoomMapImpl*>( |
| + HostZoomMap::GetForBrowserContext(web_contents->GetBrowserContext())); |
| + host_zoom_map->SetZoomLevelForWebContents( |
| + *static_cast<const WebContentsImpl*>(web_contents), level); |
| +} |
| + |
| HostZoomMapImpl::HostZoomMapImpl() |
| : default_zoom_level_(0.0) { |
| registrar_.Add( |
| @@ -194,6 +213,80 @@ HostZoomMapImpl::AddZoomLevelChangedCallback( |
| return zoom_level_changed_callbacks_.Add(callback); |
| } |
| +double HostZoomMapImpl::GetZoomLevelForWebContents( |
| + const WebContentsImpl& web_contents_impl) const { |
| + int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID(); |
| + int routing_id = web_contents_impl.GetRenderViewHost()->GetRoutingID(); |
| + |
| + if (UsesTemporaryZoomLevel(render_process_id, routing_id)) |
| + return GetTemporaryZoomLevel(render_process_id, routing_id); |
| + |
| + // Since zoom map is updated using the url as stored in the navigation |
| + // controller, we use that URL to get the zoom level. |
| + GURL url; |
| + NavigationEntry* entry = |
| + web_contents_impl.GetController().GetLastCommittedEntry(); |
| + if (entry) |
| + url = entry->GetURL(); |
| + return GetZoomLevelForHostAndScheme(url.scheme(), |
| + net::GetHostOrSpecFromURL(url)); |
| +} |
| + |
| +void HostZoomMapImpl::SetZoomLevelForWebContents( |
| + const WebContentsImpl& web_contents_impl, |
| + double level) { |
| + int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID(); |
| + int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID(); |
| + if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) { |
| + |
| + SetTemporaryZoomLevel(render_process_id, render_view_id, level); |
| + } else { |
| + SetZoomLevelForHost( |
| + net::GetHostOrSpecFromURL(web_contents_impl.GetLastCommittedURL()), |
| + level); |
| + } |
| +} |
| + |
| +void HostZoomMapImpl::SetZoomLevelForView(int render_process_id, |
| + int render_view_id, |
| + double level, |
| + const std::string& host) { |
| + if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) |
| + SetTemporaryZoomLevel(render_process_id, render_view_id, level); |
| + else |
| + SetZoomLevelForHost(host, level); |
| +} |
| + |
| +bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id, |
| + int render_view_id) const { |
| + TemporaryZoomLevel zoom_level(render_process_id, render_view_id); |
| + |
| + base::AutoLock auto_lock(lock_); |
| + TemporaryZoomLevels::const_iterator it = 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 = 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); |
| + } |
| +} |
| + |
| double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, |
| int render_view_id) const { |
| base::AutoLock auto_lock(lock_); |
| @@ -203,6 +296,7 @@ double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, |
| return temporary_zoom_levels_[i].zoom_level; |
| } |
| } |
| + |
| return 0; |
| } |
| @@ -227,10 +321,7 @@ void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, |
| } |
| if (level && i == temporary_zoom_levels_.size()) { |
| - TemporaryZoomLevel temp; |
| - temp.render_process_id = render_process_id; |
| - temp.render_view_id = render_view_id; |
| - temp.zoom_level = level; |
| + TemporaryZoomLevel temp(render_process_id, render_view_id, level); |
| temporary_zoom_levels_.push_back(temp); |
| } |
| } |
| @@ -269,4 +360,23 @@ 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) { |
| +} |
| + |
| +HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, |
| + int view_id) |
| + : render_process_id(process_id), render_view_id(view_id), zoom_level(0.0) { |
|
Peter Kasting
2014/05/29 18:16:08
Nit: I read the style guide as saying that these n
wjmaclean
2014/05/29 20:14:19
Done.
Good point ... this was auto-formatted, so
|
| +} |
| + |
| +bool HostZoomMapImpl::TemporaryZoomLevel::operator==( |
| + const TemporaryZoomLevel& other) const { |
| + return other.render_process_id == render_process_id && |
| + other.render_view_id == render_view_id; |
| +} |
| + |
| } // namespace content |