Chromium Code Reviews| Index: chrome/browser/ui/webui/flags_ui.cc |
| diff --git a/chrome/browser/ui/webui/flags_ui.cc b/chrome/browser/ui/webui/flags_ui.cc |
| index ed4fe789dae491534b78dbd690f5198ebd9a1fa6..b8b4a400756045990ec2b09b622cefaf2c492292 100644 |
| --- a/chrome/browser/ui/webui/flags_ui.cc |
| +++ b/chrome/browser/ui/webui/flags_ui.cc |
| @@ -80,6 +80,8 @@ content::WebUIDataSource* CreateFlagsUIHTMLSource() { |
| l10n_util::GetStringFUTF16(IDS_SYSTEM_FLAGS_OWNER_ONLY, |
| UTF8ToUTF16(owner))); |
| } else { |
| + // The warning will be only shown on ChromeOS, when the current user is not |
| + // the owner. |
| source->AddString("ownerWarning", string16()); |
| } |
| #endif |
| @@ -99,11 +101,17 @@ content::WebUIDataSource* CreateFlagsUIHTMLSource() { |
| // The handler for Javascript messages for the about:flags page. |
| class FlagsDOMHandler : public WebUIMessageHandler { |
| public: |
| - FlagsDOMHandler(about_flags::FlagsStorage* flags_storage, |
| - about_flags::FlagAccess access) |
| - : flags_storage_(flags_storage), access_(access) {} |
| + FlagsDOMHandler() : access_(about_flags::kGeneralAccessFlagsOnly), |
| + flags_experiments_requested_(false) { |
| + } |
| virtual ~FlagsDOMHandler() {} |
| + // Initializes the DOM handler with the provided flags storage and flags |
| + // access. If there were flags experiments requested from javascript before |
| + // this was called, it calls |HandleRequestFlagsExperiments| again. |
| + void Init(about_flags::FlagsStorage* flags_storage, |
| + about_flags::FlagAccess access); |
| + |
| // WebUIMessageHandler implementation. |
| virtual void RegisterMessages() OVERRIDE; |
| @@ -122,6 +130,7 @@ class FlagsDOMHandler : public WebUIMessageHandler { |
| private: |
| scoped_ptr<about_flags::FlagsStorage> flags_storage_; |
| about_flags::FlagAccess access_; |
| + bool flags_experiments_requested_; |
| DISALLOW_COPY_AND_ASSIGN(FlagsDOMHandler); |
| }; |
| @@ -141,18 +150,37 @@ void FlagsDOMHandler::RegisterMessages() { |
| base::Unretained(this))); |
| } |
| +void FlagsDOMHandler::Init(about_flags::FlagsStorage* flags_storage, |
| + about_flags::FlagAccess access) { |
| + flags_storage_.reset(flags_storage); |
| + access_ = access; |
| + |
| + if (flags_experiments_requested_) |
| + HandleRequestFlagsExperiments(NULL); |
| +} |
| + |
| void FlagsDOMHandler::HandleRequestFlagsExperiments(const ListValue* args) { |
| + flags_experiments_requested_ = true; |
|
Nico
2013/09/06 22:48:45
Do you need to consider multiple requests? Probabl
tbarzic
2013/09/07 00:49:34
Nope. We shouldn't get another request until js "r
|
| + // Bail out if the handler hasn't been initialized yet. The request will be |
| + // handled after the initialization. |
| + if (!flags_storage_) |
| + return; |
| + |
| + DictionaryValue results; |
| + |
| scoped_ptr<ListValue> supported_experiments(new ListValue); |
| scoped_ptr<ListValue> unsupported_experiments(new ListValue); |
| about_flags::GetFlagsExperimentsData(flags_storage_.get(), |
| access_, |
| supported_experiments.get(), |
| unsupported_experiments.get()); |
| - DictionaryValue results; |
| results.Set("supportedExperiments", supported_experiments.release()); |
| results.Set("unsupportedExperiments", unsupported_experiments.release()); |
| results.SetBoolean("needsRestart", |
| about_flags::IsRestartNeededToCommitChanges()); |
| + results.SetBoolean("showOwnerWarning", |
| + access_ == about_flags::kGeneralAccessFlagsOnly); |
| + |
| #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS) |
| chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
| results.SetBoolean("showBetaChannelPromotion", |
| @@ -168,6 +196,7 @@ void FlagsDOMHandler::HandleRequestFlagsExperiments(const ListValue* args) { |
| void FlagsDOMHandler::HandleEnableFlagsExperimentMessage( |
| const ListValue* args) { |
| + DCHECK(flags_storage_); |
| DCHECK_EQ(2u, args->GetSize()); |
| if (args->GetSize() != 2) |
| return; |
| @@ -185,13 +214,46 @@ void FlagsDOMHandler::HandleEnableFlagsExperimentMessage( |
| } |
| void FlagsDOMHandler::HandleRestartBrowser(const ListValue* args) { |
| + DCHECK(flags_storage_); |
| chrome::AttemptRestart(); |
| } |
| void FlagsDOMHandler::HandleResetAllFlags(const ListValue* args) { |
| + DCHECK(flags_storage_); |
| about_flags::ResetAllFlags(flags_storage_.get()); |
| } |
| + |
| +#if defined(OS_CHROMEOS) |
| +// On ChromeOS verifying if the owner is signed in is async operation and only |
| +// after finishing it the UI can be properly populated. This function is the |
| +// callback for whether the owner is signed in. It will respectively pick the |
| +// proper PrefService for the flags interface. |
| +void FinishInitialization(base::WeakPtr<FlagsUI> flags_ui, |
| + Profile* profile, |
| + FlagsDOMHandler* dom_handler, |
| + bool current_user_is_owner) { |
| + // If the flags_ui has gone away, there's nothing to do. |
| + if (!flags_ui) |
| + return; |
| + |
| + // On Chrome OS the owner can set system wide flags and other users can only |
| + // set flags for their own session. |
| + // Note that |dom_handler| is owned by the web ui that owns |flags_ui|, so |
| + // it is still alive if |flags_ui| is. |
| + if (current_user_is_owner) { |
| + dom_handler->Init(new chromeos::about_flags::OwnerFlagsStorage( |
| + profile->GetPrefs(), |
| + chromeos::CrosSettings::Get()), |
| + about_flags::kOwnerAccessToFlags); |
| + } else { |
| + dom_handler->Init( |
| + new about_flags::PrefServiceFlagsStorage(profile->GetPrefs()), |
| + about_flags::kGeneralAccessFlagsOnly); |
| + } |
| +} |
| +#endif |
| + |
| } // namespace |
| /////////////////////////////////////////////////////////////////////////////// |
| @@ -205,19 +267,21 @@ FlagsUI::FlagsUI(content::WebUI* web_ui) |
| weak_factory_(this) { |
| Profile* profile = Profile::FromWebUI(web_ui); |
| + FlagsDOMHandler* handler = new FlagsDOMHandler(); |
| + web_ui->AddMessageHandler(handler); |
| + |
| #if defined(OS_CHROMEOS) |
| - chromeos::DeviceSettingsService::Get()->GetOwnershipStatusAsync( |
| - base::Bind(&FlagsUI::FinishInitialization, |
| - weak_factory_.GetWeakPtr(), profile)); |
| + chromeos::DeviceSettingsService::Get()->IsCurrentUserOwnerAsync( |
| + base::Bind(&FinishInitialization, |
| + weak_factory_.GetWeakPtr(), profile, handler)); |
| #else |
| - web_ui->AddMessageHandler( |
| - new FlagsDOMHandler(new about_flags::PrefServiceFlagsStorage( |
| - g_browser_process->local_state()), |
| - about_flags::kOwnerAccessToFlags)); |
| + handler->Init(new about_flags::PrefServiceFlagsStorage( |
| + g_browser_process->local_state()), |
| + about_flags::kOwnerAccessToFlags); |
| +#endif |
| // Set up the about:flags source. |
| content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource()); |
| -#endif |
| } |
| FlagsUI::~FlagsUI() { |
| @@ -242,26 +306,4 @@ void FlagsUI::RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { |
| user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
| } |
| -void FlagsUI::FinishInitialization( |
| - Profile* profile, |
| - chromeos::DeviceSettingsService::OwnershipStatus status, |
| - bool current_user_is_owner) { |
| - // On Chrome OS the owner can set system wide flags and other users can only |
| - // set flags for their own session. |
| - if (current_user_is_owner) { |
| - web_ui()->AddMessageHandler( |
| - new FlagsDOMHandler(new chromeos::about_flags::OwnerFlagsStorage( |
| - profile->GetPrefs(), |
| - chromeos::CrosSettings::Get()), |
| - about_flags::kOwnerAccessToFlags)); |
| - } else { |
| - web_ui()->AddMessageHandler( |
| - new FlagsDOMHandler(new about_flags::PrefServiceFlagsStorage( |
| - profile->GetPrefs()), |
| - about_flags::kGeneralAccessFlagsOnly)); |
| - } |
| - |
| - // Set up the about:flags source. |
| - content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource()); |
| -} |
| #endif |