Index: chrome/browser/host_zoom_map.cc |
=================================================================== |
--- chrome/browser/host_zoom_map.cc (revision 75653) |
+++ chrome/browser/host_zoom_map.cc (working copy) |
@@ -1,260 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <cmath> |
- |
-#include "chrome/browser/host_zoom_map.h" |
- |
-#include "base/string_piece.h" |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/browser_thread.h" |
-#include "chrome/browser/prefs/pref_service.h" |
-#include "chrome/browser/prefs/scoped_pref_update.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/renderer_host/render_process_host.h" |
-#include "chrome/browser/renderer_host/render_view_host.h" |
-#include "chrome/common/notification_details.h" |
-#include "chrome/common/notification_service.h" |
-#include "chrome/common/notification_source.h" |
-#include "chrome/common/notification_type.h" |
-#include "chrome/common/pref_names.h" |
-#include "googleurl/src/gurl.h" |
-#include "net/base/net_util.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
- |
-using WebKit::WebView; |
- |
-HostZoomMap::HostZoomMap(Profile* profile) |
- : profile_(profile), |
- updating_preferences_(false) { |
- Load(); |
- default_zoom_level_ = |
- profile_->GetPrefs()->GetDouble(prefs::kDefaultZoomLevel); |
- registrar_.Add(this, NotificationType::PROFILE_DESTROYED, |
- Source<Profile>(profile)); |
- // Don't observe pref changes (e.g. from sync) in Incognito; once we create |
- // the incognito window it should have no further connection to the main |
- // profile/prefs. |
- if (!profile_->IsOffTheRecord()) { |
- pref_change_registrar_.Init(profile_->GetPrefs()); |
- pref_change_registrar_.Add(prefs::kPerHostZoomLevels, this); |
- pref_change_registrar_.Add(prefs::kDefaultZoomLevel, this); |
- } |
- |
- registrar_.Add( |
- this, NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, |
- NotificationService::AllSources()); |
-} |
- |
-void HostZoomMap::Load() { |
- if (!profile_) |
- return; |
- |
- base::AutoLock auto_lock(lock_); |
- host_zoom_levels_.clear(); |
- const DictionaryValue* host_zoom_dictionary = |
- profile_->GetPrefs()->GetDictionary(prefs::kPerHostZoomLevels); |
- // Careful: The returned value could be NULL if the pref has never been set. |
- if (host_zoom_dictionary != NULL) { |
- for (DictionaryValue::key_iterator i(host_zoom_dictionary->begin_keys()); |
- i != host_zoom_dictionary->end_keys(); ++i) { |
- const std::string& host(*i); |
- double zoom_level = 0; |
- |
- bool success = host_zoom_dictionary->GetDoubleWithoutPathExpansion( |
- host, &zoom_level); |
- if (!success) { |
- // The data used to be stored as ints, so try that. |
- int int_zoom_level; |
- success = host_zoom_dictionary->GetIntegerWithoutPathExpansion( |
- host, &int_zoom_level); |
- if (success) { |
- zoom_level = static_cast<double>(int_zoom_level); |
- // Since the values were once stored as non-clamped, clamp now. |
- double zoom_factor = WebView::zoomLevelToZoomFactor(zoom_level); |
- if (zoom_factor < WebView::minTextSizeMultiplier) { |
- zoom_level = |
- WebView::zoomFactorToZoomLevel(WebView::minTextSizeMultiplier); |
- } else if (zoom_factor > WebView::maxTextSizeMultiplier) { |
- zoom_level = |
- WebView::zoomFactorToZoomLevel(WebView::maxTextSizeMultiplier); |
- } |
- } |
- } |
- DCHECK(success); |
- host_zoom_levels_[host] = zoom_level; |
- } |
- } |
-} |
- |
-// static |
-void HostZoomMap::RegisterUserPrefs(PrefService* prefs) { |
- prefs->RegisterDictionaryPref(prefs::kPerHostZoomLevels); |
-} |
- |
-double HostZoomMap::GetZoomLevel(const GURL& url) const { |
- std::string host(net::GetHostOrSpecFromURL(url)); |
- base::AutoLock auto_lock(lock_); |
- HostZoomLevels::const_iterator i(host_zoom_levels_.find(host)); |
- return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second; |
-} |
- |
-void HostZoomMap::SetZoomLevel(const GURL& url, double level) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!profile_) |
- return; |
- |
- std::string host(net::GetHostOrSpecFromURL(url)); |
- |
- { |
- base::AutoLock auto_lock(lock_); |
- if (level == default_zoom_level_) |
- host_zoom_levels_.erase(host); |
- else |
- host_zoom_levels_[host] = level; |
- } |
- |
- NotificationService::current()->Notify(NotificationType::ZOOM_LEVEL_CHANGED, |
- Source<Profile>(profile_), |
- NotificationService::NoDetails()); |
- |
- // If we're in incognito mode, don't persist changes to the prefs. We'll keep |
- // them in memory only so they will be forgotten on exiting incognito. |
- if (profile_->IsOffTheRecord()) |
- return; |
- |
- updating_preferences_ = true; |
- { |
- ScopedPrefUpdate update(profile_->GetPrefs(), prefs::kPerHostZoomLevels); |
- DictionaryValue* host_zoom_dictionary = |
- profile_->GetPrefs()->GetMutableDictionary(prefs::kPerHostZoomLevels); |
- if (level == default_zoom_level_) { |
- host_zoom_dictionary->RemoveWithoutPathExpansion(host, NULL); |
- } else { |
- host_zoom_dictionary->SetWithoutPathExpansion( |
- host, Value::CreateDoubleValue(level)); |
- } |
- } |
- updating_preferences_ = false; |
-} |
- |
-double HostZoomMap::GetTemporaryZoomLevel(int render_process_id, |
- int render_view_id) const { |
- base::AutoLock auto_lock(lock_); |
- for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { |
- if (temporary_zoom_levels_[i].render_process_id == render_process_id && |
- temporary_zoom_levels_[i].render_view_id == render_view_id) { |
- return temporary_zoom_levels_[i].zoom_level; |
- } |
- } |
- return 0; |
-} |
- |
-void HostZoomMap::SetTemporaryZoomLevel(int render_process_id, |
- int render_view_id, |
- double level) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!profile_) |
- return; |
- |
- { |
- base::AutoLock auto_lock(lock_); |
- size_t i; |
- for (i = 0; i < temporary_zoom_levels_.size(); ++i) { |
- if (temporary_zoom_levels_[i].render_process_id == render_process_id && |
- temporary_zoom_levels_[i].render_view_id == render_view_id) { |
- if (level) { |
- temporary_zoom_levels_[i].zoom_level = level; |
- } else { |
- temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i); |
- } |
- break; |
- } |
- } |
- |
- if (level && i == temporary_zoom_levels_.size()) { |
- TemporaryZoomLevel temp; |
- temp.render_process_id = render_process_id; |
- temp.render_view_id = render_view_id; |
- temp.zoom_level = level; |
- temporary_zoom_levels_.push_back(temp); |
- } |
- } |
- |
- NotificationService::current()->Notify(NotificationType::ZOOM_LEVEL_CHANGED, |
- Source<Profile>(profile_), |
- NotificationService::NoDetails()); |
-} |
- |
-void HostZoomMap::ResetToDefaults() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!profile_) |
- return; |
- |
- { |
- base::AutoLock auto_lock(lock_); |
- host_zoom_levels_.clear(); |
- } |
- |
- updating_preferences_ = true; |
- profile_->GetPrefs()->ClearPref(prefs::kPerHostZoomLevels); |
- updating_preferences_ = false; |
-} |
- |
-void HostZoomMap::Shutdown() { |
- if (!profile_) |
- return; |
- |
- registrar_.RemoveAll(); |
- if (!profile_->IsOffTheRecord()) |
- pref_change_registrar_.RemoveAll(); |
- profile_ = NULL; |
-} |
- |
-void HostZoomMap::Observe( |
- NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- switch (type.value) { |
- case NotificationType::PROFILE_DESTROYED: |
- // If the profile is going away, we need to stop using it. |
- Shutdown(); |
- break; |
- case NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { |
- base::AutoLock auto_lock(lock_); |
- int render_view_id = Source<RenderViewHost>(source)->routing_id(); |
- int render_process_id = Source<RenderViewHost>(source)->process()->id(); |
- |
- for (size_t i = 0; i < temporary_zoom_levels_.size(); ++i) { |
- if (temporary_zoom_levels_[i].render_process_id == render_process_id && |
- temporary_zoom_levels_[i].render_view_id == render_view_id) { |
- temporary_zoom_levels_.erase(temporary_zoom_levels_.begin() + i); |
- break; |
- } |
- } |
- break; |
- } |
- case NotificationType::PREF_CHANGED: { |
- // If we are updating our own preference, don't reload. |
- if (!updating_preferences_) { |
- std::string* name = Details<std::string>(details).ptr(); |
- if (prefs::kPerHostZoomLevels == *name) |
- Load(); |
- else if (prefs::kDefaultZoomLevel == *name) { |
- default_zoom_level_ = |
- profile_->GetPrefs()->GetDouble(prefs::kDefaultZoomLevel); |
- } |
- } |
- break; |
- } |
- default: |
- NOTREACHED() << "Unexpected preference observed."; |
- } |
-} |
- |
-HostZoomMap::~HostZoomMap() { |
- Shutdown(); |
-} |