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 |