Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / app_mode / kiosk_diagnosis_runner.cc
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/chromeos/app_mode/kiosk_diagnosis_runner.h"
6
7 #include "base/bind.h"
8 #include "base/memory/singleton.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/time/time.h"
12 #include "chrome/browser/extensions/api/feedback_private/feedback_private_api.h"
13 #include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
14 #include "components/browser_context_keyed_service/browser_context_keyed_service_factory.h"
15 #include "content/public/browser/browser_thread.h"
16 #include "extensions/browser/extension_system_provider.h"
17 #include "extensions/browser/extensions_browser_client.h"
18
19 namespace chromeos {
20
21 class KioskDiagnosisRunner::Factory : public BrowserContextKeyedServiceFactory {
22  public:
23   static KioskDiagnosisRunner* GetForProfile(Profile* profile) {
24     return static_cast<KioskDiagnosisRunner*>(
25         GetInstance()->GetServiceForBrowserContext(profile, true));
26   }
27
28   static Factory* GetInstance() {
29     return Singleton<Factory>::get();
30   }
31
32  private:
33   friend struct DefaultSingletonTraits<Factory>;
34
35   Factory()
36       : BrowserContextKeyedServiceFactory(
37             "KioskDiagnosisRunner",
38             BrowserContextDependencyManager::GetInstance()) {
39     DependsOn(extensions::ExtensionsBrowserClient::Get()
40                   ->GetExtensionSystemFactory());
41     DependsOn(extensions::FeedbackPrivateAPI::GetFactoryInstance());
42   }
43
44   virtual ~Factory() {}
45
46   // BrowserContextKeyedServiceFactory overrides:
47   virtual BrowserContextKeyedService* BuildServiceInstanceFor(
48       content::BrowserContext* context) const OVERRIDE {
49     Profile* profile = static_cast<Profile*>(context);
50     return new KioskDiagnosisRunner(profile);
51   }
52
53  private:
54   DISALLOW_COPY_AND_ASSIGN(Factory);
55 };
56
57 // static
58 void KioskDiagnosisRunner::Run(Profile* profile,
59                                const std::string& app_id) {
60   KioskDiagnosisRunner::Factory::GetForProfile(profile)->Start(app_id);
61 }
62
63 KioskDiagnosisRunner::KioskDiagnosisRunner(Profile* profile)
64     : profile_(profile),
65       weak_factory_(this) {}
66
67 KioskDiagnosisRunner::~KioskDiagnosisRunner() {}
68
69 void KioskDiagnosisRunner::Start(const std::string& app_id) {
70   app_id_ = app_id;
71
72   // Schedules system logs to be collected after 1 minute.
73   content::BrowserThread::PostDelayedTask(
74       content::BrowserThread::UI,
75       FROM_HERE,
76       base::Bind(&KioskDiagnosisRunner::StartSystemLogCollection,
77                  weak_factory_.GetWeakPtr()),
78       base::TimeDelta::FromMinutes(1));
79 }
80
81 void KioskDiagnosisRunner::StartSystemLogCollection() {
82   extensions::FeedbackService* service =
83       extensions::FeedbackPrivateAPI::GetFactoryInstance()
84           ->GetForProfile(profile_)
85           ->GetService();
86   DCHECK(service);
87
88   service->GetSystemInformation(
89       base::Bind(&KioskDiagnosisRunner::SendSysLogFeedback,
90                  weak_factory_.GetWeakPtr()));
91 }
92
93 void KioskDiagnosisRunner::SendSysLogFeedback(
94     const extensions::SystemInformationList& sys_info) {
95   scoped_refptr<FeedbackData> feedback_data(new FeedbackData());
96
97   feedback_data->set_profile(profile_);
98   feedback_data->set_description(base::StringPrintf(
99       "Autogenerated feedback:\nAppId: %s\n(uniquifier:%s)",
100       app_id_.c_str(),
101       base::Int64ToString(base::Time::Now().ToInternalValue()).c_str()));
102
103   scoped_ptr<FeedbackData::SystemLogsMap> sys_logs(
104       new FeedbackData::SystemLogsMap);
105   for (extensions::SystemInformationList::const_iterator it = sys_info.begin();
106        it != sys_info.end(); ++it) {
107     (*sys_logs.get())[it->get()->key] = it->get()->value;
108   }
109   feedback_data->SetAndCompressSystemInfo(sys_logs.Pass());
110
111   extensions::FeedbackService* service =
112       extensions::FeedbackPrivateAPI::GetFactoryInstance()
113           ->GetForProfile(profile_)
114           ->GetService();
115   DCHECK(service);
116   service->SendFeedback(profile_,
117                         feedback_data,
118                         base::Bind(&KioskDiagnosisRunner::OnFeedbackSent,
119                                    weak_factory_.GetWeakPtr()));
120 }
121
122 void KioskDiagnosisRunner::OnFeedbackSent(bool) {
123   // Do nothing.
124 }
125
126 }  // namespace chromeos