// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_UI_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_ #include "base/memory/scoped_ptr.h" #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/web_contents_observer.h" #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/styled_label_listener.h" namespace views { class Checkbox; class GridLayout; class LabelButton; class Widget; } namespace content { class WebContents; class RenderViewHost; } class Browser; // It creates a session restore request bubble when the previous session has // crashed. It also presents an option to enable metrics reporting, if it not // enabled already. class SessionCrashedBubbleView : public views::BubbleDelegateView, public views::ButtonListener, public views::StyledLabelListener, public content::WebContentsObserver, public content::NotificationObserver, public TabStripModelObserver { public: static void Show(Browser* browser); private: // A helper class that listens to browser removal event. class BrowserRemovalObserver; SessionCrashedBubbleView(views::View* anchor_view, Browser* browser, content::WebContents* web_contents, bool offer_uma_optin); virtual ~SessionCrashedBubbleView(); // Creates and shows the session crashed bubble, with |uma_opted_in_already| // indicating whether the user has already opted-in to UMA. It will be called // by Show. It takes ownership of |browser_observer|. static void ShowForReal(scoped_ptr browser_observer, bool uma_opted_in_already); // WidgetDelegateView methods. virtual views::View* GetInitiallyFocusedView() OVERRIDE; virtual base::string16 GetWindowTitle() const OVERRIDE; virtual bool ShouldShowWindowTitle() const OVERRIDE; virtual bool ShouldShowCloseButton() const OVERRIDE; virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE; // views::BubbleDelegateView methods. virtual void Init() OVERRIDE; // views::ButtonListener methods. virtual void ButtonPressed(views::Button* sender, const ui::Event& event) OVERRIDE; // views::StyledLabelListener methods. virtual void StyledLabelLinkClicked(const gfx::Range& range, int event_flags) OVERRIDE; // content::WebContentsObserver methods. virtual void DidStartNavigationToPendingEntry( const GURL& url, content::NavigationController::ReloadType reload_type) OVERRIDE; virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url) OVERRIDE; virtual void WasShown() OVERRIDE; virtual void WasHidden() OVERRIDE; // content::NotificationObserver methods. virtual void Observe( int type, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; // TabStripModelObserver methods. // When the tab with current bubble is being dragged and dropped to a new // window or to another window, the bubble will be dismissed as if the user // chose not to restore the previous session. virtual void TabDetachedAt( content::WebContents* contents, int index) OVERRIDE; // Create the view for the user to opt in to UMA. views::View* CreateUMAOptinView(); // Restore previous session after user selects so. void RestorePreviousSession(views::Button* sender); // Close and destroy the bubble. void CloseBubble(); content::NotificationRegistrar registrar_; // Used for opening the question mark link as well as access the tab strip. Browser* browser_; // The web content associated with current bubble. content::WebContents* web_contents_; // Button for the user to confirm a session restore. views::LabelButton* restore_button_; // Checkbox for the user to opt-in to UMA reporting. views::Checkbox* uma_option_; // Whether or not the UMA opt-in option should be shown. bool offer_uma_optin_; // Whether or not a navigation has started on current tab. bool started_navigation_; // Whether or not the user chose to restore previous session. It is used to // collect bubble usage stats. bool restored_; DISALLOW_COPY_AND_ASSIGN(SessionCrashedBubbleView); }; #endif // CHROME_BROWSER_UI_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_