Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Unified Diff: ui/views/widget/desktop_aura/x11_topmost_window_finder_unittest.cc

Issue 356353002: Reenable X11TopmostWindowFinderTests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/widget/desktop_aura/x11_topmost_window_finder_unittest.cc
diff --git a/ui/views/widget/desktop_aura/x11_topmost_window_finder_unittest.cc b/ui/views/widget/desktop_aura/x11_topmost_window_finder_unittest.cc
deleted file mode 100644
index 7c719640abb511c4c6d7036eb4ce93cb89b5cc7d..0000000000000000000000000000000000000000
--- a/ui/views/widget/desktop_aura/x11_topmost_window_finder_unittest.cc
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/widget/desktop_aura/x11_topmost_window_finder.h"
-
-#include <algorithm>
-#include <vector>
-#include <X11/extensions/shape.h>
-#include <X11/Xlib.h>
-#include <X11/Xregion.h>
-
-// Get rid of X11 macros which conflict with gtest.
-#undef Bool
-#undef None
-
-#include "base/memory/scoped_ptr.h"
-#include "third_party/skia/include/core/SkRect.h"
-#include "third_party/skia/include/core/SkRegion.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/events/platform/x11/x11_event_source.h"
-#include "ui/gfx/path.h"
-#include "ui/gfx/path_x11.h"
-#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/views/test/views_test_base.h"
-#include "ui/views/test/x11_property_change_waiter.h"
-#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
-#include "ui/views/widget/desktop_aura/x11_desktop_handler.h"
-#include "ui/views/widget/widget.h"
-
-namespace views {
-
-namespace {
-
-// Waits till |window| is minimized.
-class MinimizeWaiter : public X11PropertyChangeWaiter {
- public:
- explicit MinimizeWaiter(XID window)
- : X11PropertyChangeWaiter(window, "_NET_WM_STATE") {
- const char* kAtomsToCache[] = { "_NET_WM_STATE_HIDDEN", NULL };
- atom_cache_.reset(new ui::X11AtomCache(gfx::GetXDisplay(), kAtomsToCache));
- }
-
- virtual ~MinimizeWaiter() {
- }
-
- private:
- // X11PropertyChangeWaiter:
- virtual bool ShouldKeepOnWaiting(const ui::PlatformEvent& event) OVERRIDE {
- std::vector<Atom> wm_states;
- if (ui::GetAtomArrayProperty(xwindow(), "_NET_WM_STATE", &wm_states)) {
- std::vector<Atom>::iterator it = std::find(
- wm_states.begin(),
- wm_states.end(),
- atom_cache_->GetAtom("_NET_WM_STATE_HIDDEN"));
- return it == wm_states.end();
- }
- return true;
- }
-
- scoped_ptr<ui::X11AtomCache> atom_cache_;
-
- DISALLOW_COPY_AND_ASSIGN(MinimizeWaiter);
-};
-
-// Waits till |_NET_CLIENT_LIST_STACKING| is updated to include
-// |expected_windows|.
-class StackingClientListWaiter : public X11PropertyChangeWaiter {
- public:
- StackingClientListWaiter(XID* expected_windows, size_t count)
- : X11PropertyChangeWaiter(ui::GetX11RootWindow(),
- "_NET_CLIENT_LIST_STACKING"),
- expected_windows_(expected_windows, expected_windows + count) {
- }
-
- virtual ~StackingClientListWaiter() {
- }
-
- // X11PropertyChangeWaiter:
- virtual void Wait() OVERRIDE {
- // StackingClientListWaiter may be created after
- // _NET_CLIENT_LIST_STACKING already contains |expected_windows|.
- if (!ShouldKeepOnWaiting(NULL))
- return;
-
- X11PropertyChangeWaiter::Wait();
- }
-
- private:
- // X11PropertyChangeWaiter:
- virtual bool ShouldKeepOnWaiting(const ui::PlatformEvent& event) OVERRIDE {
- std::vector<XID> stack;
- ui::GetXWindowStack(ui::GetX11RootWindow(), &stack);
- for (size_t i = 0; i < expected_windows_.size(); ++i) {
- std::vector<XID>::iterator it = std::find(
- stack.begin(), stack.end(), expected_windows_[i]);
- if (it == stack.end())
- return true;
- }
- return false;
- }
-
- std::vector<XID> expected_windows_;
-
- DISALLOW_COPY_AND_ASSIGN(StackingClientListWaiter);
-};
-
-} // namespace
-
-class X11TopmostWindowFinderTest : public ViewsTestBase {
- public:
- X11TopmostWindowFinderTest() {
- }
-
- virtual ~X11TopmostWindowFinderTest() {
- }
-
- // Creates and shows a Widget with |bounds|. The caller takes ownership of
- // the returned widget.
- scoped_ptr<Widget> CreateAndShowWidget(const gfx::Rect& bounds) {
- scoped_ptr<Widget> toplevel(new Widget);
- Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.native_widget = new DesktopNativeWidgetAura(toplevel.get());
- params.bounds = bounds;
- params.remove_standard_frame = true;
- toplevel->Init(params);
- toplevel->Show();
- return toplevel.Pass();
- }
-
- // Creates and shows an X window with |bounds|.
- XID CreateAndShowXWindow(const gfx::Rect& bounds) {
- XID root = DefaultRootWindow(xdisplay());
- XID xid = XCreateSimpleWindow(xdisplay(),
- root,
- 0, 0, 1, 1,
- 0, // border_width
- 0, // border
- 0); // background
-
- ui::SetUseOSWindowFrame(xid, false);
- ShowAndSetXWindowBounds(xid, bounds);
- return xid;
- }
-
- // Shows |xid| and sets its bounds.
- void ShowAndSetXWindowBounds(XID xid, const gfx::Rect& bounds) {
- XMapWindow(xdisplay(), xid);
-
- XWindowChanges changes = {0};
- changes.x = bounds.x();
- changes.y = bounds.y();
- changes.width = bounds.width();
- changes.height = bounds.height();
- XConfigureWindow(xdisplay(),
- xid,
- CWX | CWY | CWWidth | CWHeight,
- &changes);
- }
-
- Display* xdisplay() {
- return gfx::GetXDisplay();
- }
-
- // Returns the topmost X window at the passed in screen position.
- XID FindTopmostXWindowAt(int screen_x, int screen_y) {
- X11TopmostWindowFinder finder;
- return finder.FindWindowAt(gfx::Point(screen_x, screen_y));
- }
-
- // Returns the topmost aura::Window at the passed in screen position. Returns
- // NULL if the topmost window does not have an associated aura::Window.
- aura::Window* FindTopmostLocalProcessWindowAt(int screen_x, int screen_y) {
- X11TopmostWindowFinder finder;
- return finder.FindLocalProcessWindowAt(gfx::Point(screen_x, screen_y),
- std::set<aura::Window*>());
- }
-
- // Returns the topmost aura::Window at the passed in screen position ignoring
- // |ignore_window|. Returns NULL if the topmost window does not have an
- // associated aura::Window.
- aura::Window* FindTopmostLocalProcessWindowWithIgnore(
- int screen_x,
- int screen_y,
- aura::Window* ignore_window) {
- std::set<aura::Window*> ignore;
- ignore.insert(ignore_window);
- X11TopmostWindowFinder finder;
- return finder.FindLocalProcessWindowAt(gfx::Point(screen_x, screen_y),
- ignore);
- }
-
- // ViewsTestBase:
- virtual void SetUp() OVERRIDE {
- ViewsTestBase::SetUp();
-
- // Make X11 synchronous for our display connection. This does not force the
- // window manager to behave synchronously.
- XSynchronize(xdisplay(), True);
-
- // Ensure that the X11DesktopHandler exists. The X11DesktopHandler is
- // necessary to properly track menu windows.
- X11DesktopHandler::get();
- }
-
- virtual void TearDown() OVERRIDE {
- XSynchronize(xdisplay(), False);
- ViewsTestBase::TearDown();
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(X11TopmostWindowFinderTest);
-};
-
-// Flaky on Linux. http://crbug.com/388241
-TEST_F(X11TopmostWindowFinderTest, DISABLED_Basic) {
- // Avoid positioning test windows at 0x0 because window managers often have a
- // panel/launcher along one of the screen edges and do not allow windows to
- // position themselves to overlap the panel/launcher.
- scoped_ptr<Widget> widget1(
- CreateAndShowWidget(gfx::Rect(100, 100, 200, 100)));
- aura::Window* window1 = widget1->GetNativeWindow();
- XID xid1 = window1->GetHost()->GetAcceleratedWidget();
-
- XID xid2 = CreateAndShowXWindow(gfx::Rect(200, 100, 100, 200));
-
- scoped_ptr<Widget> widget3(
- CreateAndShowWidget(gfx::Rect(100, 190, 200, 110)));
- aura::Window* window3 = widget3->GetNativeWindow();
- XID xid3 = window3->GetHost()->GetAcceleratedWidget();
-
- XID xids[] = { xid1, xid2, xid3 };
- StackingClientListWaiter waiter(xids, arraysize(xids));
- waiter.Wait();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- EXPECT_EQ(xid1, FindTopmostXWindowAt(150, 150));
- EXPECT_EQ(window1, FindTopmostLocalProcessWindowAt(150, 150));
-
- EXPECT_EQ(xid2, FindTopmostXWindowAt(250, 150));
- EXPECT_EQ(NULL, FindTopmostLocalProcessWindowAt(250, 150));
-
- EXPECT_EQ(xid3, FindTopmostXWindowAt(250, 250));
- EXPECT_EQ(window3, FindTopmostLocalProcessWindowAt(250, 250));
-
- EXPECT_EQ(xid3, FindTopmostXWindowAt(150, 250));
- EXPECT_EQ(window3, FindTopmostLocalProcessWindowAt(150, 250));
-
- EXPECT_EQ(xid3, FindTopmostXWindowAt(150, 195));
- EXPECT_EQ(window3, FindTopmostLocalProcessWindowAt(150, 195));
-
- EXPECT_NE(xid1, FindTopmostXWindowAt(1000, 1000));
- EXPECT_NE(xid2, FindTopmostXWindowAt(1000, 1000));
- EXPECT_NE(xid3, FindTopmostXWindowAt(1000, 1000));
- EXPECT_EQ(NULL, FindTopmostLocalProcessWindowAt(1000, 1000));
-
- EXPECT_EQ(window1,
- FindTopmostLocalProcessWindowWithIgnore(150, 150, window3));
- EXPECT_EQ(NULL,
- FindTopmostLocalProcessWindowWithIgnore(250, 250, window3));
- EXPECT_EQ(NULL,
- FindTopmostLocalProcessWindowWithIgnore(150, 250, window3));
- EXPECT_EQ(window1,
- FindTopmostLocalProcessWindowWithIgnore(150, 195, window3));
-
- XDestroyWindow(xdisplay(), xid2);
-}
-
-// Test that the minimized state is properly handled.
-// Flaky on Linux. http://crbug.com/388241
-TEST_F(X11TopmostWindowFinderTest, DISABLED_Minimized) {
- scoped_ptr<Widget> widget1(
- CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
- aura::Window* window1 = widget1->GetNativeWindow();
- XID xid1 = window1->GetHost()->GetAcceleratedWidget();
- XID xid2 = CreateAndShowXWindow(gfx::Rect(300, 100, 100, 100));
-
- XID xids[] = { xid1, xid2 };
- StackingClientListWaiter stack_waiter(xids, arraysize(xids));
- stack_waiter.Wait();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- EXPECT_EQ(xid1, FindTopmostXWindowAt(150, 150));
- {
- MinimizeWaiter minimize_waiter(xid1);
- XIconifyWindow(xdisplay(), xid1, 0);
- minimize_waiter.Wait();
- }
- EXPECT_NE(xid1, FindTopmostXWindowAt(150, 150));
- EXPECT_NE(xid2, FindTopmostXWindowAt(150, 150));
-
- // Repeat test for an X window which does not belong to a views::Widget
- // because the code path is different.
- EXPECT_EQ(xid2, FindTopmostXWindowAt(350, 150));
- {
- MinimizeWaiter minimize_waiter(xid2);
- XIconifyWindow(xdisplay(), xid2, 0);
- minimize_waiter.Wait();
- }
- EXPECT_NE(xid1, FindTopmostXWindowAt(350, 150));
- EXPECT_NE(xid2, FindTopmostXWindowAt(350, 150));
-
- XDestroyWindow(xdisplay(), xid2);
-}
-
-// Test that non-rectangular windows are properly handled.
-// Flaky on Linux. http://crbug.com/388241
-TEST_F(X11TopmostWindowFinderTest, DISABLED_NonRectangular) {
- if (!ui::IsShapeExtensionAvailable())
- return;
-
- scoped_ptr<Widget> widget1(
- CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
- XID xid1 = widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
- SkRegion* skregion1 = new SkRegion;
- skregion1->op(SkIRect::MakeXYWH(0, 10, 10, 90), SkRegion::kUnion_Op);
- skregion1->op(SkIRect::MakeXYWH(10, 0, 90, 100), SkRegion::kUnion_Op);
- // Widget takes ownership of |skregion1|.
- widget1->SetShape(skregion1);
-
- SkRegion skregion2;
- skregion2.op(SkIRect::MakeXYWH(0, 10, 10, 90), SkRegion::kUnion_Op);
- skregion2.op(SkIRect::MakeXYWH(10, 0, 90, 100), SkRegion::kUnion_Op);
- XID xid2 = CreateAndShowXWindow(gfx::Rect(300, 100, 100, 100));
- REGION* region2 = gfx::CreateRegionFromSkRegion(skregion2);
- XShapeCombineRegion(xdisplay(), xid2, ShapeBounding, 0, 0, region2,
- false);
- XDestroyRegion(region2);
-
- XID xids[] = { xid1, xid2 };
- StackingClientListWaiter stack_waiter(xids, arraysize(xids));
- stack_waiter.Wait();
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- EXPECT_EQ(xid1, FindTopmostXWindowAt(105, 120));
- EXPECT_NE(xid1, FindTopmostXWindowAt(105, 105));
- EXPECT_NE(xid2, FindTopmostXWindowAt(105, 105));
-
- // Repeat test for an X window which does not belong to a views::Widget
- // because the code path is different.
- EXPECT_EQ(xid2, FindTopmostXWindowAt(305, 120));
- EXPECT_NE(xid1, FindTopmostXWindowAt(305, 105));
- EXPECT_NE(xid2, FindTopmostXWindowAt(305, 105));
-
- XDestroyWindow(xdisplay(), xid2);
-}
-
-// Test that the TopmostWindowFinder finds windows which belong to menus
-// (which may or may not belong to Chrome).
-// Flaky on Linux. http://crbug.com/388241
-TEST_F(X11TopmostWindowFinderTest, DISABLED_Menu) {
- XID xid = CreateAndShowXWindow(gfx::Rect(100, 100, 100, 100));
-
- XID root = DefaultRootWindow(xdisplay());
- XSetWindowAttributes swa;
- swa.override_redirect = True;
- XID menu_xid = XCreateWindow(xdisplay(),
- root,
- 0, 0, 1, 1,
- 0, // border width
- CopyFromParent, // depth
- InputOutput,
- CopyFromParent, // visual
- CWOverrideRedirect,
- &swa);
- {
- const char* kAtomsToCache[] = { "_NET_WM_WINDOW_TYPE_MENU", NULL };
- ui::X11AtomCache atom_cache(gfx::GetXDisplay(), kAtomsToCache);
- ui::SetAtomProperty(menu_xid,
- "_NET_WM_WINDOW_TYPE",
- "ATOM",
- atom_cache.GetAtom("_NET_WM_WINDOW_TYPE_MENU"));
- }
- ui::SetUseOSWindowFrame(menu_xid, false);
- ShowAndSetXWindowBounds(menu_xid, gfx::Rect(140, 110, 100, 100));
- ui::X11EventSource::GetInstance()->DispatchXEvents();
-
- // |menu_xid| is never added to _NET_CLIENT_LIST_STACKING.
- XID xids[] = { xid };
- StackingClientListWaiter stack_waiter(xids, arraysize(xids));
- stack_waiter.Wait();
-
- EXPECT_EQ(xid, FindTopmostXWindowAt(110, 110));
- EXPECT_EQ(menu_xid, FindTopmostXWindowAt(150, 120));
- EXPECT_EQ(menu_xid, FindTopmostXWindowAt(210, 120));
-
- XDestroyWindow(xdisplay(), xid);
- XDestroyWindow(xdisplay(), menu_xid);
-}
-
-} // namespace views
« no previous file with comments | « ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698