Store view size info ViewAndroid 

As a part of effort handling OnSizeChange event in ViewAndroid,
this CL defines variables for size information and |OnSizeChanged|
interface in ViewAndroid. The changes is not yet in actual use,
but will replace current logic going through ContentView
ContentViewCore later.

The overall change is in https://crrev.com/c/588029

BUG=622847

Change-Id: Ie99604a9f9c5109463229e7784829b1616cf9a14
Reviewed-on: https://chromium-review.googlesource.com/634847
Reviewed-by: David Trainor <[email protected]>
Reviewed-by: Michael Thiessen <[email protected]>
Reviewed-by: Bo <[email protected]>
Commit-Queue: Jinsuk Kim <[email protected]>
Cr-Commit-Position: refs/heads/master@{#500162}
diff --git a/ui/android/view_android_unittests.cc b/ui/android/view_android_unittests.cc
index 2205668..e267dd04 100644
--- a/ui/android/view_android_unittests.cc
+++ b/ui/android/view_android_unittests.cc
@@ -15,23 +15,36 @@
 
 using base::android::JavaParamRef;
 
+class TestViewAndroid : public ViewAndroid {
+ public:
+  explicit TestViewAndroid(ViewClient* client) : ViewAndroid(client) {}
+
+  float GetDipScale() override { return 1.f; }
+};
+
 class TestViewClient : public ViewClient {
  public:
-  TestViewClient() : handle_event_(true), called_(false) {}
+  TestViewClient() {}
 
-  void SetHandleEvent(bool handle_event) { handle_event_ = handle_event; }
   bool OnTouchEvent(const MotionEventAndroid& event) override {
-    called_ = true;
+    touch_called_ = true;
     return handle_event_;
   }
+  void OnSizeChanged() override { onsize_called_ = true; }
 
-  bool EventHandled() { return called_ && handle_event_; }
-  bool EventCalled() { return called_; }
-  void Reset() { called_ = false; }
+  void SetHandleEvent(bool handle_event) { handle_event_ = handle_event; }
+  bool TouchEventHandled() { return touch_called_ && handle_event_; }
+  bool TouchEventCalled() { return touch_called_; }
+  bool OnSizeCalled() { return onsize_called_; }
+  void Reset() {
+    touch_called_ = false;
+    onsize_called_ = false;
+  }
 
  private:
-  bool handle_event_;  // Marks as event was consumed. True by default.
-  bool called_;
+  bool handle_event_{true};  // Marks as event was consumed. True by default.
+  bool touch_called_{false};
+  bool onsize_called_{false};
 };
 
 class ViewAndroidBoundsTest : public testing::Test {
@@ -42,7 +55,7 @@
         view2_(&client2_),
         view3_(&client3_) {
     root_.GetEventForwarder();
-    root_.SetLayout(ViewAndroid::LayoutParams::MatchParent());
+    root_.layout_params_ = ViewAndroid::LayoutParams::MatchParent();
   }
 
   void Reset() {
@@ -64,25 +77,26 @@
     TestViewClient* clients[3] = {&client1_, &client2_, &client3_};
     for (auto* client : clients) {
       if (&hitClient == client)
-        EXPECT_TRUE(client->EventHandled());
+        EXPECT_TRUE(client->TouchEventHandled());
       else
-        EXPECT_FALSE(client->EventHandled());
+        EXPECT_FALSE(client->TouchEventHandled());
     }
     Reset();
   }
 
-  ViewAndroid root_;
-  ViewAndroid view1_;
-  ViewAndroid view2_;
-  ViewAndroid view3_;
+  TestViewAndroid root_;
+  TestViewAndroid view1_;
+  TestViewAndroid view2_;
+  TestViewAndroid view3_;
   TestViewClient client1_;
   TestViewClient client2_;
   TestViewClient client3_;
 };
 
 TEST_F(ViewAndroidBoundsTest, MatchesViewInFront) {
-  view1_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 400, 600));
-  view2_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 400, 600));
+  view1_.layout_params_ = ViewAndroid::LayoutParams::Normal(50, 50, 400, 600);
+  view1_.layout_params_ = ViewAndroid::LayoutParams::Normal(50, 50, 400, 600);
+  view2_.layout_params_ = ViewAndroid::LayoutParams::Normal(50, 50, 400, 600);
   root_.AddChild(&view2_);
   root_.AddChild(&view1_);
 
@@ -96,8 +110,8 @@
 }
 
 TEST_F(ViewAndroidBoundsTest, MatchesViewArea) {
-  view1_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 200, 200));
-  view2_.SetLayout(ViewAndroid::LayoutParams::Normal(20, 20, 400, 600));
+  view1_.layout_params_ = ViewAndroid::LayoutParams::Normal(50, 50, 200, 200);
+  view2_.layout_params_ = ViewAndroid::LayoutParams::Normal(20, 20, 400, 600);
 
   root_.AddChild(&view2_);
   root_.AddChild(&view1_);
