Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/webui/crashes_ui.h" | 5 #include "chrome/browser/ui/webui/crashes_ui.h" |
| 6 | 6 |
| 7 #include <vector> | |
| 8 | |
| 9 #include "base/bind.h" | 7 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 11 #include "base/i18n/time_formatting.h" | |
| 12 #include "base/memory/ref_counted_memory.h" | 9 #include "base/memory/ref_counted_memory.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/values.h" | 11 #include "base/values.h" |
| 15 #include "chrome/browser/crash_upload_list.h" | 12 #include "chrome/browser/crash_upload_list.h" |
| 16 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" | 13 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" |
| 17 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 18 #include "chrome/common/url_constants.h" | 15 #include "chrome/common/url_constants.h" |
| 19 #include "chrome/grit/chromium_strings.h" | 16 #include "chrome/grit/chromium_strings.h" |
| 20 #include "chrome/grit/generated_resources.h" | 17 #include "chrome/grit/generated_resources.h" |
| 21 #include "chrome/grit/google_chrome_strings.h" | 18 #include "chrome/grit/google_chrome_strings.h" |
| 19 #include "components/crash/core/browser/crashes_ui_util.h" | |
| 22 #include "components/version_info/version_info.h" | 20 #include "components/version_info/version_info.h" |
| 23 #include "content/public/browser/web_contents.h" | 21 #include "content/public/browser/web_contents.h" |
| 24 #include "content/public/browser/web_ui.h" | 22 #include "content/public/browser/web_ui.h" |
| 25 #include "content/public/browser/web_ui_data_source.h" | 23 #include "content/public/browser/web_ui_data_source.h" |
| 26 #include "content/public/browser/web_ui_message_handler.h" | 24 #include "content/public/browser/web_ui_message_handler.h" |
| 27 #include "grit/browser_resources.h" | 25 #include "grit/browser_resources.h" |
| 28 #include "grit/components_chromium_strings.h" | 26 #include "grit/components_chromium_strings.h" |
| 29 #include "grit/components_google_chrome_strings.h" | 27 #include "grit/components_google_chrome_strings.h" |
| 30 #include "grit/components_resources.h" | 28 #include "grit/components_resources.h" |
| 29 #include "grit/components_scaled_resources.h" | |
| 31 #include "grit/components_strings.h" | 30 #include "grit/components_strings.h" |
| 32 #include "grit/theme_resources.h" | |
| 33 #include "ui/base/resource/resource_bundle.h" | 31 #include "ui/base/resource/resource_bundle.h" |
| 34 | 32 |
| 35 #if defined(OS_CHROMEOS) | 33 #if defined(OS_CHROMEOS) |
| 36 #include "chromeos/dbus/dbus_thread_manager.h" | 34 #include "chromeos/dbus/dbus_thread_manager.h" |
| 37 #include "chromeos/dbus/debug_daemon_client.h" | 35 #include "chromeos/dbus/debug_daemon_client.h" |
| 38 #endif | 36 #endif |
| 39 | 37 |
| 40 using content::WebContents; | 38 using content::WebContents; |
| 41 using content::WebUIMessageHandler; | 39 using content::WebUIMessageHandler; |
| 42 | 40 |
| 43 namespace { | 41 namespace { |
| 44 | 42 |
| 45 content::WebUIDataSource* CreateCrashesUIHTMLSource() { | 43 content::WebUIDataSource* CreateCrashesUIHTMLSource() { |
| 46 content::WebUIDataSource* source = | 44 content::WebUIDataSource* source = |
| 47 content::WebUIDataSource::Create(chrome::kChromeUICrashesHost); | 45 content::WebUIDataSource::Create(chrome::kChromeUICrashesHost); |
| 48 | 46 |
| 49 source->AddLocalizedString("shortProductName", IDS_SHORT_PRODUCT_NAME); | 47 source->AddLocalizedString(crash::kCrashesUIShortProductName, |
|
Robert Sesek
2015/10/06 20:13:35
Could you expose an array of struct{const char* na
droger
2015/10/07 09:39:10
Good suggestion.
Done, except for IDS_SHORT_PRODUC
| |
| 50 source->AddLocalizedString("crashesTitle", IDS_CRASH_TITLE); | 48 IDS_SHORT_PRODUCT_NAME); |
| 51 source->AddLocalizedString("crashCountFormat", | 49 source->AddLocalizedString(crash::kCrashesUICrashesTitle, IDS_CRASH_TITLE); |
| 50 source->AddLocalizedString(crash::kCrashesUICrashCountFormat, | |
| 52 IDS_CRASH_CRASH_COUNT_BANNER_FORMAT); | 51 IDS_CRASH_CRASH_COUNT_BANNER_FORMAT); |
| 53 source->AddLocalizedString("crashHeaderFormat", | 52 source->AddLocalizedString(crash::kCrashesUICrashHeaderFormat, |
| 54 IDS_CRASH_CRASH_HEADER_FORMAT); | 53 IDS_CRASH_CRASH_HEADER_FORMAT); |
| 55 source->AddLocalizedString("crashTimeFormat", IDS_CRASH_CRASH_TIME_FORMAT); | 54 source->AddLocalizedString(crash::kCrashesUICrashTimeFormat, |
| 56 source->AddLocalizedString("bugLinkText", IDS_CRASH_BUG_LINK_LABEL); | 55 IDS_CRASH_CRASH_TIME_FORMAT); |
| 57 source->AddLocalizedString("noCrashesMessage", | 56 source->AddLocalizedString(crash::kCrashesUIBugLinkText, |
| 57 IDS_CRASH_BUG_LINK_LABEL); | |
| 58 source->AddLocalizedString(crash::kCrashesUINoCrashesMessage, | |
| 58 IDS_CRASH_NO_CRASHES_MESSAGE); | 59 IDS_CRASH_NO_CRASHES_MESSAGE); |
| 59 source->AddLocalizedString("disabledHeader", IDS_CRASH_DISABLED_HEADER); | 60 source->AddLocalizedString(crash::kCrashesUIDisabledHeader, |
| 60 source->AddLocalizedString("disabledMessage", IDS_CRASH_DISABLED_MESSAGE); | 61 IDS_CRASH_DISABLED_HEADER); |
| 61 source->AddLocalizedString("uploadCrashesLinkText", | 62 source->AddLocalizedString(crash::kCrashesUIDisabledMessage, |
| 63 IDS_CRASH_DISABLED_MESSAGE); | |
| 64 source->AddLocalizedString(crash::kCrashesUIUploadCrashesLinkText, | |
| 62 IDS_CRASH_UPLOAD_MESSAGE); | 65 IDS_CRASH_UPLOAD_MESSAGE); |
| 63 source->SetJsonPath("strings.js"); | 66 source->SetJsonPath("strings.js"); |
| 64 source->AddResourcePath("crashes.js", IDR_CRASH_CRASHES_JS); | 67 source->AddResourcePath(crash::kCrashesUICrashesJS, IDR_CRASH_CRASHES_JS); |
| 65 source->SetDefaultResource(IDR_CRASH_CRASHES_HTML); | 68 source->SetDefaultResource(IDR_CRASH_CRASHES_HTML); |
| 66 return source; | 69 return source; |
| 67 } | 70 } |
| 68 | 71 |
| 69 //////////////////////////////////////////////////////////////////////////////// | 72 //////////////////////////////////////////////////////////////////////////////// |
| 70 // | 73 // |
| 71 // CrashesDOMHandler | 74 // CrashesDOMHandler |
| 72 // | 75 // |
| 73 //////////////////////////////////////////////////////////////////////////////// | 76 //////////////////////////////////////////////////////////////////////////////// |
| 74 | 77 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 108 : list_available_(false), first_load_(true) { | 111 : list_available_(false), first_load_(true) { |
| 109 upload_list_ = CreateCrashUploadList(this); | 112 upload_list_ = CreateCrashUploadList(this); |
| 110 } | 113 } |
| 111 | 114 |
| 112 CrashesDOMHandler::~CrashesDOMHandler() { | 115 CrashesDOMHandler::~CrashesDOMHandler() { |
| 113 upload_list_->ClearDelegate(); | 116 upload_list_->ClearDelegate(); |
| 114 } | 117 } |
| 115 | 118 |
| 116 void CrashesDOMHandler::RegisterMessages() { | 119 void CrashesDOMHandler::RegisterMessages() { |
| 117 upload_list_->LoadUploadListAsynchronously(); | 120 upload_list_->LoadUploadListAsynchronously(); |
| 118 web_ui()->RegisterMessageCallback("requestCrashList", | 121 web_ui()->RegisterMessageCallback( |
| 122 crash::kCrashesUIRequestCrashList, | |
| 119 base::Bind(&CrashesDOMHandler::HandleRequestCrashes, | 123 base::Bind(&CrashesDOMHandler::HandleRequestCrashes, |
| 120 base::Unretained(this))); | 124 base::Unretained(this))); |
| 121 | 125 |
| 122 #if defined(OS_CHROMEOS) | 126 #if defined(OS_CHROMEOS) |
| 123 web_ui()->RegisterMessageCallback("requestCrashUpload", | 127 web_ui()->RegisterMessageCallback( |
| 128 crash::kCrashesUIRequestCrashUpload, | |
| 124 base::Bind(&CrashesDOMHandler::HandleRequestUploads, | 129 base::Bind(&CrashesDOMHandler::HandleRequestUploads, |
| 125 base::Unretained(this))); | 130 base::Unretained(this))); |
| 126 #endif | 131 #endif |
| 127 } | 132 } |
| 128 | 133 |
| 129 void CrashesDOMHandler::HandleRequestCrashes(const base::ListValue* args) { | 134 void CrashesDOMHandler::HandleRequestCrashes(const base::ListValue* args) { |
| 130 if (first_load_) { | 135 if (first_load_) { |
| 131 first_load_ = false; | 136 first_load_ = false; |
| 132 if (list_available_) | 137 if (list_available_) |
| 133 UpdateUI(); | 138 UpdateUI(); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 149 | 154 |
| 150 void CrashesDOMHandler::OnUploadListAvailable() { | 155 void CrashesDOMHandler::OnUploadListAvailable() { |
| 151 list_available_ = true; | 156 list_available_ = true; |
| 152 if (!first_load_) | 157 if (!first_load_) |
| 153 UpdateUI(); | 158 UpdateUI(); |
| 154 } | 159 } |
| 155 | 160 |
| 156 void CrashesDOMHandler::UpdateUI() { | 161 void CrashesDOMHandler::UpdateUI() { |
| 157 bool crash_reporting_enabled = | 162 bool crash_reporting_enabled = |
| 158 ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled(); | 163 ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled(); |
| 159 base::ListValue crash_list; | 164 |
| 160 bool system_crash_reporter = false; | 165 bool system_crash_reporter = false; |
| 161 | |
| 162 #if defined(OS_CHROMEOS) | 166 #if defined(OS_CHROMEOS) |
| 163 // Chrome OS has a system crash reporter. | 167 // Chrome OS has a system crash reporter. |
| 164 system_crash_reporter = true; | 168 system_crash_reporter = true; |
| 165 #endif | 169 #endif |
| 166 | 170 |
| 167 if (crash_reporting_enabled) { | 171 base::ListValue crash_list; |
| 168 std::vector<CrashUploadList::UploadInfo> crashes; | 172 if (crash_reporting_enabled) |
| 169 upload_list_->GetUploads(50, &crashes); | 173 crash::UploadListToValue(upload_list_.get(), &crash_list); |
| 170 | |
| 171 for (std::vector<CrashUploadList::UploadInfo>::iterator i = crashes.begin(); | |
| 172 i != crashes.end(); ++i) { | |
| 173 base::DictionaryValue* crash = new base::DictionaryValue(); | |
| 174 crash->SetString("id", i->id); | |
| 175 crash->SetString("time", base::TimeFormatFriendlyDateAndTime(i->time)); | |
| 176 crash->SetString("local_id", i->local_id); | |
| 177 crash_list.Append(crash); | |
| 178 } | |
| 179 } | |
| 180 | 174 |
| 181 base::FundamentalValue enabled(crash_reporting_enabled); | 175 base::FundamentalValue enabled(crash_reporting_enabled); |
| 182 base::FundamentalValue dynamic_backend(system_crash_reporter); | 176 base::FundamentalValue dynamic_backend(system_crash_reporter); |
| 183 | |
| 184 base::StringValue version(version_info::GetVersionNumber()); | 177 base::StringValue version(version_info::GetVersionNumber()); |
| 185 | 178 web_ui()->CallJavascriptFunction(crash::kCrashesUIUpdateCrashList, enabled, |
| 186 web_ui()->CallJavascriptFunction("updateCrashList", enabled, dynamic_backend, | 179 dynamic_backend, crash_list, version); |
| 187 crash_list, version); | |
| 188 } | 180 } |
| 189 | 181 |
| 190 } // namespace | 182 } // namespace |
| 191 | 183 |
| 192 /////////////////////////////////////////////////////////////////////////////// | 184 /////////////////////////////////////////////////////////////////////////////// |
| 193 // | 185 // |
| 194 // CrashesUI | 186 // CrashesUI |
| 195 // | 187 // |
| 196 /////////////////////////////////////////////////////////////////////////////// | 188 /////////////////////////////////////////////////////////////////////////////// |
| 197 | 189 |
| 198 CrashesUI::CrashesUI(content::WebUI* web_ui) : WebUIController(web_ui) { | 190 CrashesUI::CrashesUI(content::WebUI* web_ui) : WebUIController(web_ui) { |
| 199 web_ui->AddMessageHandler(new CrashesDOMHandler()); | 191 web_ui->AddMessageHandler(new CrashesDOMHandler()); |
| 200 | 192 |
| 201 // Set up the chrome://crashes/ source. | 193 // Set up the chrome://crashes/ source. |
| 202 Profile* profile = Profile::FromWebUI(web_ui); | 194 Profile* profile = Profile::FromWebUI(web_ui); |
| 203 content::WebUIDataSource::Add(profile, CreateCrashesUIHTMLSource()); | 195 content::WebUIDataSource::Add(profile, CreateCrashesUIHTMLSource()); |
| 204 } | 196 } |
| 205 | 197 |
| 206 // static | 198 // static |
| 207 base::RefCountedMemory* CrashesUI::GetFaviconResourceBytes( | 199 base::RefCountedMemory* CrashesUI::GetFaviconResourceBytes( |
| 208 ui::ScaleFactor scale_factor) { | 200 ui::ScaleFactor scale_factor) { |
| 209 return ResourceBundle::GetSharedInstance(). | 201 return ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale( |
| 210 LoadDataResourceBytesForScale(IDR_SAD_FAVICON, scale_factor); | 202 IDR_CRASH_SAD_FAVICON, scale_factor); |
| 211 } | 203 } |
| OLD | NEW |