Commit adda5779 authored by Collin Baker's avatar Collin Baker Committed by Commit Bot

Put unit tests' anchor view in Widget to allow bubble creation

FeaturePromoBubbleView requires a ThemeProvider in its parent
Widget. So, for TabGroupsIPHControllerTest to instantiate it the
anchor view must be inside a Widget with a ThemeProvider.

TestWidget used internally to ChromeViewsTestBase serves this
purpose. This CL extracts it as ChromeTestWidget to be used
elsewhere. TabGroupsIPHControllerTest uses this as the parent Widget.

Bug: 1102655
Change-Id: Ib0d8a290789c1af1c08adb9fb6afc816ee2eeb90
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2289922
Commit-Queue: Collin Baker <collinbaker@chromium.org>
Reviewed-by: default avatarAllen Bauer <kylixrd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#787419}
parent 9a335422
...@@ -5,17 +5,22 @@ ...@@ -5,17 +5,22 @@
#include "chrome/browser/ui/views/tabs/tab_groups_iph_controller.h" #include "chrome/browser/ui/views/tabs/tab_groups_iph_controller.h"
#include <memory> #include <memory>
#include <utility>
#include "base/bind.h" #include "base/bind.h"
#include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/feature_engagement/tracker_factory.h"
#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_commands.h"
#include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/browser_with_test_window_test.h"
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
#include "chrome/test/views/chrome_test_widget.h"
#include "components/feature_engagement/public/event_constants.h" #include "components/feature_engagement/public/event_constants.h"
#include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/public/feature_constants.h"
#include "components/feature_engagement/test/mock_tracker.h" #include "components/feature_engagement/test/mock_tracker.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "ui/views/test/scoped_views_test_helper.h"
#include "ui/views/view.h" #include "ui/views/view.h"
#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
using ::testing::_; using ::testing::_;
using ::testing::AnyNumber; using ::testing::AnyNumber;
...@@ -26,6 +31,13 @@ class TabGroupsIPHControllerTest : public BrowserWithTestWindowTest { ...@@ -26,6 +31,13 @@ class TabGroupsIPHControllerTest : public BrowserWithTestWindowTest {
public: public:
void SetUp() override { void SetUp() override {
BrowserWithTestWindowTest::SetUp(); BrowserWithTestWindowTest::SetUp();
views::Widget::InitParams widget_params;
widget_params.context = GetContext();
anchor_widget_ = std::unique_ptr<views::Widget>(new ChromeTestWidget);
anchor_widget_->Init(std::move(widget_params));
mock_tracker_ = mock_tracker_ =
feature_engagement::TrackerFactory::GetInstance() feature_engagement::TrackerFactory::GetInstance()
->SetTestingSubclassFactoryAndUse( ->SetTestingSubclassFactoryAndUse(
...@@ -50,20 +62,22 @@ class TabGroupsIPHControllerTest : public BrowserWithTestWindowTest { ...@@ -50,20 +62,22 @@ class TabGroupsIPHControllerTest : public BrowserWithTestWindowTest {
void TearDown() override { void TearDown() override {
iph_controller_.reset(); iph_controller_.reset();
anchor_widget_.reset();
BrowserWithTestWindowTest::TearDown(); BrowserWithTestWindowTest::TearDown();
} }
private:
views::View* GetAnchorView(int tab_index) {
return anchor_widget_->GetContentsView();
}
// The Widget our IPH bubble is anchored to. It is specifically
// anchored to its contents view.
views::UniqueWidgetPtr anchor_widget_;
protected: protected:
feature_engagement::test::MockTracker* mock_tracker_; feature_engagement::test::MockTracker* mock_tracker_;
std::unique_ptr<TabGroupsIPHController> iph_controller_; std::unique_ptr<TabGroupsIPHController> iph_controller_;
private:
views::View* GetAnchorView(int tab_index) { return &dummy_anchor_view_; }
// TabGroupsIPHController takes a callback to get the promo's anchor
// view. These tests shouldn't trigger the promo, but we return this
// view just in case.
views::View dummy_anchor_view_;
}; };
TEST_F(TabGroupsIPHControllerTest, NotifyEventAndTriggerOnSixthTabOpened) { TEST_F(TabGroupsIPHControllerTest, NotifyEventAndTriggerOnSixthTabOpened) {
......
...@@ -362,6 +362,8 @@ static_library("test_support") { ...@@ -362,6 +362,8 @@ static_library("test_support") {
"views/accessibility_checker.cc", "views/accessibility_checker.cc",
"views/accessibility_checker.h", "views/accessibility_checker.h",
"views/chrome_test_views_delegate.h", "views/chrome_test_views_delegate.h",
"views/chrome_test_widget.cc",
"views/chrome_test_widget.h",
"views/chrome_views_test_base.cc", "views/chrome_views_test_base.cc",
"views/chrome_views_test_base.h", "views/chrome_views_test_base.h",
] ]
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/test/views/chrome_test_widget.h"
#include <memory>
#include "ui/base/theme_provider.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/color_utils.h"
namespace base {
class RefCountedMemory;
}
namespace gfx {
class ImageSkia;
}
class ChromeTestWidget::StubThemeProvider : public ui::ThemeProvider {
public:
StubThemeProvider() = default;
~StubThemeProvider() override = default;
// ui::ThemeProvider:
gfx::ImageSkia* GetImageSkiaNamed(int id) const override { return nullptr; }
SkColor GetColor(int id) const override { return gfx::kPlaceholderColor; }
color_utils::HSL GetTint(int id) const override { return color_utils::HSL(); }
int GetDisplayProperty(int id) const override { return -1; }
bool ShouldUseNativeFrame() const override { return false; }
bool HasCustomImage(int id) const override { return false; }
bool HasCustomColor(int id) const override { return false; }
base::RefCountedMemory* GetRawData(int id, ui::ScaleFactor scale_factor)
const override {
return nullptr;
}
};
ChromeTestWidget::ChromeTestWidget()
: theme_provider_(std::make_unique<StubThemeProvider>()) {}
ChromeTestWidget::~ChromeTestWidget() = default;
const ui::ThemeProvider* ChromeTestWidget::GetThemeProvider() const {
return theme_provider_.get();
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_TEST_VIEWS_CHROME_TEST_WIDGET_H_
#define CHROME_TEST_VIEWS_CHROME_TEST_WIDGET_H_
#include <memory>
#include "ui/views/widget/widget.h"
namespace ui {
class ThemeProvider;
}
class ChromeTestWidget : public views::Widget {
public:
ChromeTestWidget();
~ChromeTestWidget() override;
// views::Widget:
const ui::ThemeProvider* GetThemeProvider() const override;
private:
class StubThemeProvider;
std::unique_ptr<StubThemeProvider> theme_provider_;
};
#endif // CHROME_TEST_VIEWS_CHROME_TEST_WIDGET_H_
...@@ -7,10 +7,8 @@ ...@@ -7,10 +7,8 @@
#include <memory> #include <memory>
#include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/test/views/chrome_test_widget.h"
#include "content/public/test/browser_task_environment.h" #include "content/public/test/browser_task_environment.h"
#include "ui/base/theme_provider.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/color_utils.h"
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
#include "ash/test/ash_test_helper.h" #include "ash/test/ash_test_helper.h"
...@@ -25,39 +23,6 @@ std::unique_ptr<aura::test::AuraTestHelper> MakeTestHelper() { ...@@ -25,39 +23,6 @@ std::unique_ptr<aura::test::AuraTestHelper> MakeTestHelper() {
} }
#endif #endif
class StubThemeProvider : public ui::ThemeProvider {
public:
StubThemeProvider() = default;
~StubThemeProvider() override = default;
// ui::ThemeProvider:
gfx::ImageSkia* GetImageSkiaNamed(int id) const override { return nullptr; }
SkColor GetColor(int id) const override { return gfx::kPlaceholderColor; }
color_utils::HSL GetTint(int id) const override { return color_utils::HSL(); }
int GetDisplayProperty(int id) const override { return -1; }
bool ShouldUseNativeFrame() const override { return false; }
bool HasCustomImage(int id) const override { return false; }
bool HasCustomColor(int id) const override { return false; }
base::RefCountedMemory* GetRawData(int id, ui::ScaleFactor scale_factor)
const override {
return nullptr;
}
};
class TestWidget : public views::Widget {
public:
TestWidget() = default;
~TestWidget() override = default;
// views::Widget:
const ui::ThemeProvider* GetThemeProvider() const override {
return &theme_provider_;
}
private:
StubThemeProvider theme_provider_;
};
} // namespace } // namespace
ChromeViewsTestBase::ChromeViewsTestBase() ChromeViewsTestBase::ChromeViewsTestBase()
...@@ -92,5 +57,5 @@ void ChromeViewsTestBase::TearDown() { ...@@ -92,5 +57,5 @@ void ChromeViewsTestBase::TearDown() {
#endif #endif
std::unique_ptr<views::Widget> ChromeViewsTestBase::AllocateTestWidget() { std::unique_ptr<views::Widget> ChromeViewsTestBase::AllocateTestWidget() {
return std::make_unique<TestWidget>(); return std::make_unique<ChromeTestWidget>();
} }
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