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

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

Issue 302603012: Zoom Extension API (content changes) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Use ContainsKey(), send host zoom level if it exists. Created 6 years, 6 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 <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "base/strings/string_piece.h" 10 #include "base/strings/string_piece.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } 80 }
81 default_zoom_level_ = copy->default_zoom_level_; 81 default_zoom_level_ = copy->default_zoom_level_;
82 } 82 }
83 83
84 double HostZoomMapImpl::GetZoomLevelForHost(const std::string& host) const { 84 double HostZoomMapImpl::GetZoomLevelForHost(const std::string& host) const {
85 base::AutoLock auto_lock(lock_); 85 base::AutoLock auto_lock(lock_);
86 HostZoomLevels::const_iterator i(host_zoom_levels_.find(host)); 86 HostZoomLevels::const_iterator i(host_zoom_levels_.find(host));
87 return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second; 87 return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second;
88 } 88 }
89 89
90 bool HostZoomMapImpl::HasZoomLevel(const std::string& scheme,
91 const std::string& host) const {
92 base::AutoLock auto_lock(lock_);
93
94 SchemeHostZoomLevels::const_iterator scheme_iterator(
95 scheme_host_zoom_levels_.find(scheme));
96
97 const HostZoomLevels& zoom_levels =
98 (scheme_iterator != scheme_host_zoom_levels_.end())
99 ? scheme_iterator->second
100 : host_zoom_levels_;
101
102 HostZoomLevels::const_iterator i(zoom_levels.find(host));
103 return i != zoom_levels.end();
104 }
105
90 double HostZoomMapImpl::GetZoomLevelForHostAndScheme( 106 double HostZoomMapImpl::GetZoomLevelForHostAndScheme(
91 const std::string& scheme, 107 const std::string& scheme,
92 const std::string& host) const { 108 const std::string& host) const {
93 { 109 {
94 base::AutoLock auto_lock(lock_); 110 base::AutoLock auto_lock(lock_);
95 SchemeHostZoomLevels::const_iterator scheme_iterator( 111 SchemeHostZoomLevels::const_iterator scheme_iterator(
96 scheme_host_zoom_levels_.find(scheme)); 112 scheme_host_zoom_levels_.find(scheme));
97 if (scheme_iterator != scheme_host_zoom_levels_.end()) { 113 if (scheme_iterator != scheme_host_zoom_levels_.end()) {
98 HostZoomLevels::const_iterator i(scheme_iterator->second.find(host)); 114 HostZoomLevels::const_iterator i(scheme_iterator->second.find(host));
99 if (i != scheme_iterator->second.end()) 115 if (i != scheme_iterator->second.end())
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 161
146 { 162 {
147 base::AutoLock auto_lock(lock_); 163 base::AutoLock auto_lock(lock_);
148 164
149 if (ZoomValuesEqual(level, default_zoom_level_)) 165 if (ZoomValuesEqual(level, default_zoom_level_))
150 host_zoom_levels_.erase(host); 166 host_zoom_levels_.erase(host);
151 else 167 else
152 host_zoom_levels_[host] = level; 168 host_zoom_levels_[host] = level;
153 } 169 }
154 170
155 // Notify renderers from this browser context. 171 SendZoomLevelChange(std::string(), host, level);
156 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); 172
157 !i.IsAtEnd(); i.Advance()) {
158 RenderProcessHost* render_process_host = i.GetCurrentValue();
159 if (HostZoomMap::GetForBrowserContext(
160 render_process_host->GetBrowserContext()) == this) {
161 render_process_host->Send(
162 new ViewMsg_SetZoomLevelForCurrentURL(std::string(), host, level));
163 }
164 }
165 HostZoomMap::ZoomLevelChange change; 173 HostZoomMap::ZoomLevelChange change;
166 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST; 174 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST;
167 change.host = host; 175 change.host = host;
168 change.zoom_level = level; 176 change.zoom_level = level;
169 177
170 zoom_level_changed_callbacks_.Notify(change); 178 zoom_level_changed_callbacks_.Notify(change);
171 } 179 }
172 180
173 void HostZoomMapImpl::SetZoomLevelForHostAndScheme(const std::string& scheme, 181 void HostZoomMapImpl::SetZoomLevelForHostAndScheme(const std::string& scheme,
174 const std::string& host, 182 const std::string& host,
175 double level) { 183 double level) {
176 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 184 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
177 { 185 {
178 base::AutoLock auto_lock(lock_); 186 base::AutoLock auto_lock(lock_);
179 scheme_host_zoom_levels_[scheme][host] = level; 187 scheme_host_zoom_levels_[scheme][host] = level;
180 } 188 }
181 189
182 // Notify renderers from this browser context. 190 SendZoomLevelChange(scheme, host, level);
183 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
184 !i.IsAtEnd(); i.Advance()) {
185 RenderProcessHost* render_process_host = i.GetCurrentValue();
186 if (HostZoomMap::GetForBrowserContext(
187 render_process_host->GetBrowserContext()) == this) {
188 render_process_host->Send(
189 new ViewMsg_SetZoomLevelForCurrentURL(scheme, host, level));
190 }
191 }
192 191
193 HostZoomMap::ZoomLevelChange change; 192 HostZoomMap::ZoomLevelChange change;
194 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST; 193 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST;
195 change.host = host; 194 change.host = host;
196 change.scheme = scheme; 195 change.scheme = scheme;
197 change.zoom_level = level; 196 change.zoom_level = level;
198 197
199 zoom_level_changed_callbacks_.Notify(change); 198 zoom_level_changed_callbacks_.Notify(change);
200 } 199 }
201 200
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 return GetZoomLevelForHostAndScheme(url.scheme(), 233 return GetZoomLevelForHostAndScheme(url.scheme(),
235 net::GetHostOrSpecFromURL(url)); 234 net::GetHostOrSpecFromURL(url));
236 } 235 }
237 236
238 void HostZoomMapImpl::SetZoomLevelForWebContents( 237 void HostZoomMapImpl::SetZoomLevelForWebContents(
239 const WebContentsImpl& web_contents_impl, 238 const WebContentsImpl& web_contents_impl,
240 double level) { 239 double level) {
241 int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID(); 240 int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID();
242 int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID(); 241 int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID();
243 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) { 242 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) {
244 SetTemporaryZoomLevel(render_process_id, render_view_id, level); 243 SetTemporaryZoomLevel(render_process_id,
Fady Samuel 2014/06/12 19:42:44 nit: Unnecessary change, revert.
wjmaclean 2014/06/12 19:58:18 Done.
244 render_view_id,
245 level);
245 } else { 246 } else {
246 // Get the url from the navigation controller directly, as calling 247 // Get the url from the navigation controller directly, as calling
247 // WebContentsImpl::GetLastCommittedURL() may give us a virtual url that 248 // WebContentsImpl::GetLastCommittedURL() may give us a virtual url that
248 // is different than what the render view is using. If the two don't match, 249 // is different than what the render view is using. If the two don't match,
249 // the attempt to set the zoom will fail. 250 // the attempt to set the zoom will fail.
250 NavigationEntry* entry = 251 NavigationEntry* entry =
251 web_contents_impl.GetController().GetLastCommittedEntry(); 252 web_contents_impl.GetController().GetLastCommittedEntry();
252 // Tests may invoke this function with a null entry, but we don't 253 // Tests may invoke this function with a null entry, but we don't
253 // want to save zoom levels in this case. 254 // want to save zoom levels in this case.
254 if (!entry) 255 if (!entry)
255 return; 256 return;
256 257
257 GURL url = entry->GetURL(); 258 GURL url = entry->GetURL();
258 SetZoomLevelForHost(net::GetHostOrSpecFromURL(url), level); 259 SetZoomLevelForHost(net::GetHostOrSpecFromURL(url), level);
259 } 260 }
260 } 261 }
261 262
262 void HostZoomMapImpl::SetZoomLevelForView(int render_process_id, 263 void HostZoomMapImpl::SetZoomLevelForView(int render_process_id,
263 int render_view_id, 264 int render_view_id,
264 double level, 265 double level,
265 const std::string& host) { 266 const std::string& host) {
266 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) 267 if (UsesTemporaryZoomLevel(render_process_id, render_view_id))
267 SetTemporaryZoomLevel(render_process_id, render_view_id, level); 268 SetTemporaryZoomLevel(render_process_id, render_view_id, level);
268 else 269 else
269 SetZoomLevelForHost(host, level); 270 SetZoomLevelForHost(host, level);
270 } 271 }
271 272
272 bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id, 273 bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id,
273 int render_view_id) const { 274 int render_view_id) const {
274 TemporaryZoomLevel zoom_level(render_process_id, render_view_id); 275 RenderViewKey key(render_process_id, render_view_id);
275 276
276 base::AutoLock auto_lock(lock_); 277 base::AutoLock auto_lock(lock_);
277 TemporaryZoomLevels::const_iterator it = std::find( 278 return ContainsKey(temporary_zoom_levels_, key);
278 temporary_zoom_levels_.begin(), temporary_zoom_levels_.end(), zoom_level);
279 return it != temporary_zoom_levels_.end();
280 }
281
282 void HostZoomMapImpl::SetUsesTemporaryZoomLevel(
283 int render_process_id,
284 int render_view_id,
285 bool uses_temporary_zoom_level) {
286 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
287
288 TemporaryZoomLevel zoom_level(
289 render_process_id, render_view_id, default_zoom_level_);
290
291 base::AutoLock auto_lock(lock_);
292 TemporaryZoomLevels::iterator it = std::find(
293 temporary_zoom_levels_.begin(), temporary_zoom_levels_.end(), zoom_level);
294 if (uses_temporary_zoom_level) {
295 if (it == temporary_zoom_levels_.end())
296 temporary_zoom_levels_.push_back(zoom_level);
297 } else if (it != temporary_zoom_levels_.end()) {
298 temporary_zoom_levels_.erase(it);
299 }
300 } 279 }
301 280
302 double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, 281 double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id,
303 int render_view_id) const { 282 int render_view_id) const {
304 base::AutoLock auto_lock(lock_); 283 base::AutoLock auto_lock(lock_);
305 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { 284 RenderViewKey key(render_process_id, render_view_id);
306 if (temporary_zoom_levels_[i].render_process_id == render_process_id && 285 if (!ContainsKey(temporary_zoom_levels_, key))
307 temporary_zoom_levels_[i].render_view_id == render_view_id) { 286 return 0;
308 return temporary_zoom_levels_[i].zoom_level;
309 }
310 }
311 287
312 return 0; 288 return temporary_zoom_levels_.find(key)->second;
313 } 289 }
314 290
291 namespace {
292
293 std::string GetHostFromProcessView(int render_process_id, int render_view_id) {
294 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
295 RenderViewHost* render_view_host =
296 RenderViewHost::FromID(render_process_id, render_view_id);
297 if (!render_view_host)
298 return std::string();
299
300 WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host);
301 DCHECK(web_contents);
302
303 NavigationEntry* entry =
304 web_contents->GetController().GetLastCommittedEntry();
305 if (!entry)
306 return std::string();
307
308 return net::GetHostOrSpecFromURL(entry->GetURL());
309 }
310
311 } // namespace
312
315 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, 313 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id,
316 int render_view_id, 314 int render_view_id,
317 double level) { 315 double level) {
318 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 316 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
319 317
320 { 318 {
319 RenderViewKey key(render_process_id, render_view_id);
321 base::AutoLock auto_lock(lock_); 320 base::AutoLock auto_lock(lock_);
322 size_t i; 321 temporary_zoom_levels_[key] = level;
323 for (i = 0; i < temporary_zoom_levels_.size(); ++i) { 322 }
324 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
325 temporary_zoom_levels_[i].render_view_id == render_view_id) {
326 if (level) {
327 temporary_zoom_levels_[i].zoom_level = level;
328 } else {
329 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
330 }
331 break;
332 }
333 }
334 323
335 if (level && i == temporary_zoom_levels_.size()) { 324 RenderViewHost* host =
336 TemporaryZoomLevel temp(render_process_id, render_view_id, level); 325 RenderViewHost::FromID(render_process_id, render_view_id);
337 temporary_zoom_levels_.push_back(temp); 326 DCHECK(host);
338 } 327 host->Send(new ViewMsg_SetZoomLevelForView(render_view_id, true, level));
339 }
340 328
341 HostZoomMap::ZoomLevelChange change; 329 HostZoomMap::ZoomLevelChange change;
342 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; 330 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM;
331 change.host = GetHostFromProcessView(render_process_id, render_view_id);
343 change.zoom_level = level; 332 change.zoom_level = level;
344 333
345 zoom_level_changed_callbacks_.Notify(change); 334 zoom_level_changed_callbacks_.Notify(change);
346 } 335 }
347 336
348 void HostZoomMapImpl::Observe(int type, 337 void HostZoomMapImpl::Observe(int type,
349 const NotificationSource& source, 338 const NotificationSource& source,
350 const NotificationDetails& details) { 339 const NotificationDetails& details) {
351 switch (type) { 340 switch (type) {
352 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { 341 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: {
353 base::AutoLock auto_lock(lock_);
354 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); 342 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID();
355 int render_process_id = 343 int render_process_id =
356 Source<RenderViewHost>(source)->GetProcess()->GetID(); 344 Source<RenderViewHost>(source)->GetProcess()->GetID();
357 345 ClearTemporaryZoomLevel(render_process_id, render_view_id);
358 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
359 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
360 temporary_zoom_levels_[i].render_view_id == render_view_id) {
361 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
362 break;
363 }
364 }
365 break; 346 break;
366 } 347 }
367 default: 348 default:
368 NOTREACHED() << "Unexpected preference observed."; 349 NOTREACHED() << "Unexpected preference observed.";
369 } 350 }
370 } 351 }
371 352
353 void HostZoomMapImpl::ClearTemporaryZoomLevel(int render_process_id,
354 int render_view_id) {
355 {
356 base::AutoLock auto_lock(lock_);
357 RenderViewKey key(render_process_id, render_view_id);
358 TemporaryZoomLevels::iterator it = temporary_zoom_levels_.find(key);
359 if (it == temporary_zoom_levels_.end())
360 return;
361 // TODO(wjmaclean) Do we need to lookup the appropriate per-origin
Fady Samuel 2014/06/12 19:42:44 nit: You've addressed this right? You can remove t
wjmaclean 2014/06/12 19:58:19 D'oh! Removed.
362 // zoom level (if any) and send it to the render view?
363 temporary_zoom_levels_.erase(it);
364 }
365 RenderViewHost* host =
366 RenderViewHost::FromID(render_process_id, render_view_id);
367 DCHECK(host);
368 // TODO(wjmaclean) Need to see if there's a mapped host zoom level to use.
Fady Samuel 2014/06/12 19:42:44 nit: You've addressed this right? This TODO can go
wjmaclean 2014/06/12 19:58:18 I 'rewrote' this one, then forgot to write the fil
369 host->Send(new ViewMsg_SetZoomLevelForView(
370 render_view_id,
371 false,
372 GetZoomLevelForHost(
373 GetHostFromProcessView(render_process_id, render_view_id))));
374 }
375
376 void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme,
377 const std::string& host,
378 double level) {
379 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
380 !i.IsAtEnd(); i.Advance()) {
381 RenderProcessHost* render_process_host = i.GetCurrentValue();
382 if (HostZoomMap::GetForBrowserContext(
383 render_process_host->GetBrowserContext()) == this) {
384 render_process_host->Send(
385 new ViewMsg_SetZoomLevelForCurrentURL(scheme, host, level));
386 }
387 }
388 }
389
372 HostZoomMapImpl::~HostZoomMapImpl() { 390 HostZoomMapImpl::~HostZoomMapImpl() {
373 } 391 }
374 392
375 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id,
376 int view_id,
377 double level)
378 : render_process_id(process_id),
379 render_view_id(view_id),
380 zoom_level(level) {
381 }
382
383 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id,
384 int view_id)
385 : render_process_id(process_id),
386 render_view_id(view_id),
387 zoom_level(0.0) {
388 }
389
390 bool HostZoomMapImpl::TemporaryZoomLevel::operator==(
391 const TemporaryZoomLevel& other) const {
392 return other.render_process_id == render_process_id &&
393 other.render_view_id == render_view_id;
394 }
395
396 } // namespace content 393 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698