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

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: Additions to HostZoomMap API. 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::HasZoomLevelInMap(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 29 matching lines...) Expand all
231 return GetZoomLevelForHostAndScheme(url.scheme(), 230 return GetZoomLevelForHostAndScheme(url.scheme(),
232 net::GetHostOrSpecFromURL(url)); 231 net::GetHostOrSpecFromURL(url));
233 } 232 }
234 233
235 void HostZoomMapImpl::SetZoomLevelForWebContents( 234 void HostZoomMapImpl::SetZoomLevelForWebContents(
236 const WebContentsImpl& web_contents_impl, 235 const WebContentsImpl& web_contents_impl,
237 double level) { 236 double level) {
238 int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID(); 237 int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID();
239 int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID(); 238 int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID();
240 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) { 239 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) {
241 240 SetTemporaryZoomLevel(render_process_id,
242 SetTemporaryZoomLevel(render_process_id, render_view_id, level); 241 render_view_id,
242 net::GetHostOrSpecFromURL(
243 web_contents_impl.GetLastCommittedURL()),
244 level,
245 true);
243 } else { 246 } else {
244 SetZoomLevelForHost( 247 SetZoomLevelForHost(
245 net::GetHostOrSpecFromURL(web_contents_impl.GetLastCommittedURL()), 248 net::GetHostOrSpecFromURL(web_contents_impl.GetLastCommittedURL()),
246 level); 249 level);
247 } 250 }
248 } 251 }
249 252
250 void HostZoomMapImpl::SetZoomLevelForView(int render_process_id, 253 void HostZoomMapImpl::SetZoomLevelForView(int render_process_id,
251 int render_view_id, 254 int render_view_id,
252 double level, 255 double level,
253 const std::string& host) { 256 const std::string& host) {
254 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) 257 if (UsesTemporaryZoomLevel(render_process_id, render_view_id))
255 SetTemporaryZoomLevel(render_process_id, render_view_id, level); 258 SetTemporaryZoomLevel(render_process_id, render_view_id, host, level, true);
256 else 259 else
257 SetZoomLevelForHost(host, level); 260 SetZoomLevelForHost(host, level);
258 } 261 }
259 262
260 bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id, 263 bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id,
261 int render_view_id) const { 264 int render_view_id) const {
262 TemporaryZoomLevel zoom_level(render_process_id, render_view_id); 265 TemporaryZoomLevel zoom_level(render_process_id, render_view_id);
263 266
264 base::AutoLock auto_lock(lock_); 267 base::AutoLock auto_lock(lock_);
265 TemporaryZoomLevels::const_iterator it = std::find( 268 TemporaryZoomLevels::const_iterator it = std::find(
(...skipping 29 matching lines...) Expand all
295 temporary_zoom_levels_[i].render_view_id == render_view_id) { 298 temporary_zoom_levels_[i].render_view_id == render_view_id) {
296 return temporary_zoom_levels_[i].zoom_level; 299 return temporary_zoom_levels_[i].zoom_level;
297 } 300 }
298 } 301 }
299 302
300 return 0; 303 return 0;
301 } 304 }
302 305
303 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, 306 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id,
304 int render_view_id, 307 int render_view_id,
305 double level) { 308 const std::string& host,
Fady Samuel 2014/06/09 15:43:21 This is really weird and inconsistent with the exp
wjmaclean 2014/06/09 17:23:29 Sure, we can do that. I added it primarily so it
wjmaclean 2014/06/10 13:20:09 Done.
309 double level,
310 bool send_level_to_view) {
306 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 311 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
307 312
308 { 313 {
309 base::AutoLock auto_lock(lock_); 314 base::AutoLock auto_lock(lock_);
310 size_t i; 315 size_t i;
311 for (i = 0; i < temporary_zoom_levels_.size(); ++i) { 316 for (i = 0; i < temporary_zoom_levels_.size(); ++i) {
312 if (temporary_zoom_levels_[i].render_process_id == render_process_id && 317 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
313 temporary_zoom_levels_[i].render_view_id == render_view_id) { 318 temporary_zoom_levels_[i].render_view_id == render_view_id) {
314 if (level) { 319 temporary_zoom_levels_[i].zoom_level = level;
315 temporary_zoom_levels_[i].zoom_level = level;
316 } else {
317 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
318 }
319 break; 320 break;
320 } 321 }
321 } 322 }
322 323
323 if (level && i == temporary_zoom_levels_.size()) { 324 if (i == temporary_zoom_levels_.size()) {
324 TemporaryZoomLevel temp(render_process_id, render_view_id, level); 325 TemporaryZoomLevel temp(render_process_id, render_view_id, level);
325 temporary_zoom_levels_.push_back(temp); 326 temporary_zoom_levels_.push_back(temp);
326 } 327 }
327 } 328 }
328 329
330 if (send_level_to_view)
331 SendZoomLevelChange(render_process_id, render_view_id, level);
332
329 HostZoomMap::ZoomLevelChange change; 333 HostZoomMap::ZoomLevelChange change;
330 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; 334 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM;
335 change.host = host;
331 change.zoom_level = level; 336 change.zoom_level = level;
332 337
333 zoom_level_changed_callbacks_.Notify(change); 338 zoom_level_changed_callbacks_.Notify(change);
334 } 339 }
335 340
336 void HostZoomMapImpl::Observe(int type, 341 void HostZoomMapImpl::Observe(int type,
337 const NotificationSource& source, 342 const NotificationSource& source,
338 const NotificationDetails& details) { 343 const NotificationDetails& details) {
339 switch (type) { 344 switch (type) {
340 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { 345 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: {
341 base::AutoLock auto_lock(lock_);
342 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); 346 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID();
343 int render_process_id = 347 int render_process_id =
344 Source<RenderViewHost>(source)->GetProcess()->GetID(); 348 Source<RenderViewHost>(source)->GetProcess()->GetID();
345 349 EraseTemporaryZoomLevel(render_process_id, render_view_id);
346 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
347 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
348 temporary_zoom_levels_[i].render_view_id == render_view_id) {
349 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
350 break;
351 }
352 }
353 break; 350 break;
354 } 351 }
355 default: 352 default:
356 NOTREACHED() << "Unexpected preference observed."; 353 NOTREACHED() << "Unexpected preference observed.";
357 } 354 }
358 } 355 }
359 356
357 void HostZoomMapImpl::EraseTemporaryZoomLevel(int render_process_id,
358 int render_view_id) {
359 base::AutoLock auto_lock(lock_);
360 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) {
361 if (temporary_zoom_levels_[i].render_process_id == render_process_id &&
362 temporary_zoom_levels_[i].render_view_id == render_view_id) {
363 // TODO(wjmaclean) Do we need to lookup the appropriate per-origin
364 // zoom level (if any) and send it to the render view?
365 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i);
366 break;
367 }
368 }
369 }
370
371 void HostZoomMapImpl::SendZoomLevelChange(int render_process_id,
372 int render_view_id,
373 double level) {
374 RenderViewHost* host =
375 RenderViewHost::FromID(render_process_id, render_view_id);
376 DCHECK(host);
377 host->Send(new ViewMsg_SetZoomLevelForView(render_view_id, level));
378 }
379
380 void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme,
381 const std::string& host,
382 double level) {
383 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
384 !i.IsAtEnd(); i.Advance()) {
385 RenderProcessHost* render_process_host = i.GetCurrentValue();
386 if (HostZoomMap::GetForBrowserContext(
387 render_process_host->GetBrowserContext()) == this) {
388 int render_process_id = render_process_host->GetID();
389 std::set<int> exceptions;
390 for (size_t i = 0; i != temporary_zoom_levels_.size(); ++i) {
391 if (temporary_zoom_levels_[i].render_process_id == render_process_id)
392 exceptions.insert(temporary_zoom_levels_[i].render_view_id);
393 }
394 render_process_host->Send(new ViewMsg_SetZoomLevelForCurrentURL(
395 scheme, host, level, exceptions));
396 }
397 }
398 }
399
360 HostZoomMapImpl::~HostZoomMapImpl() { 400 HostZoomMapImpl::~HostZoomMapImpl() {
361 } 401 }
362 402
363 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, 403 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id,
364 int view_id, 404 int view_id,
365 double level) 405 double level)
366 : render_process_id(process_id), 406 : render_process_id(process_id),
367 render_view_id(view_id), 407 render_view_id(view_id),
368 zoom_level(level) { 408 zoom_level(level) {
369 } 409 }
370 410
371 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id, 411 HostZoomMapImpl::TemporaryZoomLevel::TemporaryZoomLevel(int process_id,
372 int view_id) 412 int view_id)
373 : render_process_id(process_id), 413 : render_process_id(process_id),
374 render_view_id(view_id), 414 render_view_id(view_id),
375 zoom_level(0.0) { 415 zoom_level(0.0) {
376 } 416 }
377 417
378 bool HostZoomMapImpl::TemporaryZoomLevel::operator==( 418 bool HostZoomMapImpl::TemporaryZoomLevel::operator==(
379 const TemporaryZoomLevel& other) const { 419 const TemporaryZoomLevel& other) const {
380 return other.render_process_id == render_process_id && 420 return other.render_process_id == render_process_id &&
381 other.render_view_id == render_view_id; 421 other.render_view_id == render_view_id;
382 } 422 }
383 423
384 } // namespace content 424 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698