Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: chrome/browser/ui/webui/flags_ui.cc

Issue 12330137: Allow normal users to change per session flags. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix include for a moved file. Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/webui/flags_ui.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "base/memory/ref_counted_memory.h" 11 #include "base/memory/ref_counted_memory.h"
12 #include "base/prefs/pref_registry_simple.h" 12 #include "base/prefs/pref_registry_simple.h"
13 #include "base/prefs/pref_service.h"
13 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
14 #include "base/values.h" 15 #include "base/values.h"
15 #include "chrome/browser/about_flags.h" 16 #include "chrome/browser/about_flags.h"
16 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
17 #include "chrome/browser/lifetime/application_lifetime.h" 18 #include "chrome/browser/lifetime/application_lifetime.h"
18 #include "chrome/browser/profiles/profile.h" 19 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/common/pref_names.h" 20 #include "chrome/common/pref_names.h"
20 #include "chrome/common/url_constants.h" 21 #include "chrome/common/url_constants.h"
21 #include "content/public/browser/web_contents.h" 22 #include "content/public/browser/web_contents.h"
22 #include "content/public/browser/web_ui.h" 23 #include "content/public/browser/web_ui.h"
23 #include "content/public/browser/web_ui_data_source.h" 24 #include "content/public/browser/web_ui_data_source.h"
24 #include "content/public/browser/web_ui_message_handler.h" 25 #include "content/public/browser/web_ui_message_handler.h"
25 #include "grit/browser_resources.h" 26 #include "grit/browser_resources.h"
26 #include "grit/chromium_strings.h" 27 #include "grit/chromium_strings.h"
27 #include "grit/generated_resources.h" 28 #include "grit/generated_resources.h"
28 #include "grit/theme_resources.h" 29 #include "grit/theme_resources.h"
29 #include "ui/base/l10n/l10n_util.h" 30 #include "ui/base/l10n/l10n_util.h"
30 #include "ui/base/resource/resource_bundle.h" 31 #include "ui/base/resource/resource_bundle.h"
31 32
32 #if defined(OS_CHROMEOS) 33 #if defined(OS_CHROMEOS)
33 #include "base/chromeos/chromeos_version.h" 34 #include "base/chromeos/chromeos_version.h"
34 #include "chrome/browser/chromeos/login/user_manager.h" 35 #include "chrome/browser/chromeos/login/user_manager.h"
35 #include "chrome/browser/chromeos/settings/cros_settings.h" 36 #include "chrome/browser/chromeos/settings/cros_settings.h"
37 #include "components/user_prefs/pref_registry_syncable.h"
36 #endif 38 #endif
37 39
38 using content::WebContents; 40 using content::WebContents;
39 using content::WebUIMessageHandler; 41 using content::WebUIMessageHandler;
40 42
41 namespace { 43 namespace {
42 44
43 content::WebUIDataSource* CreateFlagsUIHTMLSource() { 45 content::WebUIDataSource* CreateFlagsUIHTMLSource() {
44 content::WebUIDataSource* source = 46 content::WebUIDataSource* source =
45 content::WebUIDataSource::Create(chrome::kChromeUIFlagsHost); 47 content::WebUIDataSource::Create(chrome::kChromeUIFlagsHost);
46 48
47 source->SetUseJsonJSFormatV2(); 49 source->SetUseJsonJSFormatV2();
48 source->AddLocalizedString("flagsLongTitle", IDS_FLAGS_LONG_TITLE); 50 source->AddLocalizedString("flagsLongTitle", IDS_FLAGS_LONG_TITLE);
49 source->AddLocalizedString("flagsTableTitle", IDS_FLAGS_TABLE_TITLE); 51 source->AddLocalizedString("flagsTableTitle", IDS_FLAGS_TABLE_TITLE);
50 source->AddLocalizedString("flagsNoExperimentsAvailable", 52 source->AddLocalizedString("flagsNoExperimentsAvailable",
51 IDS_FLAGS_NO_EXPERIMENTS_AVAILABLE); 53 IDS_FLAGS_NO_EXPERIMENTS_AVAILABLE);
52 source->AddLocalizedString("flagsWarningHeader", IDS_FLAGS_WARNING_HEADER); 54 source->AddLocalizedString("flagsWarningHeader", IDS_FLAGS_WARNING_HEADER);
53 source->AddLocalizedString("flagsBlurb", IDS_FLAGS_WARNING_TEXT); 55 source->AddLocalizedString("flagsBlurb", IDS_FLAGS_WARNING_TEXT);
54 source->AddLocalizedString("flagsNotSupported", IDS_FLAGS_NOT_AVAILABLE); 56 source->AddLocalizedString("flagsNotSupported", IDS_FLAGS_NOT_AVAILABLE);
55 source->AddLocalizedString("flagsRestartNotice", IDS_FLAGS_RELAUNCH_NOTICE); 57 source->AddLocalizedString("flagsRestartNotice", IDS_FLAGS_RELAUNCH_NOTICE);
56 source->AddLocalizedString("flagsRestartButton", IDS_FLAGS_RELAUNCH_BUTTON); 58 source->AddLocalizedString("flagsRestartButton", IDS_FLAGS_RELAUNCH_BUTTON);
57 source->AddLocalizedString("resetAllButton", IDS_FLAGS_RESET_ALL_BUTTON); 59 source->AddLocalizedString("resetAllButton", IDS_FLAGS_RESET_ALL_BUTTON);
58 source->AddLocalizedString("disable", IDS_FLAGS_DISABLE); 60 source->AddLocalizedString("disable", IDS_FLAGS_DISABLE);
59 source->AddLocalizedString("enable", IDS_FLAGS_ENABLE); 61 source->AddLocalizedString("enable", IDS_FLAGS_ENABLE);
60 #if defined(OS_CHROMEOS) 62 #if defined(OS_CHROMEOS)
61 // Set the strings to show which user can actually change the flags 63 if (!chromeos::UserManager::Get()->IsCurrentUserOwner() &&
62 source->AddLocalizedString("ownerOnly", IDS_OPTIONS_ACCOUNTS_OWNER_ONLY); 64 base::chromeos::IsRunningOnChromeOS()) {
63 std::string owner; 65 // Set the strings to show which user can actually change the flags.
64 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner); 66 std::string owner;
65 source->AddString("ownerUserId", UTF8ToUTF16(owner)); 67 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
68 source->AddString("ownerWarning",
69 l10n_util::GetStringFUTF16(IDS_SYSTEM_FLAGS_OWNER_ONLY,
70 UTF8ToUTF16(owner)));
71 } else {
72 source->AddString("ownerWarning", string16());
73 }
66 #endif 74 #endif
67 75
68 source->SetJsonPath("strings.js"); 76 source->SetJsonPath("strings.js");
69 source->AddResourcePath("flags.js", IDR_FLAGS_JS); 77 source->AddResourcePath("flags.js", IDR_FLAGS_JS);
70 78 source->SetDefaultResource(IDR_FLAGS_HTML);
71 int idr = IDR_FLAGS_HTML;
72 #if defined (OS_CHROMEOS)
73 if (!chromeos::UserManager::Get()->IsCurrentUserOwner() &&
74 base::chromeos::IsRunningOnChromeOS())
75 idr = IDR_FLAGS_HTML_WARNING;
76 #endif
77 source->SetDefaultResource(idr);
78 return source; 79 return source;
79 } 80 }
80 81
81 //////////////////////////////////////////////////////////////////////////////// 82 ////////////////////////////////////////////////////////////////////////////////
82 // 83 //
83 // FlagsDOMHandler 84 // FlagsDOMHandler
84 // 85 //
85 //////////////////////////////////////////////////////////////////////////////// 86 ////////////////////////////////////////////////////////////////////////////////
86 87
87 // The handler for Javascript messages for the about:flags page. 88 // The handler for Javascript messages for the about:flags page.
88 class FlagsDOMHandler : public WebUIMessageHandler { 89 class FlagsDOMHandler : public WebUIMessageHandler {
89 public: 90 public:
90 FlagsDOMHandler() {} 91 explicit FlagsDOMHandler(PrefService* prefs) : prefs_(prefs) {}
91 virtual ~FlagsDOMHandler() {} 92 virtual ~FlagsDOMHandler() {}
92 93
93 // WebUIMessageHandler implementation. 94 // WebUIMessageHandler implementation.
94 virtual void RegisterMessages() OVERRIDE; 95 virtual void RegisterMessages() OVERRIDE;
95 96
96 // Callback for the "requestFlagsExperiments" message. 97 // Callback for the "requestFlagsExperiments" message.
97 void HandleRequestFlagsExperiments(const ListValue* args); 98 void HandleRequestFlagsExperiments(const ListValue* args);
98 99
99 // Callback for the "enableFlagsExperiment" message. 100 // Callback for the "enableFlagsExperiment" message.
100 void HandleEnableFlagsExperimentMessage(const ListValue* args); 101 void HandleEnableFlagsExperimentMessage(const ListValue* args);
101 102
102 // Callback for the "restartBrowser" message. Restores all tabs on restart. 103 // Callback for the "restartBrowser" message. Restores all tabs on restart.
103 void HandleRestartBrowser(const ListValue* args); 104 void HandleRestartBrowser(const ListValue* args);
104 105
105 // Callback for the "resetAllFlags" message. 106 // Callback for the "resetAllFlags" message.
106 void HandleResetAllFlags(const ListValue* args); 107 void HandleResetAllFlags(const ListValue* args);
107 108
108 private: 109 private:
110 PrefService* prefs_;
111
109 DISALLOW_COPY_AND_ASSIGN(FlagsDOMHandler); 112 DISALLOW_COPY_AND_ASSIGN(FlagsDOMHandler);
110 }; 113 };
111 114
112 void FlagsDOMHandler::RegisterMessages() { 115 void FlagsDOMHandler::RegisterMessages() {
113 web_ui()->RegisterMessageCallback("requestFlagsExperiments", 116 web_ui()->RegisterMessageCallback("requestFlagsExperiments",
114 base::Bind(&FlagsDOMHandler::HandleRequestFlagsExperiments, 117 base::Bind(&FlagsDOMHandler::HandleRequestFlagsExperiments,
115 base::Unretained(this))); 118 base::Unretained(this)));
116 web_ui()->RegisterMessageCallback("enableFlagsExperiment", 119 web_ui()->RegisterMessageCallback("enableFlagsExperiment",
117 base::Bind(&FlagsDOMHandler::HandleEnableFlagsExperimentMessage, 120 base::Bind(&FlagsDOMHandler::HandleEnableFlagsExperimentMessage,
118 base::Unretained(this))); 121 base::Unretained(this)));
119 web_ui()->RegisterMessageCallback("restartBrowser", 122 web_ui()->RegisterMessageCallback("restartBrowser",
120 base::Bind(&FlagsDOMHandler::HandleRestartBrowser, 123 base::Bind(&FlagsDOMHandler::HandleRestartBrowser,
121 base::Unretained(this))); 124 base::Unretained(this)));
122 web_ui()->RegisterMessageCallback("resetAllFlags", 125 web_ui()->RegisterMessageCallback("resetAllFlags",
123 base::Bind(&FlagsDOMHandler::HandleResetAllFlags, 126 base::Bind(&FlagsDOMHandler::HandleResetAllFlags,
124 base::Unretained(this))); 127 base::Unretained(this)));
125 } 128 }
126 129
127 void FlagsDOMHandler::HandleRequestFlagsExperiments(const ListValue* args) { 130 void FlagsDOMHandler::HandleRequestFlagsExperiments(const ListValue* args) {
128 DictionaryValue results; 131 DictionaryValue results;
129 results.Set("flagsExperiments", 132 results.Set("flagsExperiments",
130 about_flags::GetFlagsExperimentsData( 133 about_flags::GetFlagsExperimentsData(prefs_));
131 g_browser_process->local_state()));
132 results.SetBoolean("needsRestart", 134 results.SetBoolean("needsRestart",
133 about_flags::IsRestartNeededToCommitChanges()); 135 about_flags::IsRestartNeededToCommitChanges());
134 web_ui()->CallJavascriptFunction("returnFlagsExperiments", results); 136 web_ui()->CallJavascriptFunction("returnFlagsExperiments", results);
135 } 137 }
136 138
137 void FlagsDOMHandler::HandleEnableFlagsExperimentMessage( 139 void FlagsDOMHandler::HandleEnableFlagsExperimentMessage(
138 const ListValue* args) { 140 const ListValue* args) {
139 DCHECK_EQ(2u, args->GetSize()); 141 DCHECK_EQ(2u, args->GetSize());
140 if (args->GetSize() != 2) 142 if (args->GetSize() != 2)
141 return; 143 return;
142 144
143 std::string experiment_internal_name; 145 std::string experiment_internal_name;
144 std::string enable_str; 146 std::string enable_str;
145 if (!args->GetString(0, &experiment_internal_name) || 147 if (!args->GetString(0, &experiment_internal_name) ||
146 !args->GetString(1, &enable_str)) 148 !args->GetString(1, &enable_str))
147 return; 149 return;
148 150
149 about_flags::SetExperimentEnabled( 151 about_flags::SetExperimentEnabled(
150 g_browser_process->local_state(), 152 prefs_,
151 experiment_internal_name, 153 experiment_internal_name,
152 enable_str == "true"); 154 enable_str == "true");
153 } 155 }
154 156
155 void FlagsDOMHandler::HandleRestartBrowser(const ListValue* args) { 157 void FlagsDOMHandler::HandleRestartBrowser(const ListValue* args) {
156 chrome::AttemptRestart(); 158 chrome::AttemptRestart();
157 } 159 }
158 160
159 void FlagsDOMHandler::HandleResetAllFlags(const ListValue* args) { 161 void FlagsDOMHandler::HandleResetAllFlags(const ListValue* args) {
160 about_flags::ResetAllFlags(g_browser_process->local_state()); 162 about_flags::ResetAllFlags(g_browser_process->local_state());
161 } 163 }
162 164
163 } // namespace 165 } // namespace
164 166
165 /////////////////////////////////////////////////////////////////////////////// 167 ///////////////////////////////////////////////////////////////////////////////
166 // 168 //
167 // FlagsUI 169 // FlagsUI
168 // 170 //
169 /////////////////////////////////////////////////////////////////////////////// 171 ///////////////////////////////////////////////////////////////////////////////
170 172
171 FlagsUI::FlagsUI(content::WebUI* web_ui) : WebUIController(web_ui) { 173 FlagsUI::FlagsUI(content::WebUI* web_ui)
172 web_ui->AddMessageHandler(new FlagsDOMHandler()); 174 : WebUIController(web_ui),
175 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
176 Profile* profile = Profile::FromWebUI(web_ui);
177
178 #ifdef OS_CHROMEOS
179 chromeos::DeviceSettingsService::Get()->GetOwnershipStatusAsync(
180 base::Bind(&FlagsUI::FinishInitialization,
181 weak_factory_.GetWeakPtr(), profile));
182 #else
183 web_ui->AddMessageHandler(
184 new FlagsDOMHandler(g_browser_process->local_state()));
173 185
174 // Set up the about:flags source. 186 // Set up the about:flags source.
175 Profile* profile = Profile::FromWebUI(web_ui);
176 content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource()); 187 content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource());
188 #endif
189 }
190
191 FlagsUI::~FlagsUI() {
177 } 192 }
178 193
179 // static 194 // static
180 base::RefCountedMemory* FlagsUI::GetFaviconResourceBytes( 195 base::RefCountedMemory* FlagsUI::GetFaviconResourceBytes(
181 ui::ScaleFactor scale_factor) { 196 ui::ScaleFactor scale_factor) {
182 return ResourceBundle::GetSharedInstance(). 197 return ResourceBundle::GetSharedInstance().
183 LoadDataResourceBytesForScale(IDR_FLAGS_FAVICON, scale_factor); 198 LoadDataResourceBytesForScale(IDR_FLAGS_FAVICON, scale_factor);
184 } 199 }
185 200
186 // static 201 // static
187 void FlagsUI::RegisterPrefs(PrefRegistrySimple* registry) { 202 void FlagsUI::RegisterPrefs(PrefRegistrySimple* registry) {
188 registry->RegisterListPref(prefs::kEnabledLabsExperiments); 203 registry->RegisterListPref(prefs::kEnabledLabsExperiments);
189 } 204 }
205
206 #ifdef OS_CHROMEOS
207 // static
208 void FlagsUI::RegisterUserPrefs(PrefRegistrySyncable* registry) {
209 registry->RegisterListPref(prefs::kEnabledLabsExperiments,
210 PrefRegistrySyncable::UNSYNCABLE_PREF);
211 }
212
213 void FlagsUI::FinishInitialization(
214 Profile* profile,
215 chromeos::DeviceSettingsService::OwnershipStatus status,
216 bool current_user_is_owner) {
217 // On Chrome OS the owner can set system wide flags and other users can only
218 // set flags for their own session.
219 if (!current_user_is_owner) {
220 web_ui()->AddMessageHandler(new FlagsDOMHandler(profile->GetPrefs()));
221 } else {
222 web_ui()->AddMessageHandler(
223 new FlagsDOMHandler(g_browser_process->local_state()));
224 // If the owner managed to set the flags pref on his own profile clear it
225 // because it will never be accessible anymore.
226 if (profile->GetPrefs()->HasPrefPath(prefs::kEnabledLabsExperiments))
227 profile->GetPrefs()->ClearPref(prefs::kEnabledLabsExperiments);
228 }
229
230 // Set up the about:flags source.
231 content::WebUIDataSource::Add(profile, CreateFlagsUIHTMLSource());
232 }
233 #endif
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/flags_ui.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698