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
3// found in the LICENSE file.
4
5#include "chrome/browser/sessions/session_service_factory.h"
6
7#include "chrome/browser/profiles/profile.h"
8#include "chrome/browser/sessions/session_data_deleter.h"
9#include "chrome/browser/sessions/session_service.h"
10#include "components/keyed_service/content/browser_context_dependency_manager.h"
11
12// static
13SessionService* SessionServiceFactory::GetForProfile(Profile* profile) {
14#if defined(OS_ANDROID)
15  // For Android we do not store sessions in the SessionService.
16  return NULL;
17#else
18  return static_cast<SessionService*>(
19      GetInstance()->GetServiceForBrowserContext(profile, true));
20#endif
21}
22
23// static
24SessionService* SessionServiceFactory::GetForProfileIfExisting(
25    Profile* profile) {
26#if defined(OS_ANDROID)
27  // For Android we do not store sessions in the SessionService.
28  return NULL;
29#else
30  return static_cast<SessionService*>(
31      GetInstance()->GetServiceForBrowserContext(profile, false));
32#endif
33}
34
35// static
36SessionService* SessionServiceFactory::GetForProfileForSessionRestore(
37    Profile* profile) {
38  SessionService* service = GetForProfile(profile);
39  if (!service) {
40    // If the service has been shutdown, remove the reference to NULL for
41    // |profile| so GetForProfile will recreate it.
42    GetInstance()->Disassociate(profile);
43    service = GetForProfile(profile);
44  }
45  return service;
46}
47
48// static
49void SessionServiceFactory::ShutdownForProfile(Profile* profile) {
50  DeleteSessionOnlyData(profile);
51
52  // We're about to exit, force creation of the session service if it hasn't
53  // been created yet. We do this to ensure session state matches the point in
54  // time the user exited.
55  SessionServiceFactory* factory = GetInstance();
56  factory->GetServiceForBrowserContext(profile, true);
57
58  // Shut down and remove the reference to the session service, and replace it
59  // with an explicit NULL to prevent it being recreated on the next access.
60  factory->BrowserContextShutdown(profile);
61  factory->BrowserContextDestroyed(profile);
62  factory->Associate(profile, NULL);
63}
64
65SessionServiceFactory* SessionServiceFactory::GetInstance() {
66  return Singleton<SessionServiceFactory>::get();
67}
68
69SessionServiceFactory::SessionServiceFactory()
70    : BrowserContextKeyedServiceFactory(
71        "SessionService",
72        BrowserContextDependencyManager::GetInstance()) {
73}
74
75SessionServiceFactory::~SessionServiceFactory() {
76}
77
78KeyedService* SessionServiceFactory::BuildServiceInstanceFor(
79    content::BrowserContext* profile) const {
80  SessionService* service = NULL;
81  service = new SessionService(static_cast<Profile*>(profile));
82  service->ResetFromCurrentBrowsers();
83  return service;
84}
85
86bool SessionServiceFactory::ServiceIsCreatedWithBrowserContext() const {
87  return true;
88}
89
90bool SessionServiceFactory::ServiceIsNULLWhileTesting() const {
91  return true;
92}
93