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/history/history_backend.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_db_task.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/browser/history_types.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_thread.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/color_utils.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/native_theme/native_theme.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/common/extensions/sync_helper.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/constants.h"
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kHistoryEntriesBeforeNewProfilePrompt = 10;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Determines whether a profile has any typed URLs in its history.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class HasTypedURLsTask : public history::HistoryDBTask {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit HasTypedURLsTask(const base::Callback<void(bool)>& cb)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : has_typed_urls_(false), cb_(cb) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool RunOnDBThread(history::HistoryBackend* backend,
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             history::HistoryDatabase* db) OVERRIDE {
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    history::URLRows rows;
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    backend->GetAllTypedURLs(&rows);
49a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!rows.empty()) {
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DVLOG(1) << "ProfileSigninConfirmationHelper: profile contains "
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               << rows.size() << " typed URLs";
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      has_typed_urls_ = true;
53a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DoneRunOnMainThread() OVERRIDE {
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cb_.Run(has_typed_urls_);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~HasTypedURLsTask() {}
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_typed_urls_;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Callback<void(bool)> cb_;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasBookmarks(Profile* profile) {
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BookmarkModel* bookmarks = BookmarkModelFactory::GetForProfile(profile);
70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool has_bookmarks = bookmarks && bookmarks->HasBookmarks();
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (has_bookmarks)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "ProfileSigninConfirmationHelper: profile contains bookmarks";
73a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return has_bookmarks;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper functions for Chrome profile signin.
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ProfileSigninConfirmationHelper {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProfileSigninConfirmationHelper(
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile,
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::Callback<void(bool)>& return_result);
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CheckHasHistory(int max_entries);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CheckHasTypedURLs();
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Deletes itself.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~ProfileSigninConfirmationHelper();
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnHistoryQueryResults(size_t max_entries,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             history::QueryResults* results);
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ReturnResult(bool result);
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Weak pointer to the profile being signed-in.
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile_;
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Used for async tasks.
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::CancelableTaskTracker task_tracker_;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Keep track of how many async requests are pending.
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int pending_requests_;
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Callback to pass the result back to the caller.
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::Callback<void(bool)> return_result_;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ProfileSigninConfirmationHelper);
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfileSigninConfirmationHelper::ProfileSigninConfirmationHelper(
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Callback<void(bool)>& return_result)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : profile_(profile),
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pending_requests_(0),
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return_result_(return_result) {
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfileSigninConfirmationHelper::~ProfileSigninConfirmationHelper() {
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::OnHistoryQueryResults(
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t max_entries,
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    history::QueryResults* results) {
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::QueryResults owned_results;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  results->Swap(&owned_results);
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool too_much_history = owned_results.size() >= max_entries;
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (too_much_history) {
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "ProfileSigninConfirmationHelper: profile contains "
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             << owned_results.size() << " history entries";
129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ReturnResult(too_much_history);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::CheckHasHistory(int max_entries) {
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HistoryService* service =
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HistoryServiceFactory::GetForProfileWithoutCreating(profile_);
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pending_requests_++;
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!service) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReturnResult(false);
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::QueryOptions opts;
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  opts.max_count = max_entries;
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  service->QueryHistory(
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::string16(),
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      opts,
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&ProfileSigninConfirmationHelper::OnHistoryQueryResults,
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(this),
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 max_entries),
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &task_tracker_);
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::CheckHasTypedURLs() {
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HistoryService* service =
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HistoryServiceFactory::GetForProfileWithoutCreating(profile_);
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pending_requests_++;
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!service) {
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReturnResult(false);
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  service->ScheduleDBTask(
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      scoped_ptr<history::HistoryDBTask>(new HasTypedURLsTask(
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          base::Bind(&ProfileSigninConfirmationHelper::ReturnResult,
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     base::Unretained(this)))),
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &task_tracker_);
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfileSigninConfirmationHelper::ReturnResult(bool result) {
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Pass |true| into the callback as soon as one of the tasks passes a
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // result of |true|, otherwise pass the last returned result.
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (--pending_requests_ == 0 || result) {
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return_result_.Run(result);
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // This leaks at shutdown if the HistoryService is destroyed, but
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // the process is going to die anyway.
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delete this;
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ui {
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SkColor GetSigninConfirmationPromptBarColor(SkAlpha alpha) {
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static const SkColor kBackgroundColor =
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ui::NativeTheme::instance()->GetSystemColor(
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          ui::NativeTheme::kColorId_DialogBackground);
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return color_utils::BlendTowardOppositeLuminance(kBackgroundColor, alpha);
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasBeenShutdown(Profile* profile) {
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_IOS)
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This check is not useful on iOS: the browser can be shut down without
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // explicit user action (for example, in response to memory pressure), and
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // this should be invisible to the user. The desktop assumption that the
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // profile going through a restart indicates something about user intention
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // does not hold. We rely on the other profile dirtiness checks.
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return false;
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
200a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool has_been_shutdown = !profile->IsNewProfile();
201a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (has_been_shutdown)
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "ProfileSigninConfirmationHelper: profile is not new";
203a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return has_been_shutdown;
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool HasSyncedExtensions(Profile* profile) {
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  extensions::ExtensionSystem* system =
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extensions::ExtensionSystem::Get(profile);
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (system && system->extension_service()) {
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::ExtensionSet* extensions =
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        system->extension_service()->extensions();
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (extensions::ExtensionSet::const_iterator iter = extensions->begin();
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         iter != extensions->end(); ++iter) {
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // The webstore is synced so that it stays put on the new tab
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // page, but since it's installed by default we don't want to
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // consider it when determining if the profile is dirty.
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (extensions::sync_helper::IsSyncable(iter->get()) &&
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (*iter)->id() != extensions::kWebStoreAppId &&
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          (*iter)->id() != extension_misc::kChromeAppId) {
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        DVLOG(1) << "ProfileSigninConfirmationHelper: "
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 << "profile contains a synced extension: " << (*iter)->id();
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return true;
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return false;
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CheckShouldPromptForNewProfile(
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile,
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Callback<void(bool)>& return_result) {
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (HasBeenShutdown(profile) ||
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HasBookmarks(profile) ||
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HasSyncedExtensions(profile)) {
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return_result.Run(true);
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Fire asynchronous queries for profile data.
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ProfileSigninConfirmationHelper* helper =
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new ProfileSigninConfirmationHelper(profile, return_result);
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->CheckHasHistory(kHistoryEntriesBeforeNewProfilePrompt);
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  helper->CheckHasTypedURLs();
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace ui
251