blob: b343010ac13c2aa4c0363fc9f3d98dd0ee81cff5 [file] [log] [blame]
// Copyright 2016 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 "ash/public/cpp/immersive/immersive_fullscreen_controller_test_api.h"
#include "ash/public/cpp/immersive/immersive_fullscreen_controller.h"
#include "ash/public/cpp/immersive/immersive_fullscreen_controller_delegate.h"
#include "base/run_loop.h"
#include "ui/aura/env.h"
#include "ui/aura/event_injector.h"
#include "ui/aura/window.h"
#include "ui/events/base_event_utils.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/views/widget/widget.h"
namespace {
// Update mouse location for |window|. For local window, update its aura::Env
// directly. For remote window, update aura::Env by injecting a mouse move
// event. EventInjector is used so that the Window Service side code under mash
// sees the updated mouse location as well.
void UpdateMouseLocation(aura::Window* window,
const gfx::Point& screen_location,
bool wait) {
if (window->env()->mode() == aura::Env::Mode::LOCAL) {
window->env()->SetLastMouseLocation(screen_location);
return;
}
ui::MouseEvent event(ui::ET_MOUSE_MOVED, screen_location, screen_location,
ui::EventTimeForNow(), ui::EF_NONE, 0);
if (!wait) {
aura::EventInjector().Inject(window->GetHost(), &event);
return;
}
// Ensure the mouse event goes through when |wait| is set.
aura::EventInjector event_injector;
base::RunLoop run_loop;
event_injector.Inject(window->GetHost(), &event, run_loop.QuitClosure());
run_loop.Run();
}
} // namespace
namespace ash {
ImmersiveFullscreenControllerTestApi::ImmersiveFullscreenControllerTestApi(
ImmersiveFullscreenController* controller)
: immersive_fullscreen_controller_(controller) {}
ImmersiveFullscreenControllerTestApi::~ImmersiveFullscreenControllerTestApi() =
default;
void ImmersiveFullscreenControllerTestApi::SetupForTest(
bool wait_for_mouse_event) {
immersive_fullscreen_controller_->animations_disabled_for_test_ = true;
// Move the mouse off of the top-of-window views so that it does not keep the
// top-of-window views revealed.
std::vector<gfx::Rect> bounds_in_screen(
immersive_fullscreen_controller_->delegate_->GetVisibleBoundsInScreen());
DCHECK(!bounds_in_screen.empty());
int bottommost_in_screen = bounds_in_screen[0].bottom();
for (size_t i = 1; i < bounds_in_screen.size(); ++i) {
if (bounds_in_screen[i].bottom() > bottommost_in_screen)
bottommost_in_screen = bounds_in_screen[i].bottom();
}
gfx::Point cursor_pos(0, bottommost_in_screen + 10);
UpdateMouseLocation(
immersive_fullscreen_controller_->widget()->GetNativeView(), cursor_pos,
wait_for_mouse_event);
immersive_fullscreen_controller_->UpdateLocatedEventRevealedLock();
}
bool ImmersiveFullscreenControllerTestApi::IsTopEdgeHoverTimerRunning() const {
return immersive_fullscreen_controller_->top_edge_hover_timer_.IsRunning();
}
ImmersiveFullscreenControllerTestApi::GlobalAnimationDisabler::
GlobalAnimationDisabler() {
// Nesting isn't supported.
DCHECK(
!ImmersiveFullscreenController::value_for_animations_disabled_for_test_);
ImmersiveFullscreenController::value_for_animations_disabled_for_test_ = true;
}
ImmersiveFullscreenControllerTestApi::GlobalAnimationDisabler::
~GlobalAnimationDisabler() {
ImmersiveFullscreenController::value_for_animations_disabled_for_test_ =
false;
}
} // namespace ash