diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/app/nibs/en.lproj/HungRendererDialog.xib | 664 | ||||
-rw-r--r-- | chrome/browser/cocoa/hung_renderer_controller.h | 65 | ||||
-rw-r--r-- | chrome/browser/cocoa/hung_renderer_controller.mm | 143 | ||||
-rw-r--r-- | chrome/browser/cocoa/hung_renderer_controller_unittest.mm | 51 | ||||
-rw-r--r-- | chrome/chrome.gyp | 5 | ||||
-rw-r--r-- | chrome/common/temp_scaffolding_stubs.cc | 10 |
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 |