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