summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/generated_resources.grd10
-rw-r--r--chrome/app/theme/killtab.pngbin0 -> 351 bytes
-rw-r--r--chrome/app/theme/theme_resources.grd1
-rw-r--r--chrome/browser/browser_about_handler.cc3
-rw-r--r--chrome/browser/browser_about_handler_unittest.cc6
-rw-r--r--chrome/browser/dom_ui/dom_ui_factory.cc3
-rw-r--r--chrome/browser/gtk/sad_tab_gtk.cc40
-rw-r--r--chrome/browser/gtk/sad_tab_gtk.h8
-rw-r--r--chrome/browser/renderer_host/site_instance.cc1
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc2
-rw-r--r--chrome/browser/tab_contents/tab_contents_view.h3
-rw-r--r--chrome/browser/tab_contents/tab_contents_view_gtk.cc8
-rw-r--r--chrome/browser/tab_contents/tab_contents_view_gtk.h3
-rw-r--r--chrome/browser/tab_contents/tab_contents_view_mac.h3
-rw-r--r--chrome/browser/tab_contents/tab_contents_view_mac.mm3
-rw-r--r--chrome/browser/ui/browser.cc10
-rw-r--r--chrome/browser/ui/views/sad_tab_view.cc40
-rw-r--r--chrome/browser/ui/views/sad_tab_view.h11
-rw-r--r--chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.cc10
-rw-r--r--chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.h3
-rw-r--r--chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc8
-rw-r--r--chrome/browser/ui/views/tab_contents/tab_contents_view_views.h9
-rw-r--r--chrome/browser/ui/views/tab_contents/tab_contents_view_win.cc10
-rw-r--r--chrome/browser/ui/views/tab_contents/tab_contents_view_win.h3
-rw-r--r--chrome/common/about_handler.cc1
-rw-r--r--chrome/common/chrome_switches.cc3
-rw-r--r--chrome/common/chrome_switches.h1
-rw-r--r--chrome/common/url_constants.cc10
-rw-r--r--chrome/common/url_constants.h4
-rw-r--r--chrome/renderer/about_handler.cc7
-rw-r--r--chrome/renderer/about_handler.h3
31 files changed, 179 insertions, 48 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index a6dc68a..561251a 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -6746,6 +6746,16 @@ Keep your key file in a safe place. You will need it to create new versions of y
Something went wrong while displaying this webpage. To continue, press Reload or go to another page.
</message>
+ <!-- Killed Tab Strings -->
+ <!-- TODO(gspencer): These are temporary values until real
+ values are supplied by UI team. See http://crosbug.com/10711 -->
+ <message name="IDS_KILLED_TAB_TITLE" desc="The title of the killed tab page that is shown when a tab is killed by the OS. This is intended to be a humorous exclamation of dismay.">
+ He's Dead, Jim!
+ </message>
+ <message name="IDS_KILLED_TAB_MESSAGE" desc="The message displayed on the killed tab page.">
+ Something caused this webpage to be killed, either because the operating system ran out of memory, or for some other reason. To continue, press Reload or go to another page.
+ </message>
+
<!-- Incognito -->
<message name="IDS_OFF_THE_RECORD_TOOLTIP" desc="The tooltip for the incognito icon.">
You have opened an incognito window. Pages that you open in this window won't appear in your history.
diff --git a/chrome/app/theme/killtab.png b/chrome/app/theme/killtab.png
new file mode 100644
index 0000000..d9a6eb8
--- /dev/null
+++ b/chrome/app/theme/killtab.png
Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index 41346d8..8c44540 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -289,6 +289,7 @@
<include name="IDR_RESTORE_BUTTON_MASK" file="restore_button_mask.png" type="BINDATA" />
<include name="IDR_SAD_FAVICON" file="sadfavicon.png" type="BINDATA" />
<include name="IDR_SAD_TAB" file="sadtab.png" type="BINDATA" />
+ <include name="IDR_KILLED_TAB" file="killtab.png" type="BINDATA" />
<include name="IDR_SEARCH_ENGINE_DIALOG_TOP" file="search_engine_top.png" type="BINDATA" />
<if expr="pp_ifdef('_google_chrome')">
<include name="IDR_SEARCH_ENGINE_LOGO_ABCSOK" file="google_chrome/search_abcsok.png" type="BINDATA" />
diff --git a/chrome/browser/browser_about_handler.cc b/chrome/browser/browser_about_handler.cc
index af8b8e0..775f700 100644
--- a/chrome/browser/browser_about_handler.cc
+++ b/chrome/browser/browser_about_handler.cc
@@ -289,7 +289,8 @@ std::string AboutAbout() {
html.append(kAllAboutPaths[i]);
html.append("</a>\n");
}
- const char *debug[] = { "crash", "hang", "shorthang", "gpucrash", "gpuhang" };
+ const char *debug[] = { "crash", "kill", "hang", "shorthang",
+ "gpucrash", "gpuhang" };
html.append("</ul><h2>For Debug</h2>");
html.append("</ul><p>The following pages are for debugging purposes only. "
"Because they crash or hang the renderer, they're not linked "
diff --git a/chrome/browser/browser_about_handler_unittest.cc b/chrome/browser/browser_about_handler_unittest.cc
index 9b234a2..6b3bd40 100644
--- a/chrome/browser/browser_about_handler_unittest.cc
+++ b/chrome/browser/browser_about_handler_unittest.cc
@@ -66,6 +66,12 @@ TEST(BrowserAboutHandlerTest, WillHandleBrowserAboutURL) {
false
},
{
+ GURL(chrome::kAboutKillURL),
+ GURL(chrome::kAboutKillURL),
+ true,
+ false
+ },
+ {
GURL(chrome::kAboutHangURL),
GURL(chrome::kAboutHangURL),
true,
diff --git a/chrome/browser/dom_ui/dom_ui_factory.cc b/chrome/browser/dom_ui/dom_ui_factory.cc
index 3ef5f5b..69081da 100644
--- a/chrome/browser/dom_ui/dom_ui_factory.cc
+++ b/chrome/browser/dom_ui/dom_ui_factory.cc
@@ -251,8 +251,9 @@ bool DOMUIFactory::IsURLAcceptableForDOMUI(Profile* profile, const GURL& url) {
// It's possible to load about:blank in a DOM UI renderer.
// See http://crbug.com/42547
url.spec() == chrome::kAboutBlankURL ||
- // about:crash, about:hang, and about:shorthang are allowed.
+ // about:crash, about:kill, about:hang, and about:shorthang are allowed.
url.spec() == chrome::kAboutCrashURL ||
+ url.spec() == chrome::kAboutKillURL ||
url.spec() == chrome::kAboutHangURL ||
url.spec() == chrome::kAboutShorthangURL;
}
diff --git a/chrome/browser/gtk/sad_tab_gtk.cc b/chrome/browser/gtk/sad_tab_gtk.cc
index 80612f7..aeae7d8 100644
--- a/chrome/browser/gtk/sad_tab_gtk.cc
+++ b/chrome/browser/gtk/sad_tab_gtk.cc
@@ -19,8 +19,13 @@
namespace {
-// Background color of the content (a grayish blue).
-const GdkColor kBackgroundColor = GDK_COLOR_RGB(35, 48, 64);
+// Background color of the content (a grayish blue) for a crashed tab.
+const GdkColor kCrashedBackgroundColor = GDK_COLOR_RGB(35, 48, 64);
+
+// Background color of the content (a grayish purple) for a killed
+// tab. TODO(gspencer): update this for the "real" color when the UI
+// team provides one. See http://crosbug.com/10711
+const GdkColor kKilledBackgroundColor = GDK_COLOR_RGB(57, 48, 88);
// Construct a centered GtkLabel with a white foreground.
// |format| is a printf-style format containing a %s;
@@ -44,13 +49,17 @@ GtkWidget* MakeWhiteMarkupLabel(const char* format, const std::string& str) {
} // namespace
-SadTabGtk::SadTabGtk(TabContents* tab_contents)
- : tab_contents_(tab_contents) {
+SadTabGtk::SadTabGtk(TabContents* tab_contents, Kind kind)
+ : tab_contents_(tab_contents),
+ kind_(kind) {
DCHECK(tab_contents_);
// Use an event box to get the background painting correctly.
event_box_.Own(gtk_event_box_new());
- gtk_widget_modify_bg(event_box_.get(), GTK_STATE_NORMAL, &kBackgroundColor);
+ gtk_widget_modify_bg(event_box_.get(), GTK_STATE_NORMAL,
+ kind == CRASHED ?
+ &kCrashedBackgroundColor :
+ &kKilledBackgroundColor);
// Allow ourselves to be resized arbitrarily small.
gtk_widget_set_size_request(event_box_.get(), 0, 0);
@@ -63,7 +72,9 @@ SadTabGtk::SadTabGtk(TabContents* tab_contents)
// Add center-aligned image.
GtkWidget* image = gtk_image_new_from_pixbuf(
- ResourceBundle::GetSharedInstance().GetPixbufNamed(IDR_SAD_TAB));
+ ResourceBundle::GetSharedInstance().GetPixbufNamed(kind == CRASHED ?
+ IDR_SAD_TAB :
+ IDR_KILLED_TAB));
gtk_misc_set_alignment(GTK_MISC(image), 0.5, 0.5);
gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 0);
@@ -75,7 +86,9 @@ SadTabGtk::SadTabGtk(TabContents* tab_contents)
// Add center-aligned title.
GtkWidget* title = MakeWhiteMarkupLabel(
"<span size=\"larger\" style=\"normal\"><b>%s</b></span>",
- l10n_util::GetStringUTF8(IDS_SAD_TAB_TITLE));
+ l10n_util::GetStringUTF8(kind == CRASHED ?
+ IDS_SAD_TAB_TITLE :
+ IDS_KILLED_TAB_TITLE));
gtk_box_pack_start(GTK_BOX(vbox), title, FALSE, FALSE, 0);
// Add spacer between title and message.
@@ -83,9 +96,11 @@ SadTabGtk::SadTabGtk(TabContents* tab_contents)
gtk_box_pack_start(GTK_BOX(vbox), spacer, FALSE, FALSE, 0);
// Add center-aligned message.
- GtkWidget* message =
- MakeWhiteMarkupLabel("<span style=\"normal\">%s</span>",
- l10n_util::GetStringUTF8(IDS_SAD_TAB_MESSAGE));
+ GtkWidget* message = MakeWhiteMarkupLabel(
+ "<span style=\"normal\">%s</span>",
+ l10n_util::GetStringUTF8(kind == CRASHED ?
+ IDS_SAD_TAB_MESSAGE :
+ IDS_KILLED_TAB_MESSAGE));
gtk_label_set_line_wrap(GTK_LABEL(message), TRUE);
gtk_box_pack_start(GTK_BOX(vbox), message, FALSE, FALSE, 0);
@@ -115,7 +130,10 @@ SadTabGtk::~SadTabGtk() {
void SadTabGtk::OnLinkButtonClick(GtkWidget* sender) {
if (tab_contents_ != NULL) {
GURL help_url =
- google_util::AppendGoogleLocaleParam(GURL(chrome::kCrashReasonURL));
+ google_util::AppendGoogleLocaleParam(GURL(
+ kind_ == CRASHED ?
+ chrome::kCrashReasonURL :
+ chrome::kKillReasonURL));
tab_contents_->OpenURL(help_url, GURL(), CURRENT_TAB, PageTransition::LINK);
}
}
diff --git a/chrome/browser/gtk/sad_tab_gtk.h b/chrome/browser/gtk/sad_tab_gtk.h
index 9c5489b..dafc835 100644
--- a/chrome/browser/gtk/sad_tab_gtk.h
+++ b/chrome/browser/gtk/sad_tab_gtk.h
@@ -15,7 +15,12 @@ class TabContents;
class SadTabGtk {
public:
- explicit SadTabGtk(TabContents* tab_contents);
+ enum Kind {
+ CRASHED, // The tab crashed. Display the "Aw, Snap!" page.
+ KILLED // The tab was killed. Display the killed tab page.
+ };
+
+ explicit SadTabGtk(TabContents* tab_contents, Kind kind);
virtual ~SadTabGtk();
GtkWidget* widget() const { return event_box_.get(); }
@@ -27,6 +32,7 @@ class SadTabGtk {
TabContents* tab_contents_;
OwnedWidgetGtk event_box_;
+ Kind kind_;
DISALLOW_COPY_AND_ASSIGN(SadTabGtk);
};
diff --git a/chrome/browser/renderer_host/site_instance.cc b/chrome/browser/renderer_host/site_instance.cc
index 31f20f5..8850c86 100644
--- a/chrome/browser/renderer_host/site_instance.cc
+++ b/chrome/browser/renderer_host/site_instance.cc
@@ -19,6 +19,7 @@ static bool IsURLSameAsAnySiteInstance(const GURL& url) {
return false;
return url.SchemeIs(chrome::kJavaScriptScheme) ||
url.spec() == chrome::kAboutCrashURL ||
+ url.spec() == chrome::kAboutKillURL ||
url.spec() == chrome::kAboutHangURL ||
url.spec() == chrome::kAboutShorthangURL;
}
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index 4701265..b73ef97 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -2544,7 +2544,7 @@ void TabContents::RenderViewGone(RenderViewHost* rvh,
// objects that are not in a browser (e.g., HTML dialogs) and thus are
// visible do not flash a sad tab page.
if (browser_shutdown::GetShutdownType() == browser_shutdown::NOT_VALID)
- view_->OnTabCrashed();
+ view_->OnTabCrashed(status, error_code);
// Hide any visible hung renderer warning for this web contents' process.
hung_renderer_dialog::HideForTabContents(this);
diff --git a/chrome/browser/tab_contents/tab_contents_view.h b/chrome/browser/tab_contents/tab_contents_view.h
index c6b9a61..ac37312 100644
--- a/chrome/browser/tab_contents/tab_contents_view.h
+++ b/chrome/browser/tab_contents/tab_contents_view.h
@@ -80,7 +80,8 @@ class TabContentsView : public RenderViewHostDelegate::View {
// Used to notify the view that a tab has crashed so each platform can
// prepare the sad tab.
- virtual void OnTabCrashed() = 0;
+ virtual void OnTabCrashed(base::TerminationStatus status,
+ int error_code) = 0;
// TODO(brettw) this is a hack. It's used in two places at the time of this
// writing: (1) when render view hosts switch, we need to size the replaced
diff --git a/chrome/browser/tab_contents/tab_contents_view_gtk.cc b/chrome/browser/tab_contents/tab_contents_view_gtk.cc
index dbd2797..4563251 100644
--- a/chrome/browser/tab_contents/tab_contents_view_gtk.cc
+++ b/chrome/browser/tab_contents/tab_contents_view_gtk.cc
@@ -203,9 +203,13 @@ void TabContentsViewGtk::SetPageTitle(const std::wstring& title) {
gdk_window_set_title(content_view->window, WideToUTF8(title).c_str());
}
-void TabContentsViewGtk::OnTabCrashed() {
+void TabContentsViewGtk::OnTabCrashed(base::TerminationStatus status,
+ int error_code) {
if (tab_contents() != NULL && !sad_tab_.get()) {
- sad_tab_.reset(new SadTabGtk(tab_contents()));
+ sad_tab_.reset(new SadTabGtk(
+ tab_contents(),
+ status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED ?
+ SadTabGtk::KILLED : SadTabGtk::CRASHED));
InsertIntoContentArea(sad_tab_->widget());
gtk_widget_show(sad_tab_->widget());
}
diff --git a/chrome/browser/tab_contents/tab_contents_view_gtk.h b/chrome/browser/tab_contents/tab_contents_view_gtk.h
index 9a016a1..b7f218b 100644
--- a/chrome/browser/tab_contents/tab_contents_view_gtk.h
+++ b/chrome/browser/tab_contents/tab_contents_view_gtk.h
@@ -53,7 +53,8 @@ class TabContentsViewGtk : public TabContentsView,
virtual gfx::NativeWindow GetTopLevelNativeWindow() const;
virtual void GetContainerBounds(gfx::Rect* out) const;
virtual void SetPageTitle(const std::wstring& title);
- virtual void OnTabCrashed();
+ virtual void OnTabCrashed(base::TerminationStatus status,
+ int error_code);
virtual void SizeContents(const gfx::Size& size);
virtual void Focus();
virtual void SetInitialFocus();
diff --git a/chrome/browser/tab_contents/tab_contents_view_mac.h b/chrome/browser/tab_contents/tab_contents_view_mac.h
index 1aab6b84..e1aec6b 100644
--- a/chrome/browser/tab_contents/tab_contents_view_mac.h
+++ b/chrome/browser/tab_contents/tab_contents_view_mac.h
@@ -60,7 +60,8 @@ class TabContentsViewMac : public TabContentsView,
virtual void GetContainerBounds(gfx::Rect* out) const;
virtual void RenderViewCreated(RenderViewHost* host);
virtual void SetPageTitle(const std::wstring& title);
- virtual void OnTabCrashed();
+ virtual void OnTabCrashed(base::TerminationStatus status,
+ int error_code);
virtual void SizeContents(const gfx::Size& size);
virtual void Focus();
virtual void SetInitialFocus();
diff --git a/chrome/browser/tab_contents/tab_contents_view_mac.mm b/chrome/browser/tab_contents/tab_contents_view_mac.mm
index 8d810dd..61cf26b 100644
--- a/chrome/browser/tab_contents/tab_contents_view_mac.mm
+++ b/chrome/browser/tab_contents/tab_contents_view_mac.mm
@@ -175,7 +175,8 @@ void TabContentsViewMac::SetPageTitle(const std::wstring& title) {
// Meaningless on the Mac; widgets don't have a "title" attribute
}
-void TabContentsViewMac::OnTabCrashed() {
+void TabContentsViewMac::OnTabCrashed(base::TerminationStatus /* status */,
+ int /* error_code */) {
if (!sad_tab_.get()) {
TabContents* contents = tab_contents();
DCHECK(contents);
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 3ba24b0..8334180 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -2626,6 +2626,16 @@ void Browser::TabSelectedAt(TabContentsWrapper* old_contents,
bool user_gesture) {
DCHECK(old_contents != new_contents);
+ // On some platforms we want to automatically reload tabs that are
+ // killed when the user selects them.
+ if (user_gesture && new_contents->tab_contents()->crashed_status() ==
+ base::TERMINATION_STATUS_PROCESS_WAS_KILLED) {
+ const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
+ if (parsed_command_line.HasSwitch(switches::kReloadKilledTabs))
+ Reload(CURRENT_TAB);
+ return;
+ }
+
// If we have any update pending, do it now.
if (!chrome_updater_factory_.empty() && old_contents)
ProcessPendingUIUpdates();
diff --git a/chrome/browser/ui/views/sad_tab_view.cc b/chrome/browser/ui/views/sad_tab_view.cc
index 62bbfd0..f0f4639 100644
--- a/chrome/browser/ui/views/sad_tab_view.cc
+++ b/chrome/browser/ui/views/sad_tab_view.cc
@@ -28,8 +28,12 @@ static const float kMessageSize = 0.65f;
static const SkColor kTitleColor = SK_ColorWHITE;
static const SkColor kMessageColor = SK_ColorWHITE;
static const SkColor kLinkColor = SK_ColorWHITE;
-static const SkColor kBackgroundColor = SkColorSetRGB(35, 48, 64);
-static const SkColor kBackgroundEndColor = SkColorSetRGB(35, 48, 64);
+static const SkColor kCrashBackgroundColor = SkColorSetRGB(35, 48, 64);
+static const SkColor kCrashBackgroundEndColor = SkColorSetRGB(35, 48, 64);
+// TODO(gspencer): update these colors when the UI team has picked
+// official versions. See http://crosbug.com/10711.
+static const SkColor kKillBackgroundColor = SkColorSetRGB(57, 48, 88);
+static const SkColor kKillBackgroundEndColor = SkColorSetRGB(57, 48, 88);
// Font size correction.
#if defined(CROS_FONTS_USING_BCI)
@@ -48,12 +52,13 @@ std::wstring SadTabView::title_;
std::wstring SadTabView::message_;
int SadTabView::title_width_;
-SadTabView::SadTabView(TabContents* tab_contents)
+SadTabView::SadTabView(TabContents* tab_contents, Kind kind)
: tab_contents_(tab_contents),
- learn_more_link_(NULL) {
+ learn_more_link_(NULL),
+ kind_(kind) {
DCHECK(tab_contents);
- InitClass();
+ InitClass(kind);
if (tab_contents != NULL) {
learn_more_link_ =
@@ -67,9 +72,13 @@ SadTabView::SadTabView(TabContents* tab_contents)
void SadTabView::Paint(gfx::Canvas* canvas) {
SkPaint paint;
- SkSafeUnref(paint.setShader(gfx::CreateGradientShader(0, height(),
- kBackgroundColor,
- kBackgroundEndColor)));
+ SkSafeUnref(paint.setShader(
+ gfx::CreateGradientShader(
+ 0,
+ height(),
+ kind_ == CRASHED ? kCrashBackgroundColor : kKillBackgroundColor,
+ kind_ == CRASHED ?
+ kCrashBackgroundEndColor : kKillBackgroundEndColor)));
paint.setStyle(SkPaint::kFill_Style);
canvas->AsCanvasSkia()->drawRectCoords(
0, 0, SkIntToScalar(width()), SkIntToScalar(height()), paint);
@@ -124,7 +133,9 @@ void SadTabView::Layout() {
void SadTabView::LinkActivated(views::Link* source, int event_flags) {
if (tab_contents_ != NULL && source == learn_more_link_) {
GURL help_url =
- google_util::AppendGoogleLocaleParam(GURL(chrome::kCrashReasonURL));
+ google_util::AppendGoogleLocaleParam(GURL(kind_ == CRASHED ?
+ chrome::kCrashReasonURL :
+ chrome::kKillReasonURL));
WindowOpenDisposition disposition(CURRENT_TAB);
#if defined(OS_CHROMEOS)
if (tab_contents_->delegate() &&
@@ -139,7 +150,7 @@ void SadTabView::LinkActivated(views::Link* source, int event_flags) {
}
// static
-void SadTabView::InitClass() {
+void SadTabView::InitClass(Kind kind) {
static bool initialized = false;
if (!initialized) {
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
@@ -148,11 +159,14 @@ void SadTabView::InitClass() {
gfx::Font::BOLD));
message_font_ = new gfx::Font(
rb.GetFont(ResourceBundle::BaseFont).DeriveFont(kMessageFontSizeDelta));
- sad_tab_bitmap_ = rb.GetBitmapNamed(IDR_SAD_TAB);
+ sad_tab_bitmap_ = rb.GetBitmapNamed(
+ kind == CRASHED ? IDR_SAD_TAB : IDR_KILLED_TAB);
- title_ = UTF16ToWide(l10n_util::GetStringUTF16(IDS_SAD_TAB_TITLE));
+ title_ = UTF16ToWide(l10n_util::GetStringUTF16(
+ kind == CRASHED ? IDS_SAD_TAB_TITLE : IDS_KILLED_TAB_TITLE));
title_width_ = title_font_->GetStringWidth(WideToUTF16Hack(title_));
- message_ = UTF16ToWide(l10n_util::GetStringUTF16(IDS_SAD_TAB_MESSAGE));
+ message_ = UTF16ToWide(l10n_util::GetStringUTF16(
+ kind == CRASHED ? IDS_SAD_TAB_MESSAGE : IDS_KILLED_TAB_MESSAGE));
initialized = true;
}
diff --git a/chrome/browser/ui/views/sad_tab_view.h b/chrome/browser/ui/views/sad_tab_view.h
index 22c088a..ce5ccbe 100644
--- a/chrome/browser/ui/views/sad_tab_view.h
+++ b/chrome/browser/ui/views/sad_tab_view.h
@@ -25,7 +25,12 @@ class TabContents;
class SadTabView : public views::View,
public views::LinkController {
public:
- explicit SadTabView(TabContents* tab_contents);
+ enum Kind {
+ CRASHED, // The tab crashed. Display the "Aw, Snap!" page.
+ KILLED // The tab was killed. Display the killed tab page.
+ };
+
+ explicit SadTabView(TabContents* tab_contents, Kind kind);
virtual ~SadTabView() {}
// Overridden from views::View:
@@ -36,7 +41,7 @@ class SadTabView : public views::View,
virtual void LinkActivated(views::Link* source, int event_flags);
private:
- static void InitClass();
+ static void InitClass(Kind kind);
// Assorted resources for display.
static SkBitmap* sad_tab_bitmap_;
@@ -56,6 +61,8 @@ class SadTabView : public views::View,
gfx::Rect message_bounds_;
gfx::Rect link_bounds_;
+ Kind kind_;
+
DISALLOW_COPY_AND_ASSIGN(SadTabView);
};
diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.cc b/chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.cc
index 4d27e95..490c7a8 100644
--- a/chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.cc
+++ b/chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.cc
@@ -239,7 +239,8 @@ void TabContentsViewGtk::SetPageTitle(const std::wstring& title) {
gdk_window_set_title(content_view->window, WideToUTF8(title).c_str());
}
-void TabContentsViewGtk::OnTabCrashed() {
+void TabContentsViewGtk::OnTabCrashed(base::TerminationStatus /* status */,
+ int /* error_code */) {
}
void TabContentsViewGtk::SizeContents(const gfx::Size& size) {
@@ -394,7 +395,12 @@ gboolean TabContentsViewGtk::OnPaint(GtkWidget* widget, GdkEventExpose* event) {
if (tab_contents()->render_view_host() &&
!tab_contents()->render_view_host()->IsRenderViewLive()) {
if (sad_tab_ == NULL) {
- sad_tab_ = new SadTabView(tab_contents());
+ base::TerminationStatus status =
+ tab_contents()->render_view_host()->render_view_termination_status();
+ SadTabView::Kind kind =
+ status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED ?
+ SadTabView::KILLED : SadTabView::CRASHED;
+ sad_tab_ = new SadTabView(tab_contents(), kind);
SetContentsView(sad_tab_);
}
gfx::Rect bounds;
diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.h b/chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.h
index 5352aaf4..6efe01c 100644
--- a/chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.h
+++ b/chrome/browser/ui/views/tab_contents/tab_contents_view_gtk.h
@@ -56,7 +56,8 @@ class TabContentsViewGtk : public TabContentsView,
virtual gfx::NativeWindow GetTopLevelNativeWindow() const;
virtual void GetContainerBounds(gfx::Rect* out) const;
virtual void SetPageTitle(const std::wstring& title);
- virtual void OnTabCrashed();
+ virtual void OnTabCrashed(base::TerminationStatus status,
+ int error_code);
virtual void SizeContents(const gfx::Size& size);
virtual void Focus();
virtual void SetInitialFocus();
diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc b/chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc
index ec48536..f6c2e97 100644
--- a/chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc
+++ b/chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc
@@ -130,11 +130,15 @@ void TabContentsViewViews::SetPageTitle(const std::wstring& title) {
// TODO(anicolao): figure out if there's anything useful to do here
}
-void TabContentsViewViews::OnTabCrashed() {
+void TabContentsViewViews::OnTabCrashed(base::TerminationStatus status,
+ int /* error_code */) {
if (sad_tab_ != NULL)
return;
- sad_tab_.reset(new SadTabView(tab_contents()));
+ sad_tab_.reset(new SadTabView(
+ tab_contents(),
+ status == TERMINATION_STATUS_PROCESS_WAS_KILLED ?
+ SadTabView::KILLED : SadTabView::CRASHED));
RemoveAllChildViews(true);
AddChildView(sad_tab_.get());
Layout();
diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_view_views.h b/chrome/browser/ui/views/tab_contents/tab_contents_view_views.h
index ab0e666..3b716a1 100644
--- a/chrome/browser/ui/views/tab_contents/tab_contents_view_views.h
+++ b/chrome/browser/ui/views/tab_contents/tab_contents_view_views.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_VIEWS_H_
-#define CHROME_BROWSER_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_VIEWS_H_
+#ifndef CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_VIEWS_H_
+#define CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_VIEWS_H_
#pragma once
#include <vector>
@@ -52,7 +52,8 @@ class TabContentsViewViews : public TabContentsView, public views::View {
virtual gfx::NativeWindow GetTopLevelNativeWindow() const;
virtual void GetContainerBounds(gfx::Rect* out) const;
virtual void SetPageTitle(const std::wstring& title);
- virtual void OnTabCrashed();
+ virtual void OnTabCrashed(base::TerminationStatus status,
+ int error_code);
virtual void SizeContents(const gfx::Size& size);
virtual void Focus();
virtual void SetInitialFocus();
@@ -128,4 +129,4 @@ class TabContentsViewViews : public TabContentsView, public views::View {
DISALLOW_COPY_AND_ASSIGN(TabContentsViewViews);
};
-#endif // CHROME_BROWSER_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_VIEWS_H_
+#endif // CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_VIEW_VIEWS_H_
diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_view_win.cc b/chrome/browser/ui/views/tab_contents/tab_contents_view_win.cc
index ca93676..52ad4ba 100644
--- a/chrome/browser/ui/views/tab_contents/tab_contents_view_win.cc
+++ b/chrome/browser/ui/views/tab_contents/tab_contents_view_win.cc
@@ -155,7 +155,8 @@ void TabContentsViewWin::SetPageTitle(const std::wstring& title) {
}
}
-void TabContentsViewWin::OnTabCrashed() {
+void TabContentsViewWin::OnTabCrashed(base::TerminationStatus /* status */,
+ int /* error_code */) {
// Force an invalidation to render sad tab. We will notice we crashed when we
// paint.
// Note that it's possible to get this message after the window was destroyed.
@@ -398,7 +399,12 @@ void TabContentsViewWin::OnPaint(HDC junk_dc) {
if (tab_contents()->render_view_host() &&
!tab_contents()->render_view_host()->IsRenderViewLive()) {
if (sad_tab_ == NULL) {
- sad_tab_ = new SadTabView(tab_contents());
+ base::TerminationStatus status =
+ tab_contents()->render_view_host()->render_view_termination_status();
+ SadTabView::Kind kind =
+ status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED ?
+ SadTabView::KILLED : SadTabView::CRASHED;
+ sad_tab_ = new SadTabView(tab_contents(), kind);
SetContentsView(sad_tab_);
}
CRect cr;
diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_view_win.h b/chrome/browser/ui/views/tab_contents/tab_contents_view_win.h
index fcfbfe4..27a1eb4 100644
--- a/chrome/browser/ui/views/tab_contents/tab_contents_view_win.h
+++ b/chrome/browser/ui/views/tab_contents/tab_contents_view_win.h
@@ -48,7 +48,8 @@ class TabContentsViewWin : public TabContentsView,
virtual gfx::NativeWindow GetTopLevelNativeWindow() const;
virtual void GetContainerBounds(gfx::Rect* out) const;
virtual void SetPageTitle(const std::wstring& title);
- virtual void OnTabCrashed();
+ virtual void OnTabCrashed(base::TerminationStatus status,
+ int error_code);
virtual void SizeContents(const gfx::Size& size);
virtual void Focus();
virtual void SetInitialFocus();
diff --git a/chrome/common/about_handler.cc b/chrome/common/about_handler.cc
index d2121b8..6e3e152 100644
--- a/chrome/common/about_handler.cc
+++ b/chrome/common/about_handler.cc
@@ -12,6 +12,7 @@ namespace chrome_about_handler {
// chrome/renderer/about_handler.cc.
const char* const about_urls[] = {
chrome::kAboutCrashURL,
+ chrome::kAboutKillURL,
chrome::kAboutHangURL,
chrome::kAboutShorthangURL,
NULL,
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 9fee02f..9297740 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -992,6 +992,9 @@ const char kRecordMode[] = "record-mode";
// Register pepper plugins that should be loaded into the renderer.
const char kRegisterPepperPlugins[] = "register-pepper-plugins";
+// Reload pages that have been killed when they are next focused by the user.
+const char kReloadKilledTabs[] = "reload-killed-tabs";
+
// Enable remote debug over HTTP on the specified port.
const char kRemoteDebuggingPort[] = "remote-debugging-port";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index cae8fcd..1c3e1ea 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -279,6 +279,7 @@ extern const char kProxyServer[];
extern const char kPurgeMemoryButton[];
extern const char kRecordMode[];
extern const char kRegisterPepperPlugins[];
+extern const char kReloadKilledTabs[];
extern const char kRemoteDebuggingPort[];
extern const char kRemoteShellPort[];
extern const char kRendererAssertTest[];
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index e4c56fc..844cb32 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -51,6 +51,7 @@ const char kAboutBlankURL[] = "about:blank";
const char kAboutCacheURL[] = "about:cache";
const char kAboutConflicts[] = "about:conflicts";
const char kAboutCrashURL[] = "about:crash";
+const char kAboutKillURL[] = "about:kill";
const char kAboutCreditsURL[] = "about:credits";
const char kAboutDNSURL[] = "about:dns";
const char kAboutFlagsURL[] = "about:flags";
@@ -204,6 +205,15 @@ const char kCrashReasonURL[] =
"http://www.google.com/support/chrome/bin/answer.py?answer=95669";
#endif
+// TODO: These are currently placeholders that point to the crash
+// docs. See bug http://crosbug.com/10711
+const char kKillReasonURL[] =
+#if defined(OS_CHROMEOS)
+ "http://www.google.com/support/chromeos/bin/answer.py?answer=1047340";
+#else
+ "http://www.google.com/support/chrome/bin/answer.py?answer=95669";
+#endif
+
const char kPrivacyLearnMoreURL[] =
#if defined(OS_CHROMEOS)
"http://www.google.com/support/chromeos/bin/answer.py?answer=1047334";
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index 50d1a5c..532f230 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -44,6 +44,7 @@ extern const char kAboutBrowserCrash[];
extern const char kAboutConflicts[];
extern const char kAboutCacheURL[];
extern const char kAboutCrashURL[];
+extern const char kAboutKillURL[];
extern const char kAboutCreditsURL[];
extern const char kAboutDNSURL[];
extern const char kAboutFlagsURL[];
@@ -188,6 +189,9 @@ extern const char kPageInfoHelpCenterURL[];
// "Learn more" URL for "Aw snap" page.
extern const char kCrashReasonURL[];
+// "Learn more" URL for killed tab page.
+extern const char kKillReasonURL[];
+
// "Learn more" URL for the Privacy section under Options.
extern const char kPrivacyLearnMoreURL[];
diff --git a/chrome/renderer/about_handler.cc b/chrome/renderer/about_handler.cc
index f53302b..e748aa1 100644
--- a/chrome/renderer/about_handler.cc
+++ b/chrome/renderer/about_handler.cc
@@ -4,6 +4,7 @@
#include "chrome/renderer/about_handler.h"
+#include "base/process_util.h"
#include "base/threading/platform_thread.h"
#include "chrome/common/about_handler.h"
#include "googleurl/src/gurl.h"
@@ -14,6 +15,7 @@ typedef void (*AboutHandlerFuncPtr)();
// chrome/common/about_handler.cc.
static const AboutHandlerFuncPtr about_urls_handlers[] = {
AboutHandler::AboutCrash,
+ AboutHandler::AboutKill,
AboutHandler::AboutHang,
AboutHandler::AboutShortHang,
NULL,
@@ -44,6 +46,11 @@ void AboutHandler::AboutCrash() {
}
// static
+void AboutHandler::AboutKill() {
+ base::KillProcess(base::GetCurrentProcessHandle(), 1, false);
+}
+
+// static
void AboutHandler::AboutHang() {
for (;;) {
base::PlatformThread::Sleep(1000);
diff --git a/chrome/renderer/about_handler.h b/chrome/renderer/about_handler.h
index ee55f49..dea3c5b 100644
--- a/chrome/renderer/about_handler.h
+++ b/chrome/renderer/about_handler.h
@@ -24,6 +24,9 @@ class AboutHandler {
// Induces a renderer crash.
static void AboutCrash();
+ // Induces a renderer kill.
+ static void AboutKill();
+
// Induces a renderer hang.
static void AboutHang();