Commit 47770a25 authored by Peter Boström's avatar Peter Boström Committed by Commit Bot

Dynamically enable/disable WebUI tab strip

This change keys off of ui::MaterialDesignController::touch_ui().

Bug: chromium:1024013
Change-Id: Ic22087009c21a57b4616c333f652b5fa5a03f63f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1914533
Commit-Queue: Peter Boström <pbos@chromium.org>
Reviewed-by: default avatarTaylor Bergquist <tbergquist@chromium.org>
Cr-Commit-Position: refs/heads/master@{#715308}
parent 7ab60f67
......@@ -67,6 +67,10 @@
#include "ui/views/widget/widget_delegate.h"
#include "ui/views/window/caption_button_layout_constants.h"
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
#include "chrome/browser/ui/views/frame/webui_tab_strip_container_view.h"
#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
namespace {
// Color for the window title text.
......@@ -657,7 +661,7 @@ bool BrowserNonClientFrameViewAsh::ShouldPaint() const {
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
// Normal windows that have a WebUI-based tab strip do not need a browser
// frame as no tab strip is drawn on top of the browser frame.
if (base::FeatureList::IsEnabled(features::kWebUITabStrip) &&
if (WebUITabStripContainerView::UseTouchableTabStrip() &&
browser_view()->IsBrowserTypeNormal()) {
return false;
}
......
......@@ -425,6 +425,7 @@ BrowserView::BrowserView(std::unique_ptr<Browser> browser)
: views::ClientView(nullptr, nullptr), browser_(std::move(browser)) {
browser_->tab_strip_model()->AddObserver(this);
immersive_mode_controller_ = chrome::CreateImmersiveModeController();
md_observer_.Add(ui::MaterialDesignController::GetInstance());
}
BrowserView::~BrowserView() {
......@@ -547,7 +548,7 @@ bool BrowserView::IsTabStripVisible() const {
return false;
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
if (base::FeatureList::IsEnabled(features::kWebUITabStrip))
if (WebUITabStripContainerView::UseTouchableTabStrip())
return false;
#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
......@@ -2010,7 +2011,7 @@ BrowserView::GetNativeViewHostsForTopControlsSlide() const {
results.push_back(contents_web_view_->holder());
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
if (base::FeatureList::IsEnabled(features::kWebUITabStrip))
if (webui_tab_strip_)
results.push_back(webui_tab_strip_->GetNativeViewHost());
#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
......@@ -2591,22 +2592,6 @@ void BrowserView::InitViews() {
contents_container_->SetLayoutManager(std::make_unique<ContentsLayoutManager>(
devtools_web_view_, contents_web_view_));
views::View* webui_tab_strip_view = nullptr;
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
if (base::FeatureList::IsEnabled(features::kWebUITabStrip)) {
// We use |contents_container_| here so that enabling or disabling
// devtools won't affect the tab sizes. We still use only
// |contents_web_view_| for screenshotting and will adjust the
// screenshot accordingly. Ideally, the thumbnails should be sized
// based on a typical tab size, ignoring devtools or e.g. the
// downloads bar.
webui_tab_strip_ = top_container_->AddChildView(
std::make_unique<WebUITabStripContainerView>(browser_.get(),
contents_container_));
webui_tab_strip_view = webui_tab_strip_;
}
#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
toolbar_ = top_container_->AddChildView(
std::make_unique<ToolbarView>(browser_.get(), this));
toolbar_->Init();
......@@ -2650,8 +2635,8 @@ void BrowserView::InitViews() {
auto browser_view_layout = std::make_unique<BrowserViewLayout>(
std::make_unique<BrowserViewLayoutDelegateImpl>(this),
GetWidget()->GetNativeView(), this, top_container_,
tab_strip_region_view_, tabstrip_, webui_tab_strip_view, toolbar_,
infobar_container_, contents_container_, immersive_mode_controller_.get(),
tab_strip_region_view_, tabstrip_, toolbar_, infobar_container_,
contents_container_, immersive_mode_controller_.get(),
web_footer_experiment, contents_separator_);
SetLayoutManager(std::move(browser_view_layout));
......@@ -2668,6 +2653,33 @@ void BrowserView::InitViews() {
frame_->OnBrowserViewInitViewsComplete();
frame_->GetFrameView()->UpdateMinimumSize();
using_native_frame_ = frame_->ShouldUseNativeFrame();
MaybeInitializeWebUITabStrip();
}
void BrowserView::MaybeInitializeWebUITabStrip() {
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
if (WebUITabStripContainerView::UseTouchableTabStrip()) {
if (!webui_tab_strip_) {
// We use |contents_container_| here so that enabling or disabling
// devtools won't affect the tab sizes. We still use only
// |contents_web_view_| for screenshotting and will adjust the
// screenshot accordingly. Ideally, the thumbnails should be sized
// based on a typical tab size, ignoring devtools or e.g. the
// downloads bar.
webui_tab_strip_ = top_container_->AddChildView(
std::make_unique<WebUITabStripContainerView>(browser_.get(),
contents_container_));
}
} else if (webui_tab_strip_) {
top_container_->RemoveChildView(webui_tab_strip_);
delete webui_tab_strip_;
webui_tab_strip_ = nullptr;
}
GetBrowserViewLayout()->set_webui_tab_strip(webui_tab_strip_);
if (toolbar_)
toolbar_->UpdateForWebUITabStrip();
#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
}
void BrowserView::LoadingAnimationCallback() {
......@@ -3246,6 +3258,12 @@ void BrowserView::OnImmersiveModeControllerDestroyed() {
ReparentTopContainerForEndOfImmersive();
}
///////////////////////////////////////////////////////////////////////////////
// BrowserView, ui::MaterialDesignControllerObserver implementation:
void BrowserView::OnTouchUiChanged() {
MaybeInitializeWebUITabStrip();
}
///////////////////////////////////////////////////////////////////////////////
// BrowserView, banners::AppBannerManager::Observer implementation:
void BrowserView::OnAppBannerManagerChanged(
......
......@@ -42,6 +42,8 @@
#include "chrome/common/buildflags.h"
#include "components/infobars/core/infobar_container.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/material_design/material_design_controller.h"
#include "ui/base/material_design/material_design_controller_observer.h"
#include "ui/base/models/simple_menu_model.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/controls/button/button.h"
......@@ -104,6 +106,7 @@ class BrowserView : public BrowserWindow,
public ExclusiveAccessBubbleViewsContext,
public extensions::ExtensionKeybindingRegistry::Delegate,
public ImmersiveModeController::Observer,
public ui::MaterialDesignControllerObserver,
public banners::AppBannerManager::Observer {
public:
// The browser view's class name.
......@@ -528,6 +531,9 @@ class BrowserView : public BrowserWindow,
void OnImmersiveFullscreenExited() override;
void OnImmersiveModeControllerDestroyed() override;
// ui::MaterialDesignControllerObserver:
void OnTouchUiChanged() override;
// banners::AppBannerManager::Observer:
void OnAppBannerManagerChanged(
banners::AppBannerManager* new_manager) override;
......@@ -570,6 +576,9 @@ class BrowserView : public BrowserWindow,
// Constructs and initializes the child views.
void InitViews();
// Make sure the WebUI tab strip exists if it should.
void MaybeInitializeWebUITabStrip();
// Callback for the loading animation(s) associated with this view.
void LoadingAnimationCallback();
......@@ -826,6 +835,10 @@ class BrowserView : public BrowserWindow,
std::unique_ptr<ImmersiveModeController> immersive_mode_controller_;
ScopedObserver<ui::MaterialDesignController,
ui::MaterialDesignControllerObserver>
md_observer_{this};
std::unique_ptr<WebContentsCloseHandler> web_contents_close_handler_;
// The class that registers for keyboard shortcuts for extension commands.
......
......@@ -126,7 +126,6 @@ BrowserViewLayout::BrowserViewLayout(
views::View* top_container,
views::View* tab_strip_region_view,
TabStrip* tab_strip,
views::View* webui_tab_strip,
views::View* toolbar,
InfoBarContainerView* infobar_container,
views::View* contents_container,
......@@ -138,7 +137,6 @@ BrowserViewLayout::BrowserViewLayout(
browser_view_(browser_view),
top_container_(top_container),
tab_strip_region_view_(tab_strip_region_view),
webui_tab_strip_(webui_tab_strip),
toolbar_(toolbar),
infobar_container_(infobar_container),
contents_container_(contents_container),
......
......@@ -54,7 +54,6 @@ class BrowserViewLayout : public views::LayoutManager {
views::View* top_container,
views::View* tab_strip_region_view,
TabStrip* tab_strip,
views::View* webui_tab_strip,
views::View* toolbar,
InfoBarContainerView* infobar_container,
views::View* contents_container,
......@@ -65,6 +64,9 @@ class BrowserViewLayout : public views::LayoutManager {
// Sets or updates views that are not available when |this| is initialized.
void set_tab_strip(TabStrip* tab_strip) { tab_strip_ = tab_strip; }
void set_webui_tab_strip(views::View* webui_tab_strip) {
webui_tab_strip_ = webui_tab_strip;
}
void set_bookmark_bar(BookmarkBarView* bookmark_bar) {
bookmark_bar_ = bookmark_bar;
}
......@@ -144,7 +146,6 @@ class BrowserViewLayout : public views::LayoutManager {
// testing much easier.
views::View* const top_container_;
views::View* const tab_strip_region_view_;
views::View* const webui_tab_strip_;
views::View* const toolbar_;
InfoBarContainerView* const infobar_container_;
views::View* const contents_container_;
......@@ -152,6 +153,7 @@ class BrowserViewLayout : public views::LayoutManager {
views::View* const web_footer_experiment_;
views::View* const contents_separator_;
views::View* webui_tab_strip_ = nullptr;
TabStrip* tab_strip_ = nullptr;
BookmarkBarView* bookmark_bar_ = nullptr;
views::View* download_shelf_ = nullptr;
......
......@@ -210,9 +210,10 @@ class BrowserViewLayoutTest : public ChromeViewsTestBase {
std::unique_ptr<BrowserViewLayoutDelegate>(delegate_),
nullptr, // NativeView.
nullptr, // BrowserView.
top_container_, tab_strip_region_view, tab_strip_, webui_tab_strip_,
toolbar_, infobar_container_, contents_container_,
top_container_, tab_strip_region_view, tab_strip_, toolbar_,
infobar_container_, contents_container_,
immersive_mode_controller_.get(), nullptr, separator_);
layout_->set_webui_tab_strip(webui_tab_strip());
}
private:
......
......@@ -15,11 +15,13 @@
#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/task_manager/web_contents_tags.h"
#include "chrome/browser/themes/theme_properties.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/layout_constants.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/view_ids.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
......@@ -133,6 +135,7 @@ WebUITabStripContainerView::WebUITabStripContainerView(
base::Unretained(this)),
base::Bind(&WebUITabStripContainerView::CloseContainer,
base::Unretained(this)))) {
DCHECK(UseTouchableTabStrip());
animation_.SetTweenType(gfx::Tween::Type::FAST_OUT_SLOW_IN);
SetVisible(false);
......@@ -170,7 +173,17 @@ WebUITabStripContainerView::WebUITabStripContainerView(
auto_closer_->DisableCheckTargets();
}
WebUITabStripContainerView::~WebUITabStripContainerView() = default;
WebUITabStripContainerView::~WebUITabStripContainerView() {
// The NewTabButton and TabCounter button both use |this| as a listener. We
// need to make sure we outlive them.
delete new_tab_button_;
delete tab_counter_;
}
bool WebUITabStripContainerView::UseTouchableTabStrip() {
return base::FeatureList::IsEnabled(features::kWebUITabStrip) &&
ui::MaterialDesignController::touch_ui();
}
views::NativeViewHost* WebUITabStripContainerView::GetNativeViewHost() {
return web_view_->holder();
......@@ -228,6 +241,17 @@ std::unique_ptr<views::View> WebUITabStripContainerView::CreateTabCounter() {
return tab_counter;
}
void WebUITabStripContainerView::UpdateButtons() {
const SkColor normal_color =
GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON);
if (new_tab_button_) {
new_tab_button_->SetImage(views::Button::STATE_NORMAL,
gfx::CreateVectorIcon(kAddIcon, normal_color));
}
if (tab_counter_)
tab_counter_->SetEnabledTextColors(normal_color);
}
void WebUITabStripContainerView::CloseContainer() {
SetContainerTargetVisibility(false);
}
......@@ -256,8 +280,9 @@ bool WebUITabStripContainerView::EventShouldPropagate(const ui::Event& event) {
return true;
// If the event is in the container or control buttons, let it be handled.
for (views::View* view :
{static_cast<views::View*>(this), new_tab_button_, tab_counter_}) {
for (views::View* view : {static_cast<views::View*>(this),
static_cast<views::View*>(new_tab_button_),
static_cast<views::View*>(tab_counter_)}) {
if (!view)
continue;
......
......@@ -43,12 +43,16 @@ class WebUITabStripContainerView : public TabStripUI::Embedder,
views::View* tab_contents_container);
~WebUITabStripContainerView() override;
static bool UseTouchableTabStrip();
views::NativeViewHost* GetNativeViewHost();
// Control buttons. Each must only be called once.
std::unique_ptr<ToolbarButton> CreateNewTabButton();
std::unique_ptr<views::View> CreateTabCounter();
void UpdateButtons();
private:
class AutoCloser;
......@@ -85,8 +89,8 @@ class WebUITabStripContainerView : public TabStripUI::Embedder,
Browser* const browser_;
views::WebView* const web_view_;
views::View* const tab_contents_container_;
views::View* new_tab_button_ = nullptr;
views::View* tab_counter_ = nullptr;
ToolbarButton* new_tab_button_ = nullptr;
views::LabelButton* tab_counter_ = nullptr;
int desired_height_ = 0;
......
......@@ -272,14 +272,6 @@ void ToolbarView::Init() {
if (avatar)
avatar_ = AddChildView(std::move(avatar));
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
if (browser_view_->webui_tab_strip()) {
webui_new_tab_button_ =
AddChildView(browser_view_->webui_tab_strip()->CreateNewTabButton());
AddChildView(browser_view_->webui_tab_strip()->CreateTabCounter());
}
#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
app_menu_button_ = AddChildView(std::move(app_menu_button));
LoadImages();
......@@ -364,6 +356,19 @@ void ToolbarView::UpdateCustomTabBarVisibility(bool visible, bool animate) {
}
}
void ToolbarView::UpdateForWebUITabStrip() {
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
if (browser_view_->webui_tab_strip() && app_menu_button_) {
const int insertion_index = GetIndexOf(app_menu_button_);
AddChildViewAt(browser_view_->webui_tab_strip()->CreateTabCounter(),
insertion_index);
AddChildViewAt(browser_view_->webui_tab_strip()->CreateNewTabButton(),
insertion_index);
LoadImages();
}
#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
}
void ToolbarView::ResetTabState(WebContents* tab) {
if (location_bar_)
location_bar_->ResetTabState(tab);
......@@ -890,11 +895,10 @@ void ToolbarView::LoadImages() {
if (media_button_)
media_button_->UpdateIcon();
if (webui_new_tab_button_) {
webui_new_tab_button_->SetImage(
views::Button::STATE_NORMAL,
gfx::CreateVectorIcon(kAddIcon, normal_color));
}
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
if (browser_view_->webui_tab_strip())
browser_view_->webui_tab_strip()->UpdateButtons();
#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
if (avatar_)
avatar_->UpdateIcon();
......
......@@ -107,6 +107,10 @@ class ToolbarView : public views::AccessiblePaneView,
// transition.
void UpdateCustomTabBarVisibility(bool visible, bool animate);
// We may or may not be using a WebUI tab strip. Make sure toolbar items are
// added or removed accordingly.
void UpdateForWebUITabStrip();
// Clears the current state for |tab|.
void ResetTabState(content::WebContents* tab);
......@@ -274,7 +278,6 @@ class ToolbarView : public views::AccessiblePaneView,
ExtensionsToolbarContainer* extensions_container_ = nullptr;
media_router::CastToolbarButton* cast_ = nullptr;
ToolbarAccountIconContainerView* toolbar_account_icon_container_ = nullptr;
ToolbarButton* webui_new_tab_button_ = nullptr;
AvatarToolbarButton* avatar_ = nullptr;
MediaToolbarButtonView* media_button_ = nullptr;
BrowserAppMenuButton* app_menu_button_ = nullptr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment