1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/feedback/feedback_profile_observer.h" 6 7#include "base/callback.h" 8#include "chrome/browser/chrome_notification_types.h" 9#include "chrome/browser/profiles/profile.h" 10#include "components/feedback/feedback_report.h" 11#include "components/feedback/feedback_uploader.h" 12#include "components/feedback/feedback_uploader_factory.h" 13#include "content/public/browser/browser_context.h" 14#include "content/public/browser/browser_thread.h" 15#include "content/public/browser/notification_service.h" 16 17using content::BrowserThread; 18 19static base::LazyInstance<feedback::FeedbackProfileObserver>::Leaky 20 g_feedback_profile_observer = LAZY_INSTANCE_INITIALIZER; 21 22namespace feedback { 23 24// static 25void FeedbackProfileObserver::Initialize() { 26 g_feedback_profile_observer.Get(); 27} 28 29FeedbackProfileObserver::FeedbackProfileObserver() { 30 prefs_registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CREATED, 31 content::NotificationService::AllSources()); 32} 33 34FeedbackProfileObserver::~FeedbackProfileObserver() { 35 prefs_registrar_.RemoveAll(); 36} 37 38void FeedbackProfileObserver::Observe( 39 int type, 40 const content::NotificationSource& source, 41 const content::NotificationDetails& details) { 42 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 43 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_CREATED, type); 44 45 Profile* profile = content::Source<Profile>(source).ptr(); 46 if (profile && !profile->IsOffTheRecord()) 47 QueueUnsentReports(profile); 48} 49 50void FeedbackProfileObserver::QueueSingleReport( 51 feedback::FeedbackUploader* uploader, 52 const std::string& data) { 53 BrowserThread::PostTask( 54 BrowserThread::UI, FROM_HERE, base::Bind(&FeedbackUploader::QueueReport, 55 uploader->AsWeakPtr(), data)); 56} 57 58void FeedbackProfileObserver::QueueUnsentReports( 59 content::BrowserContext* context) { 60 feedback::FeedbackUploader* uploader = 61 feedback::FeedbackUploaderFactory::GetForBrowserContext(context); 62 BrowserThread::PostBlockingPoolTask(FROM_HERE, 63 base::Bind( 64 &FeedbackReport::LoadReportsAndQueue, 65 uploader->GetFeedbackReportsPath(), 66 base::Bind(&FeedbackProfileObserver::QueueSingleReport, uploader))); 67} 68 69} // namespace feedback 70