Chromium Code Reviews| Index: chrome/browser/ui/webui/hung_renderer_dialog.cc |
| diff --git a/chrome/browser/ui/webui/hung_renderer_dialog.cc b/chrome/browser/ui/webui/hung_renderer_dialog.cc |
| index de0233451310e5c191aab408e2d75da609af653e..9017dab9e16a34880c56957e3f5b12fec956b42f 100644 |
| --- a/chrome/browser/ui/webui/hung_renderer_dialog.cc |
| +++ b/chrome/browser/ui/webui/hung_renderer_dialog.cc |
| @@ -35,7 +35,7 @@ namespace browser { |
| void ShowHungRendererDialog(TabContents* contents) { |
| #if defined(OS_CHROMEOS) || defined(USE_AURA) |
| - HungRendererDialog::ShowHungRendererDialog(contents); |
| + HungRendererDialog::ShowHungRendererDialog(contents, true); |
|
wyck
2011/11/15 01:56:44
Aw Snap! This shouldn't be here. This caused the
|
| #else |
| // TODO(rbyers): Remove IsMoreWebUI check once we decide for sure which |
| // platforms will use the WebUI version of this dialog. |
| @@ -63,12 +63,7 @@ void HideHungRendererDialog(TabContents* contents) { |
| // HungRendererDialog public static methods |
| void HungRendererDialog::ShowHungRendererDialog(TabContents* contents) { |
| - if (!logging::DialogsAreSuppressed()) { |
| - if (g_instance) |
| - return; |
| - g_instance = new HungRendererDialog(); |
| - g_instance->ShowDialog(contents); |
| - } |
| + ShowHungRendererDialogInternal(contents, true); |
| } |
| void HungRendererDialog::HideHungRendererDialog(TabContents* contents) { |
| @@ -76,16 +71,49 @@ void HungRendererDialog::HideHungRendererDialog(TabContents* contents) { |
| g_instance->HideDialog(contents); |
| } |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// HungRendererDialog::TabContentsObserverImpl |
| + |
| +HungRendererDialog::TabContentsObserverImpl::TabContentsObserverImpl( |
| + HungRendererDialog* dialog, |
| + TabContents* contents) |
| + : TabContentsObserver(contents), |
| + contents_(contents), |
| + dialog_(dialog) { |
| +} |
| + |
| +void HungRendererDialog::TabContentsObserverImpl::RenderViewGone() { |
| + dialog_->HideDialog(contents_); |
| +} |
| + |
| +void HungRendererDialog::TabContentsObserverImpl::TabContentsDestroyed( |
| + TabContents* tab) { |
| + dialog_->HideDialog(contents_); |
| +} |
| //////////////////////////////////////////////////////////////////////////////// |
| // HungRendererDialog private methods |
| -HungRendererDialog::HungRendererDialog() |
| +HungRendererDialog::HungRendererDialog(bool is_enabled) |
| : contents_(NULL), |
| handler_(NULL), |
| + is_enabled_(is_enabled), |
| window_(NULL) { |
| } |
| +HungRendererDialog::~HungRendererDialog() { |
| +} |
| + |
| +void HungRendererDialog::ShowHungRendererDialogInternal(TabContents* contents, |
| + bool is_enabled) { |
| + if (!logging::DialogsAreSuppressed()) { |
| + if (g_instance) |
| + return; |
| + g_instance = new HungRendererDialog(is_enabled); |
| + g_instance->ShowDialog(contents); |
| + } |
| +} |
| + |
| void HungRendererDialog::ShowDialog(TabContents* contents) { |
| DCHECK(contents); |
| contents_ = contents; |
| @@ -93,6 +121,7 @@ void HungRendererDialog::ShowDialog(TabContents* contents) { |
| DCHECK(browser); |
| handler_ = new HungRendererDialogHandler(contents_); |
| window_ = browser->BrowserShowHtmlDialog(this, NULL); |
| + contents_observer_.reset(new TabContentsObserverImpl(this, contents_)); |
| } |
| void HungRendererDialog::HideDialog(TabContents* contents) { |
| @@ -104,6 +133,7 @@ void HungRendererDialog::HideDialog(TabContents* contents) { |
| // Settings |contents_| to NULL prevents the hang monitor from restarting. |
| // We do this because the close dialog handler runs whether it is trigged by |
| // the user closing the box, or by being closed externally with widget->Close. |
| + contents_observer_.reset(); |
| contents_ = NULL; |
| DCHECK(handler_); |
| handler_->CloseDialog(); |
| @@ -135,25 +165,27 @@ std::string HungRendererDialog::GetDialogArgs() const { |
| } |
| void HungRendererDialog::OnDialogClosed(const std::string& json_retval) { |
| - // Figure out what the response was. |
| - scoped_ptr<Value> root(base::JSONReader::Read(json_retval, false)); |
| - bool response = false; |
| - ListValue* list = NULL; |
| - // If the dialog closes because of a button click then the json is a list |
| - // containing a single bool. If the dialog closes some other way, then we |
| - // assume it means no permission was given to kill tabs. |
| - if (root.get() && root->GetAsList(&list) && list && |
| - list->GetBoolean(0, &response) && response) { |
| - // The user indicated that it is OK to kill the renderer process. |
| - if (contents_ && contents_->GetRenderProcessHost()) { |
| - base::KillProcess(contents_->GetRenderProcessHost()->GetHandle(), |
| - content::RESULT_CODE_HUNG, false); |
| + if (is_enabled_) { |
| + // Figure out what the response was. |
| + scoped_ptr<Value> root(base::JSONReader::Read(json_retval, false)); |
| + bool response = false; |
| + ListValue* list = NULL; |
| + // If the dialog closes because of a button click then the json is a list |
| + // containing a single bool. If the dialog closes some other way, then we |
| + // assume it means no permission was given to kill tabs. |
| + if (root.get() && root->GetAsList(&list) && list && |
| + list->GetBoolean(0, &response) && response) { |
| + // The user indicated that it is OK to kill the renderer process. |
| + if (contents_ && contents_->GetRenderProcessHost()) { |
| + base::KillProcess(contents_->GetRenderProcessHost()->GetHandle(), |
| + content::RESULT_CODE_HUNG, false); |
| + } |
| + } else { |
| + // No indication from the user that it is ok to kill anything. Just wait. |
| + // Start waiting again for responsiveness. |
| + if (contents_ && contents_->render_view_host()) |
| + contents_->render_view_host()->RestartHangMonitorTimeout(); |
| } |
| - } else { |
| - // No indication from the user that it is ok to kill anything. Just wait. |
| - // Start waiting again for responsiveness. |
| - if (contents_ && contents_->render_view_host()) |
| - contents_->render_view_host()->RestartHangMonitorTimeout(); |
| } |
| g_instance = NULL; |
| delete this; |