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