1 // Copyright 2015 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 "components/crash/core/browser/crashes_ui_util.h"
6
7 #include <memory>
8 #include <utility>
9 #include <vector>
10
11 #include "base/i18n/time_formatting.h"
12 #include "base/notreached.h"
13 #include "base/stl_util.h"
14 #include "base/values.h"
15 #include "components/strings/grit/components_chromium_strings.h"
16 #include "components/strings/grit/components_strings.h"
17 #include "components/upload_list/upload_list.h"
18
19 namespace crash_reporter {
20
21 const CrashesUILocalizedString kCrashesUILocalizedStrings[] = {
22 {"bugLinkText", IDS_CRASH_BUG_LINK_LABEL},
23 {"crashCaptureTimeFormat", IDS_CRASH_CAPTURE_TIME_FORMAT},
24 {"crashCountFormat", IDS_CRASH_CRASH_COUNT_BANNER_FORMAT},
25 {"crashStatus", IDS_CRASH_REPORT_STATUS},
26 {"crashStatusNotUploaded", IDS_CRASH_REPORT_STATUS_NOT_UPLOADED},
27 {"crashStatusPending", IDS_CRASH_REPORT_STATUS_PENDING},
28 {"crashStatusPendingUserRequested",
29 IDS_CRASH_REPORT_STATUS_PENDING_USER_REQUESTED},
30 {"crashStatusUploaded", IDS_CRASH_REPORT_STATUS_UPLOADED},
31 {"crashesTitle", IDS_CRASH_TITLE},
32 {"disabledHeader", IDS_CRASH_DISABLED_HEADER},
33 {"disabledMessage", IDS_CRASH_DISABLED_MESSAGE},
34 {"fileSize", IDS_CRASH_REPORT_FILE_SIZE},
35 {"localId", IDS_CRASH_REPORT_LOCAL_ID},
36 {"noCrashesMessage", IDS_CRASH_NO_CRASHES_MESSAGE},
37 {"showDeveloperDetails", IDS_CRASH_SHOW_DEVELOPER_DETAILS},
38 {"uploadCrashesLinkText", IDS_CRASH_UPLOAD_MESSAGE},
39 {"uploadId", IDS_CRASH_REPORT_UPLOADED_ID},
40 {"uploadNowLinkText", IDS_CRASH_UPLOAD_NOW_LINK_TEXT},
41 {"uploadTime", IDS_CRASH_REPORT_UPLOADED_TIME},
42 };
43
44 const size_t kCrashesUILocalizedStringsCount =
45 base::size(kCrashesUILocalizedStrings);
46
47 const char kCrashesUICrashesJS[] = "crashes.js";
48 const char kCrashesUIRequestCrashList[] = "requestCrashList";
49 const char kCrashesUIRequestCrashUpload[] = "requestCrashUpload";
50 const char kCrashesUIShortProductName[] = "shortProductName";
51 const char kCrashesUIUpdateCrashList[] = "updateCrashList";
52 const char kCrashesUIRequestSingleCrashUpload[] = "requestSingleCrashUpload";
53
UploadInfoStateAsString(UploadList::UploadInfo::State state)54 std::string UploadInfoStateAsString(UploadList::UploadInfo::State state) {
55 switch (state) {
56 case UploadList::UploadInfo::State::NotUploaded:
57 return "not_uploaded";
58 case UploadList::UploadInfo::State::Pending:
59 return "pending";
60 case UploadList::UploadInfo::State::Pending_UserRequested:
61 return "pending_user_requested";
62 case UploadList::UploadInfo::State::Uploaded:
63 return "uploaded";
64 }
65
66 NOTREACHED();
67 return "";
68 }
69
UploadListToValue(UploadList * upload_list,base::ListValue * out_value)70 void UploadListToValue(UploadList* upload_list, base::ListValue* out_value) {
71 std::vector<UploadList::UploadInfo> crashes;
72 upload_list->GetUploads(50, &crashes);
73
74 for (const auto& info : crashes) {
75 std::unique_ptr<base::DictionaryValue> crash(new base::DictionaryValue());
76 crash->SetString("id", info.upload_id);
77 if (info.state == UploadList::UploadInfo::State::Uploaded) {
78 crash->SetString("upload_time",
79 base::TimeFormatFriendlyDateAndTime(info.upload_time));
80 }
81 if (!info.capture_time.is_null()) {
82 crash->SetString("capture_time",
83 base::TimeFormatFriendlyDateAndTime(info.capture_time));
84 }
85 crash->SetString("local_id", info.local_id);
86 crash->SetString("state", UploadInfoStateAsString(info.state));
87 crash->SetString("file_size", info.file_size);
88 out_value->Append(std::move(crash));
89 }
90 }
91
92 } // namespace crash_reporter
93