| OLD | NEW |
| 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 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 | 143 |
| 144 { | 144 { |
| 145 base::AutoLock auto_lock(lock_); | 145 base::AutoLock auto_lock(lock_); |
| 146 | 146 |
| 147 if (ZoomValuesEqual(level, default_zoom_level_)) | 147 if (ZoomValuesEqual(level, default_zoom_level_)) |
| 148 host_zoom_levels_.erase(host); | 148 host_zoom_levels_.erase(host); |
| 149 else | 149 else |
| 150 host_zoom_levels_[host] = level; | 150 host_zoom_levels_[host] = level; |
| 151 } | 151 } |
| 152 | 152 |
| 153 // Notify renderers from this browser context. | 153 SendZoomLevelChange(std::string(), host, level); |
| 154 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); | 154 |
| 155 !i.IsAtEnd(); i.Advance()) { | |
| 156 RenderProcessHost* render_process_host = i.GetCurrentValue(); | |
| 157 if (HostZoomMap::GetForBrowserContext( | |
| 158 render_process_host->GetBrowserContext()) == this) { | |
| 159 render_process_host->Send( | |
| 160 new ViewMsg_SetZoomLevelForCurrentURL(std::string(), host, level)); | |
| 161 } | |
| 162 } | |
| 163 HostZoomMap::ZoomLevelChange change; | 155 HostZoomMap::ZoomLevelChange change; |
| 164 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST; | 156 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST; |
| 165 change.host = host; | 157 change.host = host; |
| 166 change.zoom_level = level; | 158 change.zoom_level = level; |
| 167 | 159 |
| 168 zoom_level_changed_callbacks_.Notify(change); | 160 zoom_level_changed_callbacks_.Notify(change); |
| 169 } | 161 } |
| 170 | 162 |
| 171 void HostZoomMapImpl::SetZoomLevelForHostAndScheme(const std::string& scheme, | 163 void HostZoomMapImpl::SetZoomLevelForHostAndScheme(const std::string& scheme, |
| 172 const std::string& host, | 164 const std::string& host, |
| 173 double level) { | 165 double level) { |
| 174 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 166 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 175 { | 167 { |
| 176 base::AutoLock auto_lock(lock_); | 168 base::AutoLock auto_lock(lock_); |
| 177 scheme_host_zoom_levels_[scheme][host] = level; | 169 scheme_host_zoom_levels_[scheme][host] = level; |
| 178 } | 170 } |
| 179 | 171 |
| 180 // Notify renderers from this browser context. | 172 SendZoomLevelChange(scheme, host, level); |
| 181 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); | |
| 182 !i.IsAtEnd(); i.Advance()) { | |
| 183 RenderProcessHost* render_process_host = i.GetCurrentValue(); | |
| 184 if (HostZoomMap::GetForBrowserContext( | |
| 185 render_process_host->GetBrowserContext()) == this) { | |
| 186 render_process_host->Send( | |
| 187 new ViewMsg_SetZoomLevelForCurrentURL(scheme, host, level)); | |
| 188 } | |
| 189 } | |
| 190 | 173 |
| 191 HostZoomMap::ZoomLevelChange change; | 174 HostZoomMap::ZoomLevelChange change; |
| 192 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST; | 175 change.mode = HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST; |
| 193 change.host = host; | 176 change.host = host; |
| 194 change.scheme = scheme; | 177 change.scheme = scheme; |
| 195 change.zoom_level = level; | 178 change.zoom_level = level; |
| 196 | 179 |
| 197 zoom_level_changed_callbacks_.Notify(change); | 180 zoom_level_changed_callbacks_.Notify(change); |
| 198 } | 181 } |
| 199 | 182 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 } | 216 } |
| 234 | 217 |
| 235 void HostZoomMapImpl::SetZoomLevelForWebContents( | 218 void HostZoomMapImpl::SetZoomLevelForWebContents( |
| 236 const WebContents& web_contents, | 219 const WebContents& web_contents, |
| 237 double level) { | 220 double level) { |
| 238 const WebContentsImpl& web_contents_impl = | 221 const WebContentsImpl& web_contents_impl = |
| 239 static_cast<const WebContentsImpl&>(web_contents); | 222 static_cast<const WebContentsImpl&>(web_contents); |
| 240 int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID(); | 223 int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID(); |
| 241 int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID(); | 224 int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID(); |
| 242 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) { | 225 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) { |
| 243 | 226 SetTemporaryZoomLevel(render_process_id, |
| 244 SetTemporaryZoomLevel(render_process_id, render_view_id, level); | 227 render_view_id, |
| 228 net::GetHostOrSpecFromURL( |
| 229 web_contents_impl.GetLastCommittedURL()), |
| 230 level); |
| 245 } else { | 231 } else { |
| 246 SetZoomLevelForHost( | 232 SetZoomLevelForHost( |
| 247 net::GetHostOrSpecFromURL(web_contents_impl.GetLastCommittedURL()), | 233 net::GetHostOrSpecFromURL(web_contents_impl.GetLastCommittedURL()), |
| 248 level); | 234 level); |
| 249 } | 235 } |
| 250 } | 236 } |
| 251 | 237 |
| 252 void HostZoomMapImpl::SetZoomLevelForView(int render_process_id, | 238 void HostZoomMapImpl::SetZoomLevelForView(int render_process_id, |
| 253 int render_view_id, | 239 int render_view_id, |
| 254 double level, | 240 double level, |
| 255 const std::string& host) { | 241 const std::string& host) { |
| 256 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) | 242 if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) |
| 257 SetTemporaryZoomLevel(render_process_id, render_view_id, level); | 243 SetTemporaryZoomLevel(render_process_id, render_view_id, host, level); |
| 258 else | 244 else |
| 259 SetZoomLevelForHost(host, level); | 245 SetZoomLevelForHost(host, level); |
| 260 } | 246 } |
| 261 | 247 |
| 262 bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id, | 248 bool HostZoomMapImpl::UsesTemporaryZoomLevel(int render_process_id, |
| 263 int render_view_id) const { | 249 int render_view_id) const { |
| 264 base::AutoLock auto_lock(lock_); | 250 base::AutoLock auto_lock(lock_); |
| 265 TemporaryZoomLevel zoom_level(render_process_id, render_view_id); | 251 TemporaryZoomLevel zoom_level(render_process_id, render_view_id); |
| 266 TemporaryZoomLevelList::const_iterator it = find( | 252 TemporaryZoomLevelList::const_iterator it = find( |
| 267 temporary_zoom_levels_.begin(), temporary_zoom_levels_.end(), zoom_level); | 253 temporary_zoom_levels_.begin(), temporary_zoom_levels_.end(), zoom_level); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 296 temporary_zoom_levels_[i].render_view_id == render_view_id) { | 282 temporary_zoom_levels_[i].render_view_id == render_view_id) { |
| 297 return temporary_zoom_levels_[i].zoom_level; | 283 return temporary_zoom_levels_[i].zoom_level; |
| 298 } | 284 } |
| 299 } | 285 } |
| 300 | 286 |
| 301 return 0; | 287 return 0; |
| 302 } | 288 } |
| 303 | 289 |
| 304 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, | 290 void HostZoomMapImpl::SetTemporaryZoomLevel(int render_process_id, |
| 305 int render_view_id, | 291 int render_view_id, |
| 292 const std::string& host, |
| 306 double level) { | 293 double level) { |
| 307 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 294 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 308 | 295 |
| 309 { | 296 { |
| 310 base::AutoLock auto_lock(lock_); | 297 base::AutoLock auto_lock(lock_); |
| 311 size_t i; | 298 size_t i; |
| 312 for (i = 0; i < temporary_zoom_levels_.size(); ++i) { | 299 for (i = 0; i < temporary_zoom_levels_.size(); ++i) { |
| 313 if (temporary_zoom_levels_[i].render_process_id == render_process_id && | 300 if (temporary_zoom_levels_[i].render_process_id == render_process_id && |
| 314 temporary_zoom_levels_[i].render_view_id == render_view_id) { | 301 temporary_zoom_levels_[i].render_view_id == render_view_id) { |
| 315 if (level) { | 302 temporary_zoom_levels_[i].zoom_level = level; |
| 316 temporary_zoom_levels_[i].zoom_level = level; | |
| 317 } else { | |
| 318 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i); | |
| 319 } | |
| 320 break; | 303 break; |
| 321 } | 304 } |
| 322 } | 305 } |
| 323 | 306 |
| 324 if (level && i == temporary_zoom_levels_.size()) { | 307 if (level && i == temporary_zoom_levels_.size()) { |
| 325 TemporaryZoomLevel temp(render_process_id, render_view_id, level); | 308 TemporaryZoomLevel temp(render_process_id, render_view_id, level); |
| 326 temporary_zoom_levels_.push_back(temp); | 309 temporary_zoom_levels_.push_back(temp); |
| 327 } | 310 } |
| 328 } | 311 } |
| 329 | 312 |
| 330 HostZoomMap::ZoomLevelChange change; | 313 HostZoomMap::ZoomLevelChange change; |
| 331 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; | 314 change.mode = HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM; |
| 315 change.host = host; |
| 332 change.zoom_level = level; | 316 change.zoom_level = level; |
| 333 | 317 |
| 334 zoom_level_changed_callbacks_.Notify(change); | 318 zoom_level_changed_callbacks_.Notify(change); |
| 335 } | 319 } |
| 336 | 320 |
| 337 void HostZoomMapImpl::Observe(int type, | 321 void HostZoomMapImpl::Observe(int type, |
| 338 const NotificationSource& source, | 322 const NotificationSource& source, |
| 339 const NotificationDetails& details) { | 323 const NotificationDetails& details) { |
| 340 switch (type) { | 324 switch (type) { |
| 341 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { | 325 case NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { |
| 342 base::AutoLock auto_lock(lock_); | 326 base::AutoLock auto_lock(lock_); |
| 343 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); | 327 int render_view_id = Source<RenderViewHost>(source)->GetRoutingID(); |
| 344 int render_process_id = | 328 int render_process_id = |
| 345 Source<RenderViewHost>(source)->GetProcess()->GetID(); | 329 Source<RenderViewHost>(source)->GetProcess()->GetID(); |
| 346 | 330 EraseTemporaryZoomLevel(render_process_id, render_view_id); |
| 347 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { | |
| 348 if (temporary_zoom_levels_[i].render_process_id == render_process_id && | |
| 349 temporary_zoom_levels_[i].render_view_id == render_view_id) { | |
| 350 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i); | |
| 351 break; | |
| 352 } | |
| 353 } | |
| 354 break; | 331 break; |
| 355 } | 332 } |
| 356 default: | 333 default: |
| 357 NOTREACHED() << "Unexpected preference observed."; | 334 NOTREACHED() << "Unexpected preference observed."; |
| 358 } | 335 } |
| 359 } | 336 } |
| 360 | 337 |
| 338 void HostZoomMapImpl::EraseTemporaryZoomLevel(int render_process_id, |
| 339 int render_view_id) { |
| 340 base::AutoLock auto_lock(lock_); |
| 341 for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { |
| 342 if (temporary_zoom_levels_[i].render_process_id == render_process_id && |
| 343 temporary_zoom_levels_[i].render_view_id == render_view_id) { |
| 344 temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i); |
| 345 break; |
| 346 } |
| 347 } |
| 348 } |
| 349 |
| 350 void HostZoomMapImpl::SendZoomLevelChange(const std::string& scheme, |
| 351 const std::string& host, |
| 352 double level) { |
| 353 for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); |
| 354 !i.IsAtEnd(); i.Advance()) { |
| 355 RenderProcessHost* render_process_host = i.GetCurrentValue(); |
| 356 if (HostZoomMap::GetForBrowserContext( |
| 357 render_process_host->GetBrowserContext()) == this) { |
| 358 int render_process_id = render_process_host->GetID(); |
| 359 std::set<int> exceptions; |
| 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 exceptions.insert(temporary_zoom_levels_[i].render_view_id); |
| 363 } |
| 364 render_process_host->Send(new ViewMsg_SetZoomLevelForCurrentURL( |
| 365 scheme, host, level, exceptions)); |
| 366 } |
| 367 } |
| 368 } |
| 369 |
| 361 HostZoomMapImpl::~HostZoomMapImpl() { | 370 HostZoomMapImpl::~HostZoomMapImpl() { |
| 362 } | 371 } |
| 363 | 372 |
| 364 } // namespace content | 373 } // namespace content |
| OLD | NEW |