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)#ifndef CHROME_BROWSER_UI_ZOOM_ZOOM_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_ZOOM_ZOOM_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/host_zoom_map.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ZoomObserver;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Per-tab class to manage the Omnibox zoom icon.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ZoomController : public content::WebContentsObserver,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public content::WebContentsUserData<ZoomController> {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ZoomController();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int zoom_percent() const { return zoom_percent_; }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convenience method to quickly check if the tab's at default zoom.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsAtDefaultZoom() const;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns which image should be loaded for the current zoom level.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetResourceForZoomLevel() const;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_observer(ZoomObserver* observer) { observer_ = observer; }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::WebContentsObserver overrides:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidNavigateMainFrame(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::LoadCommittedDetails& details,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::FrameNavigateParams& params) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ZoomController(content::WebContents* web_contents);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class content::WebContentsUserData<ZoomController>;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ZoomControllerTest;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnZoomLevelChanged(const content::HostZoomMap::ZoomLevelChange& change);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the zoom icon and zoom percentage based on current values and
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifies the observer if changes have occurred. |host| may be empty,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // meaning the change should apply to ~all sites. If it is not empty, the
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // change only affects sites with the given host.
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void UpdateState(const std::string& host);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current zoom percentage.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int zoom_percent_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to access the default zoom level preference.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoublePrefMember default_zoom_level_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observer receiving notifications on state changes.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ZoomObserver* observer_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::BrowserContext* browser_context_;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::HostZoomMap::ZoomLevelChangedCallback zoom_callback_;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ZoomController);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_ZOOM_ZOOM_CONTROLLER_H_
72