• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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/prefs/session_startup_pref.h"
6 
7 #include <string>
8 
9 #include "base/string_piece.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/defaults.h"
12 #include "chrome/browser/net/url_fixer_upper.h"
13 #include "chrome/browser/prefs/pref_service.h"
14 #include "chrome/browser/prefs/scoped_user_pref_update.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/common/pref_names.h"
17 
18 namespace {
19 
20 // For historical reasons the enum and value registered in the prefs don't line
21 // up. These are the values registered in prefs.
22 const int kPrefValueDefault = 0;
23 const int kPrefValueLast = 1;
24 const int kPrefValueURLs = 4;
25 
26 // Converts a SessionStartupPref::Type to an integer written to prefs.
TypeToPrefValue(SessionStartupPref::Type type)27 int TypeToPrefValue(SessionStartupPref::Type type) {
28   switch (type) {
29     case SessionStartupPref::LAST:   return kPrefValueLast;
30     case SessionStartupPref::URLS:   return kPrefValueURLs;
31     default:                         return kPrefValueDefault;
32   }
33 }
34 
35 // Converts an integer pref value to a SessionStartupPref::Type.
PrefValueToType(int pref_value)36 SessionStartupPref::Type PrefValueToType(int pref_value) {
37   switch (pref_value) {
38     case kPrefValueLast:  return SessionStartupPref::LAST;
39     case kPrefValueURLs:  return SessionStartupPref::URLS;
40     default:              return SessionStartupPref::DEFAULT;
41   }
42 }
43 
44 }  // namespace
45 
46 // static
RegisterUserPrefs(PrefService * prefs)47 void SessionStartupPref::RegisterUserPrefs(PrefService* prefs) {
48   prefs->RegisterIntegerPref(prefs::kRestoreOnStartup,
49       TypeToPrefValue(browser_defaults::kDefaultSessionStartupType));
50   prefs->RegisterListPref(prefs::kURLsToRestoreOnStartup);
51 }
52 
53 // static
SetStartupPref(Profile * profile,const SessionStartupPref & pref)54 void SessionStartupPref::SetStartupPref(
55     Profile* profile,
56     const SessionStartupPref& pref) {
57   DCHECK(profile);
58   SetStartupPref(profile->GetPrefs(), pref);
59 }
60 
61 // static
SetStartupPref(PrefService * prefs,const SessionStartupPref & pref)62 void SessionStartupPref::SetStartupPref(PrefService* prefs,
63                                         const SessionStartupPref& pref) {
64   DCHECK(prefs);
65 
66   if (!SessionStartupPref::TypeIsManaged(prefs))
67     prefs->SetInteger(prefs::kRestoreOnStartup, TypeToPrefValue(pref.type));
68 
69   if (!SessionStartupPref::URLsAreManaged(prefs)) {
70     // Always save the URLs, that way the UI can remain consistent even if the
71     // user changes the startup type pref.
72     // Ownership of the ListValue retains with the pref service.
73     ListPrefUpdate update(prefs, prefs::kURLsToRestoreOnStartup);
74     ListValue* url_pref_list = update.Get();
75     DCHECK(url_pref_list);
76     url_pref_list->Clear();
77     for (size_t i = 0; i < pref.urls.size(); ++i) {
78       url_pref_list->Set(static_cast<int>(i),
79                          new StringValue(pref.urls[i].spec()));
80     }
81   }
82 }
83 
84 // static
GetStartupPref(Profile * profile)85 SessionStartupPref SessionStartupPref::GetStartupPref(Profile* profile) {
86   DCHECK(profile);
87   return GetStartupPref(profile->GetPrefs());
88 }
89 
90 // static
GetStartupPref(PrefService * prefs)91 SessionStartupPref SessionStartupPref::GetStartupPref(PrefService* prefs) {
92   DCHECK(prefs);
93   SessionStartupPref pref(
94       PrefValueToType(prefs->GetInteger(prefs::kRestoreOnStartup)));
95 
96   // Always load the urls, even if the pref type isn't URLS. This way the
97   // preferences panels can show the user their last choice.
98   const ListValue* url_pref_list = prefs->GetList(
99       prefs::kURLsToRestoreOnStartup);
100   if (url_pref_list) {
101     for (size_t i = 0; i < url_pref_list->GetSize(); ++i) {
102       Value* value = NULL;
103       if (url_pref_list->Get(i, &value)) {
104         std::string url_text;
105         if (value->GetAsString(&url_text)) {
106           GURL fixed_url = URLFixerUpper::FixupURL(url_text, "");
107           pref.urls.push_back(fixed_url);
108         }
109       }
110     }
111   }
112   return pref;
113 }
114 
115 // static
TypeIsManaged(PrefService * prefs)116 bool SessionStartupPref::TypeIsManaged(PrefService* prefs) {
117   DCHECK(prefs);
118   const PrefService::Preference* pref_restore =
119       prefs->FindPreference(prefs::kRestoreOnStartup);
120   DCHECK(pref_restore);
121   return pref_restore->IsManaged();
122 }
123 
124 // static
URLsAreManaged(PrefService * prefs)125 bool SessionStartupPref::URLsAreManaged(PrefService* prefs) {
126   DCHECK(prefs);
127   const PrefService::Preference* pref_urls =
128       prefs->FindPreference(prefs::kURLsToRestoreOnStartup);
129   DCHECK(pref_urls);
130   return pref_urls->IsManaged();
131 }
132 
SessionStartupPref()133 SessionStartupPref::SessionStartupPref() : type(DEFAULT) {}
134 
SessionStartupPref(Type type)135 SessionStartupPref::SessionStartupPref(Type type) : type(type) {}
136 
~SessionStartupPref()137 SessionStartupPref::~SessionStartupPref() {}
138