diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-12-22 20:34:42 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-12-22 20:34:42 +0000 |
commit | b5c4ef70068ba850a5b3e6fc494bd2396c9bb1a0 (patch) | |
tree | fa82bd07b715dc7ee8a9bc16c9569586079aae4f /chrome/browser/user_data_manager.cc | |
parent | 382048328177bcf0b0fe937319fd1b73a132229c (diff) | |
download | chromium_src-b5c4ef70068ba850a5b3e6fc494bd2396c9bb1a0.zip chromium_src-b5c4ef70068ba850a5b3e6fc494bd2396c9bb1a0.tar.gz chromium_src-b5c4ef70068ba850a5b3e6fc494bd2396c9bb1a0.tar.bz2 |
Fix racing condition that blocks profiles menu showing up
Chrome should show profiles menu when "enable-udd-profiles" is supplied
on command line. This is broken while refactoring app menu code from
ToolbarView into AppMenuModel. Previously, the profile submenu model is
kept in ToolbarView and profiles menu would show up on 2nd time app menu
showing up. After the refactoring, profile menu is moved into
AppMenuModel, which is re-created everytime before we show app menu. In
AppMenuModel, it requests profiles data from GetProfilesHelper which
will later invoke OnGetProfilesDone. However, app menu is created on the
UI thread and blocks the callback until it shows up. This makes the
profiles mneu empty.
The fix is to leverage an existing profile list in BrowserProcess. When
"enable-udd-profiles" is on, BrowserInit will get the initial profile
list and NewProfileDialog will refresh it if user creates new profile.
And AppMenuModel just use the list to populate the profile menu.
BUG=30417
TEST=Verify profiles menu exists when "enable-udd-profiles" is on command line for issue 30417.
Review URL: http://codereview.chromium.org/503062
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35166 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/user_data_manager.cc')
-rw-r--r-- | chrome/browser/user_data_manager.cc | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/chrome/browser/user_data_manager.cc b/chrome/browser/user_data_manager.cc index 588f699..e7d71c2 100644 --- a/chrome/browser/user_data_manager.cc +++ b/chrome/browser/user_data_manager.cc @@ -15,6 +15,7 @@ #include "base/path_service.h" #include "base/process_util.h" #include "base/string_util.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_thread.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" @@ -64,7 +65,23 @@ class LaunchChromeForProfileIndexHelper : GetProfilesHelper::Delegate { DISALLOW_COPY_AND_ASSIGN(LaunchChromeForProfileIndexHelper); }; -} // namespace +// Helper to update global user data dir profiles list. +class UserDataDirProfilesUpdater : GetProfilesHelper::Delegate { + public: + UserDataDirProfilesUpdater(); + virtual ~UserDataDirProfilesUpdater(); + + // Request profiles via GetProfilesHelper. + void Run(); + + // GetProfilesHelper::Delegate method. + void OnGetProfilesDone(const std::vector<std::wstring>& profiles); + + private: + scoped_refptr<GetProfilesHelper> profiles_helper_; + + DISALLOW_COPY_AND_ASSIGN(UserDataDirProfilesUpdater); +}; LaunchChromeForProfileIndexHelper::LaunchChromeForProfileIndexHelper( const UserDataManager* manager, @@ -93,6 +110,29 @@ void LaunchChromeForProfileIndexHelper::OnGetProfilesDone( delete this; } +UserDataDirProfilesUpdater::UserDataDirProfilesUpdater() + : ALLOW_THIS_IN_INITIALIZER_LIST( + profiles_helper_(new GetProfilesHelper(this))) { +} + +UserDataDirProfilesUpdater::~UserDataDirProfilesUpdater() { + profiles_helper_->OnDelegateDeleted(); +} + +void UserDataDirProfilesUpdater::Run() { + profiles_helper_->GetProfiles(NULL); +} + +void UserDataDirProfilesUpdater::OnGetProfilesDone( + const std::vector<std::wstring>& profiles) { + g_browser_process->user_data_dir_profiles() = profiles; + + // We are done, delete ourselves. + delete this; +} + +} // namespace + // Separator used in folder names between the prefix and the profile name. // For e.g. a folder for the profile "Joe" would be named "User Data-Joe". static const wchar_t kProfileFolderSeparator[] = L"-"; @@ -266,6 +306,12 @@ bool UserDataManager::CreateDesktopShortcutForProfile( #endif } +void UserDataManager::RefreshUserDataDirProfiles() const { + // UserDataDirProfilesUpdater will delete itself when done. + UserDataDirProfilesUpdater* updater = new UserDataDirProfilesUpdater(); + updater->Run(); +} + GetProfilesHelper::GetProfilesHelper(Delegate* delegate) : delegate_(delegate), message_loop_(NULL) { |