Commit ac1a8082 authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

aura: changes when WindowPort::OnDidChangeTransform() is called

This calls it from OnLayerTransform(). That way, if the transform is
changed outside of Window::SetTransform, everything still works.

BUG=822917
TEST=covered by tests

Change-Id: I27acb266c4a4993df0a71457af8aa3b4c2cde5d1
Reviewed-on: https://chromium-review.googlesource.com/967841Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543974}
parent 098fd104
...@@ -276,7 +276,6 @@ void Window::SetTransform(const gfx::Transform& transform) { ...@@ -276,7 +276,6 @@ void Window::SetTransform(const gfx::Transform& transform) {
observer.OnWindowTargetTransformChanging(this, transform); observer.OnWindowTargetTransformChanging(this, transform);
gfx::Transform old_transform = layer()->transform(); gfx::Transform old_transform = layer()->transform();
layer()->SetTransform(transform); layer()->SetTransform(transform);
port_->OnDidChangeTransform(old_transform, transform);
} }
void Window::SetLayoutManager(LayoutManager* layout_manager) { void Window::SetLayoutManager(LayoutManager* layout_manager) {
...@@ -1173,7 +1172,9 @@ void Window::OnLayerOpacityChanged(ui::PropertyChangeReason reason) { ...@@ -1173,7 +1172,9 @@ void Window::OnLayerOpacityChanged(ui::PropertyChangeReason reason) {
observer.OnWindowOpacitySet(this, reason); observer.OnWindowOpacitySet(this, reason);
} }
void Window::OnLayerTransformed(ui::PropertyChangeReason reason) { void Window::OnLayerTransformed(const gfx::Transform& old_transform,
ui::PropertyChangeReason reason) {
port_->OnDidChangeTransform(old_transform, layer()->transform());
WindowOcclusionTracker::ScopedPauseOcclusionTracking pause_occlusion_tracking; WindowOcclusionTracker::ScopedPauseOcclusionTracking pause_occlusion_tracking;
for (WindowObserver& observer : observers_) for (WindowObserver& observer : observers_)
observer.OnWindowTransformed(this, reason); observer.OnWindowTransformed(this, reason);
......
...@@ -531,7 +531,8 @@ class AURA_EXPORT Window : public ui::LayerDelegate, ...@@ -531,7 +531,8 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
void OnPaintLayer(const ui::PaintContext& context) override; void OnPaintLayer(const ui::PaintContext& context) override;
void OnLayerBoundsChanged(const gfx::Rect& old_bounds, void OnLayerBoundsChanged(const gfx::Rect& old_bounds,
ui::PropertyChangeReason reason) override; ui::PropertyChangeReason reason) override;
void OnLayerTransformed(ui::PropertyChangeReason reason) override; void OnLayerTransformed(const gfx::Transform& old_transform,
ui::PropertyChangeReason reason) override;
void OnLayerOpacityChanged(ui::PropertyChangeReason reason) override; void OnLayerOpacityChanged(ui::PropertyChangeReason reason) override;
// Overridden from ui::EventTarget: // Overridden from ui::EventTarget:
......
...@@ -1140,9 +1140,10 @@ void Layer::SetBoundsFromAnimation(const gfx::Rect& bounds, ...@@ -1140,9 +1140,10 @@ void Layer::SetBoundsFromAnimation(const gfx::Rect& bounds,
void Layer::SetTransformFromAnimation(const gfx::Transform& transform, void Layer::SetTransformFromAnimation(const gfx::Transform& transform,
PropertyChangeReason reason) { PropertyChangeReason reason) {
const gfx::Transform old_transform = this->transform();
cc_layer_->SetTransform(transform); cc_layer_->SetTransform(transform);
if (delegate_) if (delegate_)
delegate_->OnLayerTransformed(reason); delegate_->OnLayerTransformed(old_transform, reason);
} }
void Layer::SetOpacityFromAnimation(float opacity, void Layer::SetOpacityFromAnimation(float opacity,
......
...@@ -9,7 +9,8 @@ namespace ui { ...@@ -9,7 +9,8 @@ namespace ui {
void LayerDelegate::OnLayerBoundsChanged(const gfx::Rect& old_bounds, void LayerDelegate::OnLayerBoundsChanged(const gfx::Rect& old_bounds,
PropertyChangeReason reason) {} PropertyChangeReason reason) {}
void LayerDelegate::OnLayerTransformed(PropertyChangeReason reason) {} void LayerDelegate::OnLayerTransformed(const gfx::Transform& old_transform,
PropertyChangeReason reason) {}
void LayerDelegate::OnLayerOpacityChanged(PropertyChangeReason reason) {} void LayerDelegate::OnLayerOpacityChanged(PropertyChangeReason reason) {}
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
namespace gfx { namespace gfx {
class Rect; class Rect;
class Transform;
} }
namespace ui { namespace ui {
...@@ -35,7 +36,8 @@ class COMPOSITOR_EXPORT LayerDelegate { ...@@ -35,7 +36,8 @@ class COMPOSITOR_EXPORT LayerDelegate {
// the property was set directly or by an animation. This will be called // the property was set directly or by an animation. This will be called
// before the first frame of an animation is rendered and when the animation // before the first frame of an animation is rendered and when the animation
// ends, but not necessarily at every frame of the animation. // ends, but not necessarily at every frame of the animation.
virtual void OnLayerTransformed(PropertyChangeReason reason); virtual void OnLayerTransformed(const gfx::Transform& old_transform,
PropertyChangeReason reason);
virtual void OnLayerOpacityChanged(PropertyChangeReason reason); virtual void OnLayerOpacityChanged(PropertyChangeReason reason);
protected: protected:
......
...@@ -315,7 +315,8 @@ class TestLayerDelegate : public LayerDelegate { ...@@ -315,7 +315,8 @@ class TestLayerDelegate : public LayerDelegate {
MOCK_METHOD2(OnLayerBoundsChanged, MOCK_METHOD2(OnLayerBoundsChanged,
void(const gfx::Rect&, PropertyChangeReason)); void(const gfx::Rect&, PropertyChangeReason));
MOCK_METHOD1(OnLayerTransformed, void(PropertyChangeReason)); MOCK_METHOD2(OnLayerTransformed,
void(const gfx::Transform&, PropertyChangeReason));
MOCK_METHOD1(OnLayerOpacityChanged, void(PropertyChangeReason)); MOCK_METHOD1(OnLayerOpacityChanged, void(PropertyChangeReason));
void reset() { void reset() {
...@@ -2399,16 +2400,32 @@ TEST(LayerDelegateTest, OnLayerTransformed) { ...@@ -2399,16 +2400,32 @@ TEST(LayerDelegateTest, OnLayerTransformed) {
auto layer = std::make_unique<Layer>(LAYER_TEXTURED); auto layer = std::make_unique<Layer>(LAYER_TEXTURED);
testing::StrictMock<TestLayerDelegate> delegate; testing::StrictMock<TestLayerDelegate> delegate;
layer->set_delegate(&delegate); layer->set_delegate(&delegate);
gfx::Transform target_transform; gfx::Transform target_transform1;
target_transform.Skew(10.0f, 5.0f); target_transform1.Skew(10.0f, 5.0f);
{
EXPECT_CALL(delegate,
OnLayerTransformed(gfx::Transform(),
PropertyChangeReason::NOT_FROM_ANIMATION))
.WillOnce(testing::Invoke(
[&](const gfx::Transform& old_transform, PropertyChangeReason) {
// Verify that |layer->transform()| returns the correct value when
// the delegate is notified.
EXPECT_EQ(target_transform1, layer->transform());
}));
layer->SetTransform(target_transform1);
}
gfx::Transform target_transform2;
target_transform2.Skew(10.0f, 5.0f);
EXPECT_CALL(delegate, EXPECT_CALL(delegate,
OnLayerTransformed(PropertyChangeReason::NOT_FROM_ANIMATION)) OnLayerTransformed(target_transform1,
.WillOnce(testing::Invoke([&](PropertyChangeReason) { PropertyChangeReason::NOT_FROM_ANIMATION))
// Verify that |layer->transform()| returns the correct value when the .WillOnce(testing::Invoke(
// delegate is notified. [&](const gfx::Transform& old_transform, PropertyChangeReason) {
EXPECT_EQ(layer->transform(), target_transform); // Verify that |layer->transform()| returns the correct value when
})); // the delegate is notified.
layer->SetTransform(target_transform); EXPECT_EQ(target_transform2, layer->transform());
}));
layer->SetTransform(target_transform2);
} }
// Verify that LayerDelegate::OnLayerTransformed() is called at every step of a // Verify that LayerDelegate::OnLayerTransformed() is called at every step of a
...@@ -2442,8 +2459,10 @@ TEST(LayerDelegateTest, OnLayerTransformedNonThreadedAnimation) { ...@@ -2442,8 +2459,10 @@ TEST(LayerDelegateTest, OnLayerTransformedNonThreadedAnimation) {
ASSERT_FALSE(element->IsThreaded(layer.get())); ASSERT_FALSE(element->IsThreaded(layer.get()));
LayerAnimationElement* element_raw = element.get(); LayerAnimationElement* element_raw = element.get();
EXPECT_CALL(delegate, EXPECT_CALL(delegate,
OnLayerTransformed(PropertyChangeReason::FROM_ANIMATION)) OnLayerTransformed(gfx::Transform(),
.WillOnce(testing::Invoke([&](PropertyChangeReason) { PropertyChangeReason::FROM_ANIMATION))
.WillOnce(testing::Invoke([&](const gfx::Transform& old_transform,
PropertyChangeReason) {
// Verify that |layer->transform()| returns the correct value when the // Verify that |layer->transform()| returns the correct value when the
// delegate is notified. // delegate is notified.
EXPECT_EQ(layer->transform(), initial_transform); EXPECT_EQ(layer->transform(), initial_transform);
...@@ -2455,19 +2474,23 @@ TEST(LayerDelegateTest, OnLayerTransformedNonThreadedAnimation) { ...@@ -2455,19 +2474,23 @@ TEST(LayerDelegateTest, OnLayerTransformedNonThreadedAnimation) {
// Progress the animation. // Progress the animation.
EXPECT_CALL(delegate, EXPECT_CALL(delegate,
OnLayerTransformed(PropertyChangeReason::FROM_ANIMATION)) OnLayerTransformed(initial_transform,
.WillOnce(testing::Invoke([&](PropertyChangeReason) { PropertyChangeReason::FROM_ANIMATION))
// Verify that |layer->transform()| returns the correct value when the .WillOnce(testing::Invoke(
// delegate is notified. [&](const gfx::Transform& old_transform, PropertyChangeReason) {
EXPECT_EQ(layer->transform(), step_transform); // Verify that |layer->transform()| returns the correct value when
})); // the delegate is notified.
EXPECT_EQ(layer->transform(), step_transform);
}));
test_controller.Step(element_raw->duration() / 2); test_controller.Step(element_raw->duration() / 2);
testing::Mock::VerifyAndClear(&delegate); testing::Mock::VerifyAndClear(&delegate);
// End the animation. // End the animation.
EXPECT_CALL(delegate, EXPECT_CALL(
OnLayerTransformed(PropertyChangeReason::FROM_ANIMATION)) delegate,
.WillOnce(testing::Invoke([&](PropertyChangeReason) { OnLayerTransformed(step_transform, PropertyChangeReason::FROM_ANIMATION))
.WillOnce(testing::Invoke([&](const gfx::Transform& old_transform,
PropertyChangeReason) {
// Verify that |layer->transform()| returns the correct value when the // Verify that |layer->transform()| returns the correct value when the
// delegate is notified. // delegate is notified.
EXPECT_EQ(layer->transform(), target_transform); EXPECT_EQ(layer->transform(), target_transform);
...@@ -2502,8 +2525,10 @@ TEST(LayerDelegateTest, OnLayerTransformedThreadedAnimation) { ...@@ -2502,8 +2525,10 @@ TEST(LayerDelegateTest, OnLayerTransformedThreadedAnimation) {
ASSERT_TRUE(element->IsThreaded(layer.get())); ASSERT_TRUE(element->IsThreaded(layer.get()));
LayerAnimationElement* element_raw = element.get(); LayerAnimationElement* element_raw = element.get();
EXPECT_CALL(delegate, EXPECT_CALL(delegate,
OnLayerTransformed(PropertyChangeReason::FROM_ANIMATION)) OnLayerTransformed(gfx::Transform(),
.WillOnce(testing::Invoke([&](PropertyChangeReason) { PropertyChangeReason::FROM_ANIMATION))
.WillOnce(testing::Invoke([&](const gfx::Transform& old_transform,
PropertyChangeReason) {
// Verify that |layer->transform()| returns the correct value when the // Verify that |layer->transform()| returns the correct value when the
// delegate is notified. // delegate is notified.
EXPECT_EQ(layer->transform(), initial_transform); EXPECT_EQ(layer->transform(), initial_transform);
...@@ -2516,8 +2541,10 @@ TEST(LayerDelegateTest, OnLayerTransformedThreadedAnimation) { ...@@ -2516,8 +2541,10 @@ TEST(LayerDelegateTest, OnLayerTransformedThreadedAnimation) {
// End the animation. // End the animation.
EXPECT_CALL(delegate, EXPECT_CALL(delegate,
OnLayerTransformed(PropertyChangeReason::FROM_ANIMATION)) OnLayerTransformed(initial_transform,
.WillOnce(testing::Invoke([&](PropertyChangeReason) { PropertyChangeReason::FROM_ANIMATION))
.WillOnce(testing::Invoke([&](const gfx::Transform& old_transform,
PropertyChangeReason) {
// Verify that |layer->transform()| returns the correct value when the // Verify that |layer->transform()| returns the correct value when the
// delegate is notified. // delegate is notified.
EXPECT_EQ(layer->transform(), target_transform); EXPECT_EQ(layer->transform(), target_transform);
......
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