| 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/flags_ui.h" | 5 #include "chrome/browser/ui/webui/flags_ui.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 #if defined(OS_CHROMEOS) | 73 #if defined(OS_CHROMEOS) |
| 74 if (!chromeos::UserManager::Get()->IsCurrentUserOwner() && | 74 if (!chromeos::UserManager::Get()->IsCurrentUserOwner() && |
| 75 base::chromeos::IsRunningOnChromeOS()) { | 75 base::chromeos::IsRunningOnChromeOS()) { |
| 76 // Set the strings to show which user can actually change the flags. | 76 // Set the strings to show which user can actually change the flags. |
| 77 std::string owner; | 77 std::string owner; |
| 78 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner); | 78 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner); |
| 79 source->AddString("ownerWarning", | 79 source->AddString("ownerWarning", |
| 80 l10n_util::GetStringFUTF16(IDS_SYSTEM_FLAGS_OWNER_ONLY, | 80 l10n_util::GetStringFUTF16(IDS_SYSTEM_FLAGS_OWNER_ONLY, |
| 81 UTF8ToUTF16(owner))); | 81 UTF8ToUTF16(owner))); |
| 82 } else { | 82 } else { |
| 83 // The warning will be only shown on ChromeOS, when the current user is not |
| 84 // the owner. |
| 83 source->AddString("ownerWarning", string16()); | 85 source->AddString("ownerWarning", string16()); |
| 84 } | 86 } |
| 85 #endif | 87 #endif |
| 86 | 88 |
| 87 source->SetJsonPath("strings.js"); | 89 source->SetJsonPath("strings.js"); |
| 88 source->AddResourcePath("flags.js", IDR_FLAGS_JS); | 90 source->AddResourcePath("flags.js", IDR_FLAGS_JS); |
| 89 source->SetDefaultResource(IDR_FLAGS_HTML); | 91 source->SetDefaultResource(IDR_FLAGS_HTML); |
| 90 return source; | 92 return source; |
| 91 } | 93 } |
| 92 | 94 |
| 93 //////////////////////////////////////////////////////////////////////////////// | 95 //////////////////////////////////////////////////////////////////////////////// |
| 94 // | 96 // |
| 95 // FlagsDOMHandler | 97 // FlagsDOMHandler |
| 96 // | 98 // |
| 97 //////////////////////////////////////////////////////////////////////////////// | 99 //////////////////////////////////////////////////////////////////////////////// |
| 98 | 100 |
| 99 // The handler for Javascript messages for the about:flags page. | 101 // The handler for Javascript messages for the about:flags page. |
| 100 class FlagsDOMHandler : public WebUIMessageHandler { | 102 class FlagsDOMHandler : public WebUIMessageHandler { |
| 101 public: | 103 public: |
| 102 FlagsDOMHandler(about_flags::FlagsStorage* flags_storage, | 104 FlagsDOMHandler() : access_(about_flags::kGeneralAccessFlagsOnly), |
| 103 about_flags::FlagAccess access) | 105 flags_experiments_requested_(false) { |
| 104 : flags_storage_(flags_storage), access_(access) {} | 106 } |
| 105 virtual ~FlagsDOMHandler() {} | 107 virtual ~FlagsDOMHandler() {} |
| 106 | 108 |
| 109 // Initializes the DOM handler with the provided flags storage and flags |
| 110 // access. If there were flags experiments requested from javascript before |
| 111 // this was called, it calls |HandleRequestFlagsExperiments| again. |
| 112 void Init(about_flags::FlagsStorage* flags_storage, |
| 113 about_flags::FlagAccess access); |
| 114 |
| 107 // WebUIMessageHandler implementation. | 115 // WebUIMessageHandler implementation. |
| 108 virtual void RegisterMessages() OVERRIDE; | 116 virtual void RegisterMessages() OVERRIDE; |
| 109 | 117 |
| 110 // Callback for the "requestFlagsExperiments" message. | 118 // Callback for the "requestFlagsExperiments" message. |
| 111 void HandleRequestFlagsExperiments(const ListValue* args); | 119 void HandleRequestFlagsExperiments(const ListValue* args); |
| 112 | 120 |
| 113 // Callback for the "enableFlagsExperiment" message. | 121 // Callback for the "enableFlagsExperiment" message. |
| 114 void HandleEnableFlagsExperimentMessage(const ListValue* args); | 122 void HandleEnableFlagsExperimentMessage(const ListValue* args); |
| 115 | 123 |
| 116 // Callback for the "restartBrowser" message. Restores all tabs on restart. | 124 // Callback for the "restartBrowser" message. Restores all tabs on restart. |
| 117 void HandleRestartBrowser(const ListValue* args); | 125 void HandleRestartBrowser(const ListValue* args); |
| 118 | 126 |
| 119 // Callback for the "resetAllFlags" message. | 127 // Callback for the "resetAllFlags" message. |
| 120 void HandleResetAllFlags(const ListValue* args); | 128 void HandleResetAllFlags(const ListValue* args); |
| 121 | 129 |
| 122 private: | 130 private: |
| 123 scoped_ptr<about_flags::FlagsStorage> flags_storage_; | 131 scoped_ptr<about_flags::FlagsStorage> flags_storage_; |
| 124 about_flags::FlagAccess access_; | 132 about_flags::FlagAccess access_; |
| 133 bool flags_experiments_requested_; |
| 125 | 134 |
| 126 DISALLOW_COPY_AND_ASSIGN(FlagsDOMHandler); | 135 DISALLOW_COPY_AND_ASSIGN(FlagsDOMHandler); |
| 127 }; | 136 }; |
| 128 | 137 |
| 129 void FlagsDOMHandler::RegisterMessages() { | 138 void FlagsDOMHandler::RegisterMessages() { |
| 130 web_ui()->RegisterMessageCallback("requestFlagsExperiments", | 139 web_ui()->RegisterMessageCallback("requestFlagsExperiments", |
| 131 base::Bind(&FlagsDOMHandler::HandleRequestFlagsExperiments, | 140 base::Bind(&FlagsDOMHandler::HandleRequestFlagsExperiments, |
| 132 base::Unretained(this))); | 141 base::Unretained(this))); |
| 133 web_ui()->RegisterMessageCallback("enableFlagsExperiment", | 142 web_ui()->RegisterMessageCallback("enableFlagsExperiment", |
| 134 base::Bind(&FlagsDOMHandler::HandleEnableFlagsExperimentMessage, | 143 base::Bind(&FlagsDOMHandler::HandleEnableFlagsExperimentMessage, |
| 135 base::Unretained(this))); | 144 base::Unretained(this))); |
| 136 web_ui()->RegisterMessageCallback("restartBrowser", | 145 web_ui()->RegisterMessageCallback("restartBrowser", |
| 137 base::Bind(&FlagsDOMHandler::HandleRestartBrowser, | 146 base::Bind(&FlagsDOMHandler::HandleRestartBrowser, |
| 138 base::Unretained(this))); | 147 base::Unretained(this))); |
| 139 web_ui()->RegisterMessageCallback("resetAllFlags", | 148 web_ui()->RegisterMessageCallback("resetAllFlags", |
| 140 base::Bind(&FlagsDOMHandler::HandleResetAllFlags, | 149 base::Bind(&FlagsDOMHandler::HandleResetAllFlags, |
| 141 base::Unretained(this))); | 150 base::Unretained(this))); |
| 142 } | 151 } |
| 143 | 152 |
| 153 void FlagsDOMHandler::Init(about_flags::FlagsStorage* flags_storage, |
| 154 about_flags::FlagAccess access) { |
| 155 flags_storage_.reset(flags_storage); |
| 156 access_ = access; |
| 157 |
| 158 if (flags_experiments_requested_) |
| 159 HandleRequestFlagsExperiments(NULL); |
| 160 } |
| 161 |
| 144 void FlagsDOMHandler::HandleRequestFlagsExperiments(const ListValue* args) { | 162 void FlagsDOMHandler::HandleRequestFlagsExperiments(const ListValue* args) { |
| 163 flags_experiments_requested_ = true; |
| 164 // Bail out if the handler hasn't been initialized yet. The request will be |
| 165 // handled after the initialization. |
| 166 if (!flags_storage_) |
| 167 return; |
| 168 |
| 169 DictionaryValue results; |
| 170 |
| 145 scoped_ptr<ListValue> supported_experiments(new ListValue); | 171 scoped_ptr<ListValue> supported_experiments(new ListValue); |
| 146 scoped_ptr<ListValue> unsupported_experiments(new ListValue); | 172 scoped_ptr<ListValue> unsupported_experiments(new ListValue); |
| 147 about_flags::GetFlagsExperimentsData(flags_storage_.get(), | 173 about_flags::GetFlagsExperimentsData(flags_storage_.get(), |
| 148 access_, | 174 access_, |
| 149 supported_experiments.get(), | 175 supported_experiments.get(), |
| 150 unsupported_experiments.get()); | 176 unsupported_experiments.get()); |
| 151 DictionaryValue results; | |
| 152 results.Set("supportedExperiments", supported_experiments.release()); | 177 results.Set("supportedExperiments", supported_experiments.release()); |
| 153 results.Set("unsupportedExperiments", unsupported_experiments.release()); | 178 results.Set("unsupportedExperiments", unsupported_experiments.release()); |
| 154 results.SetBoolean("needsRestart", | 179 results.SetBoolean("needsRestart", |
| 155 about_flags::IsRestartNeededToCommitChanges()); | 180 about_flags::IsRestartNeededToCommitChanges()); |
| 181 results.SetBoolean("showOwnerWarning", |
| 182 access_ == about_flags::kGeneralAccessFlagsOnly); |
| 183 |
| 156 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS) | 184 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS) |
| 157 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 185 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
| 158 results.SetBoolean("showBetaChannelPromotion", | 186 results.SetBoolean("showBetaChannelPromotion", |
| 159 channel == chrome::VersionInfo::CHANNEL_STABLE); | 187 channel == chrome::VersionInfo::CHANNEL_STABLE); |
| 160 results.SetBoolean("showDevChannelPromotion", | 188 results.SetBoolean("showDevChannelPromotion", |
| 161 channel == chrome::VersionInfo::CHANNEL_BETA); | 189 channel == chrome::VersionInfo::CHANNEL_BETA); |
| 162 #else | 190 #else |
| 163 results.SetBoolean("showBetaChannelPromotion", false); | 191 results.SetBoolean("showBetaChannelPromotion", false); |
| 164 results.SetBoolean("showDevChannelPromotion", false); | 192 results.SetBoolean("showDevChannelPromotion", false); |
| 165 #endif | 193 #endif |
| 166 web_ui()->CallJavascriptFunction("returnFlagsExperiments", results); | 194 web_ui()->CallJavascriptFunction("returnFlagsExperiments", results); |
| 167 } | 195 } |
| 168 | 196 |
| 169 void FlagsDOMHandler::HandleEnableFlagsExperimentMessage( | 197 void FlagsDOMHandler::HandleEnableFlagsExperimentMessage( |
| 170 const ListValue* args) { | 198 const ListValue* args) { |
| 199 DCHECK(flags_storage_); |
| 171 DCHECK_EQ(2u, args->GetSize()); | 200 DCHECK_EQ(2u, args->GetSize()); |
| 172 if (args->GetSize() != 2) | 201 if (args->GetSize() != 2) |
| 173 return; | 202 return; |
| 174 | 203 |
| 175 std::string experiment_internal_name; | 204 std::string experiment_internal_name; |
| 176 std::string enable_str; | 205 std::string enable_str; |
| 177 if (!args->GetString(0, &experiment_internal_name) || | 206 if (!args->GetString(0, &experiment_internal_name) || |
| 178 !args->GetString(1, &enable_str)) | 207 !args->GetString(1, &enable_str)) |
| 179 return; | 208 return; |
| 180 | 209 |
| 181 about_flags::SetExperimentEnabled( | 210 about_flags::SetExperimentEnabled( |
| 182 flags_storage_.get(), | 211 flags_storage_.get(), |
| 183 experiment_internal_name, | 212 experiment_internal_name, |
| 184 enable_str == "true"); | 213 enable_str == "true"); |
| 185 } | 214 } |
| 186 | 215 |
| 187 void FlagsDOMHandler::HandleRestartBrowser(const ListValue* args) { | 216 void FlagsDOMHandler::HandleRestartBrowser(const ListValue* args) { |
| 217 DCHECK(flags_storage_); |
| 188 chrome::AttemptRestart(); | 218 chrome::AttemptRestart(); |
| 189 } | 219 } |
| 190 | 220 |
| 191 void FlagsDOMHandler::HandleResetAllFlags(const ListValue* args) { | 221 void FlagsDOMHandler::HandleResetAllFlags(const ListValue* args) { |
| 222 DCHECK(flags_storage_); |
| 192 about_flags::ResetAllFlags(flags_storage_.get()); | 223 about_flags::ResetAllFlags(flags_storage_.get()); |
| 193 } | 224 } |
| 194 | 225 |
| 226 |
| 227 #if defined(OS_CHROMEOS) |
| 228 // On ChromeOS verifying if the owner is signed in is async operation and only |
| 229 // after finishing it the UI can be properly populated. This function is the |
| 230 // callback for whether the owner is signed in. It will respectively pick the |
| 231 // proper PrefService for the flags interface. |
| 232 void FinishInitialization(base::WeakPtr<FlagsUI> flags_ui, |
| 233 Profile* profile, |
| 234 FlagsDOMHandler* dom_handler, |
| 235 bool current_user_is_owner) { |
| 236 // If the flags_ui has gone away, there's nothing to do. |
| 237 if (!flags_ui) |
| 238 return; |
| 239 |
| 240 // On Chrome OS the owner can set system wide flags and other users can only |
| 241 // set flags for their own session. |
| 242 // Note that |dom_handler| is owned by the web ui that owns |flags_ui|, so |
| 243 // it is still alive if |flags_ui| is. |
| 244 if (current_user_is_owner) { |
| 245 dom_handler->Init(new chromeos::about_flags::OwnerFlagsStorage( |
| 246 profile->GetPrefs(), |
| 247 chromeos::CrosSettings::Get()), |
| 248 about_flags::kOwnerAccessToFlags); |
| 249 } else { |
| 250 dom_handler->Init( |
| 251 new about_flags::PrefServiceFlagsStorage(profile->GetPrefs()), |
| 252 about_flags::kGeneralAccessFlagsOnly); |
| 253 } |
| 254 } |
| 255 #endif |
| 256 |
| 195 } // namespace | 257 } // namespace |
| 196 | 258 |
| 197 /////////////////////////////////////////////////////////////////////////////// | 259 /////////////////////////////////////////////////////////////////////////////// |
| 198 // | 260 // |
| 199 // FlagsUI | 261 // FlagsUI |
| 200 // | 262 // |
| 201 /////////////////////////////////////////////////////////////////////////////// | 263 /////////////////////////////////////////////////////////////////////////////// |
| 202 | 264 |
| 203 FlagsUI::FlagsUI(content::WebUI* web_ui) | 265 FlagsUI::FlagsUI(content::WebUI* web_ui) |
| 204 : WebUIController(web_ui), | 266 : WebUIController(web_ui), |
| 205 weak_factory_(this) { | 267 weak_factory_(this) { |
| 206 Profile* profile = Profile::FromWebUI(web_ui); | 268 Profile* profile = Profile::FromWebUI(web_ui); |
| 207 | 269 |
| 270 FlagsDOMHandler* handler = new FlagsDOMHandler(); |
| 271 web_ui->AddMessageHandler(handler); |
| 272 |
| 208 #if defined(OS_CHROMEOS) | 273 #if defined(OS_CHROMEOS) |
| 209 chromeos::DeviceSettingsService::Get()->GetOwnershipStatusAsync( | 274 chromeos::DeviceSettingsService::Get()->IsCurrentUserOwnerAsync( |
| 210 base::Bind(&FlagsUI::FinishInitialization, | 275 base::Bind(&FinishInitialization, |
| 211 weak_factory_.GetWeakPtr(), profile)); | 276 weak_factory_.GetWeakPtr(), profile, handler)); |
| 212 #else | 277 #else |
| 213 web_ui->AddMessageHandler( | 278 handler->Init(new about_flags::PrefServiceFlagsStorage( |
| 214 new FlagsDOMHandler(new about_flags::PrefServiceFlagsStorage( | 279 g_browser_process->local_state()), |
| 215 g_browser_process->local_state()), | 280 about_flags::kOwnerAccessToFlags); |
| 216 about_flags::kOwnerAccessToFlags)); | 281 #endif |
| 217 | 282 |
| 218 // Set up the about:flags source. | 283 // Set up the about:flags source. |
| 219 content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource()); | 284 content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource()); |
| 220 #endif | |
| 221 } | 285 } |
| 222 | 286 |
| 223 FlagsUI::~FlagsUI() { | 287 FlagsUI::~FlagsUI() { |
| 224 } | 288 } |
| 225 | 289 |
| 226 // static | 290 // static |
| 227 base::RefCountedMemory* FlagsUI::GetFaviconResourceBytes( | 291 base::RefCountedMemory* FlagsUI::GetFaviconResourceBytes( |
| 228 ui::ScaleFactor scale_factor) { | 292 ui::ScaleFactor scale_factor) { |
| 229 return ResourceBundle::GetSharedInstance(). | 293 return ResourceBundle::GetSharedInstance(). |
| 230 LoadDataResourceBytesForScale(IDR_FLAGS_FAVICON, scale_factor); | 294 LoadDataResourceBytesForScale(IDR_FLAGS_FAVICON, scale_factor); |
| 231 } | 295 } |
| 232 | 296 |
| 233 // static | 297 // static |
| 234 void FlagsUI::RegisterPrefs(PrefRegistrySimple* registry) { | 298 void FlagsUI::RegisterPrefs(PrefRegistrySimple* registry) { |
| 235 registry->RegisterListPref(prefs::kEnabledLabsExperiments); | 299 registry->RegisterListPref(prefs::kEnabledLabsExperiments); |
| 236 } | 300 } |
| 237 | 301 |
| 238 #if defined(OS_CHROMEOS) | 302 #if defined(OS_CHROMEOS) |
| 239 // static | 303 // static |
| 240 void FlagsUI::RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { | 304 void FlagsUI::RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { |
| 241 registry->RegisterListPref(prefs::kEnabledLabsExperiments, | 305 registry->RegisterListPref(prefs::kEnabledLabsExperiments, |
| 242 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | 306 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
| 243 } | 307 } |
| 244 | 308 |
| 245 void FlagsUI::FinishInitialization( | |
| 246 Profile* profile, | |
| 247 chromeos::DeviceSettingsService::OwnershipStatus status, | |
| 248 bool current_user_is_owner) { | |
| 249 // On Chrome OS the owner can set system wide flags and other users can only | |
| 250 // set flags for their own session. | |
| 251 if (current_user_is_owner) { | |
| 252 web_ui()->AddMessageHandler( | |
| 253 new FlagsDOMHandler(new chromeos::about_flags::OwnerFlagsStorage( | |
| 254 profile->GetPrefs(), | |
| 255 chromeos::CrosSettings::Get()), | |
| 256 about_flags::kOwnerAccessToFlags)); | |
| 257 } else { | |
| 258 web_ui()->AddMessageHandler( | |
| 259 new FlagsDOMHandler(new about_flags::PrefServiceFlagsStorage( | |
| 260 profile->GetPrefs()), | |
| 261 about_flags::kGeneralAccessFlagsOnly)); | |
| 262 } | |
| 263 | |
| 264 // Set up the about:flags source. | |
| 265 content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource()); | |
| 266 } | |
| 267 #endif | 309 #endif |
| OLD | NEW |