summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorrohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-24 16:18:02 +0000
committerrohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-24 16:18:02 +0000
commitb89d4cdd649ad1e70d5bad3e18f6f721761861d5 (patch)
tree461b6977d53f8f9a3bd92e45bba66bd1069d75ba /chrome
parent734d9be68c10a2d85336baaf3f21d21520ea9f5c (diff)
downloadchromium_src-b89d4cdd649ad1e70d5bad3e18f6f721761861d5.zip
chromium_src-b89d4cdd649ad1e70d5bad3e18f6f721761861d5.tar.gz
chromium_src-b89d4cdd649ad1e70d5bad3e18f6f721761861d5.tar.bz2
Initial implementation of the hung renderer dialog on Mac.
BUG=http://crbug.com/13152 TEST=Navigate to about:hang in a tab, verify that the dialog comes up. Review URL: http://codereview.chromium.org/146012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19125 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/app/nibs/en.lproj/HungRendererDialog.xib664
-rw-r--r--chrome/browser/cocoa/hung_renderer_controller.h65
-rw-r--r--chrome/browser/cocoa/hung_renderer_controller.mm143
-rw-r--r--chrome/browser/cocoa/hung_renderer_controller_unittest.mm51
-rw-r--r--chrome/chrome.gyp5
-rw-r--r--chrome/common/temp_scaffolding_stubs.cc10
6 files changed, 928 insertions, 10 deletions
diff --git a/chrome/app/nibs/en.lproj/HungRendererDialog.xib b/chrome/app/nibs/en.lproj/HungRendererDialog.xib
new file mode 100644
index 0000000..5b75f75
--- /dev/null
+++ b/chrome/app/nibs/en.lproj/HungRendererDialog.xib
@@ -0,0 +1,664 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">9J61</string>
+ <string key="IBDocument.InterfaceBuilderVersion">677</string>
+ <string key="IBDocument.AppKitVersion">949.46</string>
+ <string key="IBDocument.HIToolboxVersion">353.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="1" id="9"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">HungRendererController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="1005">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 264}, {480, 246}}</string>
+ <int key="NSWTFlags">536870912</int>
+ <string key="NSWindowTitle"/>
+ <string key="NSWindowClass">NSWindow</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <object class="NSView" key="NSWindowView" id="1006">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSScrollView" id="501203135">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">286</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="995011774">
+ <reference key="NSNextResponder" ref="501203135"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableView" id="216923421">
+ <reference key="NSNextResponder" ref="995011774"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{350, 114}</string>
+ <reference key="NSSuperview" ref="995011774"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="_NSCornerView" key="NSCornerView">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{424, 0}, {16, 17}}</string>
+ </object>
+ <object class="NSMutableArray" key="NSTableColumns">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableColumn" id="171324652">
+ <string key="NSIdentifier">title</string>
+ <double key="NSWidth">3.470000e+02</double>
+ <double key="NSMinWidth">4.000000e+01</double>
+ <double key="NSMaxWidth">1.000000e+03</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents"/>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.100000e+01</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerTextColor</string>
+ <object class="NSColor" key="NSColor" id="332806078">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="354720928">
+ <int key="NSCellFlags">67239488</int>
+ <int key="NSCellFlags2">272761856</int>
+ <string key="NSContents">Text</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="216923421"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="97073632">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <reference key="NSColor" ref="332806078"/>
+ </object>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="216923421"/>
+ </object>
+ </object>
+ <double key="NSIntercellSpacingWidth">3.000000e+00</double>
+ <double key="NSIntercellSpacingHeight">2.000000e+00</double>
+ <object class="NSColor" key="NSBackgroundColor" id="661710842">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <object class="NSColor" key="NSGridColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">gridColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
+ </object>
+ <double key="NSRowHeight">1.700000e+01</double>
+ <int key="NSTvFlags">37748736</int>
+ <int key="NSColumnAutoresizingStyle">4</int>
+ <int key="NSDraggingSourceMaskForLocal">15</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">NO</bool>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 1}, {350, 114}}</string>
+ <reference key="NSSuperview" ref="501203135"/>
+ <reference key="NSNextKeyView" ref="216923421"/>
+ <reference key="NSDocView" ref="216923421"/>
+ <object class="NSColor" key="NSBGColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlBackgroundColor</string>
+ <reference key="NSColor" ref="97073632"/>
+ </object>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="36736515">
+ <reference key="NSNextResponder" ref="501203135"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{424, 0}, {15, 150}}</string>
+ <reference key="NSSuperview" ref="501203135"/>
+ <reference key="NSTarget" ref="501203135"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">9.933775e-01</double>
+ </object>
+ <object class="NSScroller" id="1056817388">
+ <reference key="NSNextResponder" ref="501203135"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{1, 150}, {423, 15}}</string>
+ <reference key="NSSuperview" ref="501203135"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="501203135"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">9.976415e-01</double>
+ </object>
+ </object>
+ <string key="NSFrame">{{108, 60}, {352, 116}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <reference key="NSNextKeyView" ref="995011774"/>
+ <int key="NSsFlags">562</int>
+ <reference key="NSVScroller" ref="36736515"/>
+ <reference key="NSHScroller" ref="1056817388"/>
+ <reference key="NSContentView" ref="995011774"/>
+ <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
+ </object>
+ <object class="NSButton" id="485103160">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">289</int>
+ <string key="NSFrame">{{370, 12}, {96, 32}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="147145924">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Kill</string>
+ <object class="NSFont" key="NSSupport" id="832152429">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="485103160"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="544568006">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">289</int>
+ <string key="NSFrame">{{274, 12}, {96, 32}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="602602853">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Wait</string>
+ <reference key="NSSupport" ref="832152429"/>
+ <reference key="NSControlView" ref="544568006"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="777888236">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">284</int>
+ <string key="NSFrame">{{105, 187}, {358, 39}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="636497192">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">272629760</int>
+ <string key="NSContents">The following page(s) have become unresponsive. You can wait for them to become responsive or kill them.</string>
+ <reference key="NSSupport" ref="832152429"/>
+ <reference key="NSControlView" ref="777888236"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <reference key="NSColor" ref="661710842"/>
+ </object>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <reference key="NSColor" ref="332806078"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSImageView" id="848955907">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableSet" key="NSDragTypes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="set.sortedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple PNG pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ </object>
+ </object>
+ <string key="NSFrame">{{20, 146}, {80, 80}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSImageCell" key="NSCell" id="281074803">
+ <int key="NSCellFlags">130560</int>
+ <int key="NSCellFlags2">33554432</int>
+ <object class="NSCustomResource" key="NSContents">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">frozen_tab</string>
+ </object>
+ <int key="NSAlign">0</int>
+ <int key="NSScale">0</int>
+ <int key="NSStyle">0</int>
+ <bool key="NSAnimates">NO</bool>
+ </object>
+ <bool key="NSEditable">YES</bool>
+ </object>
+ </object>
+ <string key="NSFrameSize">{480, 246}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">killButton_</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="485103160"/>
+ </object>
+ <int key="connectionID">16</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">waitButton_</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="544568006"/>
+ </object>
+ <int key="connectionID">17</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">tableView_</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="216923421"/>
+ </object>
+ <int key="connectionID">18</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1005"/>
+ </object>
+ <int key="connectionID">19</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dataSource</string>
+ <reference key="source" ref="216923421"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">20</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="216923421"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">21</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="1005"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">24</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">kill:</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="485103160"/>
+ </object>
+ <int key="connectionID">25</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">wait:</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="544568006"/>
+ </object>
+ <int key="connectionID">26</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <object class="NSArray" key="object" id="1002">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="1002"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="1005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1006"/>
+ </object>
+ <reference key="parent" ref="1002"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="1006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="501203135"/>
+ <reference ref="485103160"/>
+ <reference ref="544568006"/>
+ <reference ref="777888236"/>
+ <reference ref="848955907"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="501203135"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="36736515"/>
+ <reference ref="1056817388"/>
+ <reference ref="216923421"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">4</int>
+ <reference key="object" ref="36736515"/>
+ <reference key="parent" ref="501203135"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="1056817388"/>
+ <reference key="parent" ref="501203135"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">6</int>
+ <reference key="object" ref="216923421"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="171324652"/>
+ </object>
+ <reference key="parent" ref="501203135"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">8</int>
+ <reference key="object" ref="171324652"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="354720928"/>
+ </object>
+ <reference key="parent" ref="216923421"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">12</int>
+ <reference key="object" ref="485103160"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="147145924"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">13</int>
+ <reference key="object" ref="147145924"/>
+ <reference key="parent" ref="485103160"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">14</int>
+ <reference key="object" ref="544568006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="602602853"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">15</int>
+ <reference key="object" ref="602602853"/>
+ <reference key="parent" ref="544568006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">23</int>
+ <reference key="object" ref="354720928"/>
+ <reference key="parent" ref="171324652"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">31</int>
+ <reference key="object" ref="777888236"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="636497192"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">32</int>
+ <reference key="object" ref="636497192"/>
+ <reference key="parent" ref="777888236"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">33</int>
+ <reference key="object" ref="848955907"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="281074803"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">34</int>
+ <reference key="object" ref="281074803"/>
+ <reference key="parent" ref="848955907"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.IBPluginDependency</string>
+ <string>-2.IBPluginDependency</string>
+ <string>-3.IBPluginDependency</string>
+ <string>1.IBEditorWindowLastContentRect</string>
+ <string>1.IBPluginDependency</string>
+ <string>1.IBWindowTemplateEditedContentRect</string>
+ <string>1.NSWindowTemplate.visibleAtLaunch</string>
+ <string>1.WindowOrigin</string>
+ <string>1.editorWindowContentRectSynchronizationRect</string>
+ <string>12.IBPluginDependency</string>
+ <string>13.IBPluginDependency</string>
+ <string>14.IBPluginDependency</string>
+ <string>15.IBPluginDependency</string>
+ <string>2.IBPluginDependency</string>
+ <string>23.IBPluginDependency</string>
+ <string>3.IBPluginDependency</string>
+ <string>31.IBPluginDependency</string>
+ <string>32.IBPluginDependency</string>
+ <string>33.IBPluginDependency</string>
+ <string>34.IBPluginDependency</string>
+ <string>4.IBPluginDependency</string>
+ <string>5.IBPluginDependency</string>
+ <string>6.IBPluginDependency</string>
+ <string>8.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{445, 189}, {480, 246}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{445, 189}, {480, 246}}</string>
+ <reference ref="9"/>
+ <string>{196, 240}</string>
+ <string>{{357, 418}, {480, 270}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">34</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">HungRendererController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>kill:</string>
+ <string>wait:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>killButton_</string>
+ <string>tableView_</string>
+ <string>waitButton_</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSButton</string>
+ <string>NSTableView</string>
+ <string>NSButton</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">browser/cocoa/hung_renderer_dialog_cocoa.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">browser/cocoa/tab_strip_model_observer_bridge.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../../../chrome.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/chrome/browser/cocoa/hung_renderer_controller.h b/chrome/browser/cocoa/hung_renderer_controller.h
new file mode 100644
index 0000000..9139503b
--- /dev/null
+++ b/chrome/browser/cocoa/hung_renderer_controller.h
@@ -0,0 +1,65 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_COCOA_HUNG_RENDERER_CONTROLLER_H_
+#define CHROME_BROWSER_COCOA_HUNG_RENDERER_CONTROLLER_H_
+
+// A controller for the Mac hung renderer dialog window. Only one
+// instance of this controller can exist at any time, although a given
+// controller is destroyed when its window is closed.
+//
+// The dialog itself displays a list of frozen tabs, all of which
+// share a render process. Since there can only be a single dialog
+// open at a time, if showForTabContents is called for a different
+// tab, the dialog is repurposed to show a warning for the new tab.
+//
+// The caller is required to call endForTabContents before deleting
+// any TabContents object.
+
+#import <Cocoa/Cocoa.h>
+
+#include <vector>
+
+@interface HungRendererController : NSWindowController {
+ @private
+ IBOutlet NSButton* waitButton_;
+ IBOutlet NSButton* killButton_;
+ IBOutlet NSTableView* tableView_;
+
+ // The TabContents for which this dialog is open. Should never be
+ // NULL while this dialog is open.
+ TabContents* hungContents_;
+
+ // Backing data for |tableView_|. Contains a list of all
+ // TabContents that share a renderer process with |hungContents_|.
+ std::vector<TabContents*> hungRenderers_;
+}
+
+// Kills the hung renderers.
+- (IBAction)kill:(id)sender;
+
+// Waits longer for the renderers to respond.
+- (IBAction)wait:(id)sender;
+
+// Modifies the dialog to show a warning for the given tab contents.
+// The dialog will contain a list of all tabs that share a renderer
+// process with |contents|. The caller must not delete any tab
+// contents without first calling endForTabContents.
+- (void)showForTabContents:(TabContents*)contents;
+
+// Notifies the dialog that |contents| is either responsive or closed.
+// If |contents| shares the same render process as the tab contents
+// this dialog was created for, this function will close the dialog.
+// If |contents| has a different process, this function does nothing.
+- (void)endForTabContents:(TabContents*)contents;
+
+@end // HungRendererController
+
+
+@interface HungRendererController (JustForTesting)
+- (NSButton*)killButton;
+- (NSButton*)waitButton;
+@end
+
+#endif // CHROME_BROWSER_COCOA_HUNG_RENDERER_CONTROLLER_H_
diff --git a/chrome/browser/cocoa/hung_renderer_controller.mm b/chrome/browser/cocoa/hung_renderer_controller.mm
new file mode 100644
index 0000000..a9ec7ea
--- /dev/null
+++ b/chrome/browser/cocoa/hung_renderer_controller.mm
@@ -0,0 +1,143 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+#include "app/l10n_util.h"
+#include "base/mac_util.h"
+#include "base/process_util.h"
+#include "base/sys_string_conversions.h"
+#include "grit/generated_resources.h"
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/hung_renderer_dialog.h"
+#import "chrome/browser/cocoa/hung_renderer_controller.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/common/logging_chrome.h"
+#include "chrome/common/result_codes.h"
+#include "grit/chromium_strings.h"
+
+namespace {
+// We only support showing one of these at a time per app. The
+// controller owns itself and is released when its window is closed.
+HungRendererController* g_instance = NULL;
+} // end namespace
+
+@implementation HungRendererController
+
+- (id)initWithWindowNibName:(NSString*)nibName {
+ NSString* nibpath = [mac_util::MainAppBundle() pathForResource:nibName
+ ofType:@"nib"];
+ self = [super initWithWindowNibPath:nibpath owner:self];
+ if (self) {
+ [tableView_ setDataSource:self];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ DCHECK(!g_instance);
+ [super dealloc];
+}
+
+- (void)awakeFromNib {
+ // This is easier than creating a localizer, since we only have one
+ // string to modify.
+ std::wstring productString = l10n_util::GetString(IDS_PRODUCT_NAME);
+ [[self window] setTitle:base::SysWideToNSString(productString)];
+}
+
+- (IBAction)kill:(id)sender {
+ if (hungContents_)
+ base::KillProcess(hungContents_->process()->process().handle(),
+ ResultCodes::HUNG, false);
+ [[self window] performClose:nil];
+}
+
+- (IBAction)wait:(id)sender {
+ if (hungContents_ && hungContents_->render_view_host())
+ hungContents_->render_view_host()->RestartHangMonitorTimeout();
+ [[self window] performClose:nil];
+}
+
+- (int)numberOfRowsInTableView:(NSTableView *)aTableView {
+ return hungRenderers_.size();
+}
+
+- (id)tableView:(NSTableView*)aTableView
+ objectValueForTableColumn:(NSTableColumn*)column
+ row:(int)rowIndex {
+ // TODO(rohitrao): Add favicons.
+ TabContents* contents = hungRenderers_[rowIndex];
+ string16 title = contents->GetTitle();
+ if (title.empty())
+ title = l10n_util::GetStringUTF16(IDS_TAB_UNTITLED_TITLE);
+ return base::SysUTF16ToNSString(title);
+}
+
+- (void)windowWillClose:(NSNotification*)notification {
+ // We have to reset g_instance before autoreleasing the window,
+ // because we want to avoid reusing the same dialog if someone calls
+ // HungRendererDialog::ShowForTabContents() between the autorelease
+ // call and the actual dealloc.
+ g_instance = nil;
+
+ [self autorelease];
+}
+
+- (void)showForTabContents:(TabContents*)contents {
+ DCHECK(contents);
+ hungContents_ = contents;
+ hungRenderers_.clear();
+ for (TabContentsIterator it; !it.done(); ++it) {
+ if (it->process() == hungContents_->process())
+ hungRenderers_.push_back(*it);
+ }
+ [tableView_ reloadData];
+
+ [[self window] center];
+ [self showWindow:self];
+}
+
+- (void)endForTabContents:(TabContents*)contents {
+ DCHECK(contents);
+ DCHECK(hungContents_);
+ if (hungContents_ && hungContents_->process() == contents->process()) {
+ // If you switch tabs with the dialog open,
+ // HungRendererDialog::EndForTabContents() is called after the
+ // RWHV is hidden. performClose: runs a nested message loop,
+ // during which the RWHV is drawn at least once, failing a DCHECK
+ // that ensures it is never drawn while hidden. The workaround
+ // here is to call close, which closes the window immediately with
+ // no nested message loop.
+ [self close];
+ }
+}
+
+@end
+
+@implementation HungRendererController (JustForTesting)
+- (NSButton*)killButton {
+ return killButton_;
+}
+
+- (NSButton*)waitButton {
+ return waitButton_;
+}
+@end
+
+// static
+void HungRendererDialog::ShowForTabContents(TabContents* contents) {
+ if (!logging::DialogsAreSuppressed()) {
+ if (!g_instance)
+ g_instance = [[HungRendererController alloc]
+ initWithWindowNibName:@"HungRendererDialog"];
+ [g_instance showForTabContents:contents];
+ }
+}
+
+// static
+void HungRendererDialog::HideForTabContents(TabContents* contents) {
+ if (!logging::DialogsAreSuppressed() && g_instance)
+ [g_instance endForTabContents:contents];
+}
diff --git a/chrome/browser/cocoa/hung_renderer_controller_unittest.mm b/chrome/browser/cocoa/hung_renderer_controller_unittest.mm
new file mode 100644
index 0000000..9b29d43
--- /dev/null
+++ b/chrome/browser/cocoa/hung_renderer_controller_unittest.mm
@@ -0,0 +1,51 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+#import "base/scoped_nsobject.h"
+#include "chrome/browser/cocoa/browser_test_helper.h"
+#include "chrome/browser/cocoa/cocoa_test_helper.h"
+#import "chrome/browser/cocoa/hung_renderer_controller.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/platform_test.h"
+
+namespace {
+
+class HungRendererControllerTest : public PlatformTest {
+ public:
+ virtual void SetUp() {
+ PlatformTest::SetUp();
+ hung_renderer_controller_ = [[HungRendererController alloc]
+ initWithWindowNibName:@"HungRendererDialog"];
+ }
+
+ HungRendererController* hung_renderer_controller_; // owned by its window
+};
+
+TEST_F(HungRendererControllerTest, TestShowAndClose) {
+ // Doesn't test much functionality-wise, but makes sure we can
+ // display and tear down a window.
+ [hung_renderer_controller_ showWindow:nil];
+ [[hung_renderer_controller_ window] performClose:nil];
+}
+
+TEST_F(HungRendererControllerTest, TestKillButton) {
+ // We can't test killing a process because we have no running
+ // process to kill, but we can make sure that pressing the kill
+ // button closes the window.
+ [hung_renderer_controller_ showWindow:nil];
+ [[hung_renderer_controller_ killButton] performClick:nil];
+}
+
+TEST_F(HungRendererControllerTest, TestWaitButton) {
+ // We can't test waiting because we have no running process to wait
+ // for, but we can make sure that pressing the wait button closes
+ // the window.
+ [hung_renderer_controller_ showWindow:nil];
+ [[hung_renderer_controller_ waitButton] performClick:nil];
+}
+
+} // namespace
+
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index adaf7a0..8a06add 100644
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -749,6 +749,8 @@
'browser/cocoa/gradient_button_cell.mm',
'browser/cocoa/grow_box_view.h',
'browser/cocoa/grow_box_view.mm',
+ 'browser/cocoa/hung_renderer_controller.h',
+ 'browser/cocoa/hung_renderer_controller.mm',
'browser/cocoa/location_bar_cell.h',
'browser/cocoa/location_bar_cell.mm',
'browser/cocoa/location_bar_view_mac.h',
@@ -2367,6 +2369,7 @@
'app/nibs/en.lproj/DownloadShelf.xib',
'app/nibs/en.lproj/FindBar.xib',
'app/nibs/en.lproj/FirstRunDialog.xib',
+ 'app/nibs/en.lproj/HungRendererDialog.xib',
'app/nibs/en.lproj/MainMenu.xib',
'app/nibs/en.lproj/PageInfo.xib',
'app/nibs/en.lproj/Preferences.xib',
@@ -2379,6 +2382,7 @@
'app/theme/close_bar_h.pdf',
'app/theme/close_bar_p.pdf',
'app/theme/forward.pdf',
+ 'app/theme/frozen_tab.png',
'app/theme/go.pdf',
'app/theme/grow_box.png',
'app/theme/nav.pdf',
@@ -3366,6 +3370,7 @@
'browser/cocoa/find_bar_bridge_unittest.mm',
'browser/cocoa/find_bar_cocoa_controller_unittest.mm',
'browser/cocoa/find_bar_view_unittest.mm',
+ 'browser/cocoa/hung_renderer_controller_unittest.mm',
'browser/cocoa/location_bar_cell_unittest.mm',
'browser/cocoa/location_bar_view_mac_unittest.mm',
'browser/cocoa/location_bar_fieldeditor_unittest.mm',
diff --git a/chrome/common/temp_scaffolding_stubs.cc b/chrome/common/temp_scaffolding_stubs.cc
index 146e956..58a7bdc 100644
--- a/chrome/common/temp_scaffolding_stubs.cc
+++ b/chrome/common/temp_scaffolding_stubs.cc
@@ -289,16 +289,6 @@ void DragDownload(const DownloadItem* download, SkBitmap* icon) {
} // namespace download_util
#endif
-#if defined(OS_MACOSX)
-void HungRendererDialog::HideForTabContents(TabContents*) {
- NOTIMPLEMENTED();
-}
-
-void HungRendererDialog::ShowForTabContents(TabContents*) {
- NOTIMPLEMENTED();
-}
-#endif
-
#if !defined(TOOLKIT_VIEWS)
void BrowserList::AllBrowsersClosed() {
// TODO(port): Close any dependent windows if necessary when the last browser