1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/app_list/profile_loader.h"
8 #include "base/files/file_path.h"
9 #include "base/memory/weak_ptr.h"
10 #include "chrome/browser/lifetime/application_lifetime.h"
11 #include "chrome/browser/profiles/profile_manager.h"
13 ProfileLoader::ProfileLoader(ProfileStore* profile_store,
14 scoped_ptr<KeepAliveService> keep_alive_service)
15 : profile_store_(profile_store),
16 keep_alive_service_(keep_alive_service.Pass()),
17 profile_load_sequence_id_(0),
18 pending_profile_loads_(0),
22 ProfileLoader::~ProfileLoader() {
25 bool ProfileLoader::IsAnyProfileLoading() const {
26 return pending_profile_loads_ > 0;
29 void ProfileLoader::InvalidatePendingProfileLoads() {
30 ++profile_load_sequence_id_;
33 void ProfileLoader::LoadProfileInvalidatingOtherLoads(
34 const base::FilePath& profile_file_path,
35 base::Callback<void(Profile*)> callback) {
36 InvalidatePendingProfileLoads();
38 Profile* profile = profile_store_->GetProfileByPath(profile_file_path);
40 callback.Run(profile);
44 IncrementPendingProfileLoads();
45 profile_store_->LoadProfileAsync(
47 base::Bind(&ProfileLoader::OnProfileLoaded,
48 weak_factory_.GetWeakPtr(),
49 profile_load_sequence_id_,
53 void ProfileLoader::OnProfileLoaded(int profile_load_sequence_id,
54 base::Callback<void(Profile*)> callback,
56 DecrementPendingProfileLoads();
57 if (profile_load_sequence_id == profile_load_sequence_id_)
58 callback.Run(profile);
61 void ProfileLoader::IncrementPendingProfileLoads() {
62 pending_profile_loads_++;
63 if (pending_profile_loads_ == 1)
64 keep_alive_service_->EnsureKeepAlive();
67 void ProfileLoader::DecrementPendingProfileLoads() {
68 pending_profile_loads_--;
69 if (pending_profile_loads_ == 0)
70 keep_alive_service_->FreeKeepAlive();