| OLD | NEW |
| 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 "chrome/browser/ui/sad_tab.h" | 5 #include "chrome/browser/ui/sad_tab.h" |
| 6 | 6 |
| 7 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
| 8 #include "chrome/browser/net/referrer.h" | 8 #include "chrome/browser/net/referrer.h" |
| 9 #include "chrome/browser/ui/browser.h" |
| 9 #include "chrome/browser/ui/browser_finder.h" | 10 #include "chrome/browser/ui/browser_finder.h" |
| 11 #include "chrome/browser/ui/browser_list.h" |
| 10 #include "chrome/browser/ui/chrome_pages.h" | 12 #include "chrome/browser/ui/chrome_pages.h" |
| 13 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 11 #include "chrome/common/url_constants.h" | 14 #include "chrome/common/url_constants.h" |
| 12 #include "chrome/grit/generated_resources.h" | 15 #include "chrome/grit/generated_resources.h" |
| 13 #include "components/feedback/feedback_util.h" | 16 #include "components/feedback/feedback_util.h" |
| 14 #include "components/strings/grit/components_strings.h" | 17 #include "components/strings/grit/components_strings.h" |
| 15 #include "content/public/browser/navigation_controller.h" | 18 #include "content/public/browser/navigation_controller.h" |
| 16 #include "content/public/browser/web_contents.h" | 19 #include "content/public/browser/web_contents.h" |
| 17 #include "ui/base/l10n/l10n_util.h" | 20 #include "ui/base/l10n/l10n_util.h" |
| 18 | 21 |
| 19 #if defined(OS_CHROMEOS) | 22 #if defined(OS_CHROMEOS) |
| 20 #include "chrome/browser/memory/oom_memory_details.h" | 23 #include "chrome/browser/memory/oom_memory_details.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 #if defined(GOOGLE_CHROME_BUILD) | 64 #if defined(GOOGLE_CHROME_BUILD) |
| 62 const int kCrashesBeforeFeedbackIsDisplayed = 1; | 65 const int kCrashesBeforeFeedbackIsDisplayed = 1; |
| 63 | 66 |
| 64 static int total_crashes = 0; | 67 static int total_crashes = 0; |
| 65 return ++total_crashes > kCrashesBeforeFeedbackIsDisplayed; | 68 return ++total_crashes > kCrashesBeforeFeedbackIsDisplayed; |
| 66 #else | 69 #else |
| 67 return false; | 70 return false; |
| 68 #endif | 71 #endif |
| 69 } | 72 } |
| 70 | 73 |
| 74 bool AreOtherTabsOpen() { |
| 75 size_t tab_count = 0; |
| 76 for (auto* browser : *BrowserList::GetInstance()) |
| 77 tab_count += browser->tab_strip_model()->count(); |
| 78 return (tab_count > 1U); |
| 79 } |
| 80 |
| 71 } // namespace | 81 } // namespace |
| 72 | 82 |
| 73 namespace chrome { | 83 namespace chrome { |
| 74 | 84 |
| 75 // static | 85 // static |
| 76 bool SadTab::ShouldShow(base::TerminationStatus status) { | 86 bool SadTab::ShouldShow(base::TerminationStatus status) { |
| 77 switch (status) { | 87 switch (status) { |
| 78 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: | 88 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: |
| 79 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: | 89 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: |
| 80 #if defined(OS_CHROMEOS) | 90 #if defined(OS_CHROMEOS) |
| 81 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: | 91 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: |
| 82 #endif | 92 #endif |
| 83 case base::TERMINATION_STATUS_PROCESS_CRASHED: | 93 case base::TERMINATION_STATUS_PROCESS_CRASHED: |
| 84 case base::TERMINATION_STATUS_OOM: | 94 case base::TERMINATION_STATUS_OOM: |
| 85 return true; | 95 return true; |
| 86 case base::TERMINATION_STATUS_NORMAL_TERMINATION: | 96 case base::TERMINATION_STATUS_NORMAL_TERMINATION: |
| 87 case base::TERMINATION_STATUS_STILL_RUNNING: | 97 case base::TERMINATION_STATUS_STILL_RUNNING: |
| 88 #if defined(OS_ANDROID) | 98 #if defined(OS_ANDROID) |
| 89 case base::TERMINATION_STATUS_OOM_PROTECTED: | 99 case base::TERMINATION_STATUS_OOM_PROTECTED: |
| 90 #endif | 100 #endif |
| 91 case base::TERMINATION_STATUS_LAUNCH_FAILED: | 101 case base::TERMINATION_STATUS_LAUNCH_FAILED: |
| 92 case base::TERMINATION_STATUS_MAX_ENUM: | 102 case base::TERMINATION_STATUS_MAX_ENUM: |
| 93 return false; | 103 return false; |
| 94 } | 104 } |
| 95 NOTREACHED(); | 105 NOTREACHED(); |
| 96 return false; | 106 return false; |
| 97 } | 107 } |
| 98 | 108 |
| 99 int SadTab::GetTitle() { | 109 int SadTab::GetTitle() { |
| 100 return IDS_SAD_TAB_TITLE; | 110 if (!show_feedback_button_) |
| 111 return IDS_SAD_TAB_TITLE; |
| 112 switch (kind_) { |
| 113 #if defined(OS_CHROMEOS) |
| 114 case chrome::SAD_TAB_KIND_KILLED_BY_OOM: |
| 115 return IDS_SAD_TAB_RELOAD_TITLE; |
| 116 #endif |
| 117 case chrome::SAD_TAB_KIND_OOM: |
| 118 #if defined(OS_WIN) // Only Windows has OOM sad tab strings. |
| 119 return IDS_SAD_TAB_OOM_TITLE; |
| 120 #endif |
| 121 case chrome::SAD_TAB_KIND_CRASHED: |
| 122 case chrome::SAD_TAB_KIND_KILLED: |
| 123 return IDS_SAD_TAB_RELOAD_TITLE; |
| 124 } |
| 125 NOTREACHED(); |
| 126 return 0; |
| 101 } | 127 } |
| 102 | 128 |
| 103 int SadTab::GetMessage() { | 129 int SadTab::GetMessage() { |
| 104 switch (kind_) { | 130 switch (kind_) { |
| 105 #if defined(OS_CHROMEOS) | 131 #if defined(OS_CHROMEOS) |
| 106 case chrome::SAD_TAB_KIND_KILLED_BY_OOM: | 132 case chrome::SAD_TAB_KIND_KILLED_BY_OOM: |
| 107 return IDS_KILLED_TAB_BY_OOM_MESSAGE; | 133 return IDS_KILLED_TAB_BY_OOM_MESSAGE; |
| 108 #endif | 134 #endif |
| 109 case chrome::SAD_TAB_KIND_OOM: | 135 case chrome::SAD_TAB_KIND_OOM: |
| 110 return IDS_SAD_TAB_OOM_MESSAGE; | 136 if (show_feedback_button_) |
| 137 return AreOtherTabsOpen() ? IDS_SAD_TAB_OOM_MESSAGE_TABS |
| 138 : IDS_SAD_TAB_OOM_MESSAGE_NOTABS; |
| 139 return IDS_SAD_TAB_MESSAGE; |
| 111 case chrome::SAD_TAB_KIND_CRASHED: | 140 case chrome::SAD_TAB_KIND_CRASHED: |
| 112 case chrome::SAD_TAB_KIND_KILLED: | 141 case chrome::SAD_TAB_KIND_KILLED: |
| 113 return IDS_SAD_TAB_MESSAGE; | 142 return show_feedback_button_ ? IDS_SAD_TAB_RELOAD_TRY |
| 143 : IDS_SAD_TAB_MESSAGE; |
| 114 } | 144 } |
| 115 NOTREACHED(); | 145 NOTREACHED(); |
| 116 return 0; | 146 return 0; |
| 117 } | 147 } |
| 118 | 148 |
| 119 int SadTab::GetButtonTitle() { | 149 int SadTab::GetButtonTitle() { |
| 120 return show_feedback_button_ ? IDS_CRASHED_TAB_FEEDBACK_LINK | 150 return show_feedback_button_ ? IDS_CRASHED_TAB_FEEDBACK_LINK |
| 121 : IDS_SAD_TAB_RELOAD_LABEL; | 151 : IDS_SAD_TAB_RELOAD_LABEL; |
| 122 } | 152 } |
| 123 | 153 |
| 124 int SadTab::GetHelpLinkTitle() { | 154 int SadTab::GetHelpLinkTitle() { |
| 125 return IDS_SAD_TAB_LEARN_MORE_LINK; | 155 return IDS_SAD_TAB_LEARN_MORE_LINK; |
| 126 } | 156 } |
| 127 | 157 |
| 128 const char* SadTab::GetHelpLinkURL() { | 158 const char* SadTab::GetHelpLinkURL() { |
| 129 return show_feedback_button_ ? chrome::kCrashReasonFeedbackDisplayedURL | 159 return show_feedback_button_ ? chrome::kCrashReasonFeedbackDisplayedURL |
| 130 : chrome::kCrashReasonURL; | 160 : chrome::kCrashReasonURL; |
| 131 } | 161 } |
| 132 | 162 |
| 163 int SadTab::GetSubMessage(size_t line_id) { |
| 164 // Note: on macOS, Linux and ChromeOS, the first bullet is either one of |
| 165 // IDS_SAD_TAB_RELOAD_CLOSE_TABS or IDS_SAD_TAB_RELOAD_CLOSE_NOTABS followed |
| 166 // by one of these suggestions. |
| 167 const int kLineIds[] = {IDS_SAD_TAB_RELOAD_INCOGNITO, |
| 168 IDS_SAD_TAB_RELOAD_RESTART_BROWSER, |
| 169 IDS_SAD_TAB_RELOAD_RESTART_DEVICE}; |
| 170 |
| 171 if (!show_feedback_button_) |
| 172 return 0; |
| 173 switch (kind_) { |
| 174 #if defined(OS_CHROMEOS) |
| 175 case chrome::SAD_TAB_KIND_KILLED_BY_OOM: |
| 176 return 0; |
| 177 #endif |
| 178 case chrome::SAD_TAB_KIND_OOM: |
| 179 return 0; |
| 180 case chrome::SAD_TAB_KIND_CRASHED: |
| 181 case chrome::SAD_TAB_KIND_KILLED: |
| 182 #if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_CHROMEOS) |
| 183 if (line_id == 0) |
| 184 return AreOtherTabsOpen() ? IDS_SAD_TAB_RELOAD_CLOSE_TABS |
| 185 : IDS_SAD_TAB_RELOAD_CLOSE_NOTABS; |
| 186 line_id--; |
| 187 #endif |
| 188 if (line_id > 2) |
| 189 return 0; |
| 190 return kLineIds[line_id]; |
| 191 } |
| 192 NOTREACHED(); |
| 193 return 0; |
| 194 } |
| 195 |
| 133 void SadTab::RecordFirstPaint() { | 196 void SadTab::RecordFirstPaint() { |
| 134 DCHECK(!recorded_paint_); | 197 DCHECK(!recorded_paint_); |
| 135 recorded_paint_ = true; | 198 recorded_paint_ = true; |
| 136 | 199 |
| 137 switch (kind_) { | 200 switch (kind_) { |
| 138 case chrome::SAD_TAB_KIND_CRASHED: | 201 case chrome::SAD_TAB_KIND_CRASHED: |
| 139 UMA_SAD_TAB_COUNTER("Tabs.SadTab.CrashDisplayed"); | 202 UMA_SAD_TAB_COUNTER("Tabs.SadTab.CrashDisplayed"); |
| 140 break; | 203 break; |
| 141 case chrome::SAD_TAB_KIND_OOM: | 204 case chrome::SAD_TAB_KIND_OOM: |
| 142 UMA_SAD_TAB_COUNTER("Tabs.SadTab.OomDisplayed"); | 205 UMA_SAD_TAB_COUNTER("Tabs.SadTab.OomDisplayed"); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 // Fall through | 269 // Fall through |
| 207 case chrome::SAD_TAB_KIND_KILLED: | 270 case chrome::SAD_TAB_KIND_KILLED: |
| 208 UMA_SAD_TAB_COUNTER("Tabs.SadTab.KillCreated"); | 271 UMA_SAD_TAB_COUNTER("Tabs.SadTab.KillCreated"); |
| 209 LOG(WARNING) << "Tab Killed: " | 272 LOG(WARNING) << "Tab Killed: " |
| 210 << web_contents->GetURL().GetOrigin().spec(); | 273 << web_contents->GetURL().GetOrigin().spec(); |
| 211 break; | 274 break; |
| 212 } | 275 } |
| 213 } | 276 } |
| 214 | 277 |
| 215 } // namespace chrome | 278 } // namespace chrome |
| OLD | NEW |