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