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 | |
pastarmovj
2013/09/05 12:48:18
Unindent the code here please.
tbarzic
2013/09/05 17:59:17
Done.
| |
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 |