Commit 8e3cf893 authored by Sammie Quon's avatar Sammie Quon Committed by Commit Bot

wm: Fix regression with dragging windows with transforms.

In crrev.com/c/2238652, we modified the drag window copy to share codes
with WindowMirrorView. For this case, we skipped setting a transform in
Layout but we actually need to set it to identity since mirroring
layers will copy transforms (case for dragging overview windows). Copies
some more layer properties that may be on the original window.

Test: added test, manual
Bug: 1113429
Change-Id: I7874d733be5026c0785c32cc5ceafb529653b4cd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2340791
Commit-Queue: Sammie Quon <sammiequon@chromium.org>
Reviewed-by: default avatarMitsuru Oshima <oshima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#796139}
parent e8335e0f
...@@ -96,6 +96,10 @@ class DragWindowController::DragWindowDetails { ...@@ -96,6 +96,10 @@ class DragWindowController::DragWindowDetails {
window->parent(), &bounds); window->parent(), &bounds);
window->SetBounds(bounds); window->SetBounds(bounds);
window->SetTransform(original_window->transform()); window->SetTransform(original_window->transform());
window->layer()->SetClipRect(original_window->layer()->clip_rect());
window->layer()->SetRoundedCornerRadius(
original_window->layer()->rounded_corner_radii());
window->layer()->SetIsFastRoundedCorner(true);
widget_->SetOpacity(opacity); widget_->SetOpacity(opacity);
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "ui/aura/window_occlusion_tracker.h" #include "ui/aura/window_occlusion_tracker.h"
#include "ui/compositor/layer.h" #include "ui/compositor/layer.h"
#include "ui/compositor/layer_tree_owner.h" #include "ui/compositor/layer_tree_owner.h"
#include "ui/gfx/transform.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/wm/core/window_util.h" #include "ui/wm/core/window_util.h"
...@@ -77,8 +78,10 @@ void WindowMirrorView::Layout() { ...@@ -77,8 +78,10 @@ void WindowMirrorView::Layout() {
// Position at 0, 0. // Position at 0, 0.
GetMirrorLayer()->SetBounds(gfx::Rect(GetMirrorLayer()->bounds().size())); GetMirrorLayer()->SetBounds(gfx::Rect(GetMirrorLayer()->bounds().size()));
if (show_non_client_view_) if (show_non_client_view_) {
GetMirrorLayer()->SetTransform(gfx::Transform());
return; return;
}
gfx::Transform transform; gfx::Transform transform;
gfx::Rect client_area_bounds = GetClientAreaBounds(); gfx::Rect client_area_bounds = GetClientAreaBounds();
...@@ -123,6 +126,10 @@ void WindowMirrorView::RemovedFromWidget() { ...@@ -123,6 +126,10 @@ void WindowMirrorView::RemovedFromWidget() {
target_ = nullptr; target_ = nullptr;
} }
ui::Layer* WindowMirrorView::GetMirrorLayerForTesting() {
return GetMirrorLayer();
}
void WindowMirrorView::InitLayerOwner() { void WindowMirrorView::InitLayerOwner() {
layer_owner_ = ::wm::MirrorLayers(source_, false /* sync_bounds */); layer_owner_ = ::wm::MirrorLayers(source_, false /* sync_bounds */);
......
...@@ -49,6 +49,8 @@ class ASH_EXPORT WindowMirrorView : public views::View, ...@@ -49,6 +49,8 @@ class ASH_EXPORT WindowMirrorView : public views::View,
void AddedToWidget() override; void AddedToWidget() override;
void RemovedFromWidget() override; void RemovedFromWidget() override;
ui::Layer* GetMirrorLayerForTesting();
protected: protected:
virtual void InitLayerOwner(); virtual void InitLayerOwner();
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "ui/aura/client/aura_constants.h" #include "ui/aura/client/aura_constants.h"
#include "ui/aura/window_occlusion_tracker.h" #include "ui/aura/window_occlusion_tracker.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "ui/gfx/transform.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h" #include "ui/views/widget/widget_delegate.h"
...@@ -36,5 +37,26 @@ TEST_F(WindowMirrorViewTest, LocalWindowOcclusionMadeVisible) { ...@@ -36,5 +37,26 @@ TEST_F(WindowMirrorViewTest, LocalWindowOcclusionMadeVisible) {
widget_window->occlusion_state()); widget_window->occlusion_state());
} }
// Tests that a mirror view that mirrors a window with an existing transform
// does not copy that transform onto its mirror layer (and then putting the
// mirror layer offscreen). Regression test for https://crbug.com/1113429.
TEST_F(WindowMirrorViewTest, MirrorLayerHasNoTransformWhenNonClientViewShown) {
// Create a window that has a transform already. When the layer is mirrored,
// the transform will be copied with it.
auto widget = CreateTestWidget();
aura::Window* widget_window = widget->GetNativeWindow();
const gfx::Transform transform(1.f, 0.f, 0.f, 1.f, 100.f, 100.f);
widget_window->SetTransform(transform);
auto mirror_widget = CreateTestWidget();
auto mirror_view = std::make_unique<WindowMirrorView>(
widget_window, /*trilinear_filtering_on_init=*/false,
/*show_non_client_view=*/true);
mirror_view->RecreateMirrorLayers();
EXPECT_TRUE(
mirror_view->GetMirrorLayerForTesting()->transform().IsIdentity());
}
} // namespace } // namespace
} // namespace ash } // namespace ash
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