Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Side by Side Diff: ui/views/view_unittest.cc

Issue 108283008: Merge 241955 "Make extensions icons easier to target with gestures" (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1750/src/
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/views/view.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <map> 5 #include <map>
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/rand_util.h" 8 #include "base/rand_util.h"
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after
1051 EXPECT_EQ(v2, root_view->GetTooltipHandlerForPoint(v2_centerpoint)); 1051 EXPECT_EQ(v2, root_view->GetTooltipHandlerForPoint(v2_centerpoint));
1052 1052
1053 EXPECT_EQ(v1, root_view->GetTooltipHandlerForPoint(v1_origin)); 1053 EXPECT_EQ(v1, root_view->GetTooltipHandlerForPoint(v1_origin));
1054 EXPECT_EQ(root_view, root_view->GetTooltipHandlerForPoint(v2_origin)); 1054 EXPECT_EQ(root_view, root_view->GetTooltipHandlerForPoint(v2_origin));
1055 1055
1056 EXPECT_FALSE(v1->GetTooltipHandlerForPoint(v2_origin)); 1056 EXPECT_FALSE(v1->GetTooltipHandlerForPoint(v2_origin));
1057 1057
1058 widget->CloseNow(); 1058 widget->CloseNow();
1059 } 1059 }
1060 1060
1061 // Tests the correctness of the rect-based targeting algorithm implemented in
1062 // View::GetEventHandlerForRect(). See http://goo.gl/3Jp2BD for a description
1063 // of rect-based targeting.
1061 TEST_F(ViewTest, GetEventHandlerForRect) { 1064 TEST_F(ViewTest, GetEventHandlerForRect) {
1062 Widget* widget = new Widget; 1065 Widget* widget = new Widget;
1063 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 1066 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
1064 widget->Init(params); 1067 widget->Init(params);
1065 View* root_view = widget->GetRootView(); 1068 View* root_view = widget->GetRootView();
1066 root_view->SetBoundsRect(gfx::Rect(0, 0, 500, 500)); 1069 root_view->SetBoundsRect(gfx::Rect(0, 0, 500, 500));
1067 1070
1068 // Have this hierarchy of views (the coordinates here are all in 1071 // Have this hierarchy of views (the coordinates here are all in
1069 // the root view's coordinate space): 1072 // the root view's coordinate space):
1070 // v1 (0, 0, 100, 100) 1073 // v1 (0, 0, 100, 100)
1071 // v2 (150, 0, 250, 100) 1074 // v2 (150, 0, 250, 100)
1072 // v3 (0, 200, 150, 100) 1075 // v3 (0, 200, 150, 100)
1073 // v31 (10, 210, 80, 80) 1076 // v31 (10, 210, 80, 80)
1074 // v32 (110, 210, 30, 80) 1077 // v32 (110, 210, 30, 80)
1075 // v4 (300, 200, 100, 100) 1078 // v4 (300, 200, 100, 100)
1076 // v41 (310, 210, 80, 80) 1079 // v41 (310, 210, 80, 80)
1077 // v411 (370, 275, 10, 5) 1080 // v411 (370, 275, 10, 5)
1081 // v5 (450, 197, 30, 36)
1082 // v51 (450, 200, 30, 30)
1078 1083
1079 // The coordinates used for SetBounds are in parent coordinates. 1084 // The coordinates used for SetBounds are in parent coordinates.
1080 1085
1081 TestView* v1 = new TestView; 1086 TestView* v1 = new TestView;
1082 v1->SetBounds(0, 0, 100, 100); 1087 v1->SetBounds(0, 0, 100, 100);
1083 root_view->AddChildView(v1); 1088 root_view->AddChildView(v1);
1084 1089
1085 TestView* v2 = new TestView; 1090 TestView* v2 = new TestView;
1086 v2->SetBounds(150, 0, 250, 100); 1091 v2->SetBounds(150, 0, 250, 100);
1087 root_view->AddChildView(v2); 1092 root_view->AddChildView(v2);
(...skipping 15 matching lines...) Expand all
1103 v3->AddChildView(v32); 1108 v3->AddChildView(v32);
1104 1109
1105 TestView* v41 = new TestView; 1110 TestView* v41 = new TestView;
1106 v41->SetBounds(10, 10, 80, 80); 1111 v41->SetBounds(10, 10, 80, 80);
1107 v4->AddChildView(v41); 1112 v4->AddChildView(v41);
1108 1113
1109 TestView* v411 = new TestView; 1114 TestView* v411 = new TestView;
1110 v411->SetBounds(60, 65, 10, 5); 1115 v411->SetBounds(60, 65, 10, 5);
1111 v41->AddChildView(v411); 1116 v41->AddChildView(v411);
1112 1117
1118 TestView* v5 = new TestView;
1119 v5->SetBounds(450, 197, 30, 36);
1120 root_view->AddChildView(v5);
1121
1122 TestView* v51 = new TestView;
1123 v51->SetBounds(0, 3, 30, 30);
1124 v5->AddChildView(v51);
1125
1113 // |touch_rect| does not intersect any descendant view of |root_view|. 1126 // |touch_rect| does not intersect any descendant view of |root_view|.
1114 gfx::Rect touch_rect(105, 105, 30, 45); 1127 gfx::Rect touch_rect(105, 105, 30, 45);
1115 View* result_view = root_view->GetEventHandlerForRect(touch_rect); 1128 View* result_view = root_view->GetEventHandlerForRect(touch_rect);
1116 EXPECT_EQ(root_view, result_view); 1129 EXPECT_EQ(root_view, result_view);
1117 result_view = NULL; 1130 result_view = NULL;
1118 1131
1119 // Covers |v1| by at least 60%. 1132 // Covers |v1| by at least 60%.
1120 touch_rect.SetRect(15, 15, 100, 100); 1133 touch_rect.SetRect(15, 15, 100, 100);
1121 result_view = root_view->GetEventHandlerForRect(touch_rect); 1134 result_view = root_view->GetEventHandlerForRect(touch_rect);
1122 EXPECT_EQ(v1, result_view); 1135 EXPECT_EQ(v1, result_view);
(...skipping 13 matching lines...) Expand all
1136 EXPECT_EQ(root_view, result_view); 1149 EXPECT_EQ(root_view, result_view);
1137 result_view = NULL; 1150 result_view = NULL;
1138 1151
1139 // Intersects |v1| and |v2|, but only covers |v2| by at least 60%. 1152 // Intersects |v1| and |v2|, but only covers |v2| by at least 60%.
1140 touch_rect.SetRect(95, 10, 300, 120); 1153 touch_rect.SetRect(95, 10, 300, 120);
1141 result_view = root_view->GetEventHandlerForRect(touch_rect); 1154 result_view = root_view->GetEventHandlerForRect(touch_rect);
1142 EXPECT_EQ(v2, result_view); 1155 EXPECT_EQ(v2, result_view);
1143 result_view = NULL; 1156 result_view = NULL;
1144 1157
1145 // Covers both |v1| and |v2| by at least 60%, but the center point 1158 // Covers both |v1| and |v2| by at least 60%, but the center point
1146 // of |touch_rect| is closer to the center line of |v2|. 1159 // of |touch_rect| is closer to the center point of |v2|.
1147 touch_rect.SetRect(20, 20, 400, 100); 1160 touch_rect.SetRect(20, 20, 400, 100);
1148 result_view = root_view->GetEventHandlerForRect(touch_rect); 1161 result_view = root_view->GetEventHandlerForRect(touch_rect);
1149 EXPECT_EQ(v2, result_view); 1162 EXPECT_EQ(v2, result_view);
1150 result_view = NULL; 1163 result_view = NULL;
1151 1164
1152 // Covers both |v1| and |v2| by at least 60%, but the center point 1165 // Covers both |v1| and |v2| by at least 60%, but the center point
1153 // of |touch_rect| is closer to the center line (point) of |v1|. 1166 // of |touch_rect| is closer to the center point of |v1|.
1154 touch_rect.SetRect(-700, -15, 1050, 110); 1167 touch_rect.SetRect(-700, -15, 1050, 110);
1155 result_view = root_view->GetEventHandlerForRect(touch_rect); 1168 result_view = root_view->GetEventHandlerForRect(touch_rect);
1156 EXPECT_EQ(v1, result_view); 1169 EXPECT_EQ(v1, result_view);
1157 result_view = NULL; 1170 result_view = NULL;
1158 1171
1159 // A mouse click within |v1| will target |v1|. 1172 // A mouse click within |v1| will target |v1|.
1160 touch_rect.SetRect(15, 15, 1, 1); 1173 touch_rect.SetRect(15, 15, 1, 1);
1161 result_view = root_view->GetEventHandlerForRect(touch_rect); 1174 result_view = root_view->GetEventHandlerForRect(touch_rect);
1162 EXPECT_EQ(v1, result_view); 1175 EXPECT_EQ(v1, result_view);
1163 result_view = NULL; 1176 result_view = NULL;
1164 1177
1165 // Intersects |v3| and |v31| by at least 60% and the center point 1178 // Intersects |v3| and |v31| by at least 60% and the center point
1166 // of |touch_rect| is closer to the center line of |v3|. 1179 // of |touch_rect| is closer to the center point of |v31|.
1167 touch_rect.SetRect(0, 200, 110, 100); 1180 touch_rect.SetRect(0, 200, 110, 100);
1168 result_view = root_view->GetEventHandlerForRect(touch_rect); 1181 result_view = root_view->GetEventHandlerForRect(touch_rect);
1169 EXPECT_EQ(v3, result_view);
1170 result_view = NULL;
1171
1172 // Intersects |v3| and |v31| by at least 60% and the center point
1173 // of |touch_rect| is equally close to the center lines of both.
1174 touch_rect.SetRect(-60, 140, 200, 200);
1175 result_view = root_view->GetEventHandlerForRect(touch_rect);
1176 EXPECT_EQ(v31, result_view); 1182 EXPECT_EQ(v31, result_view);
1177 result_view = NULL; 1183 result_view = NULL;
1178 1184
1179 // Intersects |v3| and |v31|, but neither by at least 60%. The 1185 // Intersects |v3| and |v31|, but neither by at least 60%. The
1180 // center point of |touch_rect| lies within |v31|. 1186 // center point of |touch_rect| lies within |v31|.
1181 touch_rect.SetRect(80, 280, 15, 15); 1187 touch_rect.SetRect(80, 280, 15, 15);
1182 result_view = root_view->GetEventHandlerForRect(touch_rect); 1188 result_view = root_view->GetEventHandlerForRect(touch_rect);
1183 EXPECT_EQ(v31, result_view); 1189 EXPECT_EQ(v31, result_view);
1184 result_view = NULL; 1190 result_view = NULL;
1185 1191
1186 // Covers |v3|, |v31|, and |v32| all by at least 60%, and the 1192 // Covers |v3|, |v31|, and |v32| all by at least 60%, and the
1187 // center point of |touch_rect| is closest to the center line 1193 // center point of |touch_rect| is closest to the center point
1188 // of |v3|. 1194 // of |v32|.
1189 touch_rect.SetRect(0, 200, 200, 100); 1195 touch_rect.SetRect(0, 200, 200, 100);
1190 result_view = root_view->GetEventHandlerForRect(touch_rect); 1196 result_view = root_view->GetEventHandlerForRect(touch_rect);
1191 EXPECT_EQ(v3, result_view); 1197 EXPECT_EQ(v32, result_view);
1192 result_view = NULL; 1198 result_view = NULL;
1193 1199
1194 // Intersects all of |v3|, |v31|, and |v32|, but only covers 1200 // Intersects all of |v3|, |v31|, and |v32|, but only covers
1195 // |v31| and |v32| by at least 60%. The center point of 1201 // |v31| and |v32| by at least 60%. The center point of
1196 // |touch_rect| is closest to the center line of |v32|. 1202 // |touch_rect| is closest to the center point of |v32|.
1197 touch_rect.SetRect(30, 225, 180, 115); 1203 touch_rect.SetRect(30, 225, 180, 115);
1198 result_view = root_view->GetEventHandlerForRect(touch_rect); 1204 result_view = root_view->GetEventHandlerForRect(touch_rect);
1199 EXPECT_EQ(v32, result_view); 1205 EXPECT_EQ(v32, result_view);
1200 result_view = NULL; 1206 result_view = NULL;
1201 1207
1202 // A mouse click at the corner of |v3| will target |v3|. 1208 // A mouse click at the corner of |v3| will target |v3|.
1203 touch_rect.SetRect(0, 200, 1, 1); 1209 touch_rect.SetRect(0, 200, 1, 1);
1204 result_view = root_view->GetEventHandlerForRect(touch_rect); 1210 result_view = root_view->GetEventHandlerForRect(touch_rect);
1205 EXPECT_EQ(v3, result_view); 1211 EXPECT_EQ(v3, result_view);
1206 result_view = NULL; 1212 result_view = NULL;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 result_view = NULL; 1278 result_view = NULL;
1273 1279
1274 // A mouse click within |v41| will target |v41|. 1280 // A mouse click within |v41| will target |v41|.
1275 touch_rect.SetRect(350, 215, 1, 1); 1281 touch_rect.SetRect(350, 215, 1, 1);
1276 result_view = root_view->GetEventHandlerForRect(touch_rect); 1282 result_view = root_view->GetEventHandlerForRect(touch_rect);
1277 EXPECT_EQ(v41, result_view); 1283 EXPECT_EQ(v41, result_view);
1278 result_view = NULL; 1284 result_view = NULL;
1279 1285
1280 // Covers |v3|, |v4|, and all of their descendants by at 1286 // Covers |v3|, |v4|, and all of their descendants by at
1281 // least 60%. The center point of |touch_rect| is closest 1287 // least 60%. The center point of |touch_rect| is closest
1282 // to the center line of |v32|. 1288 // to the center point of |v32|.
1283 touch_rect.SetRect(0, 200, 400, 100); 1289 touch_rect.SetRect(0, 200, 400, 100);
1284 result_view = root_view->GetEventHandlerForRect(touch_rect); 1290 result_view = root_view->GetEventHandlerForRect(touch_rect);
1285 EXPECT_EQ(v32, result_view); 1291 EXPECT_EQ(v32, result_view);
1286 result_view = NULL; 1292 result_view = NULL;
1287 1293
1288 // Intersects all of |v2|, |v3|, |v32|, |v4|, |v41|, and |v411|. 1294 // Intersects all of |v2|, |v3|, |v32|, |v4|, |v41|, and |v411|.
1289 // Covers |v2|, |v32|, |v4|, |v41|, and |v411| by at least 60%. 1295 // Covers |v2|, |v32|, |v4|, |v41|, and |v411| by at least 60%.
1290 // The center point of |touch_rect| is closest to the center 1296 // The center point of |touch_rect| is closest to the center
1291 // point of |root_view|. 1297 // point of |root_view|.
1292 touch_rect.SetRect(110, 15, 375, 450); 1298 touch_rect.SetRect(110, 15, 375, 450);
1293 result_view = root_view->GetEventHandlerForRect(touch_rect); 1299 result_view = root_view->GetEventHandlerForRect(touch_rect);
1294 EXPECT_EQ(root_view, result_view); 1300 EXPECT_EQ(root_view, result_view);
1295 result_view = NULL; 1301 result_view = NULL;
1296 1302
1297 // Covers all views by at least 60%. The center point of 1303 // Covers all views (except |v5| and |v51|) by at least 60%. The
1298 // |touch_rect| is closest to the center line of |v2|. 1304 // center point of |touch_rect| is equally close to the center
1305 // points of |v2| and |v32|. One is not a descendant of the other,
1306 // so in this case the view selected is arbitrary (i.e.,
1307 // it depends only on the ordering of nodes in the views
1308 // hierarchy).
1299 touch_rect.SetRect(0, 0, 400, 300); 1309 touch_rect.SetRect(0, 0, 400, 300);
1300 result_view = root_view->GetEventHandlerForRect(touch_rect); 1310 result_view = root_view->GetEventHandlerForRect(touch_rect);
1301 EXPECT_EQ(v2, result_view); 1311 EXPECT_EQ(v32, result_view);
1312 result_view = NULL;
1313
1314 // Covers |v5| and |v51| by at least 60%, and the center point of
1315 // the touch is located within both views. Since both views share
1316 // the same center point, the child view should be selected.
1317 touch_rect.SetRect(440, 190, 40, 40);
1318 result_view = root_view->GetEventHandlerForRect(touch_rect);
1319 EXPECT_EQ(v51, result_view);
1320 result_view = NULL;
1321
1322 // Covers |v5| and |v51| by at least 60%, but the center point of
1323 // the touch is not located within either view. Since both views
1324 // share the same center point, the child view should be selected.
1325 touch_rect.SetRect(455, 187, 60, 60);
1326 result_view = root_view->GetEventHandlerForRect(touch_rect);
1327 EXPECT_EQ(v51, result_view);
1328 result_view = NULL;
1329
1330 // Covers neither |v5| nor |v51| by at least 60%, but the center
1331 // of the touch is located within |v51|.
1332 touch_rect.SetRect(450, 197, 10, 10);
1333 result_view = root_view->GetEventHandlerForRect(touch_rect);
1334 EXPECT_EQ(v51, result_view);
1335 result_view = NULL;
1336
1337 // Covers neither |v5| nor |v51| by at least 60% but intersects both.
1338 // The center point is located outside of both views.
1339 touch_rect.SetRect(433, 180, 24, 24);
1340 result_view = root_view->GetEventHandlerForRect(touch_rect);
1341 EXPECT_EQ(root_view, result_view);
1342 result_view = NULL;
1343
1344 // Only intersects |v5| but does not cover it by at least 60%. The
1345 // center point of the touch region is located within |v5|.
1346 touch_rect.SetRect(449, 196, 3, 3);
1347 result_view = root_view->GetEventHandlerForRect(touch_rect);
1348 EXPECT_EQ(v5, result_view);
1349 result_view = NULL;
1350
1351 // A mouse click within |v5| (but not |v51|) should target |v5|.
1352 touch_rect.SetRect(462, 199, 1, 1);
1353 result_view = root_view->GetEventHandlerForRect(touch_rect);
1354 EXPECT_EQ(v5, result_view);
1355 result_view = NULL;
1356
1357 // A mouse click |v5| and |v51| should target the child view.
1358 touch_rect.SetRect(452, 226, 1, 1);
1359 result_view = root_view->GetEventHandlerForRect(touch_rect);
1360 EXPECT_EQ(v51, result_view);
1361 result_view = NULL;
1362
1363 // A mouse click on the center of |v5| and |v51| should target
1364 // the child view.
1365 touch_rect.SetRect(465, 215, 1, 1);
1366 result_view = root_view->GetEventHandlerForRect(touch_rect);
1367 EXPECT_EQ(v51, result_view);
1302 result_view = NULL; 1368 result_view = NULL;
1303 1369
1304 widget->CloseNow(); 1370 widget->CloseNow();
1305 } 1371 }
1306 1372
1307 TEST_F(ViewTest, NotifyEnterExitOnChild) { 1373 TEST_F(ViewTest, NotifyEnterExitOnChild) {
1308 Widget* widget = new Widget; 1374 Widget* widget = new Widget;
1309 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 1375 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
1310 widget->Init(params); 1376 widget->Init(params);
1311 View* root_view = widget->GetRootView(); 1377 View* root_view = widget->GetRootView();
(...skipping 2196 matching lines...) Expand 10 before | Expand all | Expand 10 after
3508 const std::vector<ui::Layer*>& child_layers_post = root_layer->children(); 3574 const std::vector<ui::Layer*>& child_layers_post = root_layer->children();
3509 ASSERT_EQ(3u, child_layers_post.size()); 3575 ASSERT_EQ(3u, child_layers_post.size());
3510 EXPECT_EQ(v1->layer(), child_layers_post[0]); 3576 EXPECT_EQ(v1->layer(), child_layers_post[0]);
3511 EXPECT_EQ(v2->layer(), child_layers_post[1]); 3577 EXPECT_EQ(v2->layer(), child_layers_post[1]);
3512 EXPECT_EQ(v1_old_layer, child_layers_post[2]); 3578 EXPECT_EQ(v1_old_layer, child_layers_post[2]);
3513 } 3579 }
3514 3580
3515 #endif // USE_AURA 3581 #endif // USE_AURA
3516 3582
3517 } // namespace views 3583 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/view.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698