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   Profile* profile =
     30       Profile::FromBrowserContext(web_contents->GetBrowserContext());
     31   default_zoom_level_.Init(prefs::kDefaultZoomLevel, profile->GetPrefs(),
     32                            base::Bind(&ZoomController::UpdateState,
     33                                       base::Unretained(this),
     34                                       std::string()));
     35 
     36   zoom_subscription_ = content::HostZoomMap::GetForBrowserContext(
     37       browser_context_)->AddZoomLevelChangedCallback(
     38           base::Bind(&ZoomController::OnZoomLevelChanged,
     39                      base::Unretained(this)));
     40 
     41   UpdateState(std::string());
     42 }
     43 
     44 ZoomController::~ZoomController() {}
     45 
     46 bool ZoomController::IsAtDefaultZoom() const {
     47   return content::ZoomValuesEqual(web_contents()->GetZoomLevel(),
     48                                   default_zoom_level_.GetValue());
     49 }
     50 
     51 int ZoomController::GetResourceForZoomLevel() const {
     52   if (IsAtDefaultZoom())
     53     return IDR_ZOOM_NORMAL;
     54   double zoom = web_contents()->GetZoomLevel();
     55   return zoom > default_zoom_level_.GetValue() ? IDR_ZOOM_PLUS : IDR_ZOOM_MINUS;
     56 }
     57 
     58 void ZoomController::DidNavigateMainFrame(
     59     const content::LoadCommittedDetails& details,
     60     const content::FrameNavigateParams& params) {
     61   // If the main frame's content has changed, the new page may have a different
     62   // zoom level from the old one.
     63   UpdateState(std::string());
     64 }
     65 
     66 void ZoomController::OnZoomLevelChanged(
     67     const content::HostZoomMap::ZoomLevelChange& change) {
     68   UpdateState(change.host);
     69 }
     70 
     71 void ZoomController::UpdateState(const std::string& host) {
     72   // If |host| is empty, all observers should be updated.
     73   if (!host.empty()) {
     74     // Use the navigation entry's URL instead of the WebContents' so virtual
     75     // URLs work (e.g. chrome://settings). http://crbug.com/153950
     76     content::NavigationEntry* entry =
     77         web_contents()->GetController().GetLastCommittedEntry();
     78     if (!entry ||
     79         host != net::GetHostOrSpecFromURL(entry->GetURL())) {
     80       return;
     81     }
     82   }
     83 
     84   bool dummy;
     85   zoom_percent_ = web_contents()->GetZoomPercent(&dummy, &dummy);
     86 
     87   if (observer_)
     88     observer_->OnZoomChanged(web_contents(), !host.empty());
     89 }
     90