15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabStripModel;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ListSelectionModel;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TabStripModelObserver
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Objects implement this interface when they wish to be notified of changes
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  to the TabStripModel.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Two major implementers are the TabStrip, which uses notifications sent
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  via this interface to update the presentation of the strip, and the Browser
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  object, which updates bookkeeping and shows/hides individual WebContentses.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Register your TabStripModelObserver with the TabStripModel using its
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Add/RemoveObserver methods.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabStripModelObserver {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enumeration of the possible values supplied to TabChangedAt.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum TabChangeType {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Only the loading state changed.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOADING_ONLY,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Only the title changed and page isn't loading.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TITLE_NOT_LOADING,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Change not characterized by LOADING_ONLY or TITLE_NOT_LOADING.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ALL
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum ChangeReason {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Used to indicate that none of the reasons below are responsible for the
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // active tab change.
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CHANGE_REASON_NONE = 0,
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The active tab changed because the tab's web contents was replaced.
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CHANGE_REASON_REPLACED = 1 << 0,
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The active tab changed due to a user input event.
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CHANGE_REASON_USER_GESTURE = 1 << 1,
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A new WebContents was inserted into the TabStripModel at the
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified index. |foreground| is whether or not it was opened in the
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // foreground (selected).
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabInsertedAt(content::WebContents* contents,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int index,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             bool foreground);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The specified WebContents at |index| is being closed (and eventually
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destroyed). |tab_strip_model| is the TabStripModel that contained the tab.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabClosingAt(TabStripModel* tab_strip_model,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            content::WebContents* contents,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int index);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The specified WebContents at |index| is being detached, perhaps to
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be inserted in another TabStripModel. The implementer should take whatever
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // action is necessary to deal with the WebContents no longer being
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // present.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabDetachedAt(content::WebContents* contents, int index);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The active WebContents is about to change from |old_contents|.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This gives observers a chance to prepare for an impending switch before it
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happens.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TabDeactivated(content::WebContents* contents);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sent when the active tab changes. The previously active tab is identified
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by |old_contents| and the newly active tab by |new_contents|. |index| is
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the index of |new_contents|. If |reason| has CHANGE_REASON_REPLACED set
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // then the web contents was replaced (see TabChangedAt). If |reason| has
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // CHANGE_REASON_USER_GESTURE set then the web contents was changed due to a
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // user input event (e.g. clicking on a tab, keystroke).
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: It is possible for the selection to change while the active tab
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remains unchanged. For example, control-click may not change the active tab
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but does change the selection. In this case |ActiveTabChanged| is not sent.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If you care about any changes to the selection, override
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TabSelectionChanged.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: |old_contents| will be NULL if there was no contents previously
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // active.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActiveTabChanged(content::WebContents* old_contents,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                content::WebContents* new_contents,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int index,
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                int reason);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sent when the selection changes in |tab_strip_model|. More precisely when
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // selected tabs, anchor tab or active tab change. |old_model| is a snapshot
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the selection model before the change. See also ActiveTabChanged for
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // details.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabSelectionChanged(TabStripModel* tab_strip_model,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const ui::ListSelectionModel& old_model);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The specified WebContents at |from_index| was moved to |to_index|.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TabMoved(content::WebContents* contents,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int from_index,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int to_index);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The specified WebContents at |index| changed in some way. |contents|
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may be an entirely different object and the old value is no longer
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // available by the time this message is delivered.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See TabChangeType for a description of |change_type|.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TabChangedAt(content::WebContents* contents,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int index,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            TabChangeType change_type);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The WebContents was replaced at the specified index. This is invoked
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when instant is enabled and the user navigates by way of instant or when
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // prerendering swaps in a prerendered WebContents.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabReplacedAt(TabStripModel* tab_strip_model,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             content::WebContents* old_contents,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             content::WebContents* new_contents,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int index);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when the pinned state of a tab changes. See note in
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TabMiniStateChanged as to how this relates to TabMiniStateChanged.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabPinnedStateChanged(content::WebContents* contents, int index);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked if the mini state of a tab changes.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: This is sent when the pinned state of a non-app tab changes and is
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sent in addition to TabPinnedStateChanged. UI code typically need not care
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // about TabPinnedStateChanged, but instead this.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabMiniStateChanged(content::WebContents* contents, int index);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when the blocked state of a tab changes.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: This is invoked when a tab becomes blocked/unblocked by a tab modal
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabBlockedStateChanged(content::WebContents* contents,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int index);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The TabStripModel now no longer has any tabs. The implementer may
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use this as a trigger to try and close the window containing the
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TabStripModel, for example...
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabStripEmpty();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Sent any time an attempt is made to close all the tabs. This is not
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // necessarily the result of CloseAllTabs(). For example, if the user closes
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the last tab WillCloseAllTabs() is sent. If the close does not succeed
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // during the current event (say unload handlers block it) then
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // CloseAllTabsCanceled() is sent. Also note that if the last tab is detached
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // (DetachWebContentsAt()) then this is not sent.
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void WillCloseAllTabs();
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void CloseAllTabsCanceled();
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sent when the tabstrip model is about to be deleted and any reference held
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must be dropped.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabStripModelDeleted();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TabStripModelObserver() {}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_
167