desktop_screen_x11_unittest.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
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 "base/message_loop/message_loop.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/run_loop.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/aura/client/aura_constants.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/aura/test/event_generator.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_tree_host.h"
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/base/hit_test.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/x/x11_util.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_dispatcher.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_source.h"
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/display_observer.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/x/x11_atom_cache.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/x/x11_types.h"
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/test/views_test_base.h"
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h"
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Class which allows for the designation of non-client component targets of
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// hit tests.
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass TestDesktopNativeWidgetAura : public views::DesktopNativeWidgetAura {
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  explicit TestDesktopNativeWidgetAura(
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      views::internal::NativeWidgetDelegate* delegate)
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      : views::DesktopNativeWidgetAura(delegate) {}
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~TestDesktopNativeWidgetAura() {}
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void set_window_component(int window_component) {
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    window_component_ = window_component;
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // DesktopNativeWidgetAura:
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE {
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return window_component_;
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int window_component_;
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TestDesktopNativeWidgetAura);
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace views {
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kFirstDisplay = 5321829;
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kSecondDisplay = 928310;
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Class which waits till the X11 window associated with the widget passed into
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the constructor is activated. We cannot listen for the widget's activation
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// because the _NET_ACTIVE_WINDOW property is changed after the widget is
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// activated.
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ActivationWaiter : public ui::PlatformEventDispatcher {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit ActivationWaiter(views::Widget* widget)
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : x_root_window_(DefaultRootWindow(gfx::GetXDisplay())),
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        widget_xid_(0),
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        active_(false) {
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const char* kAtomToCache[] = {
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "_NET_ACTIVE_WINDOW",
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        NULL
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    };
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    atom_cache_.reset(new ui::X11AtomCache(gfx::GetXDisplay(), kAtomToCache));
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    widget_xid_ = widget->GetNativeWindow()->GetHost()->
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         GetAcceleratedWidget();
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~ActivationWaiter() {
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Blocks till |widget_xid_| becomes active.
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Wait() {
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (active_)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::RunLoop run_loop;
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    quit_closure_ = run_loop.QuitClosure();
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    run_loop.Run();
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // ui::PlatformEventDispatcher:
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool CanDispatchEvent(const ui::PlatformEvent& event) OVERRIDE {
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return event->type == PropertyNotify &&
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch           event->xproperty.window == x_root_window_;
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE {
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ::Window xid;
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    CHECK_EQ(PropertyNotify, event->type);
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    CHECK_EQ(x_root_window_, event->xproperty.window);
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (event->xproperty.atom == atom_cache_->GetAtom("_NET_ACTIVE_WINDOW") &&
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ui::GetXIDProperty(x_root_window_, "_NET_ACTIVE_WINDOW", &xid) &&
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        xid == widget_xid_) {
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      active_ = true;
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (!quit_closure_.is_null())
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        quit_closure_.Run();
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return ui::POST_DISPATCH_NONE;
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<ui::X11AtomCache> atom_cache_;
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::Window x_root_window_;
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::Window widget_xid_;
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool active_;
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::Closure quit_closure_;
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ActivationWaiter);
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DesktopScreenX11Test : public views::ViewsTestBase,
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             public gfx::DisplayObserver {
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DesktopScreenX11Test() {}
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~DesktopScreenX11Test() {}
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Overridden from testing::Test:
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ViewsTestBase::SetUp();
13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Initialize the world to the single monitor case.
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::vector<gfx::Display> displays;
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    screen_.reset(new DesktopScreenX11(displays));
13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    screen_->AddObserver(this);
13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    screen_.reset();
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ViewsTestBase::TearDown();
14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) protected:
14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> changed_display_;
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> added_display_;
14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> removed_display_;
15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DesktopScreenX11* screen() { return screen_.get(); }
15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void ResetDisplayChanges() {
15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    changed_display_.clear();
15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    added_display_.clear();
15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    removed_display_.clear();
15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds,
1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      bool use_test_native_widget) {
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Widget* toplevel = new Widget;
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Widget::InitParams toplevel_params =
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CreateParams(Widget::InitParams::TYPE_WINDOW);
1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (use_test_native_widget) {
1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      toplevel_params.native_widget =
1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          new TestDesktopNativeWidgetAura(toplevel);
1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    } else {
1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      toplevel_params.native_widget =
1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          new views::DesktopNativeWidgetAura(toplevel);
1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    toplevel_params.bounds = bounds;
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    toplevel_params.remove_standard_frame = true;
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    toplevel->Init(toplevel_params);
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return toplevel;
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Overridden from gfx::DisplayObserver:
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE {
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    changed_display_.push_back(display);
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE {
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    added_display_.push_back(new_display);
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE {
18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    removed_display_.push_back(old_display);
18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<DesktopScreenX11> screen_;
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11Test);
19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, BoundsChangeSingleMonitor) {
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 1024, 768)));
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, added_display_.size());
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, removed_display_.size());
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, AddMonitorToTheRight) {
20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, changed_display_.size());
21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, added_display_.size());
21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, removed_display_.size());
21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, AddMonitorToTheLeft) {
21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768)));
22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(1024, 0, 640, 480)));
22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, added_display_.size());
22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, removed_display_.size());
22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RemoveMonitorOnRight) {
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ResetDisplayChanges();
23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.clear();
23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, changed_display_.size());
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, added_display_.size());
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, removed_display_.size());
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RemoveMonitorOnLeft) {
24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
25468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ResetDisplayChanges();
25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.clear();
25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768)));
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, changed_display_.size());
26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, added_display_.size());
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, removed_display_.size());
26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayNearestPoint) {
26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kSecondDisplay,
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayNearestPoint(gfx::Point(650, 10)).id());
27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kFirstDisplay,
27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayNearestPoint(gfx::Point(10, 10)).id());
27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kFirstDisplay,
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayNearestPoint(gfx::Point(10000, 10000)).id());
27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayMatchingBasic) {
28168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kSecondDisplay,
28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayMatching(gfx::Rect(700, 20, 100, 100)).id());
28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayMatchingOverlap) {
29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
29768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kSecondDisplay,
29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            screen()->GetDisplayMatching(gfx::Rect(630, 20, 100, 100)).id());
30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetPrimaryDisplay) {
30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<gfx::Display> displays;
30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay,
30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 640, 480)));
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  screen()->ProcessDisplayChange(displays);
30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // The first display in the list is always the primary, even if other
31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // displays are to the left in screen layout.
31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(kFirstDisplay, screen()->GetPrimaryDisplay().id());
31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DesktopScreenX11Test, GetWindowAtScreenPoint) {
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(110, 110, 10, 10),
3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false);
3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(150, 150, 10, 10),
3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false);
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Widget* window_three =
3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      BuildTopLevelDesktopWidget(gfx::Rect(115, 115, 20, 20), false);
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_three->Show();
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_two->Show();
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_one->Show();
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Make sure the internal state of DesktopWindowTreeHostX11 is set up
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // correctly.
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(3u, DesktopWindowTreeHostX11::GetAllOpenWindows().size());
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(window_one->GetNativeWindow(),
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            screen()->GetWindowAtScreenPoint(gfx::Point(115, 115)));
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(window_two->GetNativeWindow(),
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            screen()->GetWindowAtScreenPoint(gfx::Point(155, 155)));
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(NULL,
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            screen()->GetWindowAtScreenPoint(gfx::Point(200, 200)));
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Bring the third window in front. It overlaps with the first window.
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Hit-testing on the intersecting region should give the third window.
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ActivationWaiter activation_waiter(window_three);
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_three->Activate();
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  activation_waiter.Wait();
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(window_three->GetNativeWindow(),
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            screen()->GetWindowAtScreenPoint(gfx::Point(115, 115)));
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_one->CloseNow();
3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_two->CloseNow();
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_three->CloseNow();
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) {
3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set up a two monitor situation.
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<gfx::Display> displays;
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  displays.push_back(gfx::Display(kSecondDisplay,
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  gfx::Rect(640, 0, 1024, 768)));
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  screen()->ProcessDisplayChange(displays);
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10),
3600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false);
3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10),
3620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false);
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kFirstDisplay,
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      screen()->GetDisplayNearestWindow(window_one->GetNativeWindow()).id());
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kSecondDisplay,
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      screen()->GetDisplayNearestWindow(window_two->GetNativeWindow()).id());
3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_one->CloseNow();
3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_two->CloseNow();
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window is maximized in response to a double click event.
3760529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, DoubleClickHeaderMaximizes) {
3770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->Show();
3790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestDesktopNativeWidgetAura* native_widget =
3800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
3810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCAPTION);
3820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::Window* window = widget->GetNativeWindow();
3840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  window->SetProperty(aura::client::kCanMaximizeKey, true);
3850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
3870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DesktopWindowTreeHost* rwh =
3880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
3890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          GetAcceleratedWidget());
3900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::test::EventGenerator generator(window);
3920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.ClickLeftButton();
3930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.DoubleClickLeftButton();
3940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RunPendingMessages();
3950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(rwh->IsMaximized());
3960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->CloseNow();
3980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window does not maximize in response to a double click event,
4010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// if the first click was to a different target component than that of the
4020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// second click.
4030529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, DoubleClickTwoDifferentTargetsDoesntMaximizes) {
4040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
4050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->Show();
4060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestDesktopNativeWidgetAura* native_widget =
4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
4080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::Window* window = widget->GetNativeWindow();
4100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  window->SetProperty(aura::client::kCanMaximizeKey, true);
4110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
4130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DesktopWindowTreeHost* rwh =
4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
4150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          GetAcceleratedWidget());
4160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::test::EventGenerator generator(window);
4180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCLIENT);
4190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.ClickLeftButton();
4200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCAPTION);
4210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.DoubleClickLeftButton();
4220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RunPendingMessages();
4230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(rwh->IsMaximized());
4240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->CloseNow();
4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window does not maximize in response to a double click event,
4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// if the double click was interrupted by a right click.
4300529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, RightClickDuringDoubleClickDoesntMaximize) {
4310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
4320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->Show();
4330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestDesktopNativeWidgetAura* native_widget =
4340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
4350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::Window* window = widget->GetNativeWindow();
4370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  window->SetProperty(aura::client::kCanMaximizeKey, true);
4380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
4400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DesktopWindowTreeHost* rwh = static_cast<DesktopWindowTreeHost*>(
4410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          GetAcceleratedWidget()));
4430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::test::EventGenerator generator(window);
4450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCLIENT);
4460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.ClickLeftButton();
4470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  native_widget->set_window_component(HTCAPTION);
4480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.PressRightButton();
4490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.ReleaseRightButton();
4500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(rwh->IsMaximized());
4510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  generator.DoubleClickLeftButton();
4520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RunPendingMessages();
4530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(rwh->IsMaximized());
4540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  widget->CloseNow();
4560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
45868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace views
459