1// Copyright 2014 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_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_
6#define CHROME_BROWSER_UI_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
10#include "content/public/browser/notification_observer.h"
11#include "content/public/browser/notification_registrar.h"
12#include "content/public/browser/web_contents_observer.h"
13#include "ui/views/bubble/bubble_delegate.h"
14#include "ui/views/controls/button/button.h"
15#include "ui/views/controls/styled_label_listener.h"
16
17namespace views {
18class Checkbox;
19class GridLayout;
20class LabelButton;
21class Widget;
22}
23
24namespace content {
25class WebContents;
26class RenderViewHost;
27}
28
29class Browser;
30
31// It creates a session restore request bubble when the previous session has
32// crashed. It also presents an option to enable metrics reporting, if it not
33// enabled already.
34class SessionCrashedBubbleView
35    : public views::BubbleDelegateView,
36      public views::ButtonListener,
37      public views::StyledLabelListener,
38      public content::WebContentsObserver,
39      public content::NotificationObserver,
40      public TabStripModelObserver {
41 public:
42  static void Show(Browser* browser);
43
44 private:
45  // A helper class that listens to browser removal event.
46  class BrowserRemovalObserver;
47
48  SessionCrashedBubbleView(views::View* anchor_view,
49                           Browser* browser,
50                           content::WebContents* web_contents,
51                           bool offer_uma_optin);
52  virtual ~SessionCrashedBubbleView();
53
54  // Creates and shows the session crashed bubble, with |uma_opted_in_already|
55  // indicating whether the user has already opted-in to UMA. It will be called
56  // by Show. It takes ownership of |browser_observer|.
57  static void ShowForReal(scoped_ptr<BrowserRemovalObserver> browser_observer,
58                          bool uma_opted_in_already);
59
60  // WidgetDelegateView methods.
61  virtual views::View* GetInitiallyFocusedView() OVERRIDE;
62  virtual base::string16 GetWindowTitle() const OVERRIDE;
63  virtual bool ShouldShowWindowTitle() const OVERRIDE;
64  virtual bool ShouldShowCloseButton() const OVERRIDE;
65  virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
66
67  // views::BubbleDelegateView methods.
68  virtual void Init() OVERRIDE;
69
70  // views::ButtonListener methods.
71  virtual void ButtonPressed(views::Button* sender,
72                             const ui::Event& event) OVERRIDE;
73
74  // views::StyledLabelListener methods.
75  virtual void StyledLabelLinkClicked(const gfx::Range& range,
76                                      int event_flags) OVERRIDE;
77
78  // content::WebContentsObserver methods.
79  virtual void DidStartNavigationToPendingEntry(
80      const GURL& url,
81      content::NavigationController::ReloadType reload_type) OVERRIDE;
82  virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host,
83                             const GURL& validated_url) OVERRIDE;
84  virtual void WasShown() OVERRIDE;
85  virtual void WasHidden() OVERRIDE;
86
87  // content::NotificationObserver methods.
88  virtual void Observe(
89      int type,
90      const content::NotificationSource& source,
91      const content::NotificationDetails& details) OVERRIDE;
92
93  // TabStripModelObserver methods.
94  // When the tab with current bubble is being dragged and dropped to a new
95  // window or to another window, the bubble will be dismissed as if the user
96  // chose not to restore the previous session.
97  virtual void TabDetachedAt(
98      content::WebContents* contents,
99      int index) OVERRIDE;
100
101  // Create the view for the user to opt in to UMA.
102  views::View* CreateUMAOptinView();
103
104  // Restore previous session after user selects so.
105  void RestorePreviousSession(views::Button* sender);
106
107  // Close and destroy the bubble.
108  void CloseBubble();
109
110  content::NotificationRegistrar registrar_;
111
112  // Used for opening the question mark link as well as access the tab strip.
113  Browser* browser_;
114
115  // The web content associated with current bubble.
116  content::WebContents* web_contents_;
117
118  // Button for the user to confirm a session restore.
119  views::LabelButton* restore_button_;
120
121  // Checkbox for the user to opt-in to UMA reporting.
122  views::Checkbox* uma_option_;
123
124  // Whether or not the UMA opt-in option should be shown.
125  bool offer_uma_optin_;
126
127  // Whether or not a navigation has started on current tab.
128  bool started_navigation_;
129
130  // Whether or not the user chose to restore previous session. It is used to
131  // collect bubble usage stats.
132  bool restored_;
133
134  DISALLOW_COPY_AND_ASSIGN(SessionCrashedBubbleView);
135};
136
137#endif  // CHROME_BROWSER_UI_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_
138