Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / tabs / tab_strip_model_observer.h
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_TABS_TAB_STRIP_MODEL_OBSERVER_H_
6 #define CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_
7
8 class TabStripModel;
9
10 namespace content {
11 class WebContents;
12 }
13
14 namespace ui {
15 class ListSelectionModel;
16 }
17
18 ////////////////////////////////////////////////////////////////////////////////
19 //
20 // TabStripModelObserver
21 //
22 //  Objects implement this interface when they wish to be notified of changes
23 //  to the TabStripModel.
24 //
25 //  Two major implementers are the TabStrip, which uses notifications sent
26 //  via this interface to update the presentation of the strip, and the Browser
27 //  object, which updates bookkeeping and shows/hides individual WebContentses.
28 //
29 //  Register your TabStripModelObserver with the TabStripModel using its
30 //  Add/RemoveObserver methods.
31 //
32 ////////////////////////////////////////////////////////////////////////////////
33 class TabStripModelObserver {
34  public:
35   // Enumeration of the possible values supplied to TabChangedAt.
36   enum TabChangeType {
37     // Only the loading state changed.
38     LOADING_ONLY,
39
40     // Only the title changed and page isn't loading.
41     TITLE_NOT_LOADING,
42
43     // Change not characterized by LOADING_ONLY or TITLE_NOT_LOADING.
44     ALL
45   };
46
47   enum ChangeReason {
48     // Used to indicate that none of the reasons below are responsible for the
49     // active tab change.
50     CHANGE_REASON_NONE = 0,
51     // The active tab changed because the tab's web contents was replaced.
52     CHANGE_REASON_REPLACED = 1 << 0,
53     // The active tab changed due to a user input event.
54     CHANGE_REASON_USER_GESTURE = 1 << 1,
55   };
56
57   // A new WebContents was inserted into the TabStripModel at the
58   // specified index. |foreground| is whether or not it was opened in the
59   // foreground (selected).
60   virtual void TabInsertedAt(content::WebContents* contents,
61                              int index,
62                              bool foreground);
63
64   // The specified WebContents at |index| is being closed (and eventually
65   // destroyed). |tab_strip_model| is the TabStripModel that contained the tab.
66   virtual void TabClosingAt(TabStripModel* tab_strip_model,
67                             content::WebContents* contents,
68                             int index);
69
70   // The specified WebContents at |index| is being detached, perhaps to
71   // be inserted in another TabStripModel. The implementer should take whatever
72   // action is necessary to deal with the WebContents no longer being
73   // present.
74   virtual void TabDetachedAt(content::WebContents* contents, int index);
75
76   // The active WebContents is about to change from |old_contents|.
77   // This gives observers a chance to prepare for an impending switch before it
78   // happens.
79   virtual void TabDeactivated(content::WebContents* contents);
80
81   // Sent when the active tab changes. The previously active tab is identified
82   // by |old_contents| and the newly active tab by |new_contents|. |index| is
83   // the index of |new_contents|. If |reason| has CHANGE_REASON_REPLACED set
84   // then the web contents was replaced (see TabChangedAt). If |reason| has
85   // CHANGE_REASON_USER_GESTURE set then the web contents was changed due to a
86   // user input event (e.g. clicking on a tab, keystroke).
87   // Note: It is possible for the selection to change while the active tab
88   // remains unchanged. For example, control-click may not change the active tab
89   // but does change the selection. In this case |ActiveTabChanged| is not sent.
90   // If you care about any changes to the selection, override
91   // TabSelectionChanged.
92   // Note: |old_contents| will be NULL if there was no contents previously
93   // active.
94   virtual void ActiveTabChanged(content::WebContents* old_contents,
95                                 content::WebContents* new_contents,
96                                 int index,
97                                 int reason);
98
99   // Sent when the selection changes in |tab_strip_model|. More precisely when
100   // selected tabs, anchor tab or active tab change. |old_model| is a snapshot
101   // of the selection model before the change. See also ActiveTabChanged for
102   // details.
103   virtual void TabSelectionChanged(TabStripModel* tab_strip_model,
104                                    const ui::ListSelectionModel& old_model);
105
106   // The specified WebContents at |from_index| was moved to |to_index|.
107   virtual void TabMoved(content::WebContents* contents,
108                         int from_index,
109                         int to_index);
110
111   // The specified WebContents at |index| changed in some way. |contents|
112   // may be an entirely different object and the old value is no longer
113   // available by the time this message is delivered.
114   //
115   // See TabChangeType for a description of |change_type|.
116   virtual void TabChangedAt(content::WebContents* contents,
117                             int index,
118                             TabChangeType change_type);
119
120   // The WebContents was replaced at the specified index. This is invoked
121   // when instant is enabled and the user navigates by way of instant or when
122   // prerendering swaps in a prerendered WebContents.
123   virtual void TabReplacedAt(TabStripModel* tab_strip_model,
124                              content::WebContents* old_contents,
125                              content::WebContents* new_contents,
126                              int index);
127
128   // Invoked when the pinned state of a tab changes. See note in
129   // TabMiniStateChanged as to how this relates to TabMiniStateChanged.
130   virtual void TabPinnedStateChanged(content::WebContents* contents, int index);
131
132   // Invoked if the mini state of a tab changes.
133   // NOTE: This is sent when the pinned state of a non-app tab changes and is
134   // sent in addition to TabPinnedStateChanged. UI code typically need not care
135   // about TabPinnedStateChanged, but instead this.
136   virtual void TabMiniStateChanged(content::WebContents* contents, int index);
137
138   // Invoked when the blocked state of a tab changes.
139   // NOTE: This is invoked when a tab becomes blocked/unblocked by a tab modal
140   // window.
141   virtual void TabBlockedStateChanged(content::WebContents* contents,
142                                       int index);
143
144   // The TabStripModel now no longer has any tabs. The implementer may
145   // use this as a trigger to try and close the window containing the
146   // TabStripModel, for example...
147   virtual void TabStripEmpty();
148
149   // Sent any time an attempt is made to close all the tabs. This is not
150   // necessarily the result of CloseAllTabs(). For example, if the user closes
151   // the last tab WillCloseAllTabs() is sent. If the close does not succeed
152   // during the current event (say unload handlers block it) then
153   // CloseAllTabsCanceled() is sent. Also note that if the last tab is detached
154   // (DetachWebContentsAt()) then this is not sent.
155   virtual void WillCloseAllTabs();
156   virtual void CloseAllTabsCanceled();
157
158   // Sent when the tabstrip model is about to be deleted and any reference held
159   // must be dropped.
160   virtual void TabStripModelDeleted();
161
162  protected:
163   virtual ~TabStripModelObserver() {}
164 };
165
166 #endif  // CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_