Commit 317cf670 authored by Mitsuru Oshima's avatar Mitsuru Oshima Committed by Commit Bot

Fix Autohide -> None frame transition

This is reland of https://crrev.com/c/1164570

Change summary: A header view may outlive the target widget,
which can be differet widget. Reset the reference and check
before calling target widget.

Bug: b/112240082
Test: covered by unittests
Change-Id: Ia98d44a487b6cd2077b110e4a9799780cdbc4ebe
Reviewed-on: https://chromium-review.googlesource.com/1165697
Commit-Queue: Mitsuru Oshima <oshima@chromium.org>
Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#581350}
parent 543f84f3
......@@ -241,7 +241,8 @@ void HeaderView::ChildPreferredSizeChanged(views::View* child) {
void HeaderView::OnTabletModeStarted() {
caption_button_container_->UpdateCaptionButtonState(true /*=animate*/);
parent()->Layout();
if (Shell::Get()->tablet_mode_controller()->ShouldAutoHideTitlebars(
if (target_widget_ &&
Shell::Get()->tablet_mode_controller()->ShouldAutoHideTitlebars(
target_widget_)) {
target_widget_->non_client_view()->Layout();
}
......@@ -250,12 +251,16 @@ void HeaderView::OnTabletModeStarted() {
void HeaderView::OnTabletModeEnded() {
caption_button_container_->UpdateCaptionButtonState(true /*=animate*/);
parent()->Layout();
target_widget_->non_client_view()->Layout();
if (target_widget_)
target_widget_->non_client_view()->Layout();
}
void HeaderView::OnWindowPropertyChanged(aura::Window* window,
const void* key,
intptr_t old) {
if (!target_widget_)
return;
DCHECK_EQ(target_widget_->GetNativeWindow(), window);
if (key == kFrameImageActiveKey || key == kFrameImageInactiveKey ||
key == kFrameImageOverlayActiveKey ||
......@@ -278,6 +283,8 @@ void HeaderView::OnWindowPropertyChanged(aura::Window* window,
void HeaderView::OnWindowDestroying(aura::Window* window) {
window_observer_.Remove(window);
// A HeaderView may outlive the target widget.
target_widget_ = nullptr;
}
views::View* HeaderView::avatar_icon() const {
......@@ -349,7 +356,7 @@ std::vector<gfx::Rect> HeaderView::GetVisibleBoundsInScreen() const {
}
void HeaderView::PaintHeaderContent(gfx::Canvas* canvas) {
if (!should_paint_)
if (!should_paint_ || !target_widget_)
return;
bool paint_as_active =
......
......@@ -907,8 +907,9 @@ gfx::Point ClientControlledShellSurface::GetSurfaceOrigin() const {
// ClientControlledShellSurface, private:
void ClientControlledShellSurface::UpdateFrame() {
if (!widget_ || !GetFrameView()->visible())
if (!widget_)
return;
gfx::Rect work_area =
display::Screen::GetScreen()
->GetDisplayNearestWindow(widget_->GetNativeWindow())
......
......@@ -555,6 +555,18 @@ TEST_F(ClientControlledShellSurfaceTest, Frame) {
EXPECT_EQ(client_bounds, widget->GetWindowBoundsInScreen());
EXPECT_EQ(client_bounds,
frame_view->GetClientBoundsForWindowBounds(client_bounds));
// Test NONE -> AUTOHIDE -> NONE
shell_surface->SetMaximized();
shell_surface->SetGeometry(fullscreen_bounds);
surface->SetFrame(SurfaceFrameType::AUTOHIDE);
surface->Commit();
EXPECT_TRUE(frame_view->visible());
EXPECT_TRUE(frame_view->GetHeaderView()->in_immersive_mode());
surface->SetFrame(SurfaceFrameType::NONE);
surface->Commit();
EXPECT_FALSE(frame_view->visible());
EXPECT_FALSE(frame_view->GetHeaderView()->in_immersive_mode());
}
namespace {
......@@ -1483,12 +1495,22 @@ TEST_F(ClientControlledShellSurfaceTest, WideFrame) {
ASSERT_TRUE(wide_frame);
EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
// Set AutoHide mode.
// Test AUTOHIDE -> NORMAL
surface->SetFrame(SurfaceFrameType::AUTOHIDE);
surface->Commit();
EXPECT_TRUE(wide_frame->header_view()->in_immersive_mode());
// Exit AutoHide mode.
surface->SetFrame(SurfaceFrameType::NORMAL);
surface->Commit();
EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
// Test AUTOHIDE -> NONE
surface->SetFrame(SurfaceFrameType::AUTOHIDE);
surface->Commit();
EXPECT_TRUE(wide_frame->header_view()->in_immersive_mode());
surface->SetFrame(SurfaceFrameType::NONE);
surface->Commit();
EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
// Unmaximize it and the frame should be normal.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment