Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(774)

Side by Side Diff: content/browser/host_zoom_map_impl.cc

Issue 224733018: Changes to content/ to facilitate new zoom extension API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/host_zoom_map_impl.h" 5 #include "content/browser/host_zoom_map_impl.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <set>
8 9
9 #include "base/strings/string_piece.h" 10 #include "base/strings/string_piece.h"
10 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
11 #include "base/values.h" 12 #include "base/values.h"
12 #include "content/browser/renderer_host/render_process_host_impl.h" 13 #include "content/browser/renderer_host/render_process_host_impl.h"
13 #include "content/browser/renderer_host/render_view_host_impl.h" 14 #include "content/browser/renderer_host/render_view_host_impl.h"
14 #include "content/common/view_messages.h" 15 #include "content/common/view_messages.h"
15 #include "content/public/browser/browser_context.h" 16 #include "content/public/browser/browser_context.h"
16 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
17 #include "content/public/browser/notification_service.h" 18 #include "content/public/browser/notification_service.h"
18 #include "content/public/browser/notification_types.h" 19 #include "content/public/browser/notification_types.h"
19 #include "content/public/browser/resource_context.h" 20 #include "content/public/browser/resource_context.h"
21 #include "content/public/browser/web_contents.h"
20 #include "content/public/common/page_zoom.h" 22 #include "content/public/common/page_zoom.h"
21 #include "net/base/net_util.h" 23 #include "net/base/net_util.h"
22 24
23 static const char* kHostZoomMapKeyName = "content_host_zoom_map"; 25 static const char* kHostZoomMapKeyName = "content_host_zoom_map";
24 26
25 namespace content { 27 namespace content {
26 28
27 HostZoomMap* HostZoomMap::GetForBrowserContext(BrowserContext* context) { 29 HostZoomMap* HostZoomMap::GetForBrowserContext(BrowserContext* context) {
28 HostZoomMapImpl* rv = static_cast<HostZoomMapImpl*>( 30 HostZoomMapImpl* rv = static_cast<HostZoomMapImpl*>(
29 context->GetUserData(kHostZoomMapKeyName)); 31 context->GetUserData(kHostZoomMapKeyName));
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 }; 117 };
116 result.push_back(change); 118 result.push_back(change);
117 } 119 }
118 } 120 }
119 } 121 }
120 return result; 122 return result;
121 } 123 }
122 124
123 void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host, 125 void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host,
124 double level) { 126 double level) {
127 SetZoomLevelForHost(host, 0, level);
128 }
129
130 void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host,
131 int zoom_id,
132 double level) {
125 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
126 134
127 { 135 {
128 base::AutoLock auto_lock(lock_); 136 base::AutoLock auto_lock(lock_);
129 137
130 if (ZoomValuesEqual(level, default_zoom_level_)) 138 if (ZoomValuesEqual(level, default_zoom_level_))
131 host_zoom_levels_.erase(host); 139 host_zoom_levels_.erase(host);
132 else 140 else
133 host_zoom_levels_[host] = level; 141 host_zoom_levels_[host] = level;
134 } 142 }
135 143
136 // Notify renderers from this browser context. 144 SendZoomLevelChange(std::string(), host, level);
137 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); 145
138 !i.IsAtEnd(); i.Advance()) {
139 RenderProcessHost* render_process_host = i.GetCurrentValue();
140 if (HostZoomMap::GetForBrowserContext(
141 render_process_host->GetBrowserContext()) == this) {
142 render_process_host->Send(
143 new ViewMsg_SetZoomLevelForCurrentURL(std::string(), host, level));
144 }
145 }
146 HostZoomMap::ZoomLevelChange change; 146 HostZoomMap::ZoomLevelChange change;
147 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST; 147 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST;
148 change.host = host; 148 change.host = host;
149 change.zoom_level = level; 149 change.zoom_level = level;
150 150
151 CallZoomCallback(zoom_id);
151 zoom_level_changed_callbacks_.Notify(change); 152 zoom_level_changed_callbacks_.Notify(change);
152 } 153 }
153 154
154 void HostZoomMapImpl::SetZoomLevelForHostAndScheme(const std::string& scheme, 155 void HostZoomMapImpl::SetZoomLevelForHostAndScheme(const std::string& scheme,
155 const std::string& host, 156 const std::string& host,
156 double level) { 157 double level) {
157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
158 { 159 {
159 base::AutoLock auto_lock(lock_); 160 base::AutoLock auto_lock(lock_);
160 scheme_host_zoom_levels_[scheme][host] = level; 161 scheme_host_zoom_levels_[scheme][host] = level;
161 } 162 }
162 163
163 // Notify renderers from this browser context. 164 SendZoomLevelChange(scheme, host, level);
164 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
165 !i.IsAtEnd(); i.Advance()) {
166 RenderProcessHost* render_process_host = i.GetCurrentValue();
167 if (HostZoomMap::GetForBrowserContext(
168 render_process_host->GetBrowserContext()) == this) {
169 render_process_host->Send(
170 new ViewMsg_SetZoomLevelForCurrentURL(scheme, host, level));
171 }
172 }
173 165
174 HostZoomMap::ZoomLevelChange change; 166 HostZoomMap::ZoomLevelChange change;
175 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST; 167 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST;
176 change.host = host; 168 change.host = host;
177 change.scheme = scheme; 169 change.scheme = scheme;
178 change.zoom_level = level; 170 change.zoom_level = level;
179 171
180 zoom_level_changed_callbacks_.Notify(change); 172 zoom_level_changed_callbacks_.Notify(change);
181 } 173 }
182 174
183 double HostZoomMapImpl::GetDefaultZoomLevel() const { 175 double HostZoomMapImpl::GetDefaultZoomLevel() const {
184 return default_zoom_level_; 176 return default_zoom_level_;
185 } 177 }
186 178
187 void HostZoomMapImpl::SetDefaultZoomLevel(double level) { 179 void HostZoomMapImpl::SetDefaultZoomLevel(double level) {
188 default_zoom_level_ = level; 180 default_zoom_level_ = level;
189 } 181 }
190 182
191 scoped_ptr<HostZoomMap::Subscription> 183 scoped_ptr<HostZoomMap::Subscription>
192 HostZoomMapImpl::AddZoomLevelChangedCallback( 184 HostZoomMapImpl::AddZoomLevelChangedCallback(
193 const ZoomLevelChangedCallback& callback) { 185 const ZoomLevelChangedCallback& callback) {
194 return zoom_level_changed_callbacks_.Add(callback); 186 return zoom_level_changed_callbacks_.Add(callback);
195 } 187 }
196 188
189 void HostZoomMapImpl::AddZoomCallback(
190 int zoom_id,
191 const base::Callback<void(void)>& callback) {
192 zoom_callback_map_[zoom_id] = callback;
193 }
194
197 double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, 195 double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id,
198 int render_view_id) const { 196 int render_view_id) const {
199 base::AutoLock auto_lock(lock_); 197 base::AutoLock auto_lock(lock_);
200 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { 198 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
201 if (temporary_zoom_levels_[i].render_process_id == render_process_id && 199 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
202 temporary_zoom_levels_[i].render_view_id == render_view_id) { 200 temporary_zoom_levels_[i].render_view_id == render_view_id) {
203 return temporary_zoom_levels_[i].zoom_level; 201 return temporary_zoom_levels_[i].zoom_level;
204 } 202 }
205 } 203 }
206 return 0; 204 return 0;
207 } 205 }
208 206
209 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, 207 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id,
210 int render_view_id, 208 int render_view_id,
209 const std::string& host,
210 int zoom_id,
211 double level) { 211 double level) {
212 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 212 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
213 213
214 { 214 {
215 base::AutoLock auto_lock(lock_); 215 base::AutoLock auto_lock(lock_);
216 size_t i; 216 size_t i;
217 for (i = 0; i < temporary_zoom_levels_.size(); ++i) { 217 for (i = 0; i < temporary_zoom_levels_.size(); ++i) {
218 if (temporary_zoom_levels_[i].render_process_id == render_process_id && 218 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
219 temporary_zoom_levels_[i].render_view_id == render_view_id) { 219 temporary_zoom_levels_[i].render_view_id == render_view_id) {
220 if (level) { 220 temporary_zoom_levels_[i].zoom_level = level;
221 temporary_zoom_levels_[i].zoom_level = level;
222 } else {
223 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
224 }
225 break; 221 break;
226 } 222 }
227 } 223 }
228 224
229 if (level && i == temporary_zoom_levels_.size()) { 225 if (level && i == temporary_zoom_levels_.size()) {
230 TemporaryZoomLevel temp; 226 TemporaryZoomLevel temp;
231 temp.render_process_id = render_process_id; 227 temp.render_process_id = render_process_id;
232 temp.render_view_id = render_view_id; 228 temp.render_view_id = render_view_id;
233 temp.zoom_level = level; 229 temp.zoom_level = level;
234 temporary_zoom_levels_.push_back(temp); 230 temporary_zoom_levels_.push_back(temp);
235 } 231 }
236 } 232 }
237 233
238 HostZoomMap::ZoomLevelChange change; 234 HostZoomMap::ZoomLevelChange change;
239 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; 235 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM;
236 change.host = host;
240 change.zoom_level = level; 237 change.zoom_level = level;
241 238
239 CallZoomCallback(zoom_id);
242 zoom_level_changed_callbacks_.Notify(change); 240 zoom_level_changed_callbacks_.Notify(change);
243 } 241 }
244 242
245 void HostZoomMapImpl::Observe(int type, 243 void HostZoomMapImpl::Observe(int type,
246 const NotificationSource& source, 244 const NotificationSource& source,
247 const NotificationDetails& details) { 245 const NotificationDetails& details) {
248 switch (type) { 246 switch (type) {
249 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { 247 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: {
250 base::AutoLock auto_lock(lock_); 248 base::AutoLock auto_lock(lock_);
251 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); 249 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID();
252 int render_process_id = 250 int render_process_id =
253 Source<RenderViewHost>(source)->GetProcess()->GetID(); 251 Source<RenderViewHost>(source)->GetProcess()->GetID();
254 252 EraseTemporaryZoomLevel(render_process_id, render_view_id);
255 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
256 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
257 temporary_zoom_levels_[i].render_view_id == render_view_id) {
258 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
259 break;
260 }
261 }
262 break; 253 break;
263 } 254 }
264 default: 255 default:
265 NOTREACHED() << "Unexpected preference observed."; 256 NOTREACHED() << "Unexpected preference observed.";
266 } 257 }
267 } 258 }
268 259
260 void HostZoomMapImpl::EraseTemporaryZoomLevel(int render_process_id,
261 int render_view_id) {
262 base::AutoLock auto_lock(lock_);
263 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
264 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
265 temporary_zoom_levels_[i].render_view_id == render_view_id) {
266 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
267 break;
268 }
269 }
270 }
271
272 void HostZoomMapImpl::CallZoomCallback(int zoom_id) {
273 std::map<int, base::Callback<void(void)> >::iterator it =
274 zoom_callback_map_.find(zoom_id);
275 if (it == zoom_callback_map_.end())
276 return;
277
278 it->second.Run();
279 zoom_callback_map_.erase(it);
280 }
281
282 void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme,
283 const std::string& host,
284 double level) {
285 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
286 !i.IsAtEnd(); i.Advance()) {
287 RenderProcessHost* render_process_host = i.GetCurrentValue();
288 if (HostZoomMap::GetForBrowserContext(
289 render_process_host->GetBrowserContext()) == this) {
290 int render_process_id = render_process_host->GetID();
291 std::set<int> exceptions;
292 for (size_t i = 0; i != temporary_zoom_levels_.size(); ++i) {
293 if (temporary_zoom_levels_[i].render_process_id == render_process_id)
294 exceptions.insert(temporary_zoom_levels_[i].render_view_id);
295 }
296 render_process_host->Send(new ViewMsg_SetZoomLevelForCurrentURL(
297 scheme, host, level, exceptions));
298 }
299 }
300 }
301
269 HostZoomMapImpl::~HostZoomMapImpl() { 302 HostZoomMapImpl::~HostZoomMapImpl() {
270 } 303 }
271 304
272 } // namespace content 305 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698