// 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_H_ #define CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_H_ #include <stddef.h> #include <stdint.h> #include <map> #include <memory> #include <optional> #include <string> #include <variant> #include <vector> #include "base/containers/span.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/scoped_multi_source_observation.h" #include "base/scoped_observation.h" #include "build/build_config.h" #include "chrome/browser/ui/tabs/tab_group_controller.h" #include "chrome/browser/ui/tabs/tab_model.h" #include "chrome/browser/ui/tabs/tab_strip_scrubbing_metrics.h" #include "chrome/browser/ui/tabs/tab_strip_user_gesture_details.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" #include "ui/base/page_transition_types.h" #if BUILDFLAG(IS_ANDROID) #error This file should only be included on desktop. #endif class Profile; class TabContentsData; class TabGroupModel; class TabStripModelDelegate; class TabStripModelObserver; class TabDragController; namespace content { class WebContents; } class TabGroupModelFactory { … }; // Holds state for a WebContents that has been detached from the tab strip. // Will also handle WebContents deletion if |remove_reason| is kDeleted, or // WebContents caching if |remove_reason| is kCached. struct DetachedWebContents { … }; // A feature which wants to show tabstrip-modal UI should call // TabStripController::ShowModalUI and keep alive the instance of // ScopedTabStripModalUI for the duration of the tabstrip-modal UI. class ScopedTabStripModalUI { … }; //////////////////////////////////////////////////////////////////////////////// // // TabStripModel // // A model & low level controller of a Browser Window tabstrip. Holds a vector // of WebContents, and provides an API for adding, removing and // shuffling them, as well as a higher level API for doing specific Browser- // related tasks like adding new Tabs from just a URL, etc. // // Each tab may be pinned. Pinned tabs are locked to the left side of the tab // strip and rendered differently (small tabs with only a favicon). The model // makes sure all pinned tabs are at the beginning of the tab strip. For // example, if a non-pinned tab is added it is forced to be with non-pinned // tabs. Requests to move tabs outside the range of the tab type are ignored. // For example, a request to move a pinned tab after non-pinned tabs is ignored. // // A TabStripModel has one delegate that it relies on to perform certain tasks // like creating new TabStripModels (probably hosted in Browser windows) when // required. See TabStripDelegate above for more information. // // A TabStripModel also has N observers (see TabStripModelObserver above), // which can be registered via Add/RemoveObserver. An Observer is notified of // tab creations, removals, moves, and other interesting events. The // TabStrip implements this interface to know when to create new tabs in // the View, and the Browser object likewise implements to be able to update // its bookkeeping when such events happen. // // This implementation of TabStripModel is not thread-safe and should only be // accessed on the UI thread. // //////////////////////////////////////////////////////////////////////////////// class TabStripModel : public TabGroupController { … }; // Forbid construction of ScopedObservation and ScopedMultiSourceObservation // with TabStripModel: TabStripModelObserver already implements their // functionality natively. namespace base { template <> class ScopedObservation<TabStripModel, TabStripModelObserver> { … }; template <> class ScopedMultiSourceObservation<TabStripModel, TabStripModelObserver> { … }; } // namespace base #endif // CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_H_