| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "components/mus/public/cpp/view.h" | 5 #include "components/mus/public/cpp/view.h" | 
| 6 | 6 | 
| 7 #include "base/logging.h" | 7 #include "base/logging.h" | 
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" | 
| 9 #include "components/mus/public/cpp/lib/view_private.h" | 9 #include "components/mus/public/cpp/lib/view_private.h" | 
| 10 #include "components/mus/public/cpp/util.h" | 10 #include "components/mus/public/cpp/util.h" | 
| 11 #include "components/mus/public/cpp/view_observer.h" | 11 #include "components/mus/public/cpp/view_observer.h" | 
| 12 #include "components/mus/public/cpp/view_property.h" | 12 #include "components/mus/public/cpp/view_property.h" | 
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" | 
| 14 | 14 | 
| 15 namespace mus { | 15 namespace mojo { | 
| 16 | 16 | 
| 17 // View ------------------------------------------------------------------------ | 17 // View ------------------------------------------------------------------------ | 
| 18 | 18 | 
| 19 typedef testing::Test ViewTest; | 19 typedef testing::Test ViewTest; | 
| 20 | 20 | 
| 21 // Subclass with public ctor/dtor. | 21 // Subclass with public ctor/dtor. | 
| 22 class TestView : public View { | 22 class TestView : public View { | 
| 23  public: | 23  public: | 
| 24   TestView() { ViewPrivate(this).set_id(1); } | 24   TestView() { ViewPrivate(this).set_id(1); } | 
| 25   ~TestView() {} | 25   ~TestView() {} | 
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 416   EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); | 416   EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); | 
| 417 } | 417 } | 
| 418 | 418 | 
| 419 namespace { | 419 namespace { | 
| 420 | 420 | 
| 421 class OrderChangeObserver : public ViewObserver { | 421 class OrderChangeObserver : public ViewObserver { | 
| 422  public: | 422  public: | 
| 423   struct Change { | 423   struct Change { | 
| 424     View* view; | 424     View* view; | 
| 425     View* relative_view; | 425     View* relative_view; | 
| 426     mojo::OrderDirection direction; | 426     OrderDirection direction; | 
| 427   }; | 427   }; | 
| 428   typedef std::vector<Change> Changes; | 428   typedef std::vector<Change> Changes; | 
| 429 | 429 | 
| 430   explicit OrderChangeObserver(View* observee) : observee_(observee) { | 430   explicit OrderChangeObserver(View* observee) : observee_(observee) { | 
| 431     observee_->AddObserver(this); | 431     observee_->AddObserver(this); | 
| 432   } | 432   } | 
| 433   ~OrderChangeObserver() override { observee_->RemoveObserver(this); } | 433   ~OrderChangeObserver() override { observee_->RemoveObserver(this); } | 
| 434 | 434 | 
| 435   Changes GetAndClearChanges() { | 435   Changes GetAndClearChanges() { | 
| 436     Changes changes; | 436     Changes changes; | 
| 437     changes_.swap(changes); | 437     changes_.swap(changes); | 
| 438     return changes; | 438     return changes; | 
| 439   } | 439   } | 
| 440 | 440 | 
| 441  private: | 441  private: | 
| 442   // Overridden from ViewObserver: | 442   // Overridden from ViewObserver: | 
| 443   void OnViewReordering(View* view, | 443   void OnViewReordering(View* view, | 
| 444                         View* relative_view, | 444                         View* relative_view, | 
| 445                         mojo::OrderDirection direction) override { | 445                         OrderDirection direction) override { | 
| 446     OnViewReordered(view, relative_view, direction); | 446     OnViewReordered(view, relative_view, direction); | 
| 447   } | 447   } | 
| 448 | 448 | 
| 449   void OnViewReordered(View* view, | 449   void OnViewReordered(View* view, | 
| 450                        View* relative_view, | 450                        View* relative_view, | 
| 451                        mojo::OrderDirection direction) override { | 451                        OrderDirection direction) override { | 
| 452     Change change; | 452     Change change; | 
| 453     change.view = view; | 453     change.view = view; | 
| 454     change.relative_view = relative_view; | 454     change.relative_view = relative_view; | 
| 455     change.direction = direction; | 455     change.direction = direction; | 
| 456     changes_.push_back(change); | 456     changes_.push_back(change); | 
| 457   } | 457   } | 
| 458 | 458 | 
| 459   View* observee_; | 459   View* observee_; | 
| 460   Changes changes_; | 460   Changes changes_; | 
| 461 | 461 | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 481     // Move v11 to front. | 481     // Move v11 to front. | 
| 482     // Resulting order: v12, v13, v11 | 482     // Resulting order: v12, v13, v11 | 
| 483     v11.MoveToFront(); | 483     v11.MoveToFront(); | 
| 484     EXPECT_EQ(&v12, v1.children().front()); | 484     EXPECT_EQ(&v12, v1.children().front()); | 
| 485     EXPECT_EQ(&v11, v1.children().back()); | 485     EXPECT_EQ(&v11, v1.children().back()); | 
| 486 | 486 | 
| 487     OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 487     OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 
| 488     ASSERT_EQ(2U, changes.size()); | 488     ASSERT_EQ(2U, changes.size()); | 
| 489     EXPECT_EQ(&v11, changes[0].view); | 489     EXPECT_EQ(&v11, changes[0].view); | 
| 490     EXPECT_EQ(&v13, changes[0].relative_view); | 490     EXPECT_EQ(&v13, changes[0].relative_view); | 
| 491     EXPECT_EQ(mojo::ORDER_DIRECTION_ABOVE, changes[0].direction); | 491     EXPECT_EQ(ORDER_DIRECTION_ABOVE, changes[0].direction); | 
| 492 | 492 | 
| 493     EXPECT_EQ(&v11, changes[1].view); | 493     EXPECT_EQ(&v11, changes[1].view); | 
| 494     EXPECT_EQ(&v13, changes[1].relative_view); | 494     EXPECT_EQ(&v13, changes[1].relative_view); | 
| 495     EXPECT_EQ(mojo::ORDER_DIRECTION_ABOVE, changes[1].direction); | 495     EXPECT_EQ(ORDER_DIRECTION_ABOVE, changes[1].direction); | 
| 496   } | 496   } | 
| 497 | 497 | 
| 498   { | 498   { | 
| 499     OrderChangeObserver observer(&v11); | 499     OrderChangeObserver observer(&v11); | 
| 500 | 500 | 
| 501     // Move v11 to back. | 501     // Move v11 to back. | 
| 502     // Resulting order: v11, v12, v13 | 502     // Resulting order: v11, v12, v13 | 
| 503     v11.MoveToBack(); | 503     v11.MoveToBack(); | 
| 504     EXPECT_EQ(&v11, v1.children().front()); | 504     EXPECT_EQ(&v11, v1.children().front()); | 
| 505     EXPECT_EQ(&v13, v1.children().back()); | 505     EXPECT_EQ(&v13, v1.children().back()); | 
| 506 | 506 | 
| 507     OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 507     OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 
| 508     ASSERT_EQ(2U, changes.size()); | 508     ASSERT_EQ(2U, changes.size()); | 
| 509     EXPECT_EQ(&v11, changes[0].view); | 509     EXPECT_EQ(&v11, changes[0].view); | 
| 510     EXPECT_EQ(&v12, changes[0].relative_view); | 510     EXPECT_EQ(&v12, changes[0].relative_view); | 
| 511     EXPECT_EQ(mojo::ORDER_DIRECTION_BELOW, changes[0].direction); | 511     EXPECT_EQ(ORDER_DIRECTION_BELOW, changes[0].direction); | 
| 512 | 512 | 
| 513     EXPECT_EQ(&v11, changes[1].view); | 513     EXPECT_EQ(&v11, changes[1].view); | 
| 514     EXPECT_EQ(&v12, changes[1].relative_view); | 514     EXPECT_EQ(&v12, changes[1].relative_view); | 
| 515     EXPECT_EQ(mojo::ORDER_DIRECTION_BELOW, changes[1].direction); | 515     EXPECT_EQ(ORDER_DIRECTION_BELOW, changes[1].direction); | 
| 516   } | 516   } | 
| 517 | 517 | 
| 518   { | 518   { | 
| 519     OrderChangeObserver observer(&v11); | 519     OrderChangeObserver observer(&v11); | 
| 520 | 520 | 
| 521     // Move v11 above v12. | 521     // Move v11 above v12. | 
| 522     // Resulting order: v12. v11, v13 | 522     // Resulting order: v12. v11, v13 | 
| 523     v11.Reorder(&v12, mojo::ORDER_DIRECTION_ABOVE); | 523     v11.Reorder(&v12, ORDER_DIRECTION_ABOVE); | 
| 524     EXPECT_EQ(&v12, v1.children().front()); | 524     EXPECT_EQ(&v12, v1.children().front()); | 
| 525     EXPECT_EQ(&v13, v1.children().back()); | 525     EXPECT_EQ(&v13, v1.children().back()); | 
| 526 | 526 | 
| 527     OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 527     OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 
| 528     ASSERT_EQ(2U, changes.size()); | 528     ASSERT_EQ(2U, changes.size()); | 
| 529     EXPECT_EQ(&v11, changes[0].view); | 529     EXPECT_EQ(&v11, changes[0].view); | 
| 530     EXPECT_EQ(&v12, changes[0].relative_view); | 530     EXPECT_EQ(&v12, changes[0].relative_view); | 
| 531     EXPECT_EQ(mojo::ORDER_DIRECTION_ABOVE, changes[0].direction); | 531     EXPECT_EQ(ORDER_DIRECTION_ABOVE, changes[0].direction); | 
| 532 | 532 | 
| 533     EXPECT_EQ(&v11, changes[1].view); | 533     EXPECT_EQ(&v11, changes[1].view); | 
| 534     EXPECT_EQ(&v12, changes[1].relative_view); | 534     EXPECT_EQ(&v12, changes[1].relative_view); | 
| 535     EXPECT_EQ(mojo::ORDER_DIRECTION_ABOVE, changes[1].direction); | 535     EXPECT_EQ(ORDER_DIRECTION_ABOVE, changes[1].direction); | 
| 536   } | 536   } | 
| 537 | 537 | 
| 538   { | 538   { | 
| 539     OrderChangeObserver observer(&v11); | 539     OrderChangeObserver observer(&v11); | 
| 540 | 540 | 
| 541     // Move v11 below v12. | 541     // Move v11 below v12. | 
| 542     // Resulting order: v11, v12, v13 | 542     // Resulting order: v11, v12, v13 | 
| 543     v11.Reorder(&v12, mojo::ORDER_DIRECTION_BELOW); | 543     v11.Reorder(&v12, ORDER_DIRECTION_BELOW); | 
| 544     EXPECT_EQ(&v11, v1.children().front()); | 544     EXPECT_EQ(&v11, v1.children().front()); | 
| 545     EXPECT_EQ(&v13, v1.children().back()); | 545     EXPECT_EQ(&v13, v1.children().back()); | 
| 546 | 546 | 
| 547     OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 547     OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 
| 548     ASSERT_EQ(2U, changes.size()); | 548     ASSERT_EQ(2U, changes.size()); | 
| 549     EXPECT_EQ(&v11, changes[0].view); | 549     EXPECT_EQ(&v11, changes[0].view); | 
| 550     EXPECT_EQ(&v12, changes[0].relative_view); | 550     EXPECT_EQ(&v12, changes[0].relative_view); | 
| 551     EXPECT_EQ(mojo::ORDER_DIRECTION_BELOW, changes[0].direction); | 551     EXPECT_EQ(ORDER_DIRECTION_BELOW, changes[0].direction); | 
| 552 | 552 | 
| 553     EXPECT_EQ(&v11, changes[1].view); | 553     EXPECT_EQ(&v11, changes[1].view); | 
| 554     EXPECT_EQ(&v12, changes[1].relative_view); | 554     EXPECT_EQ(&v12, changes[1].relative_view); | 
| 555     EXPECT_EQ(mojo::ORDER_DIRECTION_BELOW, changes[1].direction); | 555     EXPECT_EQ(ORDER_DIRECTION_BELOW, changes[1].direction); | 
| 556   } | 556   } | 
| 557 } | 557 } | 
| 558 | 558 | 
| 559 namespace { | 559 namespace { | 
| 560 | 560 | 
| 561 typedef std::vector<std::string> Changes; | 561 typedef std::vector<std::string> Changes; | 
| 562 | 562 | 
| 563 std::string ViewIdToString(Id id) { | 563 std::string ViewIdToString(Id id) { | 
| 564   return (id == 0) ? "null" | 564   return (id == 0) ? "null" | 
| 565                    : base::StringPrintf("%d,%d", HiWord(id), LoWord(id)); | 565                    : base::StringPrintf("%d,%d", HiWord(id), LoWord(id)); | 
| 566 } | 566 } | 
| 567 | 567 | 
| 568 std::string RectToString(const mojo::Rect& rect) { | 568 std::string RectToString(const Rect& rect) { | 
| 569   return base::StringPrintf("%d,%d %dx%d", rect.x, rect.y, rect.width, | 569   return base::StringPrintf("%d,%d %dx%d", rect.x, rect.y, rect.width, | 
| 570                             rect.height); | 570                             rect.height); | 
| 571 } | 571 } | 
| 572 | 572 | 
| 573 class BoundsChangeObserver : public ViewObserver { | 573 class BoundsChangeObserver : public ViewObserver { | 
| 574  public: | 574  public: | 
| 575   explicit BoundsChangeObserver(View* view) : view_(view) { | 575   explicit BoundsChangeObserver(View* view) : view_(view) { | 
| 576     view_->AddObserver(this); | 576     view_->AddObserver(this); | 
| 577   } | 577   } | 
| 578   ~BoundsChangeObserver() override { view_->RemoveObserver(this); } | 578   ~BoundsChangeObserver() override { view_->RemoveObserver(this); } | 
| 579 | 579 | 
| 580   Changes GetAndClearChanges() { | 580   Changes GetAndClearChanges() { | 
| 581     Changes changes; | 581     Changes changes; | 
| 582     changes.swap(changes_); | 582     changes.swap(changes_); | 
| 583     return changes; | 583     return changes; | 
| 584   } | 584   } | 
| 585 | 585 | 
| 586  private: | 586  private: | 
| 587   // Overridden from ViewObserver: | 587   // Overridden from ViewObserver: | 
| 588   void OnViewBoundsChanging(View* view, | 588   void OnViewBoundsChanging(View* view, | 
| 589                             const mojo::Rect& old_bounds, | 589                             const Rect& old_bounds, | 
| 590                             const mojo::Rect& new_bounds) override { | 590                             const Rect& new_bounds) override { | 
| 591     changes_.push_back(base::StringPrintf( | 591     changes_.push_back(base::StringPrintf( | 
| 592         "view=%s old_bounds=%s new_bounds=%s phase=changing", | 592         "view=%s old_bounds=%s new_bounds=%s phase=changing", | 
| 593         ViewIdToString(view->id()).c_str(), RectToString(old_bounds).c_str(), | 593         ViewIdToString(view->id()).c_str(), RectToString(old_bounds).c_str(), | 
| 594         RectToString(new_bounds).c_str())); | 594         RectToString(new_bounds).c_str())); | 
| 595   } | 595   } | 
| 596   void OnViewBoundsChanged(View* view, | 596   void OnViewBoundsChanged(View* view, | 
| 597                            const mojo::Rect& old_bounds, | 597                            const Rect& old_bounds, | 
| 598                            const mojo::Rect& new_bounds) override { | 598                            const Rect& new_bounds) override { | 
| 599     changes_.push_back(base::StringPrintf( | 599     changes_.push_back(base::StringPrintf( | 
| 600         "view=%s old_bounds=%s new_bounds=%s phase=changed", | 600         "view=%s old_bounds=%s new_bounds=%s phase=changed", | 
| 601         ViewIdToString(view->id()).c_str(), RectToString(old_bounds).c_str(), | 601         ViewIdToString(view->id()).c_str(), RectToString(old_bounds).c_str(), | 
| 602         RectToString(new_bounds).c_str())); | 602         RectToString(new_bounds).c_str())); | 
| 603   } | 603   } | 
| 604 | 604 | 
| 605   View* view_; | 605   View* view_; | 
| 606   Changes changes_; | 606   Changes changes_; | 
| 607 | 607 | 
| 608   MOJO_DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); | 608   MOJO_DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); | 
| 609 }; | 609 }; | 
| 610 | 610 | 
| 611 }  // namespace | 611 }  // namespace | 
| 612 | 612 | 
| 613 TEST_F(ViewObserverTest, SetBounds) { | 613 TEST_F(ViewObserverTest, SetBounds) { | 
| 614   TestView v1; | 614   TestView v1; | 
| 615   { | 615   { | 
| 616     BoundsChangeObserver observer(&v1); | 616     BoundsChangeObserver observer(&v1); | 
| 617     mojo::Rect rect; | 617     Rect rect; | 
| 618     rect.width = rect.height = 100; | 618     rect.width = rect.height = 100; | 
| 619     v1.SetBounds(rect); | 619     v1.SetBounds(rect); | 
| 620 | 620 | 
| 621     Changes changes = observer.GetAndClearChanges(); | 621     Changes changes = observer.GetAndClearChanges(); | 
| 622     ASSERT_EQ(2U, changes.size()); | 622     ASSERT_EQ(2U, changes.size()); | 
| 623     EXPECT_EQ( | 623     EXPECT_EQ( | 
| 624         "view=0,1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changing", | 624         "view=0,1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changing", | 
| 625         changes[0]); | 625         changes[0]); | 
| 626     EXPECT_EQ( | 626     EXPECT_EQ( | 
| 627         "view=0,1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changed", | 627         "view=0,1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changed", | 
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 864   v1.SetLocalProperty(&prop, 3); | 864   v1.SetLocalProperty(&prop, 3); | 
| 865   EXPECT_EQ(PropertyChangeInfo(&prop, -2), o.PropertyChangeInfoAndClear()); | 865   EXPECT_EQ(PropertyChangeInfo(&prop, -2), o.PropertyChangeInfoAndClear()); | 
| 866   v1.ClearLocalProperty(&prop); | 866   v1.ClearLocalProperty(&prop); | 
| 867   EXPECT_EQ(PropertyChangeInfo(&prop, 3), o.PropertyChangeInfoAndClear()); | 867   EXPECT_EQ(PropertyChangeInfo(&prop, 3), o.PropertyChangeInfoAndClear()); | 
| 868 | 868 | 
| 869   // Sanity check to see if |PropertyChangeInfoAndClear| really clears. | 869   // Sanity check to see if |PropertyChangeInfoAndClear| really clears. | 
| 870   EXPECT_EQ(PropertyChangeInfo(reinterpret_cast<const void*>(NULL), -3), | 870   EXPECT_EQ(PropertyChangeInfo(reinterpret_cast<const void*>(NULL), -3), | 
| 871             o.PropertyChangeInfoAndClear()); | 871             o.PropertyChangeInfoAndClear()); | 
| 872 } | 872 } | 
| 873 | 873 | 
| 874 }  // namespace mus | 874 }  // namespace mojo | 
| OLD | NEW | 
|---|