profile_signin_confirmation_helper.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/task/cancelable_task_tracker.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/history/history_backend.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_db_task.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_types.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/sync_helper.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_thread.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/gfx/color_utils.h"
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/native_theme/native_theme.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kHistoryEntriesBeforeNewProfilePrompt = 10;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Determines whether a profile has any typed URLs in its history.
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class HasTypedURLsTask : public history::HistoryDBTask {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HasTypedURLsTask(const base::Callback<void(bool)>& cb)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : has_typed_urls_(false), cb_(cb) {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool RunOnDBThread(history::HistoryBackend* backend,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             history::HistoryDatabase* db) OVERRIDE {
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    history::URLRows rows;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    backend->GetAllTypedURLs(&rows);
46a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!rows.empty()) {
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DVLOG(1) << "ProfileSigninConfirmationHelper: profile contains "
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               << rows.size() << " typed URLs";
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      has_typed_urls_ = true;
50a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DoneRunOnMainThread() OVERRIDE {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cb_.Run(has_typed_urls_);
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~HasTypedURLsTask() {}
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_typed_urls_;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Callback<void(bool)> cb_;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasBookmarks(Profile* profile) {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BookmarkModel* bookmarks = BookmarkModelFactory::GetForProfile(profile);
67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool has_bookmarks = bookmarks && bookmarks->HasBookmarks();
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (has_bookmarks)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "ProfileSigninConfirmationHelper: profile contains bookmarks";
70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return has_bookmarks;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper functions for Chrome profile signin.
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ProfileSigninConfirmationHelper {
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProfileSigninConfirmationHelper(
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile,
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::Callback<void(bool)>& return_result);
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CheckHasHistory(int max_entries);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CheckHasTypedURLs();
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Deletes itself.
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~ProfileSigninConfirmationHelper();
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnHistoryQueryResults(size_t max_entries,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             history::QueryResults* results);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ReturnResult(bool result);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Weak pointer to the profile being signed-in.
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile_;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Used for async tasks.
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::CancelableTaskTracker task_tracker_;
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Keep track of how many async requests are pending.
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int pending_requests_;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Callback to pass the result back to the caller.
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::Callback<void(bool)> return_result_;
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ProfileSigninConfirmationHelper);
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfileSigninConfirmationHelper::ProfileSigninConfirmationHelper(
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile,
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Callback<void(bool)>& return_result)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : profile_(profile),
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pending_requests_(0),
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return_result_(return_result) {
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfileSigninConfirmationHelper::~ProfileSigninConfirmationHelper() {
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::OnHistoryQueryResults(
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t max_entries,
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    history::QueryResults* results) {
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::QueryResults owned_results;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  results->Swap(&owned_results);
122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool too_much_history = owned_results.size() >= max_entries;
123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (too_much_history) {
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "ProfileSigninConfirmationHelper: profile contains "
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             << owned_results.size() << " history entries";
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ReturnResult(too_much_history);
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::CheckHasHistory(int max_entries) {
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HistoryService* service =
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HistoryServiceFactory::GetForProfileWithoutCreating(profile_);
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pending_requests_++;
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!service) {
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReturnResult(false);
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::QueryOptions opts;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  opts.max_count = max_entries;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  service->QueryHistory(
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::string16(),
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      opts,
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&ProfileSigninConfirmationHelper::OnHistoryQueryResults,
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(this),
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 max_entries),
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &task_tracker_);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::CheckHasTypedURLs() {
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HistoryService* service =
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HistoryServiceFactory::GetForProfileWithoutCreating(profile_);
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pending_requests_++;
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!service) {
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReturnResult(false);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  service->ScheduleDBTask(
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new HasTypedURLsTask(
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          base::Bind(&ProfileSigninConfirmationHelper::ReturnResult,
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     base::Unretained(this))),
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &task_tracker_);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::ReturnResult(bool result) {
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Pass |true| into the callback as soon as one of the tasks passes a
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // result of |true|, otherwise pass the last returned result.
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (--pending_requests_ == 0 || result) {
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return_result_.Run(result);
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // This leaks at shutdown if the HistoryService is destroyed, but
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // the process is going to die anyway.
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delete this;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ui {
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SkColor GetSigninConfirmationPromptBarColor(SkAlpha alpha) {
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static const SkColor kBackgroundColor =
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ui::NativeTheme::instance()->GetSystemColor(
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          ui::NativeTheme::kColorId_DialogBackground);
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return color_utils::BlendTowardOppositeLuminance(kBackgroundColor, alpha);
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasBeenShutdown(Profile* profile) {
189a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool has_been_shutdown = !profile->IsNewProfile();
190a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (has_been_shutdown)
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "ProfileSigninConfirmationHelper: profile is not new";
192a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return has_been_shutdown;
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool HasSyncedExtensions(Profile* profile) {
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  extensions::ExtensionSystem* system =
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extensions::ExtensionSystem::Get(profile);
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (system && system->extension_service()) {
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::ExtensionSet* extensions =
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        system->extension_service()->extensions();
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (extensions::ExtensionSet::const_iterator iter = extensions->begin();
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         iter != extensions->end(); ++iter) {
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // The webstore is synced so that it stays put on the new tab
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // page, but since it's installed by default we don't want to
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // consider it when determining if the profile is dirty.
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (extensions::sync_helper::IsSyncable(iter->get()) &&
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          (*iter)->id() != extension_misc::kWebStoreAppId &&
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          (*iter)->id() != extension_misc::kChromeAppId) {
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        DVLOG(1) << "ProfileSigninConfirmationHelper: "
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 << "profile contains a synced extension: " << (*iter)->id();
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return true;
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return false;
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CheckShouldPromptForNewProfile(
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile,
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Callback<void(bool)>& return_result) {
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
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.
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ProfileSigninConfirmationHelper* helper =
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new ProfileSigninConfirmationHelper(profile, return_result);
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->CheckHasHistory(kHistoryEntriesBeforeNewProfilePrompt);
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->CheckHasTypedURLs();
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace ui
237