1// Copyright (c) 2011 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#pragma once
8
9// A controller for the Mac hung renderer dialog window.  Only one
10// instance of this controller can exist at any time, although a given
11// controller is destroyed when its window is closed.
12//
13// The dialog itself displays a list of frozen tabs, all of which
14// share a render process.  Since there can only be a single dialog
15// open at a time, if showForTabContents is called for a different
16// tab, the dialog is repurposed to show a warning for the new tab.
17//
18// The caller is required to call endForTabContents before deleting
19// any TabContents object.
20
21#import <Cocoa/Cocoa.h>
22
23#import "base/mac/cocoa_protocols.h"
24#import "base/memory/scoped_nsobject.h"
25
26@class MultiKeyEquivalentButton;
27class TabContents;
28
29@interface HungRendererController : NSWindowController<NSTableViewDataSource> {
30 @private
31  IBOutlet MultiKeyEquivalentButton* waitButton_;
32  IBOutlet NSButton* killButton_;
33  IBOutlet NSTableView* tableView_;
34  IBOutlet NSImageView* imageView_;
35  IBOutlet NSTextField* messageView_;
36
37  // The TabContents for which this dialog is open.  Should never be
38  // NULL while this dialog is open.
39  TabContents* hungContents_;
40
41  // Backing data for |tableView_|.  Titles of each TabContents that
42  // shares a renderer process with |hungContents_|.
43  scoped_nsobject<NSArray> hungTitles_;
44
45  // Favicons of each TabContents that shares a renderer process with
46  // |hungContents_|.
47  scoped_nsobject<NSArray> hungFavicons_;
48}
49
50// Kills the hung renderers.
51- (IBAction)kill:(id)sender;
52
53// Waits longer for the renderers to respond.
54- (IBAction)wait:(id)sender;
55
56// Modifies the dialog to show a warning for the given tab contents.
57// The dialog will contain a list of all tabs that share a renderer
58// process with |contents|.  The caller must not delete any tab
59// contents without first calling endForTabContents.
60- (void)showForTabContents:(TabContents*)contents;
61
62// Notifies the dialog that |contents| is either responsive or closed.
63// If |contents| shares the same render process as the tab contents
64// this dialog was created for, this function will close the dialog.
65// If |contents| has a different process, this function does nothing.
66- (void)endForTabContents:(TabContents*)contents;
67
68@end  // HungRendererController
69
70
71@interface HungRendererController (JustForTesting)
72- (NSButton*)killButton;
73- (MultiKeyEquivalentButton*)waitButton;
74@end
75
76#endif  // CHROME_BROWSER_UI_COCOA_HUNG_RENDERER_CONTROLLER_H_
77