profile_signin_confirmation_helper.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/common/cancelable_request.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_backend.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_db_task.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_types.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension_set.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/sync_helper.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/gfx/color_utils.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/native_theme/native_theme.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// TODO(dconnelly): change VLOG to DVLOG (crbug.com/240195)
29a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kHistoryEntriesBeforeNewProfilePrompt = 10;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Determines whether a profile has any typed URLs in its history.
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class HasTypedURLsTask : public history::HistoryDBTask {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HasTypedURLsTask(const base::Callback<void(bool)>& cb)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : has_typed_urls_(false), cb_(cb) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool RunOnDBThread(history::HistoryBackend* backend,
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             history::HistoryDatabase* db) OVERRIDE {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    history::URLRows rows;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    backend->GetAllTypedURLs(&rows);
45a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!rows.empty()) {
46a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      VLOG(1) << "ProfileSigninConfirmationHelper: profile contains "
47a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              << rows.size() << " typed URLs";
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      has_typed_urls_ = true;
49a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DoneRunOnMainThread() OVERRIDE {
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cb_.Run(has_typed_urls_);
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~HasTypedURLsTask() {}
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_typed_urls_;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Callback<void(bool)> cb_;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasBookmarks(Profile* profile) {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BookmarkModel* bookmarks = BookmarkModelFactory::GetForProfile(profile);
65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool has_bookmarks = bookmarks && bookmarks->HasBookmarks();
66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (has_bookmarks)
67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    VLOG(1) << "ProfileSigninConfirmationHelper: profile contains bookmarks";
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return has_bookmarks;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasSyncedExtensions(Profile* profile) {
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions::ExtensionSystem* system =
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile);
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (system && system->extension_service()) {
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ExtensionSet* extensions = system->extension_service()->extensions();
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (ExtensionSet::const_iterator iter = extensions->begin();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         iter != extensions->end(); ++iter) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // The webstore is synced so that it stays put on the new tab
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // page, but since it's installed by default we don't want to
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // consider it when determining if the profile is dirty.
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (extensions::sync_helper::IsSyncable(iter->get()) &&
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          (*iter)->id() != extension_misc::kWebStoreAppId) {
83a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        VLOG(1) << "ProfileSigninConfirmationHelper: "
84a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                << "profile contains a synced extension: " << (*iter)->id();
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return true;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper functions for Chrome profile signin.
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ProfileSigninConfirmationHelper
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public base::RefCounted<ProfileSigninConfirmationHelper> {
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProfileSigninConfirmationHelper(
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile,
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::Callback<void(bool)>& return_result);
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CheckHasHistory(int max_entries);
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CheckHasTypedURLs();
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_pending_requests(int requests);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class base::RefCounted<ProfileSigninConfirmationHelper>;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~ProfileSigninConfirmationHelper();
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnHistoryQueryResults(size_t max_entries,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             CancelableRequestProvider::Handle handle,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             history::QueryResults* results);
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ReturnResult(bool result);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Weak pointer to the profile being signed-in.
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile_;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Used for async tasks.
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CancelableRequestConsumer request_consumer_;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Keep track of how many async requests are pending.
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int pending_requests_;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Indicates whether the result has already been returned to caller.
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool result_returned_;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Callback to pass the result back to the caller.
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::Callback<void(bool)> return_result_;
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ProfileSigninConfirmationHelper);
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfileSigninConfirmationHelper::ProfileSigninConfirmationHelper(
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Callback<void(bool)>& return_result)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : profile_(profile),
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pending_requests_(0),
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result_returned_(false),
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return_result_(return_result) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfileSigninConfirmationHelper::~ProfileSigninConfirmationHelper() {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::OnHistoryQueryResults(
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t max_entries,
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CancelableRequestProvider::Handle handle,
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    history::QueryResults* results) {
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::QueryResults owned_results;
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  results->Swap(&owned_results);
149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool too_much_history = owned_results.size() >= max_entries;
150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (too_much_history) {
151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    VLOG(1) << "ProfileSigninConfirmationHelper: profile contains "
152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            << owned_results.size() << " history entries";
153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ReturnResult(too_much_history);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::CheckHasHistory(int max_entries) {
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HistoryService* service =
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HistoryServiceFactory::GetForProfileWithoutCreating(profile_);
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!service) {
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReturnResult(false);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::QueryOptions opts;
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  opts.max_count = max_entries;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  service->QueryHistory(
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      string16(), opts, &request_consumer_,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&ProfileSigninConfirmationHelper::OnHistoryQueryResults,
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 this,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 max_entries));
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::CheckHasTypedURLs() {
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HistoryService* service =
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HistoryServiceFactory::GetForProfileWithoutCreating(profile_);
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!service) {
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReturnResult(false);
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  service->ScheduleDBTask(
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new HasTypedURLsTask(
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          base::Bind(
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &ProfileSigninConfirmationHelper::ReturnResult,
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              this)),
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &request_consumer_);
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::set_pending_requests(int requests) {
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pending_requests_ = requests;
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::ReturnResult(bool result) {
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Pass |true| into the callback as soon as one of the tasks passes a
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // result of |true|, otherwise pass the last returned result.
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!result_returned_ && (--pending_requests_ == 0 || result)) {
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result_returned_ = true;
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    request_consumer_.CancelAllRequests();
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return_result_.Run(result);
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ui {
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SkColor GetSigninConfirmationPromptBarColor(SkAlpha alpha) {
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static const SkColor kBackgroundColor =
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ui::NativeTheme::instance()->GetSystemColor(
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          ui::NativeTheme::kColorId_DialogBackground);
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return color_utils::BlendTowardOppositeLuminance(kBackgroundColor, alpha);
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasBeenShutdown(Profile* profile) {
214a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool has_been_shutdown = !profile->IsNewProfile();
215a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (has_been_shutdown)
216a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    VLOG(1) << "ProfileSigninConfirmationHelper: profile is not new";
217a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return has_been_shutdown;
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CheckShouldPromptForNewProfile(
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile,
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Callback<void(bool)>& return_result) {
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (HasBeenShutdown(profile) ||
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HasBookmarks(profile) ||
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HasSyncedExtensions(profile)) {
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return_result.Run(true);
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Fire asynchronous queries for profile data.
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<ProfileSigninConfirmationHelper> helper =
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new ProfileSigninConfirmationHelper(profile, return_result);
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int requests = 2;
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->set_pending_requests(requests);
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->CheckHasHistory(kHistoryEntriesBeforeNewProfilePrompt);
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->CheckHasTypedURLs();
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace ui
239