Home | History | Annotate | Download | only in cocoa
      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