1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h"
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/media/fake_desktop_media_list.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/views/desktop_media_picker_views.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/web_modal/test_web_contents_modal_dialog_host.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gmock/include/gmock/gmock.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/aura/window.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/compositor/test/context_factories_for_test.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/test/views_test_helper.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/widget/widget.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/window/dialog_delegate.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace views {
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass DesktopMediaPickerViewsTest : public testing::Test {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DesktopMediaPickerViewsTest() {}
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~DesktopMediaPickerViewsTest() {}
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() OVERRIDE {
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool enable_pixel_output = false;
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ui::ContextFactory* context_factory =
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ui::InitializeContextFactoryForTests(enable_pixel_output);
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    test_helper_.reset(
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ViewsTestHelper::Create(base::MessageLoopForUI::current(),
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                context_factory));
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    test_helper_->SetUp();
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    params.context = test_helper_->GetContext();
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    parent_widget_.reset(new Widget);
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    parent_widget_->Init(params);
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    media_list_ = new FakeDesktopMediaList();
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<FakeDesktopMediaList> media_list(media_list_);
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::string16 app_name = base::ASCIIToUTF16("foo");
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    picker_views_.reset(new DesktopMediaPickerViews());
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    picker_views_->Show(NULL,
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        parent_widget_->GetNativeWindow(),
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        NULL,
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        app_name,
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        app_name,
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        media_list.PassAs<DesktopMediaList>(),
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        base::Bind(&DesktopMediaPickerViewsTest::OnPickerDone,
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   base::Unretained(this)));
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void TearDown() OVERRIDE {
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    test_helper_->TearDown();
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ui::TerminateContextFactoryForTests();
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DesktopMediaPickerDialogView* GetPickerDialogView() const {
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return picker_views_->GetDialogViewForTesting();
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MOCK_METHOD1(OnPickerDone, void(content::DesktopMediaID));
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<views::ViewsTestHelper> test_helper_;
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FakeDesktopMediaList* media_list_;
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<Widget> parent_widget_;
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<DesktopMediaPickerViews> picker_views_;
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
77116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DesktopMediaPickerViewsTest, DoneCallbackCalledWhenWindowClosed) {
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*this, OnPickerDone(content::DesktopMediaID()));
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetPickerDialogView()->GetWidget()->Close();
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
84116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DesktopMediaPickerViewsTest, DoneCallbackCalledOnOkButtonPressed) {
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int kFakeId = 222;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*this,
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              OnPickerDone(content::DesktopMediaID(
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  content::DesktopMediaID::TYPE_WINDOW, kFakeId)));
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  media_list_->AddSource(kFakeId);
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetPickerDialogView()->GetMediaSourceViewForTesting(0)->OnFocus();
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetPickerDialogView()->Accept();
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
103116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DesktopMediaPickerViewsTest, DoneCallbackCalledOnDoubleClick) {
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int kFakeId = 222;
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*this,
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              OnPickerDone(content::DesktopMediaID(
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  content::DesktopMediaID::TYPE_WINDOW, kFakeId)));
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  media_list_->AddSource(kFakeId);
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui::MouseEvent double_click(ui::ET_MOUSE_PRESSED,
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              gfx::Point(),
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              gfx::Point(),
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_DOUBLE_CLICK,
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              ui::EF_LEFT_MOUSE_BUTTON);
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetPickerDialogView()->GetMediaSourceViewForTesting(0)->OnMousePressed(
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      double_click);
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
122116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DesktopMediaPickerViewsTest, DoneCallbackCalledOnDoubleTap) {
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int kFakeId = 222;
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*this,
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              OnPickerDone(content::DesktopMediaID(
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  content::DesktopMediaID::TYPE_WINDOW, kFakeId)));
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  media_list_->AddSource(kFakeId);
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::GestureEventDetails details(ui::ET_GESTURE_TAP);
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  details.set_tap_count(2);
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::GestureEvent double_tap(10, 10, 0, base::TimeDelta(), details);
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetPickerDialogView()->GetMediaSourceViewForTesting(0)->OnGestureEvent(
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &double_tap);
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
138116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DesktopMediaPickerViewsTest, CancelButtonAlwaysEnabled) {
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL));
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verifies that the MediaSourceView is added or removed when |media_list_| is
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// updated.
145116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DesktopMediaPickerViewsTest, AddAndRemoveMediaSource) {
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // No media source at first.
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(NULL, GetPickerDialogView()->GetMediaSourceViewForTesting(0));
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < 3; ++i) {
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    media_list_->AddSource(i);
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(GetPickerDialogView()->GetMediaSourceViewForTesting(i));
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 2; i >= 0; --i) {
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    media_list_->RemoveSource(i);
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(NULL, GetPickerDialogView()->GetMediaSourceViewForTesting(i));
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verifies that focusing the MediaSourceView marks it selected and the
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// original selected MediaSourceView gets unselected.
162116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DesktopMediaPickerViewsTest, FocusMediaSourceViewToSelect) {
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  media_list_->AddSource(0);
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  media_list_->AddSource(1);
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DesktopMediaSourceView* source_view_0 =
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetPickerDialogView()->GetMediaSourceViewForTesting(0);
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DesktopMediaSourceView* source_view_1 =
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetPickerDialogView()->GetMediaSourceViewForTesting(1);
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(source_view_0->is_selected());
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(source_view_1->is_selected());
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  source_view_0->OnFocus();
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(source_view_0->is_selected());
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Removing the focus does not undo the selection.
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  source_view_0->OnBlur();
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(source_view_0->is_selected());
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  source_view_1->OnFocus();
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(source_view_0->is_selected());
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(source_view_1->is_selected());
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
187116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(DesktopMediaPickerViewsTest, OkButtonDisabledWhenNoSelection) {
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  media_list_->AddSource(111);
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetPickerDialogView()->GetMediaSourceViewForTesting(0)->OnFocus();
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  media_list_->RemoveSource(0);
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace views
203