profile_loader.cc revision 868fa2fe829687343ffae624259930155e16dbd8
110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project// Copyright 2013 The Chromium Authors. All rights reserved.
210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project// found in the LICENSE file.
410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "chrome/browser/ui/app_list/profile_loader.h"
610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "base/bind.h"
810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "base/files/file_path.h"
910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "base/memory/weak_ptr.h"
1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "chrome/browser/lifetime/application_lifetime.h"
1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "chrome/browser/profiles/profile_manager.h"
1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source ProjectProfileLoader::ProfileLoader(ProfileManager* profile_manager)
145a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng  : profile_manager_(profile_manager),
1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    profile_load_sequence_id_(0),
165a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng    pending_profile_loads_(0),
175a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng    weak_factory_(this) {
1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source ProjectProfileLoader::~ProfileLoader() {
2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectbool ProfileLoader::AnyProfilesLoading() const {
2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  return pending_profile_loads_ > 0;
2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid ProfileLoader::InvalidatePendingProfileLoads() {
2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  profile_load_sequence_id_++;
2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid ProfileLoader::LoadProfileInvalidatingOtherLoads(
3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    const base::FilePath& profile_file_path,
3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    base::Callback<void(Profile*)> callback) {
3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  Profile* profile = profile_manager_->GetProfileByPath(profile_file_path);
3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  if (profile) {
3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    callback.Run(profile);
3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    return;
3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  }
3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  IncrementPendingProfileLoads();
4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  profile_manager_->CreateProfileAsync(
4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      profile_file_path,
4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      base::Bind(&ProfileLoader::OnProfileLoaded,
4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project                 weak_factory_.GetWeakPtr(),
4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project                 profile_load_sequence_id_,
4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project                 callback),
4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      string16(), string16(), false);
4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid ProfileLoader::OnProfileLoaded(int profile_load_sequence_id,
5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project                                    base::Callback<void(Profile*)> callback,
5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project                                    Profile* profile,
5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project                                    Profile::CreateStatus status) {
5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  switch (status) {
5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    case Profile::CREATE_STATUS_CREATED:
5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      break;
5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    case Profile::CREATE_STATUS_INITIALIZED:
5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      if (profile_load_sequence_id == profile_load_sequence_id_)
5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project        callback.Run(profile);
6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      DecrementPendingProfileLoads();
6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      break;
6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    case Profile::CREATE_STATUS_LOCAL_FAIL:
6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    case Profile::CREATE_STATUS_REMOTE_FAIL:
6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    case Profile::CREATE_STATUS_CANCELED:
6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      DecrementPendingProfileLoads();
6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      break;
6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    case Profile::MAX_CREATE_STATUS:
6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      NOTREACHED();
6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project      break;
7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  }
7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid ProfileLoader::IncrementPendingProfileLoads() {
7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  pending_profile_loads_++;
7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project  if (pending_profile_loads_ == 1)
7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project    chrome::StartKeepAlive();
7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid ProfileLoader::DecrementPendingProfileLoads() {
80b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown  pending_profile_loads_--;
81b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown  if (pending_profile_loads_ == 0)
82b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown    chrome::EndKeepAlive();
83b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown}
8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project