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

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: Address comments. 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 =
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);
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();
(...skipping 25 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) {
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;
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);
335 } 355 }
336 } 356 }
337 357
338 HostZoomMap::ZoomLevelChange change; 358 HostZoomMap::ZoomLevelChange change;
339 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; 359 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM;
360 change.host = GetHostFromProcessView(render_process_id, render_view_id);
340 change.zoom_level = level; 361 change.zoom_level = level;
341 362
342 zoom_level_changed_callbacks_.Notify(change); 363 zoom_level_changed_callbacks_.Notify(change);
343 } 364 }
344 365
345 void HostZoomMapImpl::Observe(int type, 366 void HostZoomMapImpl::Observe(int type,
346 const NotificationSource& source, 367 const NotificationSource& source,
347 const NotificationDetails& details) { 368 const NotificationDetails& details) {
348 switch (type) { 369 switch (type) {
349 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { 370 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: {
350 base::AutoLock auto_lock(lock_);
351 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); 371 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID();
352 int render_process_id = 372 int render_process_id =
353 Source<RenderViewHost>(source)->GetProcess()->GetID(); 373 Source<RenderViewHost>(source)->GetProcess()->GetID();
354 374 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; 375 break;
363 } 376 }
364 default: 377 default:
365 NOTREACHED() << "Unexpected preference observed."; 378 NOTREACHED() << "Unexpected preference observed.";
366 } 379 }
367 } 380 }
368 381
382 void HostZoomMapImpl::ClearTemporaryZoomLevel(int render_process_id,
383 int render_view_id) {
384 base::AutoLock auto_lock(lock_);
385 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
386 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
387 temporary_zoom_levels_[i].render_view_id == render_view_id) {
388 // TODO(wjmaclean) Do we need to lookup the appropriate per-origin
389 // zoom level (if any) and send it to the render view?
390 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
391 break;
392 }
393 }
394 }
395
396 void HostZoomMapImpl::SendTemporaryZoomLevelChange(int render_process_id,
397 int render_view_id) const {
398 double level = 0.0;
399 bool found = false;
400 {
401 base::AutoLock auto_lock(lock_);
402 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
403 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
404 temporary_zoom_levels_[i].render_view_id == render_view_id) {
405 level = temporary_zoom_levels_[i].zoom_level;
406 found = true;
407 break;
408 }
409 }
410 }
411 if (!found)
412 return;
413
414 RenderViewHost* host =
415 RenderViewHost::FromID(render_process_id, render_view_id);
416 DCHECK(host);
417 host->Send(new ViewMsg_SetZoomLevelForView(render_view_id, level));
418 }
419
420 void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme,
421 const std::string& host,
422 double level) {
423 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
424 !i.IsAtEnd(); i.Advance()) {
425 RenderProcessHost* render_process_host = i.GetCurrentValue();
426 if (HostZoomMap::GetForBrowserContext(
427 render_process_host->GetBrowserContext()) == this) {
428 int render_process_id = render_process_host->GetID();
429 std::set<int> exceptions;
430 for (size_t i = 0; i != temporary_zoom_levels_.size(); ++i) {
431 if (temporary_zoom_levels_[i].render_process_id == render_process_id)
432 exceptions.insert(temporary_zoom_levels_[i].render_view_id);
433 }
434 render_process_host->Send(new ViewMsg_SetZoomLevelForCurrentURL(
435 scheme, host, level, exceptions));
436 }
437 }
438 }
439
369 HostZoomMapImpl::~HostZoomMapImpl() { 440 HostZoomMapImpl::~HostZoomMapImpl() {
370 } 441 }
371 442
372 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, 443 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id,
373 int view_id, 444 int view_id,
374 double level) 445 double level)
375 : render_process_id(process_id), 446 : render_process_id(process_id),
376 render_view_id(view_id), 447 render_view_id(view_id),
377 zoom_level(level) { 448 zoom_level(level) {
378 } 449 }
379 450
380 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, 451 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id,
381 int view_id) 452 int view_id)
382 : render_process_id(process_id), 453 : render_process_id(process_id),
383 render_view_id(view_id), 454 render_view_id(view_id),
384 zoom_level(0.0) { 455 zoom_level(0.0) {
385 } 456 }
386 457
387 bool HostZoomMapImpl::TemporaryZoomLevel::operator==( 458 bool HostZoomMapImpl::TemporaryZoomLevel::operator==(
388 const TemporaryZoomLevel& other) const { 459 const TemporaryZoomLevel& other) const {
389 return other.render_process_id == render_process_id && 460 return other.render_process_id == render_process_id &&
390 other.render_view_id == render_view_id; 461 other.render_view_id == render_view_id;
391 } 462 }
392 463
393 } // namespace content 464 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698