1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_COCOA_HUNG_RENDERER_CONTROLLER_H_ 6 #define CHROME_BROWSER_UI_COCOA_HUNG_RENDERER_CONTROLLER_H_ 7 8 // A controller for the Mac hung renderer dialog window. Only one 9 // instance of this controller can exist at any time, although a given 10 // controller is destroyed when its window is closed. 11 // 12 // The dialog itself displays a list of frozen tabs, all of which 13 // share a render process. Since there can only be a single dialog 14 // open at a time, if showForWebContents is called for a different 15 // tab, the dialog is repurposed to show a warning for the new tab. 16 // 17 // The caller is required to call endForWebContents before deleting 18 // any WebContents object. 19 20 #import <Cocoa/Cocoa.h> 21 22 #import "base/mac/scoped_nsobject.h" 23 #import "base/memory/scoped_ptr.h" 24 25 @class MultiKeyEquivalentButton; 26 class WebContentsObserverBridge; 27 28 namespace content { 29 class WebContents; 30 } 31 32 @interface HungRendererController : NSWindowController<NSTableViewDataSource> { 33 @private 34 IBOutlet MultiKeyEquivalentButton* waitButton_; 35 IBOutlet NSButton* killButton_; 36 IBOutlet NSTableView* tableView_; 37 IBOutlet NSImageView* imageView_; 38 IBOutlet NSTextField* messageView_; 39 40 // The WebContents for which this dialog is open. Should never be 41 // NULL while this dialog is open. 42 content::WebContents* hungContents_; 43 44 // Observes |hungContents_| in case it closes while the panel is up. 45 scoped_ptr<WebContentsObserverBridge> hungContentsObserver_; 46 47 // Backing data for |tableView_|. Titles of each WebContents that 48 // shares a renderer process with |hungContents_|. 49 base::scoped_nsobject<NSArray> hungTitles_; 50 51 // Favicons of each WebContents that shares a renderer process with 52 // |hungContents_|. 53 base::scoped_nsobject<NSArray> hungFavicons_; 54 } 55 56 // Kills the hung renderers. 57 - (IBAction)kill:(id)sender; 58 59 // Waits longer for the renderers to respond. 60 - (IBAction)wait:(id)sender; 61 62 // Modifies the dialog to show a warning for the given tab contents. 63 // The dialog will contain a list of all tabs that share a renderer 64 // process with |contents|. The caller must not delete any tab 65 // contents without first calling endForWebContents. 66 - (void)showForWebContents:(content::WebContents*)contents; 67 68 // Notifies the dialog that |contents| is either responsive or closed. 69 // If |contents| shares the same render process as the tab contents 70 // this dialog was created for, this function will close the dialog. 71 // If |contents| has a different process, this function does nothing. 72 - (void)endForWebContents:(content::WebContents*)contents; 73 74 // Called by |hungContentsObserver_| to indicate that |hungContents_| 75 // has gone away. 76 - (void)renderProcessGone; 77 78 @end // HungRendererController 79 80 81 @interface HungRendererController (JustForTesting) 82 - (NSButton*)killButton; 83 - (MultiKeyEquivalentButton*)waitButton; 84 @end 85 86 #endif // CHROME_BROWSER_UI_COCOA_HUNG_RENDERER_CONTROLLER_H_ 87