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