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