| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "base/mac_util.h" | 8 #include "base/mac_util.h" |
| 9 #include "base/process_util.h" | 9 #include "base/process_util.h" |
| 10 #include "base/sys_string_conversions.h" | 10 #include "base/sys_string_conversions.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 // This is easier than creating a localizer, since we only have one | 44 // This is easier than creating a localizer, since we only have one |
| 45 // string to modify. | 45 // string to modify. |
| 46 std::wstring productString = l10n_util::GetString(IDS_PRODUCT_NAME); | 46 std::wstring productString = l10n_util::GetString(IDS_PRODUCT_NAME); |
| 47 [[self window] setTitle:base::SysWideToNSString(productString)]; | 47 [[self window] setTitle:base::SysWideToNSString(productString)]; |
| 48 } | 48 } |
| 49 | 49 |
| 50 - (IBAction)kill:(id)sender { | 50 - (IBAction)kill:(id)sender { |
| 51 if (hungContents_) | 51 if (hungContents_) |
| 52 base::KillProcess(hungContents_->process()->process().handle(), | 52 base::KillProcess(hungContents_->process()->process().handle(), |
| 53 ResultCodes::HUNG, false); | 53 ResultCodes::HUNG, false); |
| 54 [[self window] performClose:nil]; | 54 // Cannot call performClose:, because the close button is disabled. |
| 55 [self close]; |
| 55 } | 56 } |
| 56 | 57 |
| 57 - (IBAction)wait:(id)sender { | 58 - (IBAction)wait:(id)sender { |
| 58 if (hungContents_ && hungContents_->render_view_host()) | 59 if (hungContents_ && hungContents_->render_view_host()) |
| 59 hungContents_->render_view_host()->RestartHangMonitorTimeout(); | 60 hungContents_->render_view_host()->RestartHangMonitorTimeout(); |
| 60 [[self window] performClose:nil]; | 61 // Cannot call performClose:, because the close button is disabled. |
| 62 [self close]; |
| 61 } | 63 } |
| 62 | 64 |
| 63 - (int)numberOfRowsInTableView:(NSTableView *)aTableView { | 65 - (int)numberOfRowsInTableView:(NSTableView *)aTableView { |
| 64 return hungRenderers_.size(); | 66 return hungRenderers_.size(); |
| 65 } | 67 } |
| 66 | 68 |
| 67 - (id)tableView:(NSTableView*)aTableView | 69 - (id)tableView:(NSTableView*)aTableView |
| 68 objectValueForTableColumn:(NSTableColumn*)column | 70 objectValueForTableColumn:(NSTableColumn*)column |
| 69 row:(int)rowIndex { | 71 row:(int)rowIndex { |
| 70 // TODO(rohitrao): Add favicons. | 72 // TODO(rohitrao): Add favicons. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 96 [tableView_ reloadData]; | 98 [tableView_ reloadData]; |
| 97 | 99 |
| 98 [[self window] center]; | 100 [[self window] center]; |
| 99 [self showWindow:self]; | 101 [self showWindow:self]; |
| 100 } | 102 } |
| 101 | 103 |
| 102 - (void)endForTabContents:(TabContents*)contents { | 104 - (void)endForTabContents:(TabContents*)contents { |
| 103 DCHECK(contents); | 105 DCHECK(contents); |
| 104 DCHECK(hungContents_); | 106 DCHECK(hungContents_); |
| 105 if (hungContents_ && hungContents_->process() == contents->process()) { | 107 if (hungContents_ && hungContents_->process() == contents->process()) { |
| 106 // If you switch tabs with the dialog open, | 108 // Cannot call performClose:, because the close button is disabled. |
| 107 // HungRendererDialog::EndForTabContents() is called after the | |
| 108 // RWHV is hidden. performClose: runs a nested message loop, | |
| 109 // during which the RWHV is drawn at least once, failing a DCHECK | |
| 110 // that ensures it is never drawn while hidden. The workaround | |
| 111 // here is to call close, which closes the window immediately with | |
| 112 // no nested message loop. | |
| 113 [self close]; | 109 [self close]; |
| 114 } | 110 } |
| 115 } | 111 } |
| 116 | 112 |
| 117 @end | 113 @end |
| 118 | 114 |
| 119 @implementation HungRendererController (JustForTesting) | 115 @implementation HungRendererController (JustForTesting) |
| 120 - (NSButton*)killButton { | 116 - (NSButton*)killButton { |
| 121 return killButton_; | 117 return killButton_; |
| 122 } | 118 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 134 initWithWindowNibName:@"HungRendererDialog"]; | 130 initWithWindowNibName:@"HungRendererDialog"]; |
| 135 [g_instance showForTabContents:contents]; | 131 [g_instance showForTabContents:contents]; |
| 136 } | 132 } |
| 137 } | 133 } |
| 138 | 134 |
| 139 // static | 135 // static |
| 140 void HungRendererDialog::HideForTabContents(TabContents* contents) { | 136 void HungRendererDialog::HideForTabContents(TabContents* contents) { |
| 141 if (!logging::DialogsAreSuppressed() && g_instance) | 137 if (!logging::DialogsAreSuppressed() && g_instance) |
| 142 [g_instance endForTabContents:contents]; | 138 [g_instance endForTabContents:contents]; |
| 143 } | 139 } |
| OLD | NEW |