// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_ #define CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_ #include <memory> #include <optional> #include <set> #include <vector> #include "base/memory/raw_ptr.h" #include "chrome/browser/ui/tabs/tab_change_type.h" #include "components/sessions/core/session_id.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" #include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h" #include "ui/base/models/list_selection_model.h" class TabStripModel; namespace content { class WebContents; } namespace tabs { class TabModel; } //////////////////////////////////////////////////////////////////////////////// // // TabStripModelChange / TabStripSelectionChange // // This observer is not appropriate for most use cases. It's primarily used for // features that must directly interface with the tab strip, for example: tab // groups, tab search, etc. // Most features in Chrome need to hold state on a per-tab basis. In that case, // add a controller to TabFeatures and use TabInterface to observe for the tab // events. // // The following class and structures are used to inform TabStripModelObservers // of changes to: // 1) selection model // 2) activated tab // 3) inserted/removed/moved tabs. // These changes must be bundled together because (1) and (2) consist of indices // into a list of tabs [determined by (3)]. All three must be kept synchronized. // //////////////////////////////////////////////////////////////////////////////// class TabStripModelChange { … }; // Struct to carry changes on selection/activation. struct TabStripSelectionChange { … }; // Struct to carry changes to tab groups. The tab group model is independent of // the tab strip model, so these changes are not bundled with // TabStripModelChanges or TabStripSelectionChanges. struct TabGroupChange { … }; //////////////////////////////////////////////////////////////////////////////// // // TabStripModelObserver // // Objects implement this interface when they wish to be notified of changes // to the TabStripModel. // // Two major implementers are the TabStrip, which uses notifications sent // via this interface to update the presentation of the strip, and the Browser // object, which updates bookkeeping and shows/hides individual WebContentses. // // Register your TabStripModelObserver with the TabStripModel using its // Add/RemoveObserver methods. // //////////////////////////////////////////////////////////////////////////////// class TabStripModelObserver { … }; #endif // CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_OBSERVER_H_