extended_desktop_unittest.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h"
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/root_window_controller.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/coordinate_conversion.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_cycle_controller.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_properties.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/activation_client.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/capture_client.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_client.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/event_generator.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/window_test_api.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor.h"
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetSecondaryDisplayLayout(DisplayLayout::Position position) {
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DisplayLayout layout =
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      Shell::GetInstance()->display_manager()->GetCurrentDisplayLayout();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.position = position;
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Shell::GetInstance()->display_controller()->
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SetLayoutForCurrentDisplays(layout);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochinternal::DisplayManager* GetDisplayManager() {
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return Shell::GetInstance()->display_manager();
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ModalWidgetDelegate : public views::WidgetDelegateView {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModalWidgetDelegate() {}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ModalWidgetDelegate() {}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::WidgetDelegate:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* GetContentsView() OVERRIDE {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return this;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::ModalType GetModalType() const OVERRIDE {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui::MODAL_TYPE_SYSTEM;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ModalWidgetDelegate);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// An event handler which moves the target window to the secondary root window
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at pre-handle phase of a mouse release event.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MoveWindowByClickEventHandler : public ui::EventHandler {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit MoveWindowByClickEventHandler(aura::Window* target)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : target_(target) {}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MoveWindowByClickEventHandler() {}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::EventHandler overrides:
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (event->type() == ui::ET_MOUSE_RELEASED) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK_LT(1u, root_windows.size());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      root_windows[1]->AddChild(target_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target_;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MoveWindowByClickEventHandler);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// An event handler which records the event's locations.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EventLocationRecordingEventHandler : public ui::EventHandler {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit EventLocationRecordingEventHandler() {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reset();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~EventLocationRecordingEventHandler() {}
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetLocationsAndReset() {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string result =
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        location_.ToString() + " " + root_location_.ToString();
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reset();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ui::EventHandler overrides:
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event->type() == ui::ET_MOUSE_MOVED ||
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        event->type() == ui::ET_MOUSE_DRAGGED) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      location_ = event->location();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      root_location_ = event->root_location();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void reset() {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    location_.SetPoint(-999, -999);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_location_.SetPoint(-999, -999);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point root_location_;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point location_;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EventLocationRecordingEventHandler);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtendedDesktopTest : public test::AshTestBase {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* CreateTestWidget(const gfx::Rect& bounds) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CreateTestWidgetWithParentAndContext(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NULL, CurrentContext(), bounds, false);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* CreateTestWidgetWithParent(views::Widget* parent,
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            const gfx::Rect& bounds,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            bool child) {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(parent);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CreateTestWidgetWithParentAndContext(parent, NULL, bounds, child);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* CreateTestWidgetWithParentAndContext(views::Widget* parent,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      gfx::NativeView context,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      const gfx::Rect& bounds,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      bool child) {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params.parent = parent->GetNativeView();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.context = context;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.bounds = bounds;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.child = child;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget* widget = new views::Widget;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget->Init(params);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget->Show();
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return widget;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test conditions that root windows in extended desktop mode
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// must satisfy.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, Basic) {
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All root windows must have the root window controller.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, root_windows.size());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (Shell::RootWindowList::const_iterator iter = root_windows.begin();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != root_windows.end(); ++iter) {
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(internal::GetRootWindowController(*iter) != NULL);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure root windows share the same controllers.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(aura::client::GetFocusClient(root_windows[0]),
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            aura::client::GetFocusClient(root_windows[1]));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(aura::client::GetActivationClient(root_windows[0]),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            aura::client::GetActivationClient(root_windows[1]));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(aura::client::GetCaptureClient(root_windows[0]),
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            aura::client::GetCaptureClient(root_windows[1]));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, Activation) {
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget_on_1st = CreateTestWidget(gfx::Rect(10, 10, 100, 100));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget_on_2nd =
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateTestWidget(gfx::Rect(1200, 10, 100, 100));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], widget_on_1st->GetNativeView()->GetRootWindow());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], widget_on_2nd->GetNativeView()->GetRootWindow());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(widget_on_2nd->GetNativeView(),
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            aura::client::GetFocusClient(root_windows[0])->GetFocusedWindow());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(widget_on_2nd->GetNativeView()));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator& event_generator(GetEventGenerator());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clicking a window changes the active window and active root window.
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.MoveMouseToCenterOf(widget_on_1st->GetNativeView());
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ClickLeftButton();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(widget_on_1st->GetNativeView(),
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            aura::client::GetFocusClient(root_windows[0])->GetFocusedWindow());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(widget_on_1st->GetNativeView()));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.MoveMouseToCenterOf(widget_on_2nd->GetNativeView());
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ClickLeftButton();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(widget_on_2nd->GetNativeView(),
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            aura::client::GetFocusClient(root_windows[0])->GetFocusedWindow());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(widget_on_2nd->GetNativeView()));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, SystemModal) {
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget_on_1st = CreateTestWidget(gfx::Rect(10, 10, 100, 100));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(widget_on_1st->GetNativeView()));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], widget_on_1st->GetNativeView()->GetRootWindow());
225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(root_windows[0], Shell::GetTargetRootWindow());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open system modal. Make sure it's on 2nd root window and active.
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* modal_widget = views::Widget::CreateWindowWithContextAndBounds(
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new ModalWidgetDelegate(),
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CurrentContext(),
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(1200, 100, 100, 100));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modal_widget->Show();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(modal_widget->GetNativeView()));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], modal_widget->GetNativeView()->GetRootWindow());
235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(root_windows[1], Shell::GetTargetRootWindow());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator& event_generator(GetEventGenerator());
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clicking a widget on widget_on_1st display should not change activation.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.MoveMouseToCenterOf(widget_on_1st->GetNativeView());
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ClickLeftButton();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(modal_widget->GetNativeView()));
243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(root_windows[1], Shell::GetTargetRootWindow());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close system modal and so clicking a widget should work now.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modal_widget->Close();
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.MoveMouseToCenterOf(widget_on_1st->GetNativeView());
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ClickLeftButton();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(widget_on_1st->GetNativeView()));
250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(root_windows[0], Shell::GetTargetRootWindow());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, TestCursor) {
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::kCursorPointer, root_windows[0]->last_cursor().native_type());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::kCursorPointer, root_windows[1]->last_cursor().native_type());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->cursor_manager()->SetCursor(ui::kCursorCopy);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::kCursorCopy, root_windows[0]->last_cursor().native_type());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::kCursorCopy, root_windows[1]->last_cursor().native_type());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, TestCursorLocation) {
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("1000x600,600x400");
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::WindowTestApi root_window0_test_api(root_windows[0]);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::WindowTestApi root_window1_test_api(root_windows[1]);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_windows[0]->MoveCursorTo(gfx::Point(10, 10));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,10", Shell::GetScreen()->GetCursorScreenPoint().ToString());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(root_window0_test_api.ContainsMouse());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(root_window1_test_api.ContainsMouse());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_windows[1]->MoveCursorTo(gfx::Point(10, 20));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1010,20", Shell::GetScreen()->GetCursorScreenPoint().ToString());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(root_window0_test_api.ContainsMouse());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(root_window1_test_api.ContainsMouse());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_windows[0]->MoveCursorTo(gfx::Point(20, 10));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,10", Shell::GetScreen()->GetCursorScreenPoint().ToString());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(root_window0_test_api.ContainsMouse());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(root_window1_test_api.ContainsMouse());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, CycleWindows) {
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("700x500,500x500");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowCycleController* controller =
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->window_cycle_controller();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* d1_w1 = CreateTestWidget(gfx::Rect(10, 10, 100, 100));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], d1_w1->GetNativeView()->GetRootWindow());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* d2_w1 = CreateTestWidget(gfx::Rect(800, 10, 100, 100));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], d2_w1->GetNativeView()->GetRootWindow());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d2_w1->GetNativeView()));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::FORWARD, false);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d1_w1->GetNativeView()));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::FORWARD, false);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d2_w1->GetNativeView()));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::BACKWARD, false);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d1_w1->GetNativeView()));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::BACKWARD, false);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d2_w1->GetNativeView()));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cycle through all windows across root windows.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* d1_w2 = CreateTestWidget(gfx::Rect(10, 200, 100, 100));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], d1_w2->GetNativeView()->GetRootWindow());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* d2_w2 = CreateTestWidget(gfx::Rect(800, 200, 100, 100));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], d2_w2->GetNativeView()->GetRootWindow());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::FORWARD, true);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d1_w2->GetNativeView()));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::FORWARD, true);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d2_w1->GetNativeView()));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::FORWARD, true);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d1_w1->GetNativeView()));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::FORWARD, true);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d2_w2->GetNativeView()));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Backwards
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::BACKWARD, true);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d1_w1->GetNativeView()));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::BACKWARD, true);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d2_w1->GetNativeView()));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::BACKWARD, true);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d1_w2->GetNativeView()));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->HandleCycleWindow(WindowCycleController::BACKWARD, true);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(d2_w2->GetNativeView()));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, GetRootWindowAt) {
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("700x500,500x500");
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::LEFT);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], wm::GetRootWindowAt(gfx::Point(-400, 100)));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], wm::GetRootWindowAt(gfx::Point(-1, 100)));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], wm::GetRootWindowAt(gfx::Point(0, 300)));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], wm::GetRootWindowAt(gfx::Point(700,300)));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Zero origin.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], wm::GetRootWindowAt(gfx::Point(0, 0)));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Out of range point should return the primary root window
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], wm::GetRootWindowAt(gfx::Point(-600, 0)));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], wm::GetRootWindowAt(gfx::Point(701, 100)));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, GetRootWindowMatching) {
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("700x500,500x500");
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::LEFT);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Containing rect.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1],
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(-300, 10, 50, 50)));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0],
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(100, 10, 50, 50)));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Intersecting rect.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1],
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(-200, 0, 300, 300)));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0],
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(-100, 0, 300, 300)));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Zero origin.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0],
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(0, 0, 0, 0)));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0],
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(0, 0, 1, 1)));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Empty rect.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1],
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(-400, 100, 0, 0)));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0],
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(100, 100, 0, 0)));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Out of range rect should return the primary root window.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0],
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(-600, -300, 50, 50)));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0],
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wm::GetRootWindowMatching(gfx::Rect(0, 1000, 50, 50)));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtendedDesktopTest, Capture) {
4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventCountDelegate r1_d1;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventCountDelegate r1_d2;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventCountDelegate r2_d1;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> r1_w1(aura::test::CreateTestWindowWithDelegate(
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &r1_d1, 0, gfx::Rect(10, 10, 100, 100), root_windows[0]));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> r1_w2(aura::test::CreateTestWindowWithDelegate(
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &r1_d2, 0, gfx::Rect(10, 100, 100, 100), root_windows[0]));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> r2_w1(aura::test::CreateTestWindowWithDelegate(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &r2_d1, 0, gfx::Rect(10, 10, 100, 100), root_windows[1]));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r1_w1->SetCapture();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r1_w1.get(),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            aura::client::GetCaptureWindow(r2_w1->GetRootWindow()));
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator2(root_windows[1]);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator2.MoveMouseToCenterOf(r2_w1.get());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator2.ClickLeftButton();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0 0 0", r2_d1.GetMouseMotionCountsAndReset());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0 0", r2_d1.GetMouseButtonCountsAndReset());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The mouse is outside. On chromeos, the mouse is warped to the
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dest root window, but it's not implemented on Win yet, so
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no mouse move event on Win.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1 1 0", r1_d1.GetMouseMotionCountsAndReset());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1 1", r1_d1.GetMouseButtonCountsAndReset());
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Emulate passive grab. (15,15) on 1st display is (-985,15) on 2nd
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // display.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator2.MoveMouseTo(-985, 15);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0 1 0", r1_d1.GetMouseMotionCountsAndReset());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r1_w2->SetCapture();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r1_w2.get(),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            aura::client::GetCaptureWindow(r2_w1->GetRootWindow()));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator2.MoveMouseBy(10, 10);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator2.ClickLeftButton();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0 0 0", r2_d1.GetMouseMotionCountsAndReset());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0 0", r2_d1.GetMouseButtonCountsAndReset());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mouse is already entered.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0 1 0", r1_d2.GetMouseMotionCountsAndReset());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1 1", r1_d2.GetMouseButtonCountsAndReset());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r1_w2->ReleaseCapture();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, aura::client::GetCaptureWindow(r2_w1->GetRootWindow()));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator2.MoveMouseTo(15, 15);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator2.ClickLeftButton();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1 1 0", r2_d1.GetMouseMotionCountsAndReset());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1 1", r2_d1.GetMouseButtonCountsAndReset());
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the mouse_moved_handler_ is properly reset.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0 0 0", r1_d2.GetMouseMotionCountsAndReset());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0 0", r1_d2.GetMouseButtonCountsAndReset());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, MoveWindow) {
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* d1 = CreateTestWidget(gfx::Rect(10, 10, 100, 100));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], d1->GetNativeView()->GetRootWindow());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d1->SetBounds(gfx::Rect(1010, 10, 100, 100));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1010,10 100x100",
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            d1->GetWindowBoundsInScreen().ToString());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], d1->GetNativeView()->GetRootWindow());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d1->SetBounds(gfx::Rect(10, 10, 100, 100));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,10 100x100",
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            d1->GetWindowBoundsInScreen().ToString());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], d1->GetNativeView()->GetRootWindow());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the bounds which doesn't fit to the root window
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // works correctly.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d1->SetBounds(gfx::Rect(1560, 30, 100, 100));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], d1->GetNativeView()->GetRootWindow());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1560,30 100x100",
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            d1->GetWindowBoundsInScreen().ToString());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setting outside of root windows will be moved to primary root window.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(oshima): This one probably should pick the closest root window.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d1->SetBounds(gfx::Rect(200, 10, 100, 100));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], d1->GetNativeView()->GetRootWindow());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies if the mouse event arrives to the window even when the window
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// moves to another root in a pre-target handler.  See: crbug.com/157583
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, MoveWindowByMouseClick) {
4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventCountDelegate delegate;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window(aura::test::CreateTestWindowWithDelegate(
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &delegate, 0, gfx::Rect(10, 10, 100, 100), root_windows[0]));
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MoveWindowByClickEventHandler event_handler(window.get());
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->AddPreTargetHandler(&event_handler);
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator& event_generator(GetEventGenerator());
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.MoveMouseToCenterOf(window.get());
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ClickLeftButton();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both mouse pressed and released arrive at the window and its delegate.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1 1", delegate.GetMouseButtonCountsAndReset());
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also event_handler moves the window to another root at mouse release.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], window->GetRootWindow());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtendedDesktopTest, MoveWindowToDisplay) {
5217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
5227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x1000,1000x1000");
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display display0 = Shell::GetScreen()->GetDisplayMatching(
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      root_windows[0]->GetBoundsInScreen());
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetDisplayMatching(
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      root_windows[1]->GetBoundsInScreen());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(display0.id(), display1.id());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* d1 = CreateTestWidget(gfx::Rect(10, 10, 1000, 100));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], d1->GetNativeView()->GetRootWindow());
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move the window where the window spans both root windows. Since the second
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // parameter is |display1|, the window should be shown on the secondary root.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d1->GetNativeWindow()->SetBoundsInScreen(gfx::Rect(500, 10, 1000, 100),
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           display1);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,10 1000x100",
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            d1->GetWindowBoundsInScreen().ToString());
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], d1->GetNativeView()->GetRootWindow());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move to the primary root.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d1->GetNativeWindow()->SetBoundsInScreen(gfx::Rect(500, 10, 1000, 100),
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           display0);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,10 1000x100",
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            d1->GetWindowBoundsInScreen().ToString());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], d1->GetNativeView()->GetRootWindow());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, MoveWindowWithTransient) {
5537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
5547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* w1 = CreateTestWidget(gfx::Rect(10, 10, 100, 100));
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* w1_t1 = CreateTestWidgetWithParent(
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      w1, gfx::Rect(50, 50, 50, 50), false /* transient */);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transient child of the transient child.
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* w1_t11 = CreateTestWidgetWithParent(
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      w1_t1, gfx::Rect(1200, 70, 30, 30), false /* transient */);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* w11 = CreateTestWidgetWithParent(
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      w1, gfx::Rect(10, 10, 40, 40), true /* child */);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* w11_t1 = CreateTestWidgetWithParent(
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      w1, gfx::Rect(1300, 100, 80, 80), false /* transient */);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], w1->GetNativeView()->GetRootWindow());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], w11->GetNativeView()->GetRootWindow());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], w1_t1->GetNativeView()->GetRootWindow());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], w1_t11->GetNativeView()->GetRootWindow());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], w11_t1->GetNativeView()->GetRootWindow());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("50,50 50x50",
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w1_t1->GetWindowBoundsInScreen().ToString());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1200,70 30x30",
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w1_t11->GetWindowBoundsInScreen().ToString());
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("20,20 40x40",
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w11->GetWindowBoundsInScreen().ToString());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1300,100 80x80",
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w11_t1->GetWindowBoundsInScreen().ToString());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->SetBounds(gfx::Rect(1100,10,100,100));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], w1_t1->GetNativeView()->GetRootWindow());
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], w1_t1->GetNativeView()->GetRootWindow());
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], w1_t11->GetNativeView()->GetRootWindow());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], w11->GetNativeView()->GetRootWindow());
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], w11_t1->GetNativeView()->GetRootWindow());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1110,20 40x40",
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w11->GetWindowBoundsInScreen().ToString());
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transient window's screen bounds stays the same.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("50,50 50x50",
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w1_t1->GetWindowBoundsInScreen().ToString());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1200,70 30x30",
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w1_t11->GetWindowBoundsInScreen().ToString());
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1300,100 80x80",
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w11_t1->GetWindowBoundsInScreen().ToString());
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transient window doesn't move between root window unless
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // its transient parent moves.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1_t1->SetBounds(gfx::Rect(10, 50, 50, 50));
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], w1_t1->GetNativeView()->GetRootWindow());
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,50 50x50",
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            w1_t1->GetWindowBoundsInScreen().ToString());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test if the Window::ConvertPointToTarget works across root windows.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(oshima): Move multiple display suport and this test to aura.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, ConvertPoint) {
6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
6147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
6157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Screen* screen = Shell::GetInstance()->screen();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("1000x600,600x400");
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
6187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Display display_1 = screen->GetDisplayNearestWindow(root_windows[0]);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0", display_1.bounds().origin().ToString());
6207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Display display_2 = screen->GetDisplayNearestWindow(root_windows[1]);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1000,0", display_2.bounds().origin().ToString());
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* d1 =
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateTestWidget(gfx::Rect(10, 10, 100, 100))->GetNativeView();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* d2 =
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateTestWidget(gfx::Rect(1020, 20, 100, 100))->GetNativeView();
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], d1->GetRootWindow());
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], d2->GetRootWindow());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert point in the Root2's window to the Root1's window Coord.
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point p(0, 0);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(root_windows[1], root_windows[0], &p);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1000,0", p.ToString());
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.SetPoint(0, 0);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(d2, d1, &p);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1010,10", p.ToString());
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert point in the Root1's window to the Root2's window Coord.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.SetPoint(0, 0);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(root_windows[0], root_windows[1], &p);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-1000,0", p.ToString());
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.SetPoint(0, 0);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(d1, d2, &p);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-1010,-10", p.ToString());
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move the 2nd display to the bottom and test again.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display_2 = screen->GetDisplayNearestWindow(root_windows[1]);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,600", display_2.bounds().origin().ToString());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert point in Root2's window to Root1's window Coord.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.SetPoint(0, 0);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(root_windows[1], root_windows[0], &p);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,600", p.ToString());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.SetPoint(0, 0);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(d2, d1, &p);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("10,610", p.ToString());
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert point in Root1's window to Root2's window Coord.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.SetPoint(0, 0);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(root_windows[0], root_windows[1], &p);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,-600", p.ToString());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.SetPoint(0, 0);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(d1, d2, &p);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-10,-610", p.ToString());
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, OpenSystemTray) {
6707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
6717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
6727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("500x600,600x400");
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemTray* tray = ash::Shell::GetInstance()->GetPrimarySystemTray();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(tray->HasSystemBubble());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator& event_generator(GetEventGenerator());
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens the tray by a dummy click event and makes sure that adding/removing
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // displays doesn't break anything.
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.MoveMouseToCenterOf(tray->GetWidget()->GetNativeWindow());
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_generator.ClickLeftButton();
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tray->HasSystemBubble());
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("500x600");
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tray->HasSystemBubble());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("500x600,600x400");
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tray->HasSystemBubble());
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes the tray and again makes sure that adding/removing displays doesn't
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // break anything.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_generator.ClickLeftButton();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tray->HasSystemBubble());
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("500x600");
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tray->HasSystemBubble());
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("500x600,600x400");
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tray->HasSystemBubble());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, StayInSameRootWindow) {
7047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
7057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
7067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("100x100,200x200");
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* w1 = CreateTestWidget(gfx::Rect(10, 10, 50, 50));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], w1->GetNativeView()->GetRootWindow());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->SetBounds(gfx::Rect(150, 10, 50, 50));
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], w1->GetNativeView()->GetRootWindow());
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The widget stays in the same root if kStayInSameRootWindowKey is set to
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true.
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->GetNativeView()->SetProperty(internal::kStayInSameRootWindowKey, true);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->SetBounds(gfx::Rect(10, 10, 50, 50));
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], w1->GetNativeView()->GetRootWindow());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The widget should now move to the 1st root window without the property.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->GetNativeView()->ClearProperty(internal::kStayInSameRootWindowKey);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->SetBounds(gfx::Rect(10, 10, 50, 50));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], w1->GetNativeView()->GetRootWindow());
7247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // a window in SettingsBubbleContainer and StatusContainer should
7267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // not move to another root window regardles of the bounds specified.
7277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  aura::Window* settings_bubble_container =
7287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      Shell::GetPrimaryRootWindowController()->GetContainer(
7297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          internal::kShellWindowId_SettingBubbleContainer);
7307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  aura::Window* window = aura::test::CreateTestWindowWithId(
7317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      100, settings_bubble_container);
7327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  window->SetBoundsInScreen(gfx::Rect(150, 10, 50, 50),
7337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            ScreenAsh::GetSecondaryDisplay());
7347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(root_windows[0], window->GetRootWindow());
7357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  aura::Window* status_container =
7377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      Shell::GetPrimaryRootWindowController()->GetContainer(
7387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          internal::kShellWindowId_StatusContainer);
7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  window = aura::test::CreateTestWindowWithId(100, status_container);
7407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  window->SetBoundsInScreen(gfx::Rect(150, 10, 50, 50),
7417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            ScreenAsh::GetSecondaryDisplay());
7427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(root_windows[0], window->GetRootWindow());
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtendedDesktopTest, KeyEventsOnLockScreen) {
7467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
7477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
7487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("100x100,200x200");
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create normal windows on both displays.
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget1 = CreateTestWidget(
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetScreen()->GetPrimaryDisplay().bounds());
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget1->Show();
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[0], widget1->GetNativeView()->GetRootWindow());
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget2 = CreateTestWidget(
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ScreenAsh::GetSecondaryDisplay().bounds());
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget2->Show();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root_windows[1], widget2->GetNativeView()->GetRootWindow());
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a LockScreen window.
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* lock_widget = CreateTestWidget(
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetScreen()->GetPrimaryDisplay().bounds());
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Textfield* textfield = new views::Textfield;
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lock_widget->client_view()->AddChildView(textfield);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::Shell::GetContainer(
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(),
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::internal::kShellWindowId_LockScreenContainer)->
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddChild(lock_widget->GetNativeView());
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lock_widget->Show();
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  textfield->RequestFocus();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::FocusClient* focus_client =
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::GetFocusClient(root_windows[0]);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lock window should get events on both root windows.
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator& event_generator(GetEventGenerator());
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.set_current_root_window(root_windows[0]);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.PressKey(ui::VKEY_A, 0);
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ReleaseKey(ui::VKEY_A, 0);
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("a", UTF16ToASCII(textfield->text()));
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.set_current_root_window(root_windows[1]);
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.PressKey(ui::VKEY_B, 0);
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ReleaseKey(ui::VKEY_B, 0);
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("ab", UTF16ToASCII(textfield->text()));
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display. The lock window still should get the events.
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("100x100");
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.PressKey(ui::VKEY_C, 0);
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ReleaseKey(ui::VKEY_C, 0);
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("abc", UTF16ToASCII(textfield->text()));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating 2nd display again, and lock window still should get events
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on both root windows.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("100x100,200x200");
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_windows = Shell::GetAllRootWindows();
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.set_current_root_window(root_windows[0]);
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.PressKey(ui::VKEY_D, 0);
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ReleaseKey(ui::VKEY_D, 0);
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("abcd", UTF16ToASCII(textfield->text()));
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.set_current_root_window(root_windows[1]);
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.PressKey(ui::VKEY_E, 0);
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_generator.ReleaseKey(ui::VKEY_E, 0);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("abcde", UTF16ToASCII(textfield->text()));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtendedDesktopTest, PassiveGrab) {
8197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
8207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
8217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EventLocationRecordingEventHandler event_handler;
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->AddPreTargetHandler(&event_handler);
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("300x300,200x200");
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget = CreateTestWidget(gfx::Rect(50, 50, 200, 200));
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Show();
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ("50,50 200x200", widget->GetWindowBoundsInScreen().ToString());
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator& generator(GetEventGenerator());
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.MoveMouseTo(150, 150);
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 150,150", event_handler.GetLocationsAndReset());
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.PressLeftButton();
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.MoveMouseTo(400, 150);
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("350,100 400,150", event_handler.GetLocationsAndReset());
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.ReleaseLeftButton();
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-999,-999 -999,-999", event_handler.GetLocationsAndReset());
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.MoveMouseTo(400, 150);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,150 100,150", event_handler.GetLocationsAndReset());
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
850