15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <algorithm> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <cmath> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_context.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_zoom.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const char kHostZoomMapKeyName[] = "content_host_zoom_map"; 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string GetHostFromProcessView(int render_process_id, int render_view_id) { 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewHost* render_view_host = 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewHost::FromID(render_process_id, render_view_id); 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!render_view_host) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return std::string(); 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NavigationEntry* entry = 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_contents->GetController().GetLastCommittedEntry(); 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!entry) 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return std::string(); 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::GetHostOrSpecFromURL(entry->GetURL()); 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHostZoomMap* HostZoomMap::GetDefaultForBrowserContext(BrowserContext* context) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMapImpl* rv = static_cast<HostZoomMapImpl*>( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->GetUserData(kHostZoomMapKeyName)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rv) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = new HostZoomMapImpl(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->SetUserData(kHostZoomMapKeyName, rv); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Helper function for setting/getting zoom levels for WebContents without 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// having to import HostZoomMapImpl everywhere. 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)double HostZoomMap::GetZoomLevel(const WebContents* web_contents) { 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostZoomMapImpl* host_zoom_map = 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<HostZoomMapImpl*>(HostZoomMap::GetDefaultForBrowserContext( 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents->GetBrowserContext())); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return host_zoom_map->GetZoomLevelForWebContents( 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *static_cast<const WebContentsImpl*>(web_contents)); 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HostZoomMap::SetZoomLevel(const WebContents* web_contents, double level) { 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostZoomMapImpl* host_zoom_map = 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<HostZoomMapImpl*>(HostZoomMap::GetDefaultForBrowserContext( 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents->GetBrowserContext())); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host_zoom_map->SetZoomLevelForWebContents( 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *static_cast<const WebContentsImpl*>(web_contents), level); 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostZoomMapImpl::HostZoomMapImpl() 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : default_zoom_level_(0.0) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllSources()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostZoomMapImpl::CopyFrom(HostZoomMap* copy_interface) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This can only be called on the UI thread to avoid deadlocks, otherwise 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UI: a.CopyFrom(b); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IO: b.CopyFrom(a); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can deadlock. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMapImpl* copy = static_cast<HostZoomMapImpl*>(copy_interface); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock auto_lock(lock_); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock copy_auto_lock(copy->lock_); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_zoom_levels_. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) insert(copy->host_zoom_levels_.begin(), copy->host_zoom_levels_.end()); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (SchemeHostZoomLevels::const_iterator i(copy-> 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheme_host_zoom_levels_.begin()); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i != copy->scheme_host_zoom_levels_.end(); ++i) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheme_host_zoom_levels_[i->first] = HostZoomLevels(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheme_host_zoom_levels_[i->first]. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) insert(i->second.begin(), i->second.end()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_zoom_level_ = copy->default_zoom_level_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double HostZoomMapImpl::GetZoomLevelForHost(const std::string& host) const { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock auto_lock(lock_); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomLevels::const_iterator i(host_zoom_levels_.find(host)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool HostZoomMapImpl::HasZoomLevel(const std::string& scheme, 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& host) const { 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::AutoLock auto_lock(lock_); 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SchemeHostZoomLevels::const_iterator scheme_iterator( 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scheme_host_zoom_levels_.find(scheme)); 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const HostZoomLevels& zoom_levels = 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (scheme_iterator != scheme_host_zoom_levels_.end()) 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ? scheme_iterator->second 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : host_zoom_levels_; 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) HostZoomLevels::const_iterator i(zoom_levels.find(host)); 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return i != zoom_levels.end(); 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double HostZoomMapImpl::GetZoomLevelForHostAndScheme( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& scheme, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& host) const { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock auto_lock(lock_); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchemeHostZoomLevels::const_iterator scheme_iterator( 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheme_host_zoom_levels_.find(scheme)); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scheme_iterator != scheme_host_zoom_levels_.end()) { 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostZoomLevels::const_iterator i(scheme_iterator->second.find(host)); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i != scheme_iterator->second.end()) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return i->second; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetZoomLevelForHost(host); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)HostZoomMap::ZoomLevelVector HostZoomMapImpl::GetAllZoomLevels() const { 14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) HostZoomMap::ZoomLevelVector result; 14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) { 14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::AutoLock auto_lock(lock_); 14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) result.reserve(host_zoom_levels_.size() + scheme_host_zoom_levels_.size()); 15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for (HostZoomLevels::const_iterator i = host_zoom_levels_.begin(); 15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) i != host_zoom_levels_.end(); 15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ++i) { 15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ZoomLevelChange change = {HostZoomMap::ZOOM_CHANGED_FOR_HOST, 15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) i->first, // host 15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::string(), // scheme 15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) i->second // zoom level 15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) }; 15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) result.push_back(change); 15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for (SchemeHostZoomLevels::const_iterator i = 16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scheme_host_zoom_levels_.begin(); 16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) i != scheme_host_zoom_levels_.end(); 16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ++i) { 16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& scheme = i->first; 16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const HostZoomLevels& host_zoom_levels = i->second; 16623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for (HostZoomLevels::const_iterator j = host_zoom_levels.begin(); 16723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) j != host_zoom_levels.end(); 16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ++j) { 16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ZoomLevelChange change = {HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST, 17023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) j->first, // host 17123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scheme, // scheme 17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) j->second // zoom level 17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) }; 17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) result.push_back(change); 17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 17623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 17723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 17823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return result; 17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 18023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double level) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock auto_lock(lock_); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZoomValuesEqual(level, default_zoom_level_)) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_zoom_levels_.erase(host); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_zoom_levels_[host] = level; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(wjmaclean) Should we use a GURL here? crbug.com/384486 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SendZoomLevelChange(std::string(), host, level); 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostZoomMap::ZoomLevelChange change; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.host = host; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.zoom_level = level; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) zoom_level_changed_callbacks_.Notify(change); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HostZoomMapImpl::SetZoomLevelForHostAndScheme(const std::string& scheme, 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& host, 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double level) { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock auto_lock(lock_); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheme_host_zoom_levels_[scheme][host] = level; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SendZoomLevelChange(scheme, host, level); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostZoomMap::ZoomLevelChange change; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.mode = HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.host = host; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.scheme = scheme; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.zoom_level = level; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) zoom_level_changed_callbacks_.Notify(change); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double HostZoomMapImpl::GetDefaultZoomLevel() const { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_zoom_level_; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostZoomMapImpl::SetDefaultZoomLevel(double level) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_zoom_level_ = level; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_ptr<HostZoomMap::Subscription> 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)HostZoomMapImpl::AddZoomLevelChangedCallback( 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ZoomLevelChangedCallback& callback) { 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return zoom_level_changed_callbacks_.Add(callback); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)double HostZoomMapImpl::GetZoomLevelForWebContents( 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const WebContentsImpl& web_contents_impl) const { 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID(); 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int routing_id = web_contents_impl.GetRenderViewHost()->GetRoutingID(); 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (UsesTemporaryZoomLevel(render_process_id, routing_id)) 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetTemporaryZoomLevel(render_process_id, routing_id); 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Get the url from the navigation controller directly, as calling 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // WebContentsImpl::GetLastCommittedURL() may give us a virtual url that 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // is different than is stored in the map. 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL url; 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NavigationEntry* entry = 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents_impl.GetController().GetLastCommittedEntry(); 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // It is possible for a WebContent's zoom level to be queried before 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // a navigation has occurred. 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (entry) 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) url = entry->GetURL(); 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetZoomLevelForHostAndScheme(url.scheme(), 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::GetHostOrSpecFromURL(url)); 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HostZoomMapImpl::SetZoomLevelForWebContents( 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const WebContentsImpl& web_contents_impl, 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double level) { 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID(); 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID(); 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) { 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetTemporaryZoomLevel(render_process_id, render_view_id, level); 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Get the url from the navigation controller directly, as calling 27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // WebContentsImpl::GetLastCommittedURL() may give us a virtual url that 27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // is different than what the render view is using. If the two don't match, 27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // the attempt to set the zoom will fail. 27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) NavigationEntry* entry = 27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) web_contents_impl.GetController().GetLastCommittedEntry(); 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Tests may invoke this function with a null entry, but we don't 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // want to save zoom levels in this case. 277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!entry) 278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL url = entry->GetURL(); 28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetZoomLevelForHost(net::GetHostOrSpecFromURL(url), level); 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HostZoomMapImpl::SetZoomLevelForView(int render_process_id, 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int render_view_id, 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double level, 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& host) { 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetTemporaryZoomLevel(render_process_id, render_view_id, level); 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoomLevelForHost(host, level); 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id, 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int render_view_id) const { 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewKey key(render_process_id, render_view_id); 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::AutoLock auto_lock(lock_); 300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return ContainsKey(temporary_zoom_levels_, key); 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) const { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock auto_lock(lock_); 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewKey key(render_process_id, render_view_id); 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!ContainsKey(temporary_zoom_levels_, key)) 308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return 0; 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return temporary_zoom_levels_.find(key)->second; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double level) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewKey key(render_process_id, render_view_id); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock auto_lock(lock_); 321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) temporary_zoom_levels_[key] = level; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewHost* host = 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewHost::FromID(render_process_id, render_view_id); 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) host->Send(new ViewMsg_SetZoomLevelForView(render_view_id, true, level)); 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostZoomMap::ZoomLevelChange change; 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) change.host = GetHostFromProcessView(render_process_id, render_view_id); 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change.zoom_level = level; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) zoom_level_changed_callbacks_.Notify(change); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostZoomMapImpl::Observe(int type, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id = 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<RenderViewHost>(source)->GetProcess()->GetID(); 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ClearTemporaryZoomLevel(render_process_id, render_view_id); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unexpected preference observed."; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void HostZoomMapImpl::ClearTemporaryZoomLevel(int render_process_id, 353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int render_view_id) { 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::AutoLock auto_lock(lock_); 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewKey key(render_process_id, render_view_id); 357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemporaryZoomLevels::iterator it = temporary_zoom_levels_.find(key); 358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (it == temporary_zoom_levels_.end()) 359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) temporary_zoom_levels_.erase(it); 361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewHost* host = 363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewHost::FromID(render_process_id, render_view_id); 364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(host); 365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Send a new zoom level, host-specific if one exists. 366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) host->Send(new ViewMsg_SetZoomLevelForView( 367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) render_view_id, 368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false, 369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetZoomLevelForHost( 370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetHostFromProcessView(render_process_id, render_view_id)))); 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme, 374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& host, 375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) double level) { 376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); 377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !i.IsAtEnd(); i.Advance()) { 378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderProcessHost* render_process_host = i.GetCurrentValue(); 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (HostZoomMap::GetDefaultForBrowserContext( 380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) render_process_host->GetBrowserContext()) == this) { 381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) render_process_host->Send( 382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new ViewMsg_SetZoomLevelForCurrentURL(scheme, host, level)); 383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)HostZoomMapImpl::~HostZoomMapImpl() { 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 391