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) { ...@@ -241,7 +241,8 @@ void HeaderView::ChildPreferredSizeChanged(views::View* child) {
void HeaderView::OnTabletModeStarted() { void HeaderView::OnTabletModeStarted() {
caption_button_container_->UpdateCaptionButtonState(true /*=animate*/); caption_button_container_->UpdateCaptionButtonState(true /*=animate*/);
parent()->Layout(); parent()->Layout();
if (Shell::Get()->tablet_mode_controller()->ShouldAutoHideTitlebars( if (target_widget_ &&
Shell::Get()->tablet_mode_controller()->ShouldAutoHideTitlebars(
target_widget_)) { target_widget_)) {
target_widget_->non_client_view()->Layout(); target_widget_->non_client_view()->Layout();
} }
...@@ -250,12 +251,16 @@ void HeaderView::OnTabletModeStarted() { ...@@ -250,12 +251,16 @@ void HeaderView::OnTabletModeStarted() {
void HeaderView::OnTabletModeEnded() { void HeaderView::OnTabletModeEnded() {
caption_button_container_->UpdateCaptionButtonState(true /*=animate*/); caption_button_container_->UpdateCaptionButtonState(true /*=animate*/);
parent()->Layout(); parent()->Layout();
target_widget_->non_client_view()->Layout(); if (target_widget_)
target_widget_->non_client_view()->Layout();
} }
void HeaderView::OnWindowPropertyChanged(aura::Window* window, void HeaderView::OnWindowPropertyChanged(aura::Window* window,
const void* key, const void* key,
intptr_t old) { intptr_t old) {
if (!target_widget_)
return;
DCHECK_EQ(target_widget_->GetNativeWindow(), window); DCHECK_EQ(target_widget_->GetNativeWindow(), window);
if (key == kFrameImageActiveKey || key == kFrameImageInactiveKey || if (key == kFrameImageActiveKey || key == kFrameImageInactiveKey ||
key == kFrameImageOverlayActiveKey || key == kFrameImageOverlayActiveKey ||
...@@ -278,6 +283,8 @@ void HeaderView::OnWindowPropertyChanged(aura::Window* window, ...@@ -278,6 +283,8 @@ void HeaderView::OnWindowPropertyChanged(aura::Window* window,
void HeaderView::OnWindowDestroying(aura::Window* window) { void HeaderView::OnWindowDestroying(aura::Window* window) {
window_observer_.Remove(window); window_observer_.Remove(window);
// A HeaderView may outlive the target widget.
target_widget_ = nullptr;
} }
views::View* HeaderView::avatar_icon() const { views::View* HeaderView::avatar_icon() const {
...@@ -349,7 +356,7 @@ std::vector<gfx::Rect> HeaderView::GetVisibleBoundsInScreen() const { ...@@ -349,7 +356,7 @@ std::vector<gfx::Rect> HeaderView::GetVisibleBoundsInScreen() const {
} }
void HeaderView::PaintHeaderContent(gfx::Canvas* canvas) { void HeaderView::PaintHeaderContent(gfx::Canvas* canvas) {
if (!should_paint_) if (!should_paint_ || !target_widget_)
return; return;
bool paint_as_active = bool paint_as_active =
......
...@@ -907,8 +907,9 @@ gfx::Point ClientControlledShellSurface::GetSurfaceOrigin() const { ...@@ -907,8 +907,9 @@ gfx::Point ClientControlledShellSurface::GetSurfaceOrigin() const {
// ClientControlledShellSurface, private: // ClientControlledShellSurface, private:
void ClientControlledShellSurface::UpdateFrame() { void ClientControlledShellSurface::UpdateFrame() {
if (!widget_ || !GetFrameView()->visible()) if (!widget_)
return; return;
gfx::Rect work_area = gfx::Rect work_area =
display::Screen::GetScreen() display::Screen::GetScreen()
->GetDisplayNearestWindow(widget_->GetNativeWindow()) ->GetDisplayNearestWindow(widget_->GetNativeWindow())
......
...@@ -555,6 +555,18 @@ TEST_F(ClientControlledShellSurfaceTest, Frame) { ...@@ -555,6 +555,18 @@ TEST_F(ClientControlledShellSurfaceTest, Frame) {
EXPECT_EQ(client_bounds, widget->GetWindowBoundsInScreen()); EXPECT_EQ(client_bounds, widget->GetWindowBoundsInScreen());
EXPECT_EQ(client_bounds, EXPECT_EQ(client_bounds,
frame_view->GetClientBoundsForWindowBounds(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 { namespace {
...@@ -1483,12 +1495,22 @@ TEST_F(ClientControlledShellSurfaceTest, WideFrame) { ...@@ -1483,12 +1495,22 @@ TEST_F(ClientControlledShellSurfaceTest, WideFrame) {
ASSERT_TRUE(wide_frame); ASSERT_TRUE(wide_frame);
EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode()); EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
// Set AutoHide mode. // Test AUTOHIDE -> NORMAL
surface->SetFrame(SurfaceFrameType::AUTOHIDE); surface->SetFrame(SurfaceFrameType::AUTOHIDE);
surface->Commit();
EXPECT_TRUE(wide_frame->header_view()->in_immersive_mode()); EXPECT_TRUE(wide_frame->header_view()->in_immersive_mode());
// Exit AutoHide mode.
surface->SetFrame(SurfaceFrameType::NORMAL); 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()); EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
// Unmaximize it and the frame should be normal. // 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