12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/keyboard_overlay/keyboard_overlay_delegate.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/shelf/shelf_types.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/ash_test_base.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/display.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/screen.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class KeyboardOverlayDelegateTest
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public test::AshTestBase,
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      public testing::WithParamInterface<ShelfAlignment> {
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  KeyboardOverlayDelegateTest() : shelf_alignment_(GetParam()) {}
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~KeyboardOverlayDelegateTest() {}
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ShelfAlignment shelf_alignment() const { return shelf_alignment_; }
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ShelfAlignment shelf_alignment_;
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(KeyboardOverlayDelegateTest);
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies we can show and close the widget for the overlay dialog.
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_P(KeyboardOverlayDelegateTest, ShowAndClose) {
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("500x400,300x200");
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::Shell* shell = ash::Shell::GetInstance();
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  shell->SetShelfAlignment(shelf_alignment(), shell->GetPrimaryRootWindow());
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  KeyboardOverlayDelegate delegate(base::ASCIIToUTF16("Title"),
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   GURL("chrome://keyboardoverlay/"));
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Showing the dialog creates a widget.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget = delegate.Show(NULL);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(widget);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The widget is on the primary root window.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Shell::GetPrimaryRootWindow(),
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            widget->GetNativeWindow()->GetRootWindow());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The widget is horizontally centered at the bottom of the work area.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetPrimaryDisplay().work_area();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds = widget->GetRestoredBounds();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(work_area.CenterPoint().x(), bounds.CenterPoint().x());
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(work_area.bottom(), bounds.bottom());
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clean up.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->CloseNow();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Tests run three times - for all possible values of shelf alignment
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(ShelfAlignmentAny,
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        KeyboardOverlayDelegateTest,
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        testing::Values(SHELF_ALIGNMENT_BOTTOM,
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        SHELF_ALIGNMENT_LEFT,
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        SHELF_ALIGNMENT_RIGHT,
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        SHELF_ALIGNMENT_TOP));
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ash
69