| OLD | NEW | 
 | (Empty) | 
|    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 "ui/display/chromeos/touchscreen_util.h" |  | 
|    6  |  | 
|    7 #include <memory> |  | 
|    8 #include <string> |  | 
|    9 #include <vector> |  | 
|   10  |  | 
|   11 #include "base/memory/ptr_util.h" |  | 
|   12 #include "testing/gtest/include/gtest/gtest.h" |  | 
|   13 #include "ui/display/manager/display_manager.h" |  | 
|   14 #include "ui/display/manager/managed_display_info.h" |  | 
|   15 #include "ui/display/screen_base.h" |  | 
|   16 #include "ui/display/test/display_manager_test_api.h" |  | 
|   17 #include "ui/events/devices/input_device.h" |  | 
|   18  |  | 
|   19 namespace display { |  | 
|   20  |  | 
|   21 using DisplayInfoList = std::vector<ManagedDisplayInfo>; |  | 
|   22  |  | 
|   23 class TouchscreenUtilTest : public testing::Test { |  | 
|   24  public: |  | 
|   25   TouchscreenUtilTest() {} |  | 
|   26   ~TouchscreenUtilTest() override {} |  | 
|   27  |  | 
|   28   DisplayManager* display_manager() { return display_manager_.get(); } |  | 
|   29  |  | 
|   30   // testing::Test: |  | 
|   31   void SetUp() override { |  | 
|   32     // Recreate for each test, DisplayManager has a lot of state. |  | 
|   33     display_manager_ = |  | 
|   34         base::MakeUnique<DisplayManager>(base::MakeUnique<ScreenBase>()); |  | 
|   35  |  | 
|   36     // Internal display will always match to internal touchscreen. If internal |  | 
|   37     // touchscreen can't be detected, it is then associated to a touch screen |  | 
|   38     // with matching size. |  | 
|   39     { |  | 
|   40       ManagedDisplayInfo display(1, "1", false); |  | 
|   41       scoped_refptr<ManagedDisplayMode> mode(new ManagedDisplayMode( |  | 
|   42           gfx::Size(1920, 1080), 60.0, false /* interlaced */, |  | 
|   43           true /* native */, 1.0 /* ui_scale */, |  | 
|   44           1.0 /* device_scale_factor */)); |  | 
|   45       ManagedDisplayInfo::ManagedDisplayModeList modes(1, mode); |  | 
|   46       display.SetManagedDisplayModes(modes); |  | 
|   47       displays_.push_back(display); |  | 
|   48     } |  | 
|   49  |  | 
|   50     { |  | 
|   51       ManagedDisplayInfo display(2, "2", false); |  | 
|   52  |  | 
|   53       scoped_refptr<ManagedDisplayMode> mode(new ManagedDisplayMode( |  | 
|   54           gfx::Size(800, 600), 60.0, false /* interlaced */, true /* native */, |  | 
|   55           1.0 /* ui_scale */, 1.0 /* device_scale_factor */)); |  | 
|   56       ManagedDisplayInfo::ManagedDisplayModeList modes(1, mode); |  | 
|   57       display.SetManagedDisplayModes(modes); |  | 
|   58       displays_.push_back(display); |  | 
|   59     } |  | 
|   60  |  | 
|   61     // Display without native mode. Must not be matched to any touch screen. |  | 
|   62     { |  | 
|   63       ManagedDisplayInfo display(3, "3", false); |  | 
|   64       displays_.push_back(display); |  | 
|   65     } |  | 
|   66  |  | 
|   67     { |  | 
|   68       ManagedDisplayInfo display(4, "4", false); |  | 
|   69  |  | 
|   70       scoped_refptr<ManagedDisplayMode> mode(new ManagedDisplayMode( |  | 
|   71           gfx::Size(1024, 768), 60.0, false /* interlaced */, |  | 
|   72           /* native */ true, 1.0 /* ui_scale */, |  | 
|   73           1.0 /* device_scale_factor */)); |  | 
|   74       ManagedDisplayInfo::ManagedDisplayModeList modes(1, mode); |  | 
|   75       display.SetManagedDisplayModes(modes); |  | 
|   76       displays_.push_back(display); |  | 
|   77     } |  | 
|   78   } |  | 
|   79  |  | 
|   80   void TearDown() override { displays_.clear(); } |  | 
|   81  |  | 
|   82  protected: |  | 
|   83   DisplayInfoList displays_; |  | 
|   84   std::unique_ptr<DisplayManager> display_manager_; |  | 
|   85  |  | 
|   86  private: |  | 
|   87   DISALLOW_COPY_AND_ASSIGN(TouchscreenUtilTest); |  | 
|   88 }; |  | 
|   89  |  | 
|   90 TEST_F(TouchscreenUtilTest, NoTouchscreens) { |  | 
|   91   std::vector<ui::TouchscreenDevice> devices; |  | 
|   92  |  | 
|   93   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|   94                                                 displays_[0].id()); |  | 
|   95   AssociateTouchscreens(&displays_, devices); |  | 
|   96  |  | 
|   97   for (size_t i = 0; i < displays_.size(); ++i) |  | 
|   98     EXPECT_EQ(0u, displays_[i].input_devices().size()); |  | 
|   99 } |  | 
|  100  |  | 
|  101 // Verify that if there are a lot of touchscreens, they will all get associated |  | 
|  102 // with a display. |  | 
|  103 TEST_F(TouchscreenUtilTest, ManyTouchscreens) { |  | 
|  104   std::vector<ui::TouchscreenDevice> devices; |  | 
|  105   for (int i = 0; i < 5; ++i) { |  | 
|  106     devices.push_back( |  | 
|  107         ui::TouchscreenDevice(i, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "", |  | 
|  108                               gfx::Size(256, 256), 0)); |  | 
|  109   } |  | 
|  110  |  | 
|  111   DisplayInfoList displays; |  | 
|  112   displays.push_back(displays_[3]); |  | 
|  113  |  | 
|  114   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|  115                                                 displays_[0].id()); |  | 
|  116   AssociateTouchscreens(&displays, devices); |  | 
|  117  |  | 
|  118   for (int i = 0; i < 5; ++i) |  | 
|  119     EXPECT_EQ(i, displays[0].input_devices()[i]); |  | 
|  120 } |  | 
|  121  |  | 
|  122 TEST_F(TouchscreenUtilTest, OneToOneMapping) { |  | 
|  123   std::vector<ui::TouchscreenDevice> devices; |  | 
|  124   devices.push_back( |  | 
|  125       ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "1", |  | 
|  126                             gfx::Size(800, 600), 0)); |  | 
|  127   devices.push_back( |  | 
|  128       ui::TouchscreenDevice(2, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "2", |  | 
|  129                             gfx::Size(1024, 768), 0)); |  | 
|  130  |  | 
|  131   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|  132                                                 displays_[0].id()); |  | 
|  133   AssociateTouchscreens(&displays_, devices); |  | 
|  134  |  | 
|  135   EXPECT_EQ(0u, displays_[0].input_devices().size()); |  | 
|  136   EXPECT_EQ(1u, displays_[1].input_devices().size()); |  | 
|  137   EXPECT_EQ(1, displays_[1].input_devices()[0]); |  | 
|  138   EXPECT_EQ(0u, displays_[2].input_devices().size()); |  | 
|  139   EXPECT_EQ(1u, displays_[3].input_devices().size()); |  | 
|  140   EXPECT_EQ(2, displays_[3].input_devices()[0]); |  | 
|  141 } |  | 
|  142  |  | 
|  143 TEST_F(TouchscreenUtilTest, MapToCorrectDisplaySize) { |  | 
|  144   std::vector<ui::TouchscreenDevice> devices; |  | 
|  145   devices.push_back( |  | 
|  146       ui::TouchscreenDevice(2, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "2", |  | 
|  147                             gfx::Size(1024, 768), 0)); |  | 
|  148  |  | 
|  149   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|  150                                                 displays_[0].id()); |  | 
|  151   AssociateTouchscreens(&displays_, devices); |  | 
|  152  |  | 
|  153   EXPECT_EQ(0u, displays_[0].input_devices().size()); |  | 
|  154   EXPECT_EQ(0u, displays_[1].input_devices().size()); |  | 
|  155   EXPECT_EQ(0u, displays_[2].input_devices().size()); |  | 
|  156   EXPECT_EQ(1u, displays_[3].input_devices().size()); |  | 
|  157   EXPECT_EQ(2, displays_[3].input_devices()[0]); |  | 
|  158 } |  | 
|  159  |  | 
|  160 TEST_F(TouchscreenUtilTest, MapWhenSizeDiffersByOne) { |  | 
|  161   std::vector<ui::TouchscreenDevice> devices; |  | 
|  162   devices.push_back( |  | 
|  163       ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "1", |  | 
|  164                             gfx::Size(801, 600), 0)); |  | 
|  165   devices.push_back( |  | 
|  166       ui::TouchscreenDevice(2, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "2", |  | 
|  167                             gfx::Size(1023, 768), 0)); |  | 
|  168  |  | 
|  169   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|  170                                                 displays_[0].id()); |  | 
|  171   AssociateTouchscreens(&displays_, devices); |  | 
|  172  |  | 
|  173   EXPECT_EQ(0u, displays_[0].input_devices().size()); |  | 
|  174   EXPECT_EQ(1u, displays_[1].input_devices().size()); |  | 
|  175   EXPECT_EQ(1, displays_[1].input_devices()[0]); |  | 
|  176   EXPECT_EQ(0u, displays_[2].input_devices().size()); |  | 
|  177   EXPECT_EQ(1u, displays_[3].input_devices().size()); |  | 
|  178   EXPECT_EQ(2, displays_[3].input_devices()[0]); |  | 
|  179 } |  | 
|  180  |  | 
|  181 TEST_F(TouchscreenUtilTest, MapWhenSizesDoNotMatch) { |  | 
|  182   std::vector<ui::TouchscreenDevice> devices; |  | 
|  183   devices.push_back( |  | 
|  184       ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "1", |  | 
|  185                             gfx::Size(1022, 768), 0)); |  | 
|  186   devices.push_back( |  | 
|  187       ui::TouchscreenDevice(2, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "2", |  | 
|  188                             gfx::Size(802, 600), 0)); |  | 
|  189  |  | 
|  190   DisplayInfoList displays; |  | 
|  191   displays.push_back(displays_[0]); |  | 
|  192   displays.push_back(displays_[1]); |  | 
|  193  |  | 
|  194   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|  195                                                 displays[0].id()); |  | 
|  196   AssociateTouchscreens(&displays, devices); |  | 
|  197  |  | 
|  198   EXPECT_EQ(0u, displays[0].input_devices().size()); |  | 
|  199   EXPECT_EQ(2u, displays[1].input_devices().size()); |  | 
|  200   EXPECT_EQ(1, displays[1].input_devices()[0]); |  | 
|  201   EXPECT_EQ(2, displays[1].input_devices()[1]); |  | 
|  202 } |  | 
|  203  |  | 
|  204 TEST_F(TouchscreenUtilTest, MapInternalTouchscreen) { |  | 
|  205   std::vector<ui::TouchscreenDevice> devices; |  | 
|  206   devices.push_back( |  | 
|  207       ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "1", |  | 
|  208                             gfx::Size(1920, 1080), 0)); |  | 
|  209   devices.push_back( |  | 
|  210       ui::TouchscreenDevice(2, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "2", |  | 
|  211                             gfx::Size(9999, 888), 0)); |  | 
|  212  |  | 
|  213   DisplayInfoList displays; |  | 
|  214   displays.push_back(displays_[0]); |  | 
|  215   displays.push_back(displays_[1]); |  | 
|  216  |  | 
|  217   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|  218                                                 displays[0].id()); |  | 
|  219   AssociateTouchscreens(&displays, devices); |  | 
|  220  |  | 
|  221   // Internal touchscreen is always mapped to internal display. |  | 
|  222   EXPECT_EQ(1u, displays[0].input_devices().size()); |  | 
|  223   EXPECT_EQ(2, displays[0].input_devices()[0]); |  | 
|  224   EXPECT_EQ(1u, displays[1].input_devices().size()); |  | 
|  225   EXPECT_EQ(1, displays[1].input_devices()[0]); |  | 
|  226 } |  | 
|  227  |  | 
|  228 TEST_F(TouchscreenUtilTest, MultipleInternal) { |  | 
|  229   std::vector<ui::TouchscreenDevice> devices; |  | 
|  230   devices.push_back( |  | 
|  231       ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "1", |  | 
|  232                             gfx::Size(1920, 1080), 0)); |  | 
|  233   devices.push_back( |  | 
|  234       ui::TouchscreenDevice(2, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "2", |  | 
|  235                             gfx::Size(1920, 1080), 0)); |  | 
|  236  |  | 
|  237   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|  238                                                 displays_[0].id()); |  | 
|  239   AssociateTouchscreens(&displays_, devices); |  | 
|  240  |  | 
|  241   EXPECT_EQ(2u, displays_[0].input_devices().size()); |  | 
|  242   EXPECT_EQ(0u, displays_[1].input_devices().size()); |  | 
|  243   EXPECT_EQ(0u, displays_[2].input_devices().size()); |  | 
|  244   EXPECT_EQ(0u, displays_[3].input_devices().size()); |  | 
|  245 } |  | 
|  246  |  | 
|  247 TEST_F(TouchscreenUtilTest, MultipleInternalAndExternal) { |  | 
|  248   std::vector<ui::TouchscreenDevice> devices; |  | 
|  249   devices.push_back( |  | 
|  250       ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "1", |  | 
|  251                             gfx::Size(1920, 1080), 0)); |  | 
|  252   devices.push_back( |  | 
|  253       ui::TouchscreenDevice(2, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "2", |  | 
|  254                             gfx::Size(1920, 1080), 0)); |  | 
|  255   devices.push_back( |  | 
|  256       ui::TouchscreenDevice(3, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "3", |  | 
|  257                             gfx::Size(1024, 768), 0)); |  | 
|  258  |  | 
|  259   test::ScopedSetInternalDisplayId set_internal(display_manager(), |  | 
|  260                                                 displays_[0].id()); |  | 
|  261   AssociateTouchscreens(&displays_, devices); |  | 
|  262  |  | 
|  263   EXPECT_EQ(2u, displays_[0].input_devices().size()); |  | 
|  264   EXPECT_EQ(1, displays_[0].input_devices()[0]); |  | 
|  265   EXPECT_EQ(2, displays_[0].input_devices()[1]); |  | 
|  266   EXPECT_EQ(0u, displays_[1].input_devices().size()); |  | 
|  267   EXPECT_EQ(0u, displays_[2].input_devices().size()); |  | 
|  268   EXPECT_EQ(1u, displays_[3].input_devices().size()); |  | 
|  269   EXPECT_EQ(3, displays_[3].input_devices()[0]); |  | 
|  270 } |  | 
|  271  |  | 
|  272 // crbug.com/515201 |  | 
|  273 TEST_F(TouchscreenUtilTest, TestWithNoInternalDisplay) { |  | 
|  274   std::vector<ui::TouchscreenDevice> devices; |  | 
|  275   devices.push_back( |  | 
|  276       ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_EXTERNAL, "1", |  | 
|  277                             gfx::Size(1920, 1080), 0)); |  | 
|  278   devices.push_back( |  | 
|  279       ui::TouchscreenDevice(2, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "2", |  | 
|  280                             gfx::Size(9999, 888), 0)); |  | 
|  281  |  | 
|  282   // Internal touchscreen should not be associated with any display |  | 
|  283   AssociateTouchscreens(&displays_, devices); |  | 
|  284  |  | 
|  285   EXPECT_EQ(1u, displays_[0].input_devices().size()); |  | 
|  286   EXPECT_EQ(1, displays_[0].input_devices()[0]); |  | 
|  287   EXPECT_EQ(0u, displays_[1].input_devices().size()); |  | 
|  288   EXPECT_EQ(0u, displays_[2].input_devices().size()); |  | 
|  289   EXPECT_EQ(0u, displays_[3].input_devices().size()); |  | 
|  290 } |  | 
|  291  |  | 
|  292 }  // namespace display |  | 
| OLD | NEW |