• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CONTENT_PUBLIC_BROWSER_HOST_ZOOM_MAP_H_
6 #define CONTENT_PUBLIC_BROWSER_HOST_ZOOM_MAP_H_
7 
8 #include <map>
9 #include <string>
10 #include <vector>
11 
12 #include "base/basictypes.h"
13 #include "base/callback.h"
14 #include "base/callback_list.h"
15 #include "content/common/content_export.h"
16 
17 namespace content {
18 
19 class BrowserContext;
20 class ResourceContext;
21 class WebContents;
22 
23 // Maps hostnames to custom zoom levels.  Written on the UI thread and read on
24 // any thread.  One instance per browser context. Must be created on the UI
25 // thread, and it'll delete itself on the UI thread as well.
26 // Zoom can be defined at three levels: default zoom, zoom for host, and zoom
27 // for host with specific scheme. Setting any of the levels leaves settings
28 // for other settings intact. Getting the zoom level starts at the most
29 // specific setting and progresses to the less specific: first the zoom for the
30 // host and scheme pair is checked, secondly the zoom for the host only and
31 // lastly default zoom.
32 
33 class HostZoomMap {
34  public:
35   // Enum that indicates what was the scope of zoom level change.
36   enum ZoomLevelChangeMode {
37     ZOOM_CHANGED_FOR_HOST,            // Zoom level changed for host.
38     ZOOM_CHANGED_FOR_SCHEME_AND_HOST, // Zoom level changed for scheme/host
39                                       // pair.
40     ZOOM_CHANGED_TEMPORARY_ZOOM,      // Temporary zoom change for specific
41                                       // renderer, no scheme/host is specified.
42   };
43 
44   // Structure used to notify about zoom changes. Host and/or scheme are empty
45   // if not applicable to |mode|.
46   struct ZoomLevelChange {
47     ZoomLevelChangeMode mode;
48     std::string host;
49     std::string scheme;
50     double zoom_level;
51   };
52 
53   typedef std::vector<ZoomLevelChange> ZoomLevelVector;
54 
55   CONTENT_EXPORT static HostZoomMap* GetForBrowserContext(
56       BrowserContext* browser_context);
57 
58   // Returns the current zoom level for the specified WebContents. May be
59   // temporary or host-specific.
60   CONTENT_EXPORT static double GetZoomLevel(const WebContents* web_contents);
61 
62   // Sets the current zoom level for the specified WebContents. The level may
63   // be temporary or host-specific depending on the particular WebContents.
64   CONTENT_EXPORT static void SetZoomLevel(const WebContents* web_contents,
65                                           double level);
66 
67   // Copy the zoom levels from the given map. Can only be called on the UI
68   // thread.
69   virtual void CopyFrom(HostZoomMap* copy) = 0;
70 
71   // Here |host| is the host portion of URL, or (in the absence of a host)
72   // the complete spec of the URL.
73   // Returns the zoom for the specified |scheme| and |host|. See class
74   // description for details.
75   //
76   // This may be called on any thread.
77   virtual double GetZoomLevelForHostAndScheme(
78       const std::string& scheme,
79       const std::string& host) const = 0;
80 
81   // Returns true if the specified |scheme| and/or |host| has a zoom level
82   // currently set.
83   //
84   // This may be called on any thread.
85   virtual bool HasZoomLevel(const std::string& scheme,
86                             const std::string& host) const = 0;
87 
88   // Returns all non-temporary zoom levels. Can be called on any thread.
89   virtual ZoomLevelVector GetAllZoomLevels() const = 0;
90 
91   // Here |host| is the host portion of URL, or (in the absence of a host)
92   // the complete spec of the URL.
93   // Sets the zoom level for the |host| to |level|.  If the level matches the
94   // current default zoom level, the host is erased from the saved preferences;
95   // otherwise the new value is written out.
96   // Zoom levels specified for both scheme and host are not affected.
97   //
98   // This should only be called on the UI thread.
99   virtual void SetZoomLevelForHost(const std::string& host, double level) = 0;
100 
101   // Here |host| is the host portion of URL, or (in the absence of a host)
102   // the complete spec of the URL.
103   // Sets the zoom level for the |scheme|/|host| pair to |level|. No values
104   // will be erased during this operation, and this value will not be stored in
105   // the preferences.
106   //
107   // This should only be called on the UI thread.
108   virtual void SetZoomLevelForHostAndScheme(const std::string& scheme,
109                                             const std::string& host,
110                                             double level) = 0;
111 
112   // Returns whether the view manages its zoom level independently of other
113   // views displaying content from the same host.
114   virtual bool UsesTemporaryZoomLevel(int render_process_id,
115                                       int render_view_id) const = 0;
116 
117   // Sets the temporary zoom level that's only valid for the lifetime of this
118   // WebContents.
119   //
120   // This should only be called on the UI thread.
121   virtual void SetTemporaryZoomLevel(int render_process_id,
122                                      int render_view_id,
123                                      double level) = 0;
124 
125   // Clears the temporary zoom level stored for this WebContents.
126   //
127   // This should only be called on the UI thread.
128   virtual void ClearTemporaryZoomLevel(int render_process_id,
129                                        int render_view_id) = 0;
130 
131   // Get/Set the default zoom level for pages that don't override it.
132   virtual double GetDefaultZoomLevel() const = 0;
133   virtual void SetDefaultZoomLevel(double level) = 0;;
134 
135   typedef base::Callback<void(const ZoomLevelChange&)> ZoomLevelChangedCallback;
136   typedef base::CallbackList<void(const ZoomLevelChange&)>::Subscription
137       Subscription;
138   // Add and remove zoom level changed callbacks.
139   virtual scoped_ptr<Subscription> AddZoomLevelChangedCallback(
140       const ZoomLevelChangedCallback& callback) = 0;
141 
142  protected:
~HostZoomMap()143   virtual ~HostZoomMap() {}
144 };
145 
146 }  // namespace content
147 
148 #endif  // CONTENT_PUBLIC_BROWSER_HOST_ZOOM_MAP_H_
149