Index: chrome/browser/ui/webui/options/content_settings_handler.cc |
diff --git a/chrome/browser/ui/webui/options/content_settings_handler.cc b/chrome/browser/ui/webui/options/content_settings_handler.cc |
index 7850af24a5e326879a513d9f1e93b1f1466f9f6d..e98ce9fcb530dda1186aa607041b8f5c358ec927 100644 |
--- a/chrome/browser/ui/webui/options/content_settings_handler.cc |
+++ b/chrome/browser/ui/webui/options/content_settings_handler.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/ui/webui/options/content_settings_handler.h" |
+#include <algorithm> |
#include <map> |
#include <vector> |
@@ -11,6 +12,7 @@ |
#include "base/bind_helpers.h" |
#include "base/command_line.h" |
#include "base/prefs/pref_service.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/values.h" |
#include "chrome/browser/browser_process.h" |
@@ -39,6 +41,7 @@ |
#include "content/public/browser/user_metrics.h" |
#include "content/public/browser/web_ui.h" |
#include "content/public/common/content_switches.h" |
+#include "content/public/common/page_zoom.h" |
#include "extensions/common/extension_set.h" |
#include "extensions/common/permissions/api_permission.h" |
#include "grit/generated_resources.h" |
@@ -83,6 +86,7 @@ const char* kAppId = "appId"; |
const char* kEmbeddingOrigin = "embeddingOrigin"; |
const char* kPreferencesSource = "preference"; |
const char* kVideoSetting = "video"; |
+const char* kZoom = "zoom"; |
const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { |
{CONTENT_SETTINGS_TYPE_COOKIES, "cookies"}, |
@@ -107,6 +111,10 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { |
#endif |
}; |
+// A pseudo content type. We use it to display data like a content setting even |
+// though it is not a real content setting. |
+const char* kZoomContentType = "zoomlevels"; |
+ |
ContentSettingsType ContentSettingsTypeFromGroupName(const std::string& name) { |
for (size_t i = 0; i < arraysize(kContentSettingsTypeGroupNames); ++i) { |
if (name == kContentSettingsTypeGroupNames[i].name) |
@@ -250,6 +258,17 @@ void AddExceptionsGrantedByHostedApps( |
} |
} |
+// Sort ZoomLevelChanges by host and scheme |
+// (a.com < http://a.com < https://a.com < b.com) |
+bool ZoomLevelChangeLessThan(const content::HostZoomMap::ZoomLevelChange& a, |
+ const content::HostZoomMap::ZoomLevelChange& b) { |
+ if (a.host < b.host) |
+ return true; |
+ if (a.host > b.host) |
+ return false; |
+ return a.scheme < b.scheme; |
+} |
+ |
} // namespace |
namespace options { |
@@ -291,6 +310,7 @@ void ContentSettingsHandler::GetLocalizedValues( |
{ "manage_handlers", IDS_HANDLERS_MANAGE }, |
{ "exceptionPatternHeader", IDS_EXCEPTIONS_PATTERN_HEADER }, |
{ "exceptionBehaviorHeader", IDS_EXCEPTIONS_ACTION_HEADER }, |
+ { "exceptionZoomHeader", IDS_EXCEPTIONS_ZOOM_HEADER }, |
{ "embeddedOnHost", IDS_EXCEPTIONS_GEOLOCATION_EMBEDDED_ON_HOST }, |
// Cookies filter. |
{ "cookies_tab_label", IDS_COOKIES_TAB_LABEL }, |
@@ -400,6 +420,8 @@ void ContentSettingsHandler::GetLocalizedValues( |
{ "midiSysExAllow", IDS_MIDI_SYSEX_ALLOW_RADIO }, |
{ "midiSysExAsk", IDS_MIDI_SYSEX_ASK_RADIO }, |
{ "midiSysExBlock", IDS_MIDI_SYSEX_BLOCK_RADIO }, |
+ { "zoomlevels_header", IDS_ZOOMLEVELS_HEADER }, |
+ { "zoomLevelsManage", IDS_ZOOMLEVELS_MANAGE_BUTTON }, |
}; |
RegisterStrings(localized_strings, resources, arraysize(resources)); |
@@ -438,6 +460,8 @@ void ContentSettingsHandler::GetLocalizedValues( |
IDS_AUTOMATIC_DOWNLOADS_TAB_LABEL); |
RegisterTitle(localized_strings, "midi-sysex", |
IDS_MIDI_SYSEX_TAB_LABEL); |
+ RegisterTitle(localized_strings, "zoomlevels", |
+ IDS_ZOOMLEVELS_TAB_LABEL); |
localized_strings->SetBoolean("newContentSettings", |
CommandLine::ForCurrentProcess()->HasSwitch(switches::kContentSettings2)); |
@@ -486,6 +510,13 @@ void ContentSettingsHandler::InitializeHandler() { |
&ContentSettingsHandler::UpdateProtectedContentExceptionsButton, |
base::Unretained(this))); |
+ content::HostZoomMap* host_zoom_map = |
+ content::HostZoomMap::GetForBrowserContext(profile); |
+ host_zoom_map_subscription_ = |
+ host_zoom_map->AddZoomLevelChangedCallback( |
+ base::Bind(&ContentSettingsHandler::OnZoomLevelChanged, |
+ base::Unretained(this))); |
+ |
flash_settings_manager_.reset(new PepperFlashSettingsManager(this, profile)); |
} |
@@ -677,6 +708,7 @@ void ContentSettingsHandler::UpdateAllExceptionsViewsFromModel() { |
type < CONTENT_SETTINGS_NUM_TYPES; ++type) { |
UpdateExceptionsViewFromModel(static_cast<ContentSettingsType>(type)); |
} |
+ UpdateZoomLevelsExceptionsView(); |
} |
void ContentSettingsHandler::UpdateAllOTRExceptionsViewsFromModel() { |
@@ -958,6 +990,48 @@ void ContentSettingsHandler::UpdateMIDISysExExceptionsView() { |
CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
} |
+void ContentSettingsHandler::UpdateZoomLevelsExceptionsView() { |
+ base::ListValue zoom_levels_exceptions; |
+ |
+ content::HostZoomMap* host_zoom_map = |
+ content::HostZoomMap::GetForBrowserContext(Profile::FromWebUI(web_ui())); |
+ content::HostZoomMap::ZoomLevelVector zoom_levels( |
+ host_zoom_map->GetAllZoomLevels()); |
+ std::sort(zoom_levels.begin(), zoom_levels.end(), ZoomLevelChangeLessThan); |
+ |
+ for (content::HostZoomMap::ZoomLevelVector::const_iterator i = |
+ zoom_levels.begin(); |
+ i != zoom_levels.end(); |
+ ++i) { |
+ base::DictionaryValue* exception = new base::DictionaryValue(); |
+ switch (i->mode) { |
+ case content::HostZoomMap::ZOOM_CHANGED_FOR_HOST: |
+ exception->SetString(kOrigin, i->host); |
+ break; |
+ case content::HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST: |
+ exception->SetString(kOrigin, i->scheme + "://" + i->host); |
+ break; |
+ case content::HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM: |
+ NOTREACHED(); |
+ } |
+ exception->SetString(kSetting, |
+ ContentSettingToString(CONTENT_SETTING_DEFAULT)); |
+ |
+ // Calculate the zoom percent from the factor. Round up to the nearest whole |
+ // number. |
+ int percent = static_cast<int>( |
+ content::ZoomLevelToZoomFactor(i->zoom_level) * 100 + 0.5); |
+ exception->SetString(kZoom, base::IntToString(percent) + "%"); |
markusheintz_
2014/03/12 16:31:06
hm ... I guess the string concatenation should wor
battre
2014/03/13 09:22:14
Done.
|
+ exception->SetString(kSource, kPreferencesSource); |
+ // Append the new entry to the list and map. |
+ zoom_levels_exceptions.Append(exception); |
+ } |
+ |
+ base::StringValue type_string(kZoomContentType); |
+ web_ui()->CallJavascriptFunction("ContentSettings.setExceptions", |
+ type_string, zoom_levels_exceptions); |
+} |
+ |
void ContentSettingsHandler::UpdateExceptionsViewFromHostContentSettingsMap( |
ContentSettingsType type) { |
base::ListValue exceptions; |
@@ -1155,6 +1229,30 @@ void ContentSettingsHandler::RemoveExceptionFromHostContentSettingsMap( |
} |
} |
+void ContentSettingsHandler::RemoveZoomLevelException( |
+ const base::ListValue* args, size_t arg_index) { |
+ std::string mode; |
+ bool rv = args->GetString(arg_index++, &mode); |
+ DCHECK(rv); |
+ |
+ std::string pattern; |
+ rv = args->GetString(arg_index++, &pattern); |
+ DCHECK(rv); |
+ |
+ content::HostZoomMap* host_zoom_map = |
+ content::HostZoomMap::GetForBrowserContext(Profile::FromWebUI(web_ui())); |
+ double default_level = host_zoom_map->GetDefaultZoomLevel(); |
+ |
+ std::string::size_type scheme_separator_position = pattern.find("://"); |
markusheintz_
2014/03/12 16:31:06
In src/content/public/common/url_constants.cc ther
battre
2014/03/13 09:22:14
Done.
battre
2014/03/13 09:22:14
Done.
|
+ if (scheme_separator_position == std::string::npos) { |
+ host_zoom_map->SetZoomLevelForHost(pattern, default_level); |
+ } else { |
+ std::string scheme = pattern.substr(0, scheme_separator_position); |
+ std::string host = pattern.substr(scheme_separator_position + 3); |
markusheintz_
2014/03/12 16:31:06
Please replace the '3' with the length of the cont
battre
2014/03/13 09:22:14
Done.
|
+ host_zoom_map->SetZoomLevelForHostAndScheme(scheme, host, default_level); |
+ } |
+} |
+ |
void ContentSettingsHandler::RegisterMessages() { |
web_ui()->RegisterMessageCallback("setContentFilter", |
base::Bind(&ContentSettingsHandler::SetContentFilter, |
@@ -1282,6 +1380,11 @@ void ContentSettingsHandler::RemoveException(const base::ListValue* args) { |
std::string type_string; |
CHECK(args->GetString(arg_i++, &type_string)); |
+ if (type_string == kZoomContentType) { |
markusheintz_
2014/03/12 16:31:06
Please add a comment why this needs to go before t
battre
2014/03/13 09:22:14
Done.
|
+ RemoveZoomLevelException(args, arg_i); |
+ return; |
+ } |
+ |
ContentSettingsType type = ContentSettingsTypeFromGroupName(type_string); |
switch (type) { |
case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
@@ -1400,6 +1503,11 @@ void ContentSettingsHandler::OnPepperFlashPrefChanged() { |
media_settings_.flash_settings_initialized = false; |
} |
+void ContentSettingsHandler::OnZoomLevelChanged( |
+ const content::HostZoomMap::ZoomLevelChange& change) { |
+ UpdateZoomLevelsExceptionsView(); |
+} |
+ |
void ContentSettingsHandler::ShowFlashMediaLink(LinkType link_type, bool show) { |
bool& show_link = link_type == DEFAULT_SETTING ? |
media_settings_.show_flash_default_link : |