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