168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_screen_x11.h"
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/aura/client/aura_constants.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/base/hit_test.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/x/x11_util.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/display_observer.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/x/x11_types.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/test/views_test_base.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h"
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Class which allows for the designation of non-client component targets of
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// hit tests.
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass TestDesktopNativeWidgetAura : public views::DesktopNativeWidgetAura {
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  explicit TestDesktopNativeWidgetAura(
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      views::internal::NativeWidgetDelegate* delegate)
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      : views::DesktopNativeWidgetAura(delegate) {}
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~TestDesktopNativeWidgetAura() {}
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void set_window_component(int window_component) {
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    window_component_ = window_component;
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // DesktopNativeWidgetAura:
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE {
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return window_component_;
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int window_component_;
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TestDesktopNativeWidgetAura);
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace views {
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kFirstDisplay = 5321829;
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kSecondDisplay = 928310;
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DesktopScreenX11Test : public views::ViewsTestBase,
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             public gfx::DisplayObserver {
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DesktopScreenX11Test() {}
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~DesktopScreenX11Test() {}
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Overridden from testing::Test:
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ViewsTestBase::SetUp();
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Initialize the world to the single monitor case.
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::vector<gfx::Display> displays;
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    screen_.reset(new DesktopScreenX11(displays));
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    screen_->AddObserver(this);
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    screen_.reset();
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ViewsTestBase::TearDown();
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) protected:
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> changed_display_;
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> added_display_;
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> removed_display_;
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DesktopScreenX11* screen() { return screen_.get(); }
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void NotifyDisplaysChanged(const std::vector<gfx::Display>& displays) {
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DesktopScreenX11* screen = screen_.get();
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    screen->change_notifier_.NotifyDisplaysChanged(screen->displays_, displays);
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    screen->displays_ = displays;
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void ResetDisplayChanges() {
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    changed_display_.clear();
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    added_display_.clear();
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    removed_display_.clear();
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds,
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      bool use_test_native_widget) {
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Widget* toplevel = new Widget;
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Widget::InitParams toplevel_params =
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CreateParams(Widget::InitParams::TYPE_WINDOW);
990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (use_test_native_widget) {
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      toplevel_params.native_widget =
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          new TestDesktopNativeWidgetAura(toplevel);
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    } else {
1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      toplevel_params.native_widget =
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          new views::DesktopNativeWidgetAura(toplevel);
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    toplevel_params.bounds = bounds;
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    toplevel_params.remove_standard_frame = true;
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    toplevel->Init(toplevel_params);
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return toplevel;
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Overridden from gfx::DisplayObserver:
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE {
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    added_display_.push_back(new_display);
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE {
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    removed_display_.push_back(old_display);
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnDisplayMetricsChanged(const gfx::Display& display,
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       uint32_t metrics) OVERRIDE {
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    changed_display_.push_back(display);
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<DesktopScreenX11> screen_;
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11Test);
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, BoundsChangeSingleMonitor) {
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 1024, 768)));
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, added_display_.size());
13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, removed_display_.size());
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, AddMonitorToTheRight) {
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, changed_display_.size());
15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, added_display_.size());
15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, removed_display_.size());
15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, AddMonitorToTheLeft) {
15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768)));
15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(1024, 0, 640, 480)));
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, added_display_.size());
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, removed_display_.size());
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RemoveMonitorOnRight) {
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ResetDisplayChanges();
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.clear();
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, changed_display_.size());
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, added_display_.size());
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, removed_display_.size());
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RemoveMonitorOnLeft) {
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ResetDisplayChanges();
19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.clear();
19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768)));
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, added_display_.size());
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, removed_display_.size());
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayNearestPoint) {
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kSecondDisplay,
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayNearestPoint(gfx::Point(650, 10)).id());
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kFirstDisplay,
21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayNearestPoint(gfx::Point(10, 10)).id());
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kFirstDisplay,
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayNearestPoint(gfx::Point(10000, 10000)).id());
21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayMatchingBasic) {
21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kSecondDisplay,
22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayMatching(gfx::Rect(700, 20, 100, 100)).id());
22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayMatchingOverlap) {
22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kSecondDisplay,
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayMatching(gfx::Rect(630, 20, 100, 100)).id());
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetPrimaryDisplay) {
23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay,
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 640, 480)));
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // The first display in the list is always the primary, even if other
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // displays are to the left in screen layout.
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kFirstDisplay, screen()->GetPrimaryDisplay().id());
24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) {
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set up a two monitor situation.
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<gfx::Display> displays;
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10),
2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false);
2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10),
2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false);
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kFirstDisplay,
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      screen()->GetDisplayNearestWindow(window_one->GetNativeWindow()).id());
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kSecondDisplay,
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      screen()->GetDisplayNearestWindow(window_two->GetNativeWindow()).id());
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_one->CloseNow();
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_two->CloseNow();
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window is maximized in response to a double click event.
2750529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, DoubleClickHeaderMaximizes) {
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!ui::WmSupportsHint(ui::GetAtom("_NET_WM_STATE_MAXIMIZED_VERT")))
27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->Show();
2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestDesktopNativeWidgetAura* native_widget =
2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCAPTION);
2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::Window* window = widget->GetNativeWindow();
2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  window->SetProperty(aura::client::kCanMaximizeKey, true);
2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DesktopWindowTreeHost* rwh =
2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          GetAcceleratedWidget());
2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(window);
2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.ClickLeftButton();
2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.DoubleClickLeftButton();
2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RunPendingMessages();
2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(rwh->IsMaximized());
2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->CloseNow();
3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window does not maximize in response to a double click event,
3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// if the first click was to a different target component than that of the
3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// second click.
3050529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, DoubleClickTwoDifferentTargetsDoesntMaximizes) {
3060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
3070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->Show();
3080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestDesktopNativeWidgetAura* native_widget =
3090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::Window* window = widget->GetNativeWindow();
3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  window->SetProperty(aura::client::kCanMaximizeKey, true);
3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DesktopWindowTreeHost* rwh =
3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          GetAcceleratedWidget());
3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(window);
3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCLIENT);
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.ClickLeftButton();
3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCAPTION);
3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.DoubleClickLeftButton();
3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RunPendingMessages();
3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(rwh->IsMaximized());
3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->CloseNow();
3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window does not maximize in response to a double click event,
3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// if the double click was interrupted by a right click.
3320529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, RightClickDuringDoubleClickDoesntMaximize) {
3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->Show();
3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestDesktopNativeWidgetAura* native_widget =
3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::Window* window = widget->GetNativeWindow();
3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  window->SetProperty(aura::client::kCanMaximizeKey, true);
3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DesktopWindowTreeHost* rwh = static_cast<DesktopWindowTreeHost*>(
3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
3440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          GetAcceleratedWidget()));
3450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(window);
3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCLIENT);
3480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.ClickLeftButton();
3490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCAPTION);
3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.PressRightButton();
3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.ReleaseRightButton();
3520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(rwh->IsMaximized());
3530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.DoubleClickLeftButton();
3540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RunPendingMessages();
3550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(rwh->IsMaximized());
3560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->CloseNow();
3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that rotating the displays notifies the DisplayObservers.
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RotationChange) {
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<gfx::Display> displays;
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays.push_back(
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::Display(kSecondDisplay, gfx::Rect(640, 0, 1024, 768)));
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResetDisplayChanges();
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_rotation(gfx::Display::ROTATE_90);
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[1].set_rotation(gfx::Display::ROTATE_90);
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(2u, changed_display_.size());
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_rotation(gfx::Display::ROTATE_270);
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(3u, changed_display_.size());
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_rotation(gfx::Display::ROTATE_270);
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(3u, changed_display_.size());
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_rotation(gfx::Display::ROTATE_0);
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[1].set_rotation(gfx::Display::ROTATE_0);
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(5u, changed_display_.size());
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that changing the displays workarea notifies the DisplayObservers.
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DesktopScreenX11Test, WorkareaChange) {
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<gfx::Display> displays;
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays.push_back(
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::Display(kSecondDisplay, gfx::Rect(640, 0, 1024, 768)));
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResetDisplayChanges();
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_work_area(gfx::Rect(0, 0, 300, 300));
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[1].set_work_area(gfx::Rect(0, 0, 300, 300));
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(2u, changed_display_.size());
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_work_area(gfx::Rect(0, 0, 300, 300));
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(2u, changed_display_.size());
411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[1].set_work_area(gfx::Rect(0, 0, 300, 300));
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(2u, changed_display_.size());
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_work_area(gfx::Rect(0, 0, 640, 480));
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[1].set_work_area(gfx::Rect(640, 0, 1024, 768));
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(4u, changed_display_.size());
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that changing the device scale factor notifies the DisplayObservers.
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DesktopScreenX11Test, DeviceScaleFactorChange) {
424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<gfx::Display> displays;
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays.push_back(
427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::Display(kSecondDisplay, gfx::Rect(640, 0, 1024, 768)));
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResetDisplayChanges();
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_device_scale_factor(2.5f);
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[1].set_device_scale_factor(2.5f);
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(2u, changed_display_.size());
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_device_scale_factor(2.5f);
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(2u, changed_display_.size());
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[1].set_device_scale_factor(2.5f);
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(2u, changed_display_.size());
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[0].set_device_scale_factor(1.f);
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  displays[1].set_device_scale_factor(1.f);
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NotifyDisplaysChanged(displays);
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(4u, changed_display_.size());
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace views
454