session_startup_pref.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/session_startup_pref.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_fixer_upper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/pref_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/protector/protected_prefs_watcher.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/protector/protector_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/protector/protector_service_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/cocoa/window_restore_utils.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using protector::ProtectedPrefsWatcher;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using protector::ProtectorServiceFactory;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts a SessionStartupPref::Type to an integer written to prefs.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TypeToPrefValue(SessionStartupPref::Type type) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SessionStartupPref::LAST: return SessionStartupPref::kPrefValueLast;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SessionStartupPref::URLS: return SessionStartupPref::kPrefValueURLs;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:                       return SessionStartupPref::kPrefValueNewTab;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetNewURLList(PrefService* prefs) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->IsUserModifiablePreference(prefs::kURLsToRestoreOnStartup)) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue new_url_pref_list;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringValue* home_page =
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new base::StringValue(prefs->GetString(prefs::kHomePage));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_url_pref_list.Append(home_page);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs->Set(prefs::kURLsToRestoreOnStartup, new_url_pref_list);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLListToPref(const base::ListValue* url_list, SessionStartupPref* pref) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref->urls.clear();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < url_list->GetSize(); ++i) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string url_text;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (url_list->GetString(i, &url_text)) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL fixed_url = URLFixerUpper::FixupURL(url_text, "");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref->urls.push_back(fixed_url);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStartupPref::RegisterUserPrefs(PrefService* prefs) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->RegisterIntegerPref(prefs::kRestoreOnStartup,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             TypeToPrefValue(GetDefaultStartupType()),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             PrefService::SYNCABLE_PREF);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->RegisterListPref(prefs::kURLsToRestoreOnStartup,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          PrefService::SYNCABLE_PREF);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->RegisterBooleanPref(prefs::kRestoreOnStartupMigrated,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             false,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             PrefService::UNSYNCABLE_PREF);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStartupPref::Type SessionStartupPref::GetDefaultStartupType() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SessionStartupPref::LAST;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SessionStartupPref::DEFAULT;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStartupPref::SetStartupPref(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SessionStartupPref& pref) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartupPref(profile->GetPrefs(), pref);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStartupPref::SetStartupPref(PrefService* prefs,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const SessionStartupPref& pref) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SessionStartupPref::TypeIsManaged(prefs))
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs->SetInteger(prefs::kRestoreOnStartup, TypeToPrefValue(pref.type));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SessionStartupPref::URLsAreManaged(prefs)) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Always save the URLs, that way the UI can remain consistent even if the
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // user changes the startup type pref.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ownership of the ListValue retains with the pref service.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListPrefUpdate update(prefs, prefs::kURLsToRestoreOnStartup);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* url_pref_list = update.Get();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(url_pref_list);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_pref_list->Clear();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < pref.urls.size(); ++i) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url_pref_list->Set(static_cast<int>(i),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         new StringValue(pref.urls[i].spec()));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStartupPref SessionStartupPref::GetStartupPref(Profile* profile) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetStartupPref(profile->GetPrefs());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStartupPref SessionStartupPref::GetStartupPref(PrefService* prefs) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MigrateIfNecessary(prefs);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MigrateMacDefaultPrefIfNecessary(prefs);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrefValueToType(prefs->GetInteger(prefs::kRestoreOnStartup)));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always load the urls, even if the pref type isn't URLS. This way the
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preferences panels can show the user their last choice.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ListValue* url_list = prefs->GetList(prefs::kURLsToRestoreOnStartup);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLListToPref(url_list, &pref);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pref;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStartupPref::MigrateIfNecessary(PrefService* prefs) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prefs->GetBoolean(prefs::kRestoreOnStartupMigrated)) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Read existing values
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* homepage_is_new_tab_page_value =
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->GetUserPrefValue(prefs::kHomePageIsNewTabPage);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool homepage_is_new_tab_page = true;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (homepage_is_new_tab_page_value) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!homepage_is_new_tab_page_value->GetAsBoolean(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &homepage_is_new_tab_page))
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* restore_on_startup_value =
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->GetUserPrefValue(prefs::kRestoreOnStartup);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int restore_on_startup = -1;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (restore_on_startup_value) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!restore_on_startup_value->GetAsInteger(&restore_on_startup))
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If restore_on_startup has the deprecated value kPrefValueHomePage,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // migrate it to open the homepage on startup. If 'homepage is NTP' is set,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that means just opening the NTP. If not, it means opening a one-item URL
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // list containing the homepage.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (restore_on_startup == kPrefValueHomePage) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (homepage_is_new_tab_page) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->SetInteger(prefs::kRestoreOnStartup, kPrefValueNewTab);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->SetInteger(prefs::kRestoreOnStartup, kPrefValueURLs);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SetNewURLList(prefs);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (!restore_on_startup_value && !homepage_is_new_tab_page &&
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GetDefaultStartupType() == DEFAULT) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // kRestoreOnStartup was never set by the user, but the homepage was set.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Migrate to the list of URLs. (If restore_on_startup was never set,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // and homepage_is_new_tab_page is true, no action is needed. The new
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // default value is "open the new tab page" which is what we want.)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->SetInteger(prefs::kRestoreOnStartup, kPrefValueURLs);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetNewURLList(prefs);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs->SetBoolean(prefs::kRestoreOnStartupMigrated, true);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStartupPref::MigrateMacDefaultPrefIfNecessary(PrefService* prefs) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!restore_utils::IsWindowRestoreEnabled())
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default startup pref used to be LAST, now it is DEFAULT. Don't change
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the setting for existing profiles (even if the user has never changed it),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but make new profiles default to DEFAULT.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool old_profile_version = Version(prefs->GetString(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kProfileCreatedByVersion)).IsOlderThan("21.0.1180.0");
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (old_profile_version && TypeIsDefault(prefs))
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs->SetInteger(prefs::kRestoreOnStartup, kPrefValueLast);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStartupPref::TypeIsManaged(PrefService* prefs) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref_restore =
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->FindPreference(prefs::kRestoreOnStartup);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(pref_restore);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pref_restore->IsManaged();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStartupPref::URLsAreManaged(PrefService* prefs) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref_urls =
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->FindPreference(prefs::kURLsToRestoreOnStartup);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(pref_urls);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pref_urls->IsManaged();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStartupPref::TypeIsDefault(PrefService* prefs) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref_restore =
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->FindPreference(prefs::kRestoreOnStartup);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(pref_restore);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pref_restore->IsDefaultValue();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStartupPref::Type SessionStartupPref::PrefValueToType(int pref_value) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (pref_value) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPrefValueLast:     return SessionStartupPref::LAST;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPrefValueURLs:     return SessionStartupPref::URLS;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPrefValueHomePage: return SessionStartupPref::HOMEPAGE;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:                 return SessionStartupPref::DEFAULT;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStartupPref::DidStartupPrefChange(Profile* profile) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtectedPrefsWatcher* prefs_watcher =
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProtectorServiceFactory::GetForProfile(profile)->GetPrefsWatcher();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prefs_watcher->DidPrefChange(prefs::kRestoreOnStartup) ||
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs_watcher->DidPrefChange(prefs::kURLsToRestoreOnStartup);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStartupPref SessionStartupPref::GetStartupPrefBackup(Profile* profile) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protector::ProtectedPrefsWatcher* prefs_watcher =
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      protector::ProtectorServiceFactory::GetForProfile(profile)->
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetPrefsWatcher();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int type;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(prefs_watcher->GetBackupForPref(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prefs::kRestoreOnStartup)->GetAsInteger(&type));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref backup_pref(PrefValueToType(type));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ListValue* url_list;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(prefs_watcher->GetBackupForPref(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prefs::kURLsToRestoreOnStartup)->GetAsList(&url_list));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLListToPref(url_list, &backup_pref);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return backup_pref;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStartupPref::SessionStartupPref(Type type) : type(type) {}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStartupPref::~SessionStartupPref() {}
268