OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <map> | 9 #include <map> |
10 #include <memory> | 10 #include <memory> |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 const float scale = ui::GetScaleForScaleFactor(scale_factor); | 365 const float scale = ui::GetScaleForScaleFactor(scale_factor); |
366 EXPECT_TRUE(image.HasRepresentation(scale)); | 366 EXPECT_TRUE(image.HasRepresentation(scale)); |
367 const gfx::ImageSkiaRep& representation = image.GetRepresentation(scale); | 367 const gfx::ImageSkiaRep& representation = image.GetRepresentation(scale); |
368 EXPECT_FALSE(representation.is_null()); | 368 EXPECT_FALSE(representation.is_null()); |
369 EXPECT_EQ(gfx::ToCeiledInt(app_list::kGridIconDimension * scale), | 369 EXPECT_EQ(gfx::ToCeiledInt(app_list::kGridIconDimension * scale), |
370 representation.pixel_width()); | 370 representation.pixel_width()); |
371 EXPECT_EQ(gfx::ToCeiledInt(app_list::kGridIconDimension * scale), | 371 EXPECT_EQ(gfx::ToCeiledInt(app_list::kGridIconDimension * scale), |
372 representation.pixel_height()); | 372 representation.pixel_height()); |
373 } | 373 } |
374 } | 374 } |
| 375 void MaybeRemoveIconRequestRecord(const std::string& app_id) { |
| 376 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); |
| 377 ASSERT_NE(nullptr, prefs); |
| 378 |
| 379 prefs->MaybeRemoveIconRequestRecord(app_id); |
| 380 } |
375 | 381 |
376 void AddPackage(const arc::mojom::ArcPackageInfo& package) { | 382 void AddPackage(const arc::mojom::ArcPackageInfo& package) { |
377 arc_test_.AddPackage(package); | 383 arc_test_.AddPackage(package); |
378 } | 384 } |
379 | 385 |
380 void RemovePackage(const arc::mojom::ArcPackageInfo& package) { | 386 void RemovePackage(const arc::mojom::ArcPackageInfo& package) { |
381 arc_test_.RemovePackage(package); | 387 arc_test_.RemovePackage(package); |
382 } | 388 } |
383 | 389 |
384 AppListControllerDelegate* controller() { return controller_.get(); } | 390 AppListControllerDelegate* controller() { return controller_.get(); } |
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 | 1091 |
1086 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); | 1092 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); |
1087 ASSERT_NE(nullptr, prefs); | 1093 ASSERT_NE(nullptr, prefs); |
1088 | 1094 |
1089 app_instance()->RefreshAppList(); | 1095 app_instance()->RefreshAppList(); |
1090 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>( | 1096 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>( |
1091 fake_apps().begin(), fake_apps().begin() + 1)); | 1097 fake_apps().begin(), fake_apps().begin() + 1)); |
1092 content::BrowserThread::GetBlockingPool()->FlushForTesting(); | 1098 content::BrowserThread::GetBlockingPool()->FlushForTesting(); |
1093 base::RunLoop().RunUntilIdle(); | 1099 base::RunLoop().RunUntilIdle(); |
1094 | 1100 |
1095 // Store number of requests generated during the App List item creation. | 1101 // Store number of requests generated during the App List item creation. Same |
| 1102 // request will not be re-sent without clear the request record in |
| 1103 // ArcAppListPrefs. |
1096 const size_t initial_icon_request_count = | 1104 const size_t initial_icon_request_count = |
1097 app_instance()->icon_requests().size(); | 1105 app_instance()->icon_requests().size(); |
1098 | 1106 |
1099 std::vector<arc::mojom::ShortcutInfo> shortcuts = | 1107 std::vector<arc::mojom::ShortcutInfo> shortcuts = |
1100 arc_test()->fake_shortcuts(); | 1108 arc_test()->fake_shortcuts(); |
1101 shortcuts.resize(1); | 1109 shortcuts.resize(1); |
1102 shortcuts[0].intent_uri += | 1110 shortcuts[0].intent_uri += |
1103 ";S.org.chromium.arc.shelf_group_id=arc_test_shelf_group;end"; | 1111 ";S.org.chromium.arc.shelf_group_id=arc_test_shelf_group;end"; |
1104 app_instance()->SendInstallShortcuts(shortcuts); | 1112 app_instance()->SendInstallShortcuts(shortcuts); |
1105 const std::string shortcut_id = ArcAppTest::GetAppId(shortcuts[0]); | 1113 const std::string shortcut_id = ArcAppTest::GetAppId(shortcuts[0]); |
(...skipping 17 matching lines...) Expand all Loading... |
1123 base::RunLoop().RunUntilIdle(); | 1131 base::RunLoop().RunUntilIdle(); |
1124 const size_t shortcut_request_cnt = | 1132 const size_t shortcut_request_cnt = |
1125 app_instance()->shortcut_icon_requests().size(); | 1133 app_instance()->shortcut_icon_requests().size(); |
1126 EXPECT_NE(0U, shortcut_request_cnt); | 1134 EXPECT_NE(0U, shortcut_request_cnt); |
1127 EXPECT_EQ(initial_icon_request_count, app_instance()->icon_requests().size()); | 1135 EXPECT_EQ(initial_icon_request_count, app_instance()->icon_requests().size()); |
1128 for (const auto& request : app_instance()->shortcut_icon_requests()) { | 1136 for (const auto& request : app_instance()->shortcut_icon_requests()) { |
1129 EXPECT_EQ(shortcuts[0].icon_resource_id, request->icon_resource_id()); | 1137 EXPECT_EQ(shortcuts[0].icon_resource_id, request->icon_resource_id()); |
1130 } | 1138 } |
1131 | 1139 |
1132 // Fallback when shortcut is not found for shelf group id, use app id instead. | 1140 // Fallback when shortcut is not found for shelf group id, use app id instead. |
| 1141 // Remove the IconRequestRecord for app_id to observe the icon request for |
| 1142 // app_id is re-sent. |
| 1143 MaybeRemoveIconRequestRecord(app_id); |
1133 icon_loader.FetchImage(id_shortcut_absent); | 1144 icon_loader.FetchImage(id_shortcut_absent); |
1134 EXPECT_EQ(2UL, delegate.update_image_cnt()); | 1145 EXPECT_EQ(2UL, delegate.update_image_cnt()); |
1135 content::BrowserThread::GetBlockingPool()->FlushForTesting(); | 1146 content::BrowserThread::GetBlockingPool()->FlushForTesting(); |
1136 base::RunLoop().RunUntilIdle(); | 1147 base::RunLoop().RunUntilIdle(); |
1137 EXPECT_TRUE(app_instance()->icon_requests().size() > | 1148 EXPECT_TRUE(app_instance()->icon_requests().size() > |
1138 initial_icon_request_count); | 1149 initial_icon_request_count); |
1139 EXPECT_EQ(shortcut_request_cnt, | 1150 EXPECT_EQ(shortcut_request_cnt, |
1140 app_instance()->shortcut_icon_requests().size()); | 1151 app_instance()->shortcut_icon_requests().size()); |
1141 for (size_t i = initial_icon_request_count; | 1152 for (size_t i = initial_icon_request_count; |
1142 i < app_instance()->icon_requests().size(); ++i) { | 1153 i < app_instance()->icon_requests().size(); ++i) { |
1143 const auto& request = app_instance()->icon_requests()[i]; | 1154 const auto& request = app_instance()->icon_requests()[i]; |
1144 EXPECT_TRUE(request->IsForApp(app)); | 1155 EXPECT_TRUE(request->IsForApp(app)); |
1145 } | 1156 } |
1146 } | 1157 } |
1147 | 1158 |
| 1159 // If the cached icon file is corrupted, we expect send request to ARC for a new |
| 1160 // icon. |
| 1161 TEST_P(ArcAppModelBuilderTest, IconLoaderWithBadIcon) { |
| 1162 const arc::mojom::AppInfo& app = fake_apps()[0]; |
| 1163 const std::string app_id = ArcAppTest::GetAppId(app); |
| 1164 |
| 1165 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); |
| 1166 ASSERT_NE(nullptr, prefs); |
| 1167 |
| 1168 app_instance()->RefreshAppList(); |
| 1169 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>( |
| 1170 fake_apps().begin(), fake_apps().begin() + 1)); |
| 1171 content::BrowserThread::GetBlockingPool()->FlushForTesting(); |
| 1172 base::RunLoop().RunUntilIdle(); |
| 1173 |
| 1174 // Store number of requests generated during the App List item creation. Same |
| 1175 // request will not be re-sent without clear the request record in |
| 1176 // ArcAppListPrefs. |
| 1177 const size_t initial_icon_request_count = |
| 1178 app_instance()->icon_requests().size(); |
| 1179 |
| 1180 FakeAppIconLoaderDelegate delegate; |
| 1181 ArcAppIconLoader icon_loader(profile(), app_list::kListIconSize, &delegate); |
| 1182 icon_loader.FetchImage(app_id); |
| 1183 |
| 1184 content::BrowserThread::GetBlockingPool()->FlushForTesting(); |
| 1185 base::RunLoop().RunUntilIdle(); |
| 1186 // Although icon file is still missing, expect no new request sent to ARC as |
| 1187 // them are recorded in IconRequestRecord in ArcAppListPrefs. |
| 1188 EXPECT_EQ(app_instance()->icon_requests().size(), initial_icon_request_count); |
| 1189 // Validate default image. |
| 1190 ValidateIcon(delegate.image()); |
| 1191 |
| 1192 MaybeRemoveIconRequestRecord(app_id); |
| 1193 |
| 1194 // Install Bad image. |
| 1195 const std::vector<ui::ScaleFactor>& scale_factors = |
| 1196 ui::GetSupportedScaleFactors(); |
| 1197 ArcAppItem* app_item = FindArcItem(app_id); |
| 1198 for (auto& scale_factor : scale_factors) { |
| 1199 std::string png_data; |
| 1200 app_instance()->GenerateAndSendBadIcon( |
| 1201 app, static_cast<arc::mojom::ScaleFactor>(scale_factor), &png_data); |
| 1202 const float scale = ui::GetScaleForScaleFactor(scale_factor); |
| 1203 // Force the icon to be loaded. |
| 1204 app_item->icon().GetRepresentation(scale); |
| 1205 WaitForIconReady(prefs, app_id, scale_factor); |
| 1206 } |
| 1207 // After clear request record related to app_id, when bad icon is installed, |
| 1208 // decoding failure will trigger re-sending new icon request to ARC. |
| 1209 EXPECT_TRUE(app_instance()->icon_requests().size() > |
| 1210 initial_icon_request_count); |
| 1211 for (size_t i = initial_icon_request_count; |
| 1212 i < app_instance()->icon_requests().size(); ++i) { |
| 1213 const auto& request = app_instance()->icon_requests()[i]; |
| 1214 EXPECT_TRUE(request->IsForApp(app)); |
| 1215 } |
| 1216 } |
| 1217 |
1148 // TODO(crbug.com/628425) -- reenable once this test is less flaky. | 1218 // TODO(crbug.com/628425) -- reenable once this test is less flaky. |
1149 TEST_P(ArcAppModelBuilderTest, DISABLED_IconLoader) { | 1219 TEST_P(ArcAppModelBuilderTest, DISABLED_IconLoader) { |
1150 const arc::mojom::AppInfo& app = fake_apps()[0]; | 1220 const arc::mojom::AppInfo& app = fake_apps()[0]; |
1151 const std::string app_id = ArcAppTest::GetAppId(app); | 1221 const std::string app_id = ArcAppTest::GetAppId(app); |
1152 | 1222 |
1153 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); | 1223 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); |
1154 ASSERT_NE(nullptr, prefs); | 1224 ASSERT_NE(nullptr, prefs); |
1155 | 1225 |
1156 app_instance()->RefreshAppList(); | 1226 app_instance()->RefreshAppList(); |
1157 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>( | 1227 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>( |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1460 ::testing::ValuesIn(kUnmanagedArcStates)); | 1530 ::testing::ValuesIn(kUnmanagedArcStates)); |
1461 INSTANTIATE_TEST_CASE_P(, | 1531 INSTANTIATE_TEST_CASE_P(, |
1462 ArcDefaulAppForManagedUserTest, | 1532 ArcDefaulAppForManagedUserTest, |
1463 ::testing::ValuesIn(kManagedArcStates)); | 1533 ::testing::ValuesIn(kManagedArcStates)); |
1464 INSTANTIATE_TEST_CASE_P(, | 1534 INSTANTIATE_TEST_CASE_P(, |
1465 ArcPlayStoreAppTest, | 1535 ArcPlayStoreAppTest, |
1466 ::testing::ValuesIn(kUnmanagedArcStates)); | 1536 ::testing::ValuesIn(kUnmanagedArcStates)); |
1467 INSTANTIATE_TEST_CASE_P(, | 1537 INSTANTIATE_TEST_CASE_P(, |
1468 ArcAppModelBuilderRecreate, | 1538 ArcAppModelBuilderRecreate, |
1469 ::testing::ValuesIn(kUnmanagedArcStates)); | 1539 ::testing::ValuesIn(kUnmanagedArcStates)); |
OLD | NEW |