chromium/ios/chrome/browser/tabs/model/tab_helper_util.h

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_BROWSER_TABS_MODEL_TAB_HELPER_UTIL_H_
#define IOS_CHROME_BROWSER_TABS_MODEL_TAB_HELPER_UTIL_H_

#import <type_traits>

namespace web {
class WebState;
}

// A bitmask to filter the tab helpers attached in `AttachTabHelpers`.
enum class TabHelperFilter {
  // No filter.
  kEmpty = 0,
  // Filter out tab helpers that are not needed during prerendering.
  kPrerender = 1 << 0,
  // Filter out tab helpers that are not needed when the web state
  // is presented in a bottom sheet (BVC's toolbars are covered).
  kBottomSheet = 1 << 1,
};

// Implementation of bitwise "or", "and" operators (as those are not
// automatically defined for "class enum").
constexpr TabHelperFilter operator|(TabHelperFilter lhs, TabHelperFilter rhs) {
  return static_cast<TabHelperFilter>(
      static_cast<std::underlying_type<TabHelperFilter>::type>(lhs) |
      static_cast<std::underlying_type<TabHelperFilter>::type>(rhs));
}

constexpr TabHelperFilter operator&(TabHelperFilter lhs, TabHelperFilter rhs) {
  return static_cast<TabHelperFilter>(
      static_cast<std::underlying_type<TabHelperFilter>::type>(lhs) &
      static_cast<std::underlying_type<TabHelperFilter>::type>(rhs));
}

// Attaches tab helpers to WebState. Filter the attached tab helpers with
// `filter_flags`. This function is idempotent, so it is okay to call it
// multiple times for the same WebState. When called with a different
// `filter_flags` value, the right thing (adding helpers that weren't added in
// the prior call) will happen, although tab helpers will never be removed.
void AttachTabHelpers(web::WebState* web_state,
                      TabHelperFilter filter_flags = TabHelperFilter::kEmpty);

#endif  // IOS_CHROME_BROWSER_TABS_MODEL_TAB_HELPER_UTIL_H_