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/views/sad_tab_view.h" | 5 #include "chrome/browser/ui/views/sad_tab_view.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 { \ | 57 { \ |
58 UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, buckets); \ | 58 UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, buckets); \ |
59 if (base::FieldTrialList::TrialExists(kExperiment)) \ | 59 if (base::FieldTrialList::TrialExists(kExperiment)) \ |
60 UMA_HISTOGRAM_CUSTOM_COUNTS( \ | 60 UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
61 base::FieldTrial::MakeName(name, kExperiment), \ | 61 base::FieldTrial::MakeName(name, kExperiment), \ |
62 sample, min, max, buckets); \ | 62 sample, min, max, buckets); \ |
63 } | 63 } |
64 | 64 |
65 } // namespace | 65 } // namespace |
66 | 66 |
67 SadTabView::SadTabView(WebContents* web_contents, Kind kind) | 67 SadTabView::SadTabView(WebContents* web_contents, chrome::SadTabKind kind) |
68 : web_contents_(web_contents), | 68 : web_contents_(web_contents), |
69 kind_(kind), | 69 kind_(kind), |
70 painted_(false), | 70 painted_(false), |
71 base_font_(ui::ResourceBundle::GetSharedInstance().GetFont( | 71 base_font_(ui::ResourceBundle::GetSharedInstance().GetFont( |
72 ui::ResourceBundle::BaseFont)), | 72 ui::ResourceBundle::BaseFont)), |
73 message_(NULL), | 73 message_(NULL), |
74 help_link_(NULL), | 74 help_link_(NULL), |
75 feedback_link_(NULL), | 75 feedback_link_(NULL), |
76 reload_button_(NULL) { | 76 reload_button_(NULL) { |
77 DCHECK(web_contents); | 77 DCHECK(web_contents); |
78 | 78 |
79 // Sometimes the user will never see this tab, so keep track of the total | 79 // Sometimes the user will never see this tab, so keep track of the total |
80 // number of creation events to compare to display events. | 80 // number of creation events to compare to display events. |
81 // TODO(jamescook): Remove this after R20 stable. Keep it for now so we can | 81 // TODO(jamescook): Remove this after R20 stable. Keep it for now so we can |
82 // compare R20 to earlier versions. | 82 // compare R20 to earlier versions. |
83 UMA_HISTOGRAM_COUNTS("SadTab.Created", kind_); | 83 UMA_HISTOGRAM_COUNTS("SadTab.Created", kind_); |
84 | 84 |
85 // These stats should use the same counting approach and bucket size used for | 85 // These stats should use the same counting approach and bucket size used for |
86 // tab discard events in chrome/browser/oom_priority_manager.cc so they can be | 86 // tab discard events in chrome/browser/oom_priority_manager.cc so they can be |
87 // directly compared. | 87 // directly compared. |
88 // TODO(jamescook): Maybe track time between sad tabs? | 88 // TODO(jamescook): Maybe track time between sad tabs? |
89 switch (kind_) { | 89 switch (kind_) { |
90 case CRASHED: { | 90 case chrome::SAD_TAB_KIND_CRASHED: { |
91 static int crashed = 0; | 91 static int crashed = 0; |
92 crashed++; | 92 crashed++; |
93 EXPERIMENT_CUSTOM_COUNTS( | 93 EXPERIMENT_CUSTOM_COUNTS( |
94 "Tabs.SadTab.CrashCreated", crashed, 1, 1000, 50); | 94 "Tabs.SadTab.CrashCreated", crashed, 1, 1000, 50); |
95 break; | 95 break; |
96 } | 96 } |
97 case KILLED: { | 97 case chrome::SAD_TAB_KIND_KILLED: { |
98 static int killed = 0; | 98 static int killed = 0; |
99 killed++; | 99 killed++; |
100 EXPERIMENT_CUSTOM_COUNTS( | 100 EXPERIMENT_CUSTOM_COUNTS( |
101 "Tabs.SadTab.KillCreated", killed, 1, 1000, 50); | 101 "Tabs.SadTab.KillCreated", killed, 1, 1000, 50); |
102 break; | 102 break; |
103 } | 103 } |
104 default: | 104 default: |
105 NOTREACHED(); | 105 NOTREACHED(); |
106 } | 106 } |
107 | 107 |
108 // Set the background color. | 108 // Set the background color. |
109 set_background(views::Background::CreateSolidBackground( | 109 set_background(views::Background::CreateSolidBackground( |
110 (kind_ == CRASHED) ? kCrashColor : kKillColor)); | 110 (kind_ == chrome::SAD_TAB_KIND_CRASHED) ? kCrashColor : kKillColor)); |
111 } | 111 } |
112 | 112 |
113 SadTabView::~SadTabView() {} | 113 SadTabView::~SadTabView() {} |
114 | 114 |
115 void SadTabView::LinkClicked(views::Link* source, int event_flags) { | 115 void SadTabView::LinkClicked(views::Link* source, int event_flags) { |
116 DCHECK(web_contents_); | 116 DCHECK(web_contents_); |
117 if (source == help_link_) { | 117 if (source == help_link_) { |
118 GURL help_url( | 118 GURL help_url((kind_ == chrome::SAD_TAB_KIND_CRASHED) ? |
119 kind_ == CRASHED ? chrome::kCrashReasonURL : chrome::kKillReasonURL); | 119 chrome::kCrashReasonURL : chrome::kKillReasonURL); |
120 OpenURLParams params( | 120 OpenURLParams params( |
121 help_url, content::Referrer(), CURRENT_TAB, | 121 help_url, content::Referrer(), CURRENT_TAB, |
122 content::PAGE_TRANSITION_LINK, false); | 122 content::PAGE_TRANSITION_LINK, false); |
123 web_contents_->OpenURL(params); | 123 web_contents_->OpenURL(params); |
124 } else if (source == feedback_link_) { | 124 } else if (source == feedback_link_) { |
125 browser::ShowWebFeedbackView( | 125 browser::ShowWebFeedbackView( |
126 browser::FindBrowserWithWebContents(web_contents_), | 126 browser::FindBrowserWithWebContents(web_contents_), |
127 l10n_util::GetStringUTF8(IDS_KILLED_TAB_FEEDBACK_MESSAGE), | 127 l10n_util::GetStringUTF8(IDS_KILLED_TAB_FEEDBACK_MESSAGE), |
128 std::string(kCategoryTagCrash)); | 128 std::string(kCategoryTagCrash)); |
129 } | 129 } |
(...skipping 23 matching lines...) Expand all Loading... |
153 | 153 |
154 const int column_set_id = 0; | 154 const int column_set_id = 0; |
155 views::ColumnSet* columns = layout->AddColumnSet(column_set_id); | 155 views::ColumnSet* columns = layout->AddColumnSet(column_set_id); |
156 columns->AddPaddingColumn(1, kPadding); | 156 columns->AddPaddingColumn(1, kPadding); |
157 columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, | 157 columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, |
158 0, views::GridLayout::USE_PREF, 0, 0); | 158 0, views::GridLayout::USE_PREF, 0, 0); |
159 columns->AddPaddingColumn(1, kPadding); | 159 columns->AddPaddingColumn(1, kPadding); |
160 | 160 |
161 views::ImageView* image = new views::ImageView(); | 161 views::ImageView* image = new views::ImageView(); |
162 image->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( | 162 image->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
163 (kind_ == CRASHED) ? IDR_SAD_TAB : IDR_KILLED_TAB)); | 163 (kind_ == chrome::SAD_TAB_KIND_CRASHED) ? IDR_SAD_TAB : IDR_KILLED_TAB)); |
164 layout->StartRowWithPadding(0, column_set_id, 1, kPadding); | 164 layout->StartRowWithPadding(0, column_set_id, 1, kPadding); |
165 layout->AddView(image); | 165 layout->AddView(image); |
166 | 166 |
167 views::Label* title = CreateLabel(l10n_util::GetStringUTF16( | 167 views::Label* title = CreateLabel(l10n_util::GetStringUTF16( |
168 (kind_ == CRASHED) ? IDS_SAD_TAB_TITLE : IDS_KILLED_TAB_TITLE)); | 168 (kind_ == chrome::SAD_TAB_KIND_CRASHED) ? |
| 169 IDS_SAD_TAB_TITLE : IDS_KILLED_TAB_TITLE)); |
169 title->SetFont(base_font_.DeriveFont(kTitleFontSizeDelta, gfx::Font::BOLD)); | 170 title->SetFont(base_font_.DeriveFont(kTitleFontSizeDelta, gfx::Font::BOLD)); |
170 layout->StartRowWithPadding(0, column_set_id, 0, kPadding); | 171 layout->StartRowWithPadding(0, column_set_id, 0, kPadding); |
171 layout->AddView(title); | 172 layout->AddView(title); |
172 | 173 |
173 message_ = CreateLabel(l10n_util::GetStringUTF16( | 174 message_ = CreateLabel(l10n_util::GetStringUTF16( |
174 (kind_ == CRASHED) ? IDS_SAD_TAB_MESSAGE : IDS_KILLED_TAB_MESSAGE)); | 175 (kind_ == chrome::SAD_TAB_KIND_CRASHED) ? |
| 176 IDS_SAD_TAB_MESSAGE : IDS_KILLED_TAB_MESSAGE)); |
175 message_->SetMultiLine(true); | 177 message_->SetMultiLine(true); |
176 layout->StartRowWithPadding(0, column_set_id, 0, kPadding); | 178 layout->StartRowWithPadding(0, column_set_id, 0, kPadding); |
177 layout->AddView(message_); | 179 layout->AddView(message_); |
178 | 180 |
179 if (web_contents_) { | 181 if (web_contents_) { |
180 layout->StartRowWithPadding(0, column_set_id, 0, kPadding); | 182 layout->StartRowWithPadding(0, column_set_id, 0, kPadding); |
181 reload_button_ = new views::TextButton( | 183 reload_button_ = new views::TextButton( |
182 this, | 184 this, |
183 l10n_util::GetStringUTF16(IDS_SAD_TAB_RELOAD_LABEL)); | 185 l10n_util::GetStringUTF16(IDS_SAD_TAB_RELOAD_LABEL)); |
184 reload_button_->set_border(new views::TextButtonNativeThemeBorder( | 186 reload_button_->set_border(new views::TextButtonNativeThemeBorder( |
185 reload_button_)); | 187 reload_button_)); |
186 layout->AddView(reload_button_); | 188 layout->AddView(reload_button_); |
187 | 189 |
188 help_link_ = CreateLink(l10n_util::GetStringUTF16( | 190 help_link_ = CreateLink(l10n_util::GetStringUTF16( |
189 (kind_ == CRASHED) ? IDS_SAD_TAB_HELP_LINK : IDS_LEARN_MORE)); | 191 (kind_ == chrome::SAD_TAB_KIND_CRASHED) ? |
| 192 IDS_SAD_TAB_HELP_LINK : IDS_LEARN_MORE)); |
190 | 193 |
191 if (kind_ == CRASHED) { | 194 if (kind_ == chrome::SAD_TAB_KIND_CRASHED) { |
192 size_t offset = 0; | 195 size_t offset = 0; |
193 string16 help_text(l10n_util::GetStringFUTF16(IDS_SAD_TAB_HELP_MESSAGE, | 196 string16 help_text(l10n_util::GetStringFUTF16(IDS_SAD_TAB_HELP_MESSAGE, |
194 string16(), &offset)); | 197 string16(), &offset)); |
195 views::Label* help_prefix = CreateLabel(help_text.substr(0, offset)); | 198 views::Label* help_prefix = CreateLabel(help_text.substr(0, offset)); |
196 views::Label* help_suffix = CreateLabel(help_text.substr(offset)); | 199 views::Label* help_suffix = CreateLabel(help_text.substr(offset)); |
197 | 200 |
198 const int help_column_set_id = 1; | 201 const int help_column_set_id = 1; |
199 views::ColumnSet* help_columns = layout->AddColumnSet(help_column_set_id); | 202 views::ColumnSet* help_columns = layout->AddColumnSet(help_column_set_id); |
200 help_columns->AddPaddingColumn(1, kPadding); | 203 help_columns->AddPaddingColumn(1, kPadding); |
201 // Center three middle columns for the help's [prefix][link][suffix]. | 204 // Center three middle columns for the help's [prefix][link][suffix]. |
(...skipping 23 matching lines...) Expand all Loading... |
225 if (!painted_) { | 228 if (!painted_) { |
226 // User actually saw the error, keep track for user experience stats. | 229 // User actually saw the error, keep track for user experience stats. |
227 // TODO(jamescook): Remove this after R20 stable. Keep it for now so we can | 230 // TODO(jamescook): Remove this after R20 stable. Keep it for now so we can |
228 // compare R20 to earlier versions. | 231 // compare R20 to earlier versions. |
229 UMA_HISTOGRAM_COUNTS("SadTab.Displayed", kind_); | 232 UMA_HISTOGRAM_COUNTS("SadTab.Displayed", kind_); |
230 | 233 |
231 // These stats should use the same counting approach and bucket size used | 234 // These stats should use the same counting approach and bucket size used |
232 // for tab discard events in chrome/browser/oom_priority_manager.cc so they | 235 // for tab discard events in chrome/browser/oom_priority_manager.cc so they |
233 // can be directly compared. | 236 // can be directly compared. |
234 switch (kind_) { | 237 switch (kind_) { |
235 case CRASHED: { | 238 case chrome::SAD_TAB_KIND_CRASHED: { |
236 static int crashed = 0; | 239 static int crashed = 0; |
237 UMA_HISTOGRAM_CUSTOM_COUNTS( | 240 UMA_HISTOGRAM_CUSTOM_COUNTS( |
238 "Tabs.SadTab.CrashDisplayed", ++crashed, 1, 1000, 50); | 241 "Tabs.SadTab.CrashDisplayed", ++crashed, 1, 1000, 50); |
239 break; | 242 break; |
240 } | 243 } |
241 case KILLED: { | 244 case chrome::SAD_TAB_KIND_KILLED: { |
242 static int killed = 0; | 245 static int killed = 0; |
243 UMA_HISTOGRAM_CUSTOM_COUNTS( | 246 UMA_HISTOGRAM_CUSTOM_COUNTS( |
244 "Tabs.SadTab.KillDisplayed", ++killed, 1, 1000, 50); | 247 "Tabs.SadTab.KillDisplayed", ++killed, 1, 1000, 50); |
245 break; | 248 break; |
246 } | 249 } |
247 default: | 250 default: |
248 NOTREACHED(); | 251 NOTREACHED(); |
249 } | 252 } |
250 painted_ = true; | 253 painted_ = true; |
251 } | 254 } |
252 View::OnPaint(canvas); | 255 View::OnPaint(canvas); |
253 } | 256 } |
254 | 257 |
255 views::Label* SadTabView::CreateLabel(const string16& text) { | 258 views::Label* SadTabView::CreateLabel(const string16& text) { |
256 views::Label* label = new views::Label(text); | 259 views::Label* label = new views::Label(text); |
257 label->SetFont(base_font_.DeriveFont(kMessageFontSizeDelta)); | 260 label->SetFont(base_font_.DeriveFont(kMessageFontSizeDelta)); |
258 label->SetBackgroundColor(background()->get_color()); | 261 label->SetBackgroundColor(background()->get_color()); |
259 label->SetEnabledColor(kTextColor); | 262 label->SetEnabledColor(kTextColor); |
260 return label; | 263 return label; |
261 } | 264 } |
262 | 265 |
263 views::Link* SadTabView::CreateLink(const string16& text) { | 266 views::Link* SadTabView::CreateLink(const string16& text) { |
264 views::Link* link = new views::Link(text); | 267 views::Link* link = new views::Link(text); |
265 link->SetFont(base_font_.DeriveFont(kMessageFontSizeDelta)); | 268 link->SetFont(base_font_.DeriveFont(kMessageFontSizeDelta)); |
266 link->SetBackgroundColor(background()->get_color()); | 269 link->SetBackgroundColor(background()->get_color()); |
267 link->SetEnabledColor(kTextColor); | 270 link->SetEnabledColor(kTextColor); |
268 link->set_listener(this); | 271 link->set_listener(this); |
269 return link; | 272 return link; |
270 } | 273 } |
OLD | NEW |