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: ~TabStripModelObserver()163 virtual ~TabStripModelObserver() {} 164 }; 165 166 #endif // CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_ 167