blob: 35ba0643cca514be56c953138d6eee9d6c792f7d [file] [log] [blame]
// Copyright (c) 2012 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/browser/ui/views/first_run_bubble.h"
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "build/build_config.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/ui/views/harmony/chrome_layout_provider.h"
#include "chrome/test/base/testing_profile.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
#include "content/public/test/test_browser_thread.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/event.h"
#include "ui/events/event_sink.h"
#include "ui/events/event_utils.h"
#include "ui/events/test/event_generator.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/test/widget_test.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
class FirstRunBubbleTest : public views::ViewsTestBase {
public:
FirstRunBubbleTest();
~FirstRunBubbleTest() override;
// Overrides from views::ViewsTestBase:
void SetUp() override;
void CreateAndCloseBubbleOnEventTest(ui::Event* event);
protected:
TestingProfile* profile() { return &profile_; }
private:
// TestBrowserThreadBundle cannot be used here because the ViewsTestBase
// superclass creates its own MessageLoop.
content::TestBrowserThread ui_thread_;
TestingProfile profile_;
DISALLOW_COPY_AND_ASSIGN(FirstRunBubbleTest);
};
FirstRunBubbleTest::FirstRunBubbleTest()
: ui_thread_(content::BrowserThread::UI, base::MessageLoop::current()) {}
FirstRunBubbleTest::~FirstRunBubbleTest() {}
void FirstRunBubbleTest::SetUp() {
ViewsTestBase::SetUp();
// Set the ChromeLayoutProvider as the default layout provider.
test_views_delegate()->set_layout_provider(
ChromeLayoutProvider::CreateLayoutProvider());
TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
profile(), &TemplateURLServiceFactory::BuildInstanceFor);
TemplateURLService* turl_model =
TemplateURLServiceFactory::GetForProfile(profile());
turl_model->Load();
}
void FirstRunBubbleTest::CreateAndCloseBubbleOnEventTest(ui::Event* event) {
// Create the anchor and parent widgets.
views::Widget::InitParams params =
CreateParams(views::Widget::InitParams::TYPE_WINDOW);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
views::Widget anchor_widget;
anchor_widget.Init(params);
anchor_widget.SetBounds(gfx::Rect(10, 10, 500, 500));
anchor_widget.Show();
FirstRunBubble* delegate =
FirstRunBubble::ShowForTest(anchor_widget.GetContentsView());
EXPECT_TRUE(delegate);
anchor_widget.GetContentsView()->RequestFocus();
views::test::WidgetClosingObserver widget_observer(delegate->GetWidget());
ui::test::EventGenerator generator(GetContext(),
anchor_widget.GetNativeWindow());
generator.set_target(ui::test::EventGenerator::Target::APPLICATION);
generator.Dispatch(event);
EXPECT_TRUE(widget_observer.widget_closed());
}
TEST_F(FirstRunBubbleTest, CreateAndClose) {
// Create the anchor and parent widgets.
views::Widget::InitParams params =
CreateParams(views::Widget::InitParams::TYPE_WINDOW);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
views::Widget anchor_widget;
anchor_widget.Init(params);
anchor_widget.Show();
FirstRunBubble* delegate =
FirstRunBubble::ShowForTest(anchor_widget.GetContentsView());
EXPECT_TRUE(delegate);
delegate->GetWidget()->CloseNow();
}
// Tests that the first run bubble is closed when keyboard events are
// dispatched to the anchor widget.
TEST_F(FirstRunBubbleTest, CloseBubbleOnKeyEvent) {
ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_ESCAPE, ui::EF_NONE);
CreateAndCloseBubbleOnEventTest(&key_event);
}
TEST_F(FirstRunBubbleTest, CloseBubbleOnMouseDownEvent) {
gfx::Point pt(110, 210);
ui::MouseEvent mouse_down(
ui::ET_MOUSE_PRESSED, pt, pt, ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
CreateAndCloseBubbleOnEventTest(&mouse_down);
}
#if defined(OS_MACOSX)
// Touch events aren't supported on Mac: https://crbug.com/445520
#define MAYBE_CloseBubbleOnTouchDownEvent DISABLED_CloseBubbleOnTouchDownEvent
#else
#define MAYBE_CloseBubbleOnTouchDownEvent CloseBubbleOnTouchDownEvent
#endif
TEST_F(FirstRunBubbleTest, MAYBE_CloseBubbleOnTouchDownEvent) {
ui::TouchEvent touch_down(
ui::ET_TOUCH_PRESSED, gfx::Point(10, 10), ui::EventTimeForNow(),
ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
CreateAndCloseBubbleOnEventTest(&touch_down);
}