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 "chrome/browser/ui/webui/options/clear_browser_data_handler.h" | 5 #include "chrome/browser/ui/webui/options/clear_browser_data_handler.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/command_line.h" | |
11 #include "base/metrics/histogram_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
12 #include "base/metrics/sparse_histogram.h" | 11 #include "base/metrics/sparse_histogram.h" |
13 #include "base/prefs/pref_service.h" | 12 #include "base/prefs/pref_service.h" |
14 #include "base/strings/string16.h" | 13 #include "base/strings/string16.h" |
15 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
16 #include "base/values.h" | 15 #include "base/values.h" |
17 #include "chrome/app/chrome_command_ids.h" | 16 #include "chrome/app/chrome_command_ids.h" |
18 #include "chrome/browser/browser_process.h" | 17 #include "chrome/browser/browser_process.h" |
19 #include "chrome/browser/browsing_data/autofill_counter.h" | 18 #include "chrome/browser/browsing_data/autofill_counter.h" |
20 #include "chrome/browser/browsing_data/browsing_data_counter.h" | 19 #include "chrome/browser/browsing_data/browsing_data_counter.h" |
| 20 #include "chrome/browser/browsing_data/browsing_data_counter_utils.h" |
21 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 21 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
22 #include "chrome/browser/browsing_data/browsing_data_remover.h" | 22 #include "chrome/browser/browsing_data/browsing_data_remover.h" |
23 #include "chrome/browser/browsing_data/cache_counter.h" | 23 #include "chrome/browser/browsing_data/cache_counter.h" |
24 #include "chrome/browser/browsing_data/history_counter.h" | 24 #include "chrome/browser/browsing_data/history_counter.h" |
25 #include "chrome/browser/browsing_data/passwords_counter.h" | 25 #include "chrome/browser/browsing_data/passwords_counter.h" |
26 #include "chrome/browser/prefs/incognito_mode_prefs.h" | 26 #include "chrome/browser/prefs/incognito_mode_prefs.h" |
27 #include "chrome/browser/profiles/profile.h" | 27 #include "chrome/browser/profiles/profile.h" |
28 #include "chrome/browser/sync/profile_sync_service_factory.h" | 28 #include "chrome/browser/sync/profile_sync_service_factory.h" |
29 #include "chrome/browser/ui/accelerator_utils.h" | 29 #include "chrome/browser/ui/accelerator_utils.h" |
30 #include "chrome/common/chrome_switches.h" | |
31 #include "chrome/common/pref_names.h" | 30 #include "chrome/common/pref_names.h" |
32 #include "chrome/grit/generated_resources.h" | 31 #include "chrome/grit/generated_resources.h" |
33 #include "chrome/grit/locale_settings.h" | 32 #include "chrome/grit/locale_settings.h" |
34 #include "components/google/core/browser/google_util.h" | 33 #include "components/google/core/browser/google_util.h" |
35 #include "content/public/browser/notification_details.h" | 34 #include "content/public/browser/notification_details.h" |
36 #include "content/public/browser/web_ui.h" | 35 #include "content/public/browser/web_ui.h" |
37 #include "ui/base/accelerators/accelerator.h" | 36 #include "ui/base/accelerators/accelerator.h" |
38 #include "ui/base/l10n/l10n_util.h" | 37 #include "ui/base/l10n/l10n_util.h" |
39 #include "ui/base/text/bytes_formatting.h" | |
40 #include "ui/events/keycodes/keyboard_codes.h" | 38 #include "ui/events/keycodes/keyboard_codes.h" |
41 | 39 |
42 namespace { | 40 namespace { |
43 | 41 |
44 const char kClearBrowsingDataLearnMoreUrl[] = | 42 const char kClearBrowsingDataLearnMoreUrl[] = |
45 "https://support.google.com/chrome/?p=settings_clear_browsing_data"; | 43 "https://support.google.com/chrome/?p=settings_clear_browsing_data"; |
46 | 44 |
47 bool AreCountersEnabled() { | |
48 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
49 switches::kEnableClearBrowsingDataCounters)) { | |
50 return true; | |
51 } | |
52 | |
53 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
54 switches::kDisableClearBrowsingDataCounters)) { | |
55 return false; | |
56 } | |
57 | |
58 // Enabled by default. | |
59 return true; | |
60 } | |
61 | |
62 // A helper function to display the size of cache in units of MB or higher. | |
63 // We need this, as 1 MB is the lowest nonzero cache size displayed by the | |
64 // counter. | |
65 base::string16 FormatBytesMBOrHigher(BrowsingDataCounter::ResultInt bytes) { | |
66 if (ui::GetByteDisplayUnits(bytes) >= ui::DataUnits::DATA_UNITS_MEBIBYTE) | |
67 return ui::FormatBytes(bytes); | |
68 | |
69 return ui::FormatBytesWithUnits( | |
70 bytes, ui::DataUnits::DATA_UNITS_MEBIBYTE, true); | |
71 } | |
72 | |
73 } // namespace | 45 } // namespace |
74 | 46 |
75 namespace options { | 47 namespace options { |
76 | 48 |
77 ClearBrowserDataHandler::ClearBrowserDataHandler() | 49 ClearBrowserDataHandler::ClearBrowserDataHandler() |
78 : remover_(nullptr), | 50 : remover_(nullptr), |
79 sync_service_(nullptr) { | 51 sync_service_(nullptr) { |
80 } | 52 } |
81 | 53 |
82 ClearBrowserDataHandler::~ClearBrowserDataHandler() { | 54 ClearBrowserDataHandler::~ClearBrowserDataHandler() { |
83 if (remover_) | 55 if (remover_) |
84 remover_->RemoveObserver(this); | 56 remover_->RemoveObserver(this); |
85 if (sync_service_) | 57 if (sync_service_) |
86 sync_service_->RemoveObserver(this); | 58 sync_service_->RemoveObserver(this); |
87 } | 59 } |
88 | 60 |
89 void ClearBrowserDataHandler::InitializeHandler() { | 61 void ClearBrowserDataHandler::InitializeHandler() { |
90 PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs(); | 62 PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs(); |
91 clear_plugin_lso_data_enabled_.Init(prefs::kClearPluginLSODataEnabled, prefs); | 63 clear_plugin_lso_data_enabled_.Init(prefs::kClearPluginLSODataEnabled, prefs); |
92 pepper_flash_settings_enabled_.Init(prefs::kPepperFlashSettingsEnabled, | 64 pepper_flash_settings_enabled_.Init(prefs::kPepperFlashSettingsEnabled, |
93 prefs); | 65 prefs); |
94 allow_deleting_browser_history_.Init( | 66 allow_deleting_browser_history_.Init( |
95 prefs::kAllowDeletingBrowserHistory, | 67 prefs::kAllowDeletingBrowserHistory, |
96 prefs, | 68 prefs, |
97 base::Bind(&ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged, | 69 base::Bind(&ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged, |
98 base::Unretained(this))); | 70 base::Unretained(this))); |
99 | 71 |
100 if (AreCountersEnabled()) { | 72 if (browsing_data::AreCountersEnabled()) { |
101 AddCounter(make_scoped_ptr(new PasswordsCounter())); | 73 AddCounter(make_scoped_ptr(new PasswordsCounter())); |
102 AddCounter(make_scoped_ptr(new HistoryCounter())); | 74 AddCounter(make_scoped_ptr(new HistoryCounter())); |
103 AddCounter(make_scoped_ptr(new CacheCounter())); | 75 AddCounter(make_scoped_ptr(new CacheCounter())); |
104 AddCounter(make_scoped_ptr(new AutofillCounter())); | 76 AddCounter(make_scoped_ptr(new AutofillCounter())); |
105 | 77 |
106 sync_service_ = | 78 sync_service_ = |
107 ProfileSyncServiceFactory::GetForProfile(Profile::FromWebUI(web_ui())); | 79 ProfileSyncServiceFactory::GetForProfile(Profile::FromWebUI(web_ui())); |
108 if (sync_service_) | 80 if (sync_service_) |
109 sync_service_->AddObserver(this); | 81 sync_service_->AddObserver(this); |
110 } | 82 } |
111 } | 83 } |
112 | 84 |
113 void ClearBrowserDataHandler::InitializePage() { | 85 void ClearBrowserDataHandler::InitializePage() { |
114 web_ui()->CallJavascriptFunction( | 86 web_ui()->CallJavascriptFunction( |
115 "ClearBrowserDataOverlay.createFooter", | 87 "ClearBrowserDataOverlay.createFooter", |
116 base::FundamentalValue(AreCountersEnabled()), | 88 base::FundamentalValue(browsing_data::AreCountersEnabled()), |
117 base::FundamentalValue(sync_service_ && sync_service_->IsSyncActive())); | 89 base::FundamentalValue(sync_service_ && sync_service_->IsSyncActive())); |
118 UpdateInfoBannerVisibility(); | 90 UpdateInfoBannerVisibility(); |
119 OnBrowsingHistoryPrefChanged(); | 91 OnBrowsingHistoryPrefChanged(); |
120 bool removal_in_progress = !!remover_; | 92 bool removal_in_progress = !!remover_; |
121 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setClearing", | 93 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setClearing", |
122 base::FundamentalValue(removal_in_progress)); | 94 base::FundamentalValue(removal_in_progress)); |
123 | 95 |
124 web_ui()->CallJavascriptFunction( | 96 web_ui()->CallJavascriptFunction( |
125 "ClearBrowserDataOverlay.markInitializationComplete"); | 97 "ClearBrowserDataOverlay.markInitializationComplete"); |
126 } | 98 } |
(...skipping 14 matching lines...) Expand all Loading... |
141 DCHECK_NE(ui::VKEY_UNKNOWN, acc.key_code()); | 113 DCHECK_NE(ui::VKEY_UNKNOWN, acc.key_code()); |
142 text = l10n_util::GetStringFUTF16(IDS_CLEAR_BROWSING_DATA_INFO_BAR_TEXT, | 114 text = l10n_util::GetStringFUTF16(IDS_CLEAR_BROWSING_DATA_INFO_BAR_TEXT, |
143 acc.GetShortcutText()); | 115 acc.GetShortcutText()); |
144 } | 116 } |
145 } | 117 } |
146 | 118 |
147 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setBannerText", | 119 web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setBannerText", |
148 base::StringValue(text)); | 120 base::StringValue(text)); |
149 } | 121 } |
150 | 122 |
151 // static | |
152 base::string16 ClearBrowserDataHandler::GetCounterTextFromResult( | |
153 const BrowsingDataCounter::Result* result) { | |
154 base::string16 text; | |
155 std::string pref_name = result->source()->GetPrefName(); | |
156 | |
157 if (!result->Finished()) { | |
158 // The counter is still counting. | |
159 text = l10n_util::GetStringUTF16(IDS_CLEAR_BROWSING_DATA_CALCULATING); | |
160 | |
161 } else if (pref_name == prefs::kDeletePasswords) { | |
162 // Passwords counter. | |
163 BrowsingDataCounter::ResultInt passwords_count = | |
164 static_cast<const BrowsingDataCounter::FinishedResult*>( | |
165 result)->Value(); | |
166 text = l10n_util::GetPluralStringFUTF16( | |
167 IDS_DEL_PASSWORDS_COUNTER, passwords_count); | |
168 | |
169 } else if (pref_name == prefs::kDeleteCache) { | |
170 // Cache counter. | |
171 BrowsingDataCounter::ResultInt cache_size_bytes = | |
172 static_cast<const BrowsingDataCounter::FinishedResult*>( | |
173 result)->Value(); | |
174 | |
175 PrefService* prefs = result->source()->GetProfile()->GetPrefs(); | |
176 BrowsingDataRemover::TimePeriod time_period = | |
177 static_cast<BrowsingDataRemover::TimePeriod>( | |
178 prefs->GetInteger(prefs::kDeleteTimePeriod)); | |
179 | |
180 // Three cases: Nonzero result for the entire cache, nonzero result for | |
181 // a subset of cache (i.e. a finite time interval), and almost zero (< 1MB). | |
182 static const int kBytesInAMegabyte = 1024 * 1024; | |
183 if (cache_size_bytes >= kBytesInAMegabyte) { | |
184 base::string16 formatted_size = FormatBytesMBOrHigher(cache_size_bytes); | |
185 text = time_period == BrowsingDataRemover::EVERYTHING | |
186 ? formatted_size | |
187 : l10n_util::GetStringFUTF16(IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE, | |
188 formatted_size); | |
189 } else { | |
190 text = l10n_util::GetStringUTF16(IDS_DEL_CACHE_COUNTER_ALMOST_EMPTY); | |
191 } | |
192 | |
193 } else if (pref_name == prefs::kDeleteBrowsingHistory) { | |
194 // History counter. | |
195 const HistoryCounter::HistoryResult* history_result = | |
196 static_cast<const HistoryCounter::HistoryResult*>(result); | |
197 BrowsingDataCounter::ResultInt local_item_count = history_result->Value(); | |
198 bool has_synced_visits = history_result->has_synced_visits(); | |
199 | |
200 text = has_synced_visits | |
201 ? l10n_util::GetPluralStringFUTF16( | |
202 IDS_DEL_BROWSING_HISTORY_COUNTER_SYNCED, local_item_count) | |
203 : l10n_util::GetPluralStringFUTF16( | |
204 IDS_DEL_BROWSING_HISTORY_COUNTER, local_item_count); | |
205 | |
206 } else if (pref_name == prefs::kDeleteFormData) { | |
207 // Autofill counter. | |
208 const AutofillCounter::AutofillResult* autofill_result = | |
209 static_cast<const AutofillCounter::AutofillResult*>(result); | |
210 AutofillCounter::ResultInt num_suggestions = autofill_result->Value(); | |
211 AutofillCounter::ResultInt num_credit_cards = | |
212 autofill_result->num_credit_cards(); | |
213 AutofillCounter::ResultInt num_addresses = autofill_result->num_addresses(); | |
214 | |
215 std::vector<base::string16> displayed_strings; | |
216 | |
217 if (num_credit_cards) { | |
218 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
219 IDS_DEL_AUTOFILL_COUNTER_CREDIT_CARDS, num_credit_cards)); | |
220 } | |
221 if (num_addresses) { | |
222 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
223 IDS_DEL_AUTOFILL_COUNTER_ADDRESSES, num_addresses)); | |
224 } | |
225 if (num_suggestions) { | |
226 // We use a different wording for autocomplete suggestions based on the | |
227 // length of the entire string. | |
228 switch (displayed_strings.size()) { | |
229 case 0: | |
230 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
231 IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS, num_suggestions)); | |
232 break; | |
233 case 1: | |
234 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
235 IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS_LONG, num_suggestions)); | |
236 break; | |
237 case 2: | |
238 displayed_strings.push_back(l10n_util::GetPluralStringFUTF16( | |
239 IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS_SHORT, num_suggestions)); | |
240 break; | |
241 default: | |
242 NOTREACHED(); | |
243 } | |
244 } | |
245 | |
246 // Construct the resulting string from the sections in |displayed_strings|. | |
247 switch (displayed_strings.size()) { | |
248 case 0: | |
249 text = l10n_util::GetStringUTF16(IDS_DEL_AUTOFILL_COUNTER_EMPTY); | |
250 break; | |
251 case 1: | |
252 text = displayed_strings[0]; | |
253 break; | |
254 case 2: | |
255 text = l10n_util::GetStringFUTF16(IDS_DEL_AUTOFILL_COUNTER_TWO_TYPES, | |
256 displayed_strings[0], | |
257 displayed_strings[1]); | |
258 break; | |
259 case 3: | |
260 text = l10n_util::GetStringFUTF16(IDS_DEL_AUTOFILL_COUNTER_THREE_TYPES, | |
261 displayed_strings[0], | |
262 displayed_strings[1], | |
263 displayed_strings[2]); | |
264 break; | |
265 default: | |
266 NOTREACHED(); | |
267 } | |
268 } | |
269 | |
270 return text; | |
271 } | |
272 | |
273 void ClearBrowserDataHandler::OnPageOpened(const base::ListValue* value) { | 123 void ClearBrowserDataHandler::OnPageOpened(const base::ListValue* value) { |
274 for (BrowsingDataCounter* counter : counters_) { | 124 for (BrowsingDataCounter* counter : counters_) { |
275 DCHECK(AreCountersEnabled()); | 125 DCHECK(browsing_data::AreCountersEnabled()); |
276 counter->Restart(); | 126 counter->Restart(); |
277 } | 127 } |
278 } | 128 } |
279 | 129 |
280 void ClearBrowserDataHandler::GetLocalizedValues( | 130 void ClearBrowserDataHandler::GetLocalizedValues( |
281 base::DictionaryValue* localized_strings) { | 131 base::DictionaryValue* localized_strings) { |
282 DCHECK(localized_strings); | 132 DCHECK(localized_strings); |
283 | 133 |
284 static OptionsStringResource resources[] = { | 134 static OptionsStringResource resources[] = { |
285 { "clearBrowserDataLabel", IDS_CLEAR_BROWSING_DATA_LABEL }, | 135 { "clearBrowserDataLabel", IDS_CLEAR_BROWSING_DATA_LABEL }, |
286 { "clearBrowserDataSyncWarning", IDS_CLEAR_BROWSING_DATA_SYNCED_DELETION }, | 136 { "clearBrowserDataSyncWarning", IDS_CLEAR_BROWSING_DATA_SYNCED_DELETION }, |
287 { "clearBrowserDataSupportString", AreCountersEnabled() | 137 { "clearBrowserDataSupportString", browsing_data::AreCountersEnabled() |
288 ? IDS_CLEAR_BROWSING_DATA_SOME_STUFF_REMAINS_SIMPLE | 138 ? IDS_CLEAR_BROWSING_DATA_SOME_STUFF_REMAINS_SIMPLE |
289 : IDS_CLEAR_BROWSING_DATA_SOME_STUFF_REMAINS }, | 139 : IDS_CLEAR_BROWSING_DATA_SOME_STUFF_REMAINS }, |
290 { "deleteBrowsingHistoryCheckbox", IDS_DEL_BROWSING_HISTORY_CHKBOX }, | 140 { "deleteBrowsingHistoryCheckbox", IDS_DEL_BROWSING_HISTORY_CHKBOX }, |
291 { "deleteDownloadHistoryCheckbox", IDS_DEL_DOWNLOAD_HISTORY_CHKBOX }, | 141 { "deleteDownloadHistoryCheckbox", IDS_DEL_DOWNLOAD_HISTORY_CHKBOX }, |
292 { "deleteCacheCheckbox", IDS_DEL_CACHE_CHKBOX }, | 142 { "deleteCacheCheckbox", IDS_DEL_CACHE_CHKBOX }, |
293 { "deleteCookiesCheckbox", IDS_DEL_COOKIES_CHKBOX }, | 143 { "deleteCookiesCheckbox", IDS_DEL_COOKIES_CHKBOX }, |
294 { "deleteCookiesFlashCheckbox", IDS_DEL_COOKIES_FLASH_CHKBOX }, | 144 { "deleteCookiesFlashCheckbox", IDS_DEL_COOKIES_FLASH_CHKBOX }, |
295 { "deletePasswordsCheckbox", IDS_DEL_PASSWORDS_CHKBOX }, | 145 { "deletePasswordsCheckbox", IDS_DEL_PASSWORDS_CHKBOX }, |
296 { "deleteFormDataCheckbox", IDS_DEL_FORM_DATA_CHKBOX }, | 146 { "deleteFormDataCheckbox", IDS_DEL_FORM_DATA_CHKBOX }, |
297 { "deleteHostedAppsDataCheckbox", IDS_DEL_HOSTED_APPS_DATA_CHKBOX }, | 147 { "deleteHostedAppsDataCheckbox", IDS_DEL_HOSTED_APPS_DATA_CHKBOX }, |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 } | 297 } |
448 | 298 |
449 void ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged() { | 299 void ClearBrowserDataHandler::OnBrowsingHistoryPrefChanged() { |
450 web_ui()->CallJavascriptFunction( | 300 web_ui()->CallJavascriptFunction( |
451 "ClearBrowserDataOverlay.setAllowDeletingHistory", | 301 "ClearBrowserDataOverlay.setAllowDeletingHistory", |
452 base::FundamentalValue(*allow_deleting_browser_history_)); | 302 base::FundamentalValue(*allow_deleting_browser_history_)); |
453 } | 303 } |
454 | 304 |
455 void ClearBrowserDataHandler::AddCounter( | 305 void ClearBrowserDataHandler::AddCounter( |
456 scoped_ptr<BrowsingDataCounter> counter) { | 306 scoped_ptr<BrowsingDataCounter> counter) { |
457 DCHECK(AreCountersEnabled()); | 307 DCHECK(browsing_data::AreCountersEnabled()); |
458 | 308 |
459 counter->Init( | 309 counter->Init( |
460 Profile::FromWebUI(web_ui()), | 310 Profile::FromWebUI(web_ui()), |
461 base::Bind(&ClearBrowserDataHandler::UpdateCounterText, | 311 base::Bind(&ClearBrowserDataHandler::UpdateCounterText, |
462 base::Unretained(this))); | 312 base::Unretained(this))); |
463 counters_.push_back(counter.Pass()); | 313 counters_.push_back(counter.Pass()); |
464 } | 314 } |
465 | 315 |
466 void ClearBrowserDataHandler::UpdateCounterText( | 316 void ClearBrowserDataHandler::UpdateCounterText( |
467 scoped_ptr<BrowsingDataCounter::Result> result) { | 317 scoped_ptr<BrowsingDataCounter::Result> result) { |
468 DCHECK(AreCountersEnabled()); | 318 DCHECK(browsing_data::AreCountersEnabled()); |
469 web_ui()->CallJavascriptFunction( | 319 web_ui()->CallJavascriptFunction( |
470 "ClearBrowserDataOverlay.updateCounter", | 320 "ClearBrowserDataOverlay.updateCounter", |
471 base::StringValue(result->source()->GetPrefName()), | 321 base::StringValue(result->source()->GetPrefName()), |
472 base::StringValue(GetCounterTextFromResult(result.get()))); | 322 base::StringValue(browsing_data::GetCounterTextFromResult(result.get()))); |
473 } | 323 } |
474 | 324 |
475 void ClearBrowserDataHandler::OnStateChanged() { | 325 void ClearBrowserDataHandler::OnStateChanged() { |
476 web_ui()->CallJavascriptFunction( | 326 web_ui()->CallJavascriptFunction( |
477 "ClearBrowserDataOverlay.updateSyncWarning", | 327 "ClearBrowserDataOverlay.updateSyncWarning", |
478 base::FundamentalValue(sync_service_ && sync_service_->IsSyncActive())); | 328 base::FundamentalValue(sync_service_ && sync_service_->IsSyncActive())); |
479 } | 329 } |
480 | 330 |
481 } // namespace options | 331 } // namespace options |
OLD | NEW |