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 4cc5dd8903b04136d0f0b9986d6702f43a838e9f..9b639c7d24ca1a3afb4b054fab56f24cf31288e4 100644 |
--- a/chrome/browser/ui/webui/flags_ui.cc |
+++ b/chrome/browser/ui/webui/flags_ui.cc |
@@ -10,6 +10,7 @@ |
#include "base/bind_helpers.h" |
#include "base/memory/ref_counted_memory.h" |
#include "base/prefs/pref_registry_simple.h" |
+#include "base/prefs/pref_service.h" |
#include "base/utf_string_conversions.h" |
#include "base/values.h" |
#include "chrome/browser/about_flags.h" |
@@ -33,6 +34,7 @@ |
#include "base/chromeos/chromeos_version.h" |
#include "chrome/browser/chromeos/login/user_manager.h" |
#include "chrome/browser/chromeos/settings/cros_settings.h" |
+#include "components/user_prefs/pref_registry_syncable.h" |
#endif |
using content::WebContents; |
@@ -58,23 +60,22 @@ content::WebUIDataSource* CreateFlagsUIHTMLSource() { |
source->AddLocalizedString("disable", IDS_FLAGS_DISABLE); |
source->AddLocalizedString("enable", IDS_FLAGS_ENABLE); |
#if defined(OS_CHROMEOS) |
- // Set the strings to show which user can actually change the flags |
- source->AddLocalizedString("ownerOnly", IDS_OPTIONS_ACCOUNTS_OWNER_ONLY); |
- std::string owner; |
- chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner); |
- source->AddString("ownerUserId", UTF8ToUTF16(owner)); |
+ if (!chromeos::UserManager::Get()->IsCurrentUserOwner() && |
+ base::chromeos::IsRunningOnChromeOS()) { |
+ // Set the strings to show which user can actually change the flags. |
+ std::string owner; |
+ chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner); |
+ source->AddString("ownerWarning", |
+ l10n_util::GetStringFUTF16(IDS_SYSTEM_FLAGS_OWNER_ONLY, |
+ UTF8ToUTF16(owner))); |
+ } else { |
+ source->AddString("ownerWarning", string16()); |
+ } |
#endif |
source->SetJsonPath("strings.js"); |
source->AddResourcePath("flags.js", IDR_FLAGS_JS); |
- |
- int idr = IDR_FLAGS_HTML; |
-#if defined (OS_CHROMEOS) |
- if (!chromeos::UserManager::Get()->IsCurrentUserOwner() && |
- base::chromeos::IsRunningOnChromeOS()) |
- idr = IDR_FLAGS_HTML_WARNING; |
-#endif |
- source->SetDefaultResource(idr); |
+ source->SetDefaultResource(IDR_FLAGS_HTML); |
return source; |
} |
@@ -87,7 +88,7 @@ content::WebUIDataSource* CreateFlagsUIHTMLSource() { |
// The handler for Javascript messages for the about:flags page. |
class FlagsDOMHandler : public WebUIMessageHandler { |
public: |
- FlagsDOMHandler() {} |
+ explicit FlagsDOMHandler(PrefService* prefs) : prefs_(prefs) {} |
virtual ~FlagsDOMHandler() {} |
// WebUIMessageHandler implementation. |
@@ -106,6 +107,8 @@ class FlagsDOMHandler : public WebUIMessageHandler { |
void HandleResetAllFlags(const ListValue* args); |
private: |
+ PrefService* prefs_; |
+ |
DISALLOW_COPY_AND_ASSIGN(FlagsDOMHandler); |
}; |
@@ -127,8 +130,7 @@ void FlagsDOMHandler::RegisterMessages() { |
void FlagsDOMHandler::HandleRequestFlagsExperiments(const ListValue* args) { |
DictionaryValue results; |
results.Set("flagsExperiments", |
- about_flags::GetFlagsExperimentsData( |
- g_browser_process->local_state())); |
+ about_flags::GetFlagsExperimentsData(prefs_)); |
results.SetBoolean("needsRestart", |
about_flags::IsRestartNeededToCommitChanges()); |
web_ui()->CallJavascriptFunction("returnFlagsExperiments", results); |
@@ -147,7 +149,7 @@ void FlagsDOMHandler::HandleEnableFlagsExperimentMessage( |
return; |
about_flags::SetExperimentEnabled( |
- g_browser_process->local_state(), |
+ prefs_, |
experiment_internal_name, |
enable_str == "true"); |
} |
@@ -168,12 +170,25 @@ void FlagsDOMHandler::HandleResetAllFlags(const ListValue* args) { |
// |
/////////////////////////////////////////////////////////////////////////////// |
-FlagsUI::FlagsUI(content::WebUI* web_ui) : WebUIController(web_ui) { |
- web_ui->AddMessageHandler(new FlagsDOMHandler()); |
+FlagsUI::FlagsUI(content::WebUI* web_ui) |
+ : WebUIController(web_ui), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
+ Profile* profile = Profile::FromWebUI(web_ui); |
+ |
+#ifdef OS_CHROMEOS |
+ chromeos::DeviceSettingsService::Get()->GetOwnershipStatusAsync( |
+ base::Bind(&FlagsUI::FinishInitialization, |
+ weak_factory_.GetWeakPtr(), profile)); |
+#else |
+ web_ui->AddMessageHandler( |
+ new FlagsDOMHandler(g_browser_process->local_state())); |
// Set up the about:flags source. |
- Profile* profile = Profile::FromWebUI(web_ui); |
content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource()); |
+#endif |
+} |
+ |
+FlagsUI::~FlagsUI() { |
} |
// static |
@@ -187,3 +202,32 @@ base::RefCountedMemory* FlagsUI::GetFaviconResourceBytes( |
void FlagsUI::RegisterPrefs(PrefRegistrySimple* registry) { |
registry->RegisterListPref(prefs::kEnabledLabsExperiments); |
} |
+ |
+#ifdef OS_CHROMEOS |
+// static |
+void FlagsUI::RegisterUserPrefs(PrefRegistrySyncable* registry) { |
+ registry->RegisterListPref(prefs::kEnabledLabsExperiments, |
+ 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(profile->GetPrefs())); |
+ } else { |
+ web_ui()->AddMessageHandler( |
+ new FlagsDOMHandler(g_browser_process->local_state())); |
+ // If the owner managed to set the flags pref on his own profile clear it |
+ // because it will never be accessible anymore. |
+ if (profile->GetPrefs()->HasPrefPath(prefs::kEnabledLabsExperiments)) |
+ profile->GetPrefs()->ClearPref(prefs::kEnabledLabsExperiments); |
+ } |
+ |
+ // Set up the about:flags source. |
+ content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource()); |
+} |
+#endif |