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

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: Remove exceptions from IPC. 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 url = entry->GetURL(); 232 url = entry->GetURL();
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();
242 // Get the url from the navigation controller directly, as calling
243 // WebContentsImpl::GetLastCommittedURL() may give us a virtual url that
244 // is different than what the render view is using. If the two don't match,
245 // the attempt to set the zoom will fail.
246 NavigationEntry* entry =
Fady Samuel 2014/06/10 20:05:13 It looks like this is only used in the else clause
wjmaclean 2014/06/10 20:18:54 Done.
247 web_contents_impl.GetController().GetLastCommittedEntry();
248 DCHECK(entry);
249 GURL url = entry->GetURL();
243 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) { 250 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) {
244 SetTemporaryZoomLevel(render_process_id, render_view_id, level); 251 SetTemporaryZoomLevel(render_process_id,
252 render_view_id,
253 level);
254 SendTemporaryZoomLevelChange(render_process_id, render_view_id);
245 } else { 255 } else {
246 // Get the url from the navigation controller directly, as calling
247 // 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 // the attempt to set the zoom will fail.
250 GURL url;
251 NavigationEntry* entry =
252 web_contents_impl.GetController().GetLastCommittedEntry();
253 DCHECK(entry);
254 url = entry->GetURL();
255 SetZoomLevelForHost(net::GetHostOrSpecFromURL(url), level); 256 SetZoomLevelForHost(net::GetHostOrSpecFromURL(url), level);
256 } 257 }
257 } 258 }
258 259
259 void HostZoomMapImpl::SetZoomLevelForView(int render_process_id, 260 void HostZoomMapImpl::SetZoomLevelForView(int render_process_id,
260 int render_view_id, 261 int render_view_id,
261 double level, 262 double level,
262 const std::string& host) { 263 const std::string& host) {
263 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) 264 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) {
264 SetTemporaryZoomLevel(render_process_id, render_view_id, level); 265 SetTemporaryZoomLevel(render_process_id, render_view_id, level);
265 else 266 SendTemporaryZoomLevelChange(render_process_id, render_view_id);
Fady Samuel 2014/06/10 20:05:13 This looks like the only call site for SetZoomLeve
267 } else {
266 SetZoomLevelForHost(host, level); 268 SetZoomLevelForHost(host, level);
269 }
267 } 270 }
268 271
269 bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id, 272 bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id,
270 int render_view_id) const { 273 int render_view_id) const {
271 TemporaryZoomLevel zoom_level(render_process_id, render_view_id); 274 TemporaryZoomLevel zoom_level(render_process_id, render_view_id);
272 275
273 base::AutoLock auto_lock(lock_); 276 base::AutoLock auto_lock(lock_);
274 TemporaryZoomLevels::const_iterator it = std::find( 277 TemporaryZoomLevels::const_iterator it = std::find(
275 temporary_zoom_levels_.begin(), temporary_zoom_levels_.end(), zoom_level); 278 temporary_zoom_levels_.begin(), temporary_zoom_levels_.end(), zoom_level);
276 return it != temporary_zoom_levels_.end(); 279 return it != temporary_zoom_levels_.end();
277 } 280 }
278 281
279 void HostZoomMapImpl::SetUsesTemporaryZoomLevel( 282 void HostZoomMapImpl::SetUsesTemporaryZoomLevel(
Fady Samuel 2014/06/10 20:05:13 Do we need this method? It seems unnecessary if we
wjmaclean 2014/06/12 17:40:09 Done.
280 int render_process_id, 283 int render_process_id,
281 int render_view_id, 284 int render_view_id,
282 bool uses_temporary_zoom_level) { 285 bool uses_temporary_zoom_level) {
283 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 286 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
284 287
285 TemporaryZoomLevel zoom_level( 288 TemporaryZoomLevel zoom_level(
286 render_process_id, render_view_id, default_zoom_level_); 289 render_process_id, render_view_id, default_zoom_level_);
287 290
288 base::AutoLock auto_lock(lock_); 291 base::AutoLock auto_lock(lock_);
289 TemporaryZoomLevels::iterator it = std::find( 292 TemporaryZoomLevels::iterator it = std::find(
(...skipping 12 matching lines...) Expand all
302 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { 305 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
303 if (temporary_zoom_levels_[i].render_process_id == render_process_id && 306 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
304 temporary_zoom_levels_[i].render_view_id == render_view_id) { 307 temporary_zoom_levels_[i].render_view_id == render_view_id) {
305 return temporary_zoom_levels_[i].zoom_level; 308 return temporary_zoom_levels_[i].zoom_level;
306 } 309 }
307 } 310 }
308 311
309 return 0; 312 return 0;
310 } 313 }
311 314
315 namespace {
316
317 std::string GetHostFromProcessView(int render_process_id, int render_view_id) {
Fady Samuel 2014/06/10 20:05:13 DCHECK to make sure this is only called on the UI
wjmaclean 2014/06/12 17:40:09 Done.
318 RenderViewHost* render_view_host =
319 RenderViewHost::FromID(render_process_id, render_view_id);
320 if (!render_view_host)
321 return std::string();
322
323 WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host);
324 DCHECK(web_contents);
325
326 NavigationEntry* entry =
327 web_contents->GetController().GetLastCommittedEntry();
328 if (!entry)
329 return std::string();
330
331 return net::GetHostOrSpecFromURL(entry->GetURL());
332 }
333
334 } // namespace
335
312 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, 336 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id,
313 int render_view_id, 337 int render_view_id,
314 double level) { 338 double level) {
315 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 339 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
316 340
317 { 341 {
318 base::AutoLock auto_lock(lock_); 342 base::AutoLock auto_lock(lock_);
319 size_t i; 343 size_t i;
320 for (i = 0; i < temporary_zoom_levels_.size(); ++i) { 344 for (i = 0; i < temporary_zoom_levels_.size(); ++i) {
321 if (temporary_zoom_levels_[i].render_process_id == render_process_id && 345 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
322 temporary_zoom_levels_[i].render_view_id == render_view_id) { 346 temporary_zoom_levels_[i].render_view_id == render_view_id) {
323 if (level) { 347 temporary_zoom_levels_[i].zoom_level = level;
Fady Samuel 2014/06/10 20:05:13 This becomes trivial once it's a map.
wjmaclean 2014/06/10 20:18:54 Done.
324 temporary_zoom_levels_[i].zoom_level = level;
325 } else {
326 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
327 }
328 break; 348 break;
329 } 349 }
330 } 350 }
331 351
332 if (level && i == temporary_zoom_levels_.size()) { 352 if (i == temporary_zoom_levels_.size()) {
333 TemporaryZoomLevel temp(render_process_id, render_view_id, level); 353 TemporaryZoomLevel temp(render_process_id, render_view_id, level);
334 temporary_zoom_levels_.push_back(temp); 354 temporary_zoom_levels_.push_back(temp);
355 RenderViewHost* host =
356 RenderViewHost::FromID(render_process_id, render_view_id);
357 DCHECK(host);
358 host->Send(new ViewMsg_SetUsesTemporaryZoomLevel(render_view_id, true));
Fady Samuel 2014/06/10 20:05:13 ViewMsg_SetTemporaryZoomLevel(render_view_id, true
wjmaclean 2014/06/10 20:18:54 But this will force us to send a level value for m
wjmaclean 2014/06/12 17:40:09 Now that content will have no knowledge of manual
335 } 359 }
336 } 360 }
337 361
338 HostZoomMap::ZoomLevelChange change; 362 HostZoomMap::ZoomLevelChange change;
339 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; 363 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM;
364 change.host = GetHostFromProcessView(render_process_id, render_view_id);
340 change.zoom_level = level; 365 change.zoom_level = level;
341 366
342 zoom_level_changed_callbacks_.Notify(change); 367 zoom_level_changed_callbacks_.Notify(change);
343 } 368 }
344 369
345 void HostZoomMapImpl::Observe(int type, 370 void HostZoomMapImpl::Observe(int type,
346 const NotificationSource& source, 371 const NotificationSource& source,
347 const NotificationDetails& details) { 372 const NotificationDetails& details) {
348 switch (type) { 373 switch (type) {
349 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { 374 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: {
350 base::AutoLock auto_lock(lock_);
351 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); 375 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID();
352 int render_process_id = 376 int render_process_id =
353 Source<RenderViewHost>(source)->GetProcess()->GetID(); 377 Source<RenderViewHost>(source)->GetProcess()->GetID();
354 378 ClearTemporaryZoomLevel(render_process_id, render_view_id);
355 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
356 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
357 temporary_zoom_levels_[i].render_view_id == render_view_id) {
358 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
359 break;
360 }
361 }
362 break; 379 break;
363 } 380 }
364 default: 381 default:
365 NOTREACHED() << "Unexpected preference observed."; 382 NOTREACHED() << "Unexpected preference observed.";
366 } 383 }
367 } 384 }
368 385
386 void HostZoomMapImpl::ClearTemporaryZoomLevel(int render_process_id,
387 int render_view_id) {
388 base::AutoLock auto_lock(lock_);
389 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
390 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
391 temporary_zoom_levels_[i].render_view_id == render_view_id) {
Fady Samuel 2014/06/10 20:05:13 With the map, the above becomes trivial.
wjmaclean 2014/06/10 20:18:54 Done.
392 // TODO(wjmaclean) Do we need to lookup the appropriate per-origin
393 // zoom level (if any) and send it to the render view?
394 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
395 RenderViewHost* host =
396 RenderViewHost::FromID(render_process_id, render_view_id);
397 DCHECK(host);
398 host->Send(new ViewMsg_SetUsesTemporaryZoomLevel(render_view_id, false));
Fady Samuel 2014/06/10 20:05:13 ViewMsg_SetTemporaryZoomLevel(render_view_id, fals
399 break;
400 }
401 }
402 }
403
404 void HostZoomMapImpl::SendTemporaryZoomLevelChange(int render_process_id,
Fady Samuel 2014/06/10 20:05:13 I wish we didn't have to expose this publicly. Ide
wjmaclean 2014/06/10 20:18:54 Done.
405 int render_view_id) const {
406 double level = 0.0;
407 bool found = false;
408 {
409 base::AutoLock auto_lock(lock_);
410 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
411 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
412 temporary_zoom_levels_[i].render_view_id == render_view_id) {
413 level = temporary_zoom_levels_[i].zoom_level;
414 found = true;
415 break;
416 }
417 }
418 }
Fady Samuel 2014/06/10 20:05:13 With the map, the above becomes trivial.
wjmaclean 2014/06/10 20:18:54 Done.
419 if (!found)
420 return;
421
422 RenderViewHost* host =
423 RenderViewHost::FromID(render_process_id, render_view_id);
424 DCHECK(host);
425 host->Send(new ViewMsg_SetZoomLevelForView(render_view_id, level));
Fady Samuel 2014/06/10 20:05:13 ViewMsg_SetTemporaryZoomLevel(render_view_id, true
wjmaclean 2014/06/10 20:18:54 See my previous comment about combining these.
426 }
427
428 void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme,
429 const std::string& host,
430 double level) {
431 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
432 !i.IsAtEnd(); i.Advance()) {
433 RenderProcessHost* render_process_host = i.GetCurrentValue();
434 if (HostZoomMap::GetForBrowserContext(
435 render_process_host->GetBrowserContext()) == this) {
436 render_process_host->Send(
437 new ViewMsg_SetZoomLevelForCurrentURL(scheme, host, level));
438 }
439 }
440 }
441
369 HostZoomMapImpl::~HostZoomMapImpl() { 442 HostZoomMapImpl::~HostZoomMapImpl() {
370 } 443 }
371 444
372 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, 445 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id,
373 int view_id, 446 int view_id,
374 double level) 447 double level)
375 : render_process_id(process_id), 448 : render_process_id(process_id),
376 render_view_id(view_id), 449 render_view_id(view_id),
377 zoom_level(level) { 450 zoom_level(level) {
378 } 451 }
379 452
380 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, 453 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id,
381 int view_id) 454 int view_id)
382 : render_process_id(process_id), 455 : render_process_id(process_id),
383 render_view_id(view_id), 456 render_view_id(view_id),
384 zoom_level(0.0) { 457 zoom_level(0.0) {
385 } 458 }
386 459
387 bool HostZoomMapImpl::TemporaryZoomLevel::operator==( 460 bool HostZoomMapImpl::TemporaryZoomLevel::operator==(
388 const TemporaryZoomLevel& other) const { 461 const TemporaryZoomLevel& other) const {
389 return other.render_process_id == render_process_id && 462 return other.render_process_id == render_process_id &&
390 other.render_view_id == render_view_id; 463 other.render_view_id == render_view_id;
391 } 464 }
392 465
393 } // namespace content 466 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698