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

Unified 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: . 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/webui/flags_ui.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« 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