Index: chrome/browser/ui/webui/crashes_ui.cc |
diff --git a/chrome/browser/ui/webui/crashes_ui.cc b/chrome/browser/ui/webui/crashes_ui.cc |
index af48299bb57453d4df0cb1a1eee9ddd41653a03a..81128305d5c99983953806dfac39908781214be3 100644 |
--- a/chrome/browser/ui/webui/crashes_ui.cc |
+++ b/chrome/browser/ui/webui/crashes_ui.cc |
@@ -16,6 +16,7 @@ |
#include "build/build_config.h" |
#include "chrome/browser/crash_upload_list/crash_upload_list.h" |
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" |
+#include "chrome/browser/metrics/metrics_reporting_state.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/url_constants.h" |
#include "chrome/grit/chromium_strings.h" |
@@ -92,6 +93,11 @@ class CrashesDOMHandler : public WebUIMessageHandler, |
// Sends the recent crashes list JS. |
void UpdateUI(); |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+ // Asynchronously requests a user triggered upload. Called from JS. |
+ void HandleRequestSingleCrashUpload(const base::ListValue* args); |
+#endif |
+ |
scoped_refptr<CrashUploadList> upload_list_; |
bool list_available_; |
bool first_load_; |
@@ -121,6 +127,13 @@ void CrashesDOMHandler::RegisterMessages() { |
base::Bind(&CrashesDOMHandler::HandleRequestUploads, |
base::Unretained(this))); |
#endif |
+ |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+ web_ui()->RegisterMessageCallback( |
+ crash::kCrashesUIRequestSingleCrashUpload, |
+ base::Bind(&CrashesDOMHandler::HandleRequestSingleCrashUpload, |
+ base::Unretained(this))); |
+#endif |
} |
void CrashesDOMHandler::HandleRequestCrashes(const base::ListValue* args) { |
@@ -160,12 +173,27 @@ void CrashesDOMHandler::UpdateUI() { |
system_crash_reporter = true; |
#endif |
+ bool upload_list = crash_reporting_enabled; |
+ bool support_manual_uploads = false; |
+ |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+ // Maunal uploads currently are supported only for Crashpad-using platforms |
+ // and only if crash uploads are not disabled by policy. |
+ support_manual_uploads = |
+ crash_reporting_enabled || !IsMetricsReportingPolicyManaged(); |
+ |
+ // Show crash reports regardless of |crash_reporting_enabled| so that users |
+ // can manually upload those reports. |
+ upload_list = true; |
+#endif |
+ |
base::ListValue crash_list; |
- if (crash_reporting_enabled) |
+ if (upload_list) |
crash::UploadListToValue(upload_list_.get(), &crash_list); |
base::FundamentalValue enabled(crash_reporting_enabled); |
base::FundamentalValue dynamic_backend(system_crash_reporter); |
+ base::FundamentalValue manual_uploads(support_manual_uploads); |
base::StringValue version(version_info::GetVersionNumber()); |
base::StringValue os_string(base::SysInfo::OperatingSystemName() + " " + |
base::SysInfo::OperatingSystemVersion()); |
@@ -173,6 +201,7 @@ void CrashesDOMHandler::UpdateUI() { |
std::vector<const base::Value*> args; |
args.push_back(&enabled); |
args.push_back(&dynamic_backend); |
+ args.push_back(&manual_uploads); |
args.push_back(&crash_list); |
args.push_back(&version); |
args.push_back(&os_string); |
@@ -180,6 +209,24 @@ void CrashesDOMHandler::UpdateUI() { |
args); |
} |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+void CrashesDOMHandler::HandleRequestSingleCrashUpload( |
+ const base::ListValue* args) { |
+ DCHECK(args); |
+ |
+ std::string local_id; |
+ bool success = args->GetString(0, &local_id); |
+ DCHECK(success); |
+ |
+ // Only allow manual uploads if crash uploads aren’t disabled by policy. |
+ if (!ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled() && |
+ IsMetricsReportingPolicyManaged()) { |
+ return; |
+ } |
+ upload_list_->RequestSingleCrashUploadAsync(local_id); |
+} |
+#endif |
+ |
} // namespace |
/////////////////////////////////////////////////////////////////////////////// |