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

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

Issue 23532034: Postpone loading about:flags ui until the certificates have been loaded (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 3 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"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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