• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 HungRendererWebContentsObserverBridge;
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<HungRendererWebContentsObserverBridge> 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