blob: ec26ac19c07801af29e8f755fcbc9f71be17dee1 [file] [log] [blame]
// Copyright 2014 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_TAB_HELPERS_H_
#define CHROME_BROWSER_UI_TAB_HELPERS_H_
#include "build/build_config.h"
#if BUILDFLAG(IS_ANDROID)
namespace android {
class TabWebContentsDelegateAndroid;
}
namespace thin_webview {
namespace android {
class ChromeThinWebViewInitializer;
}
} // namespace thin_webview
#else
namespace chrome {
class BrowserTabStripModelDelegate;
} // namespace chrome
class PreviewTab;
#endif // BUILDFLAG(IS_ANDROID)
namespace content {
class WebContents;
}
namespace prerender {
class ChromeNoStatePrefetchContentsDelegate;
}
namespace tabs {
class TabModel;
} // namespace tabs
// A "tab contents" is a WebContents that is used as a tab in a browser window
// (or the equivalent on Android). The TabHelpers class allows specific classes
// to attach the set of tab helpers that is used for tab contents.
//
// https://chromium.googlesource.com/chromium/src/+/main/docs/tab_helpers.md
//
// WARNING: Do not use this class for desktop chrome. Use TabFeatures instead.
// WARNING: For Android, consider using TabFeatures instead of this class.
// See
// https://chromium.googlesource.com/chromium/src/+/main/docs/chrome_browser_design_principles.md
class TabHelpers {
private:
#if BUILDFLAG(IS_ANDROID)
// ThinWebView is used to host WebContents on non-tab UIs in Android. Most
// clients of ThinWebView will need a major subset of the tab helpers.
friend class thin_webview::android::ChromeThinWebViewInitializer;
friend class TabAndroid;
friend class android::TabWebContentsDelegateAndroid;
#else
friend class Browser;
friend class chrome::BrowserTabStripModelDelegate;
friend class tabs::TabModel;
#endif // BUILDFLAG(IS_ANDROID)
// chrome::Navigate creates WebContents that are destined for the tab strip,
// and that might have WebUI that immediately calls back into random tab
// helpers.
friend class BrowserNavigatorWebContentsAdoption;
// NoStatePrefetch and Prerendering load pages that have arbitrary external
// content; they need the full set of tab helpers to deal with it.
friend class prerender::ChromeNoStatePrefetchContentsDelegate;
friend class PrerenderWebContentsDelegateImpl;
// Link Preview shows a preview of a page, then promote it as a new tab.
friend class PreviewTab;
// FYI: Do NOT add any more friends here. The functions above are the ONLY
// ones that need to call AttachTabHelpers; if you think you do, re-read the
// design document linked above, especially the section "Reusing tab helpers".
// Adopts the specified WebContents as a full-fledged browser tab, attaching
// all the associated tab helpers that are needed for the WebContents to
// serve in that role. It is safe to call this on a WebContents that was
// already adopted.
static void AttachTabHelpers(content::WebContents* web_contents);
};
#endif // CHROME_BROWSER_UI_TAB_HELPERS_H_