Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(449)

Side by Side Diff: chrome/browser/ui/sad_tab.cc

Issue 2261793002: Bring the feedback button to the Mac sad tab (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Trybots caught this, but not the local presubmit check. Will investigate. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "build/build_config.h" 5 #include "base/metrics/histogram_macros.h"
6 #include "chrome/browser/net/referrer.h"
7 #include "chrome/browser/ui/browser_finder.h"
8 #include "chrome/browser/ui/chrome_pages.h"
6 #include "chrome/browser/ui/sad_tab.h" 9 #include "chrome/browser/ui/sad_tab.h"
10 #include "chrome/common/url_constants.h"
11 #include "chrome/grit/generated_resources.h"
12 #include "components/feedback/feedback_util.h"
13 #include "components/strings/grit/components_strings.h"
14 #include "content/public/browser/navigation_controller.h"
15 #include "content/public/browser/web_contents.h"
16 #include "ui/base/l10n/l10n_util.h"
17
18 #if defined(OS_CHROMEOS)
19 #include "chrome/browser/memory/oom_memory_details.h"
20 #endif
21
22 namespace {
23
24 // They use the same counting approach and bucket sizes as the tab discard
25 // events in memory::OomPriorityManager so they can be directly compared.
26
27 // TODO(jamescook): Maybe track time between sad tabs?
28
29 // This macro uses a a static counter to add to the next numbered bucket each
30 // time it's hit, to keep track of how many sad tabs of a given kind users see
31 // per session. For details, see Tabs.SadTab.CrashCreated in histograms.xml.
32 #define UMA_SAD_TAB_COUNTER(NAME) \
33 { \
34 static int count = 0; \
35 ++count; \
36 UMA_HISTOGRAM_COUNTS_1000("Tabs.SadTab." NAME, count); \
37 }
38
39 // This enum backs a UMA histogram, so it should be treated as append-only.
40 enum class SadTabEvent {
41 DISPLAYED,
42 BUTTON_CLICKED,
43 HELP_LINK_CLICKED,
44 MAX_SAD_TAB_EVENT
45 };
46
47 void RecordEvent(bool feedback, SadTabEvent event) {
48 if (feedback) {
49 UMA_HISTOGRAM_ENUMERATION("Tabs.SadTab.StyleFeedback", event,
50 SadTabEvent::MAX_SAD_TAB_EVENT);
51 } else {
52 UMA_HISTOGRAM_ENUMERATION("Tabs.SadTab.StyleReload", event,
53 SadTabEvent::MAX_SAD_TAB_EVENT);
54 }
55 }
56
57 static const int kCrashesBeforeFeedbackIsDisplayed = 1;
58 static const char kCategoryTagCrash[] = "Crash";
59
60 bool ShouldWantFeedback() {
61 static int total_crashes = 0;
62 return ++total_crashes > kCrashesBeforeFeedbackIsDisplayed;
63 }
64
65 } // namespace
7 66
8 namespace chrome { 67 namespace chrome {
9 68
10 // static 69 // static
11 bool SadTab::ShouldShow(base::TerminationStatus status) { 70 bool SadTab::ShouldShow(base::TerminationStatus status) {
12 return (status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || 71 switch (status) {
13 status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED || 72 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION:
14 #if defined(OS_CHROMEOS) 73 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED:
15 status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM || 74 #if defined(OS_CHROMEOS)
16 #endif 75 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM:
17 status == base::TERMINATION_STATUS_PROCESS_CRASHED || 76 #endif
18 status == base::TERMINATION_STATUS_OOM); 77 case base::TERMINATION_STATUS_PROCESS_CRASHED:
78 case base::TERMINATION_STATUS_OOM:
79 return true;
80 case base::TERMINATION_STATUS_NORMAL_TERMINATION:
81 case base::TERMINATION_STATUS_STILL_RUNNING:
82 #if defined(OS_ANDROID)
83 case base::TERMINATION_STATUS_OOM_PROTECTED:
84 #endif
85 case base::TERMINATION_STATUS_LAUNCH_FAILED:
86 case base::TERMINATION_STATUS_MAX_ENUM:
87 return false;
88 }
89 CHECK(false);
90 }
91
92 SadTab::SadTab(content::WebContents* web_contents, SadTabKind kind)
93 : web_contents_(web_contents),
94 kind_(kind),
95 want_feedback_(ShouldWantFeedback()) {
96 switch (kind) {
97 case chrome::SAD_TAB_KIND_CRASHED:
98 UMA_SAD_TAB_COUNTER("CrashCreated");
99 break;
100 case chrome::SAD_TAB_KIND_OOM:
101 UMA_SAD_TAB_COUNTER("OomCreated");
102 break;
103 #if defined(OS_CHROMEOS)
104 case chrome::SAD_TAB_KIND_KILLED_BY_OOM:
105 UMA_SAD_TAB_COUNTER("KillCreated.OOM");
106 {
107 const std::string spec = web_contents->GetURL().GetOrigin().spec();
108 memory::OomMemoryDetails::Log(
109 "Tab OOM-Killed Memory details: " + spec + ", ", base::Closure());
110 }
111 // Fall through
112 #endif
113 case chrome::SAD_TAB_KIND_KILLED:
114 UMA_SAD_TAB_COUNTER("KillCreated");
115 break;
116 }
117 }
118
119 int SadTab::GetTitle() {
120 return IDS_SAD_TAB_TITLE;
121 }
122
123 int SadTab::GetMessage() {
124 switch (kind_) {
125 #if defined(OS_CHROMEOS)
126 case chrome::SAD_TAB_KIND_KILLED_BY_OOM:
127 return IDS_KILLED_TAB_BY_OOM_MESSAGE;
128 #endif
129 case chrome::SAD_TAB_KIND_OOM:
130 return IDS_SAD_TAB_OOM_MESSAGE;
131 case chrome::SAD_TAB_KIND_CRASHED:
132 case chrome::SAD_TAB_KIND_KILLED:
133 return IDS_SAD_TAB_MESSAGE;
134 }
135 CHECK(false);
Ilya Sherman 2016/08/30 21:06:39 nit: Both here and above: NOTREACHED(); retur
Sidney San Martín 2016/08/30 21:18:13 OK. I chose CHECK(false) because NOTREACHED() fall
136 }
137
138 int SadTab::GetButtonTitle() {
139 return want_feedback_ ? IDS_CRASHED_TAB_FEEDBACK_LINK
140 : IDS_SAD_TAB_RELOAD_LABEL;
141 }
142
143 int SadTab::GetHelpLinkTitle() {
144 return IDS_SAD_TAB_LEARN_MORE_LINK;
145 }
146
147 const char* SadTab::GetHelpLinkURL() {
148 return want_feedback_ ? chrome::kCrashReasonFeedbackDisplayedURL
149 : chrome::kCrashReasonURL;
150 }
151
152 void SadTab::RecordFirstPaint() {
153 #if DCHECK_IS_ON()
154 DLOG_ASSERT(!recorded_paint_);
155 recorded_paint_ = true;
156 #endif
157
158 switch (kind_) {
159 case chrome::SAD_TAB_KIND_CRASHED:
160 UMA_SAD_TAB_COUNTER("CrashDisplayed");
161 break;
162 case chrome::SAD_TAB_KIND_OOM:
163 UMA_SAD_TAB_COUNTER("OomDisplayed");
164 break;
165 #if defined(OS_CHROMEOS)
166 case chrome::SAD_TAB_KIND_KILLED_BY_OOM:
167 UMA_SAD_TAB_COUNTER("KillDisplayed.OOM");
168 // Fallthrough
169 #endif
170 case chrome::SAD_TAB_KIND_KILLED:
171 UMA_SAD_TAB_COUNTER("KillDisplayed");
172 break;
173 }
174
175 RecordEvent(want_feedback_, SadTabEvent::DISPLAYED);
176 }
177
178 void SadTab::PerformAction(SadTab::Action action) {
179 DLOG_ASSERT(recorded_paint_);
180 switch (action) {
181 case Action::BUTTON:
182 RecordEvent(want_feedback_, SadTabEvent::BUTTON_CLICKED);
183 if (want_feedback_) {
184 chrome::ShowFeedbackPage(
185 chrome::FindBrowserWithWebContents(web_contents_),
186 l10n_util::GetStringUTF8(kind_ == chrome::SAD_TAB_KIND_CRASHED
187 ? IDS_CRASHED_TAB_FEEDBACK_MESSAGE
188 : IDS_KILLED_TAB_FEEDBACK_MESSAGE),
189 std::string(kCategoryTagCrash));
190 } else {
191 web_contents_->GetController().Reload(true);
192 }
193 break;
194 case Action::HELP_LINK:
195 RecordEvent(want_feedback_, SadTabEvent::HELP_LINK_CLICKED);
196 content::OpenURLParams params(GURL(GetHelpLinkURL()), content::Referrer(),
197 CURRENT_TAB, ui::PAGE_TRANSITION_LINK,
198 false);
199 web_contents_->OpenURL(params);
200 break;
201 }
19 } 202 }
20 203
21 } // namespace chrome 204 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698