Home | History | Annotate | Download | only in zoom
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/zoom/zoom_controller.h"
      6 
      7 #include "base/prefs/pref_service.h"
      8 #include "chrome/browser/chrome_notification_types.h"
      9 #include "chrome/browser/profiles/profile.h"
     10 #include "chrome/browser/ui/browser_finder.h"
     11 #include "chrome/common/pref_names.h"
     12 #include "content/public/browser/host_zoom_map.h"
     13 #include "content/public/browser/navigation_entry.h"
     14 #include "content/public/browser/notification_details.h"
     15 #include "content/public/browser/notification_service.h"
     16 #include "content/public/browser/notification_types.h"
     17 #include "content/public/browser/web_contents.h"
     18 #include "content/public/common/page_zoom.h"
     19 #include "grit/theme_resources.h"
     20 #include "net/base/net_util.h"
     21 
     22 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ZoomController);
     23 
     24 ZoomController::ZoomController(content::WebContents* web_contents)
     25     : content::WebContentsObserver(web_contents),
     26       zoom_percent_(100),
     27       observer_(NULL),
     28       browser_context_(web_contents->GetBrowserContext()),
     29       zoom_callback_(base::Bind(&ZoomController::OnZoomLevelChanged,
     30                                 base::Unretained(this))) {
     31   Profile* profile =
     32       Profile::FromBrowserContext(web_contents->GetBrowserContext());
     33   default_zoom_level_.Init(prefs::kDefaultZoomLevel, profile->GetPrefs(),
     34                            base::Bind(&ZoomController::UpdateState,
     35                                       base::Unretained(this),
     36                                       std::string()));
     37 
     38   content::HostZoomMap::GetForBrowserContext(
     39       browser_context_)->AddZoomLevelChangedCallback(
     40           zoom_callback_);
     41 
     42   UpdateState(std::string());
     43 }
     44 
     45 ZoomController::~ZoomController() {
     46   content::HostZoomMap::GetForBrowserContext(
     47       browser_context_)->RemoveZoomLevelChangedCallback(
     48           zoom_callback_);
     49 }
     50 
     51 bool ZoomController::IsAtDefaultZoom() const {
     52   return content::ZoomValuesEqual(web_contents()->GetZoomLevel(),
     53                                   default_zoom_level_.GetValue());
     54 }
     55 
     56 int ZoomController::GetResourceForZoomLevel() const {
     57   if (IsAtDefaultZoom())
     58     return IDR_ZOOM_NORMAL;
     59   double zoom = web_contents()->GetZoomLevel();
     60   return zoom > default_zoom_level_.GetValue() ? IDR_ZOOM_PLUS : IDR_ZOOM_MINUS;
     61 }
     62 
     63 void ZoomController::DidNavigateMainFrame(
     64     const content::LoadCommittedDetails& details,
     65     const content::FrameNavigateParams& params) {
     66   // If the main frame's content has changed, the new page may have a different
     67   // zoom level from the old one.
     68   UpdateState(std::string());
     69 }
     70 
     71 void ZoomController::OnZoomLevelChanged(
     72     const content::HostZoomMap::ZoomLevelChange& change) {
     73   UpdateState(change.host);
     74 }
     75 
     76 void ZoomController::UpdateState(const std::string& host) {
     77   // If |host| is empty, all observers should be updated.
     78   if (!host.empty()) {
     79     // Use the active navigation entry's URL instead of the WebContents' so
     80     // virtual URLs work (e.g. chrome://settings). http://crbug.com/153950
     81     content::NavigationEntry* active_entry =
     82         web_contents()->GetController().GetActiveEntry();
     83     if (!active_entry ||
     84         host != net::GetHostOrSpecFromURL(active_entry->GetURL())) {
     85       return;
     86     }
     87   }
     88 
     89   bool dummy;
     90   zoom_percent_ = web_contents()->GetZoomPercent(&dummy, &dummy);
     91 
     92   if (observer_)
     93     observer_->OnZoomChanged(web_contents(), !host.empty());
     94 }
     95