Home | History | Annotate | Download | only in views
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/bind.h"
      6 #include "base/run_loop.h"
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "chrome/browser/media/fake_desktop_media_list.h"
      9 #include "chrome/browser/ui/views/desktop_media_picker_views.h"
     10 #include "components/web_modal/test_web_contents_modal_dialog_host.h"
     11 #include "content/public/test/test_browser_thread_bundle.h"
     12 #include "testing/gmock/include/gmock/gmock.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "ui/aura/window.h"
     15 #include "ui/compositor/test/context_factories_for_test.h"
     16 #include "ui/views/test/views_test_helper.h"
     17 #include "ui/views/widget/widget.h"
     18 #include "ui/views/window/dialog_delegate.h"
     19 
     20 namespace views {
     21 
     22 class DesktopMediaPickerViewsTest : public testing::Test {
     23  public:
     24   DesktopMediaPickerViewsTest() {}
     25   virtual ~DesktopMediaPickerViewsTest() {}
     26 
     27   virtual void SetUp() OVERRIDE {
     28     bool enable_pixel_output = false;
     29     ui::ContextFactory* context_factory =
     30         ui::InitializeContextFactoryForTests(enable_pixel_output);
     31     test_helper_.reset(
     32         ViewsTestHelper::Create(base::MessageLoopForUI::current(),
     33                                 context_factory));
     34     test_helper_->SetUp();
     35 
     36     Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
     37     params.context = test_helper_->GetContext();
     38     params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
     39     parent_widget_.reset(new Widget);
     40     parent_widget_->Init(params);
     41 
     42     media_list_ = new FakeDesktopMediaList();
     43     scoped_ptr<FakeDesktopMediaList> media_list(media_list_);
     44 
     45     base::string16 app_name = base::ASCIIToUTF16("foo");
     46 
     47     picker_views_.reset(new DesktopMediaPickerViews());
     48     picker_views_->Show(NULL,
     49                         parent_widget_->GetNativeWindow(),
     50                         NULL,
     51                         app_name,
     52                         app_name,
     53                         media_list.PassAs<DesktopMediaList>(),
     54                         base::Bind(&DesktopMediaPickerViewsTest::OnPickerDone,
     55                                    base::Unretained(this)));
     56   }
     57 
     58   virtual void TearDown() OVERRIDE {
     59     test_helper_->TearDown();
     60     ui::TerminateContextFactoryForTests();
     61   }
     62 
     63   DesktopMediaPickerDialogView* GetPickerDialogView() const {
     64     return picker_views_->GetDialogViewForTesting();
     65   }
     66 
     67   MOCK_METHOD1(OnPickerDone, void(content::DesktopMediaID));
     68 
     69  protected:
     70   content::TestBrowserThreadBundle thread_bundle_;
     71   scoped_ptr<views::ViewsTestHelper> test_helper_;
     72   FakeDesktopMediaList* media_list_;
     73   scoped_ptr<Widget> parent_widget_;
     74   scoped_ptr<DesktopMediaPickerViews> picker_views_;
     75 };
     76 
     77 TEST_F(DesktopMediaPickerViewsTest, DoneCallbackCalledWhenWindowClosed) {
     78   EXPECT_CALL(*this, OnPickerDone(content::DesktopMediaID()));
     79 
     80   GetPickerDialogView()->GetWidget()->Close();
     81   base::RunLoop().RunUntilIdle();
     82 }
     83 
     84 TEST_F(DesktopMediaPickerViewsTest, DoneCallbackCalledOnOkButtonPressed) {
     85   const int kFakeId = 222;
     86   EXPECT_CALL(*this,
     87               OnPickerDone(content::DesktopMediaID(
     88                   content::DesktopMediaID::TYPE_WINDOW, kFakeId)));
     89 
     90   media_list_->AddSource(kFakeId);
     91 
     92   EXPECT_FALSE(
     93       GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
     94 
     95   GetPickerDialogView()->GetMediaSourceViewForTesting(0)->OnFocus();
     96   EXPECT_TRUE(
     97       GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
     98 
     99   GetPickerDialogView()->Accept();
    100   base::RunLoop().RunUntilIdle();
    101 }
    102 
    103 TEST_F(DesktopMediaPickerViewsTest, DoneCallbackCalledOnDoubleClick) {
    104   const int kFakeId = 222;
    105   EXPECT_CALL(*this,
    106               OnPickerDone(content::DesktopMediaID(
    107                   content::DesktopMediaID::TYPE_WINDOW, kFakeId)));
    108 
    109   media_list_->AddSource(kFakeId);
    110 
    111   ui::MouseEvent double_click(ui::ET_MOUSE_PRESSED,
    112                               gfx::Point(),
    113                               gfx::Point(),
    114                               ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_DOUBLE_CLICK,
    115                               ui::EF_LEFT_MOUSE_BUTTON);
    116 
    117   GetPickerDialogView()->GetMediaSourceViewForTesting(0)->OnMousePressed(
    118       double_click);
    119   base::RunLoop().RunUntilIdle();
    120 }
    121 
    122 TEST_F(DesktopMediaPickerViewsTest, DoneCallbackCalledOnDoubleTap) {
    123   const int kFakeId = 222;
    124   EXPECT_CALL(*this,
    125               OnPickerDone(content::DesktopMediaID(
    126                   content::DesktopMediaID::TYPE_WINDOW, kFakeId)));
    127 
    128   media_list_->AddSource(kFakeId);
    129   ui::GestureEventDetails details(ui::ET_GESTURE_TAP);
    130   details.set_tap_count(2);
    131   ui::GestureEvent double_tap(10, 10, 0, base::TimeDelta(), details);
    132 
    133   GetPickerDialogView()->GetMediaSourceViewForTesting(0)->OnGestureEvent(
    134       &double_tap);
    135   base::RunLoop().RunUntilIdle();
    136 }
    137 
    138 TEST_F(DesktopMediaPickerViewsTest, CancelButtonAlwaysEnabled) {
    139   EXPECT_TRUE(
    140       GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL));
    141 }
    142 
    143 // Verifies that the MediaSourceView is added or removed when |media_list_| is
    144 // updated.
    145 TEST_F(DesktopMediaPickerViewsTest, AddAndRemoveMediaSource) {
    146   // No media source at first.
    147   EXPECT_EQ(NULL, GetPickerDialogView()->GetMediaSourceViewForTesting(0));
    148 
    149   for (int i = 0; i < 3; ++i) {
    150     media_list_->AddSource(i);
    151     EXPECT_TRUE(GetPickerDialogView()->GetMediaSourceViewForTesting(i));
    152   }
    153 
    154   for (int i = 2; i >= 0; --i) {
    155     media_list_->RemoveSource(i);
    156     EXPECT_EQ(NULL, GetPickerDialogView()->GetMediaSourceViewForTesting(i));
    157   }
    158 }
    159 
    160 // Verifies that focusing the MediaSourceView marks it selected and the
    161 // original selected MediaSourceView gets unselected.
    162 TEST_F(DesktopMediaPickerViewsTest, FocusMediaSourceViewToSelect) {
    163   media_list_->AddSource(0);
    164   media_list_->AddSource(1);
    165 
    166   DesktopMediaSourceView* source_view_0 =
    167       GetPickerDialogView()->GetMediaSourceViewForTesting(0);
    168 
    169   DesktopMediaSourceView* source_view_1 =
    170       GetPickerDialogView()->GetMediaSourceViewForTesting(1);
    171 
    172   EXPECT_FALSE(source_view_0->is_selected());
    173   EXPECT_FALSE(source_view_1->is_selected());
    174 
    175   source_view_0->OnFocus();
    176   EXPECT_TRUE(source_view_0->is_selected());
    177 
    178   // Removing the focus does not undo the selection.
    179   source_view_0->OnBlur();
    180   EXPECT_TRUE(source_view_0->is_selected());
    181 
    182   source_view_1->OnFocus();
    183   EXPECT_FALSE(source_view_0->is_selected());
    184   EXPECT_TRUE(source_view_1->is_selected());
    185 }
    186 
    187 TEST_F(DesktopMediaPickerViewsTest, OkButtonDisabledWhenNoSelection) {
    188   media_list_->AddSource(111);
    189 
    190   EXPECT_FALSE(
    191       GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
    192 
    193   GetPickerDialogView()->GetMediaSourceViewForTesting(0)->OnFocus();
    194   EXPECT_TRUE(
    195       GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
    196 
    197   media_list_->RemoveSource(0);
    198   EXPECT_FALSE(
    199       GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
    200 }
    201 
    202 }  // namespace views
    203