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