session_crashed_bubble_view.h revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
116c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// Copyright 2014 The Chromium Authors. All rights reserved.
216c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// Use of this source code is governed by a BSD-style license that can be
316c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// found in the LICENSE file.
416c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
516c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#ifndef CHROME_BROWSER_UI_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_
616c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#define CHROME_BROWSER_UI_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_
716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
816c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
916c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "content/public/browser/notification_observer.h"
102e331b938b38057e333fab0ba841130ea8467794Douglas Gregor#include "content/public/browser/notification_registrar.h"
112e331b938b38057e333fab0ba841130ea8467794Douglas Gregor#include "content/public/browser/web_contents_observer.h"
122e331b938b38057e333fab0ba841130ea8467794Douglas Gregor#include "ui/views/bubble/bubble_delegate.h"
1316c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "ui/views/controls/button/button.h"
1416c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "ui/views/controls/link_listener.h"
1516c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
160a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremeneknamespace views {
1716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenekclass Checkbox;
18ed122735639d83c10f18c28c7fd117bfcd0f62cbTed Kremenekclass GridLayout;
197eaa8ae8692c5cd3eed8cb334fe5346470522091Douglas Gregorclass LabelButton;
2016c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenekclass Widget;
216931900f43cea558c6974075256c07728dbfecc6Douglas Gregor}
22283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregor
23283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregornamespace content {
241f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregorclass WebContents;
25007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenekclass RenderViewHost;
26edc8aa68ef91aeea686c5aadf64ef902c38318ddTed Kremenek}
2716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
2816c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenekclass Browser;
291f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
3016c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// It creates a session restore request bubble when the previous session has
315bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregor// crashed. It also presents an option to enable metrics reporting, if it not
325bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregor// enabled already.
335bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregorclass SessionCrashedBubbleView
345bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregor    : public views::BubbleDelegateView,
3516c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek      public views::ButtonListener,
3616c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek      public views::LinkListener,
37e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek      public content::WebContentsObserver,
38e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek      public content::NotificationObserver,
39e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek      public TabStripModelObserver {
40e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek public:
41387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static void Show(Browser* browser);
42387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt
43387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt private:
44e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek  SessionCrashedBubbleView(views::View* anchor_view,
45e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek                           Browser* browser,
46e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek                           content::WebContents* web_contents);
47e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek  virtual ~SessionCrashedBubbleView();
48e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek
49a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek  // WidgetDelegateView methods.
50a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek  virtual views::View* GetInitiallyFocusedView() OVERRIDE;
51e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek
52e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek  // views::BubbleDelegateView methods.
53e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek  virtual void Init() OVERRIDE;
54e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek
55e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek  // views::ButtonListener methods.
56a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek  virtual void ButtonPressed(views::Button* sender,
57007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenek                             const ui::Event& event) OVERRIDE;
5854d67caeee4fdce81f07163832f1163d5f2af5d2Daniel Dunbar
59007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenek  // views::LinkListener methods.
60dec0984fce504a39a7f085774fb67cfd9957be58Jeffrey Yasskin  virtual void LinkClicked(views::Link* source, int event_floags) OVERRIDE;
61007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenek
625bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregor  // content::WebContentsObserver methods.
63edc8aa68ef91aeea686c5aadf64ef902c38318ddTed Kremenek  virtual void DidStartNavigationToPendingEntry(
64edc8aa68ef91aeea686c5aadf64ef902c38318ddTed Kremenek      const GURL& url,
65a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek      content::NavigationController::ReloadType reload_type) OVERRIDE;
66a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek  virtual void DidFinishLoad(
6754d67caeee4fdce81f07163832f1163d5f2af5d2Daniel Dunbar      int64 frame_id,
6897b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor      const GURL& validated_url,
6997b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor      bool is_main_frame,
7097b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor      content::RenderViewHost* render_view_host) OVERRIDE;
7197b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  virtual void WasShown() OVERRIDE;
7297b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  virtual void WasHidden() OVERRIDE;
7397b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
7497b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // content::NotificationObserver methods.
7597b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  virtual void Observe(
7697b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor      int type,
7797b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor      const content::NotificationSource& source,
7897b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor      const content::NotificationDetails& details) OVERRIDE;
7997b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
8097b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // TabStripModelObserver methods.
8197b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // When the tab with current bubble is being dragged and dropped to a new
8297b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // window or to another window, the bubble will be dismissed as if the user
8397b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // chose not to restore the previous session.
8497b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  virtual void TabDetachedAt(
8597b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor      content::WebContents* contents,
8697b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor      int index) OVERRIDE;
8797b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
8897b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // Create the view for user to opt in to Uma.
8997b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  void CreateUmaOptinView(views::GridLayout* layout);
9097b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
9197b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // Restore previous session after user selects so.
9297b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  void RestorePreviousSession(views::Button* sender);
9397b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
9497b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // Close and destroy the bubble.
95f85e193739c953358c865005855253af4f68a497John McCall  void CloseBubble();
9697b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
9797b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  content::NotificationRegistrar registrar_;
9897b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
99ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  // Used for opening the question mark link as well as access the tab strip.
10028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Browser* browser_;
10128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
10228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  // The web content associated with current bubble.
10303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  content::WebContents* web_contents_;
10497b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
10597b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // Button for the user to confirm a session restore.
10697b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  views::LabelButton* restore_button_;
10736897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor
10836897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor  // Button for the user to close this bubble.
10936897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor  views::LabelButton* close_;
11036897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor
11197b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // Checkbox for the user to opt-in to UMA reporting.
11297b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  views::Checkbox* uma_option_;
11397b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
11497b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  // Whether or not a navigation has started on current tab.
11597b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  bool started_navigation_;
11697b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor
11797b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor  DISALLOW_COPY_AND_ASSIGN(SessionCrashedBubbleView);
1188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor};
1198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
120f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne#endif  // CHROME_BROWSER_UI_VIEWS_SESSION_CRASHED_BUBBLE_VIEW_H_
12197b9872d5775446cb8aca1380e437649fe848d91Douglas Gregor