@@ -112,23 +126,23 @@
 }
 
 TEST_F(ViewAndroidBoundsTest, MatchesViewAfterMove) {
-  view1_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 200, 200));
-  view2_.SetLayout(ViewAndroid::LayoutParams::Normal(20, 20, 400, 600));
+  view1_.layout_params_ = ViewAndroid::LayoutParams::Normal(50, 50, 200, 200);
+  view2_.layout_params_ = ViewAndroid::LayoutParams::Normal(20, 20, 400, 600);
   root_.AddChild(&view2_);
   root_.AddChild(&view1_);
 
   GenerateTouchEventAt(100.f, 100.f);
   ExpectHit(client1_);
 
-  view1_.SetLayout(ViewAndroid::LayoutParams::Normal(150, 150, 200, 200));
+  view1_.layout_params_ = ViewAndroid::LayoutParams::Normal(150, 150, 200, 200);
   GenerateTouchEventAt(100.f, 100.f);
   ExpectHit(client2_);
 }
 
 TEST_F(ViewAndroidBoundsTest, MatchesViewSizeOfkMatchParent) {
-  view1_.SetLayout(ViewAndroid::LayoutParams::Normal(20, 20, 400, 600));
-  view3_.SetLayout(ViewAndroid::LayoutParams::MatchParent());
-  view2_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 200, 200));
+  view1_.layout_params_ = ViewAndroid::LayoutParams::Normal(20, 20, 400, 600);
+  view3_.layout_params_ = ViewAndroid::LayoutParams::MatchParent();
+  view2_.layout_params_ = ViewAndroid::LayoutParams::Normal(50, 50, 200, 200);
 
   root_.AddChild(&view1_);
   root_.AddChild(&view2_);
@@ -142,14 +156,14 @@
 
   client1_.SetHandleEvent(false);
   GenerateTouchEventAt(300.f, 400.f);
-  EXPECT_TRUE(client1_.EventCalled());
+  EXPECT_TRUE(client1_.TouchEventCalled());
   ExpectHit(client3_);
 }
 
 TEST_F(ViewAndroidBoundsTest, MatchesViewsWithOffset) {
-  view1_.SetLayout(ViewAndroid::LayoutParams::Normal(10, 20, 150, 100));
-  view2_.SetLayout(ViewAndroid::LayoutParams::Normal(20, 30, 40, 30));
-  view3_.SetLayout(ViewAndroid::LayoutParams::Normal(70, 30, 40, 30));
+  view1_.layout_params_ = ViewAndroid::LayoutParams::Normal(10, 20, 150, 100);
+  view2_.layout_params_ = ViewAndroid::LayoutParams::Normal(20, 30, 40, 30);
+  view3_.layout_params_ = ViewAndroid::LayoutParams::Normal(70, 30, 40, 30);
 
   root_.AddChild(&view1_);
   view1_.AddChild(&view2_);
@@ -160,14 +174,51 @@
 
   client1_.SetHandleEvent(false);
   GenerateTouchEventAt(40, 60);
-  EXPECT_TRUE(client1_.EventCalled());
+  EXPECT_TRUE(client1_.TouchEventCalled());
   ExpectHit(client2_);
 
   GenerateTouchEventAt(100, 70);
-  EXPECT_TRUE(client1_.EventCalled());
+  EXPECT_TRUE(client1_.TouchEventCalled());
   ExpectHit(client3_);
 }
 
+TEST_F(ViewAndroidBoundsTest, OnSizeChanged) {
+  root_.AddChild(&view1_);
+  view1_.AddChild(&view2_);
+  view1_.AddChild(&view3_);
+
+  view1_.layout_params_ = ViewAndroid::LayoutParams::Normal(0, 0, 0, 0);
+  view2_.layout_params_ = ViewAndroid::LayoutParams::MatchParent();
+  view3_.layout_params_ = ViewAndroid::LayoutParams::Normal(0, 0, 0, 0);
+
+  // Size event propagates to non-match-parent children only.
+  view1_.OnSizeChanged(100, 100);
+  EXPECT_TRUE(client1_.OnSizeCalled());
+  EXPECT_TRUE(client2_.OnSizeCalled());
+  EXPECT_FALSE(client3_.OnSizeCalled());
+
+  Reset();
+
+  // TODO(jinsukkim): Enable following test once the top view can be
+  //     set to have match-parent property.
+
+  // Match-parent view should ignore the size event.
+  // view2_.OnSizeChanged(100, 200);
+  // EXPECT_FALSE(client2_.OnSizeCalled());
+  // EXPECT_FALSE(client3_.OnSizeCalled());
+
+  Reset();
+
+  view2_.RemoveFromParent();
+  view1_.OnSizeChanged(100, 100);
+
+  // Size event is generated for a newly added, match-parent child view.
+  EXPECT_FALSE(client2_.OnSizeCalled());
+  view1_.AddChild(&view2_);
+  EXPECT_TRUE(client2_.OnSizeCalled());
+  EXPECT_FALSE(client3_.OnSizeCalled());
+}
+
 TEST(ViewAndroidTest, ChecksMultipleEventForwarders) {
   ViewAndroid parent;
   ViewAndroid child;