diff --git a/chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager.cc b/chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager.cc index 06c48070789127..b9964087c3aea5 100644 --- a/chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager.cc +++ b/chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager.cc @@ -94,14 +94,20 @@ void ShortcutMenuHandlingSubManager::Execute( void ShortcutMenuHandlingSubManager::StoreShortcutMenuData( const AppId& app_id, proto::ShortcutMenus* shortcut_menus, - WebAppIconManager::ShortcutIconDataVector shortcut_menu_items) { - if (shortcut_menu_items.size() == 0) { - return; - } + WebAppIconManager::ShortcutIconDataVector downloaded_shortcut_menu_items) { std::vector shortcut_menu_item_info = registrar_->GetAppShortcutsMenuItemInfos(app_id); - CHECK_EQ(shortcut_menu_item_info.size(), shortcut_menu_items.size()); - for (size_t menu_index = 0; menu_index < shortcut_menu_items.size(); + // Due to the bitmaps possibly being not populated (see + // https://crbug.com/1427444), we just have empty bitmap data in that case. We + // continue to check to make sure that there aren't MORE bitmaps than + // items. + CHECK_LE(downloaded_shortcut_menu_items.size(), + shortcut_menu_item_info.size()); + while (downloaded_shortcut_menu_items.size() < + shortcut_menu_item_info.size()) { + downloaded_shortcut_menu_items.emplace_back(); + } + for (size_t menu_index = 0; menu_index < shortcut_menu_item_info.size(); menu_index++) { proto::ShortcutMenuInfo* new_shortcut_menu_item = shortcut_menus->add_shortcut_menu_info(); @@ -111,7 +117,7 @@ void ShortcutMenuHandlingSubManager::StoreShortcutMenuData( shortcut_menu_item_info[menu_index].url.spec()); for (const auto& [size, time] : - shortcut_menu_items[menu_index][IconPurpose::ANY]) { + downloaded_shortcut_menu_items[menu_index][IconPurpose::ANY]) { proto::ShortcutIconData* icon_data = new_shortcut_menu_item->add_icon_data_any(); icon_data->set_icon_size(size); @@ -119,7 +125,7 @@ void ShortcutMenuHandlingSubManager::StoreShortcutMenuData( } for (const auto& [size, time] : - shortcut_menu_items[menu_index][IconPurpose::MASKABLE]) { + downloaded_shortcut_menu_items[menu_index][IconPurpose::MASKABLE]) { proto::ShortcutIconData* icon_data = new_shortcut_menu_item->add_icon_data_maskable(); icon_data->set_icon_size(size); @@ -127,7 +133,7 @@ void ShortcutMenuHandlingSubManager::StoreShortcutMenuData( } for (const auto& [size, time] : - shortcut_menu_items[menu_index][IconPurpose::MONOCHROME]) { + downloaded_shortcut_menu_items[menu_index][IconPurpose::MONOCHROME]) { proto::ShortcutIconData* icon_data = new_shortcut_menu_item->add_icon_data_monochrome(); icon_data->set_icon_size(size); diff --git a/chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager_unittest.cc b/chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager_unittest.cc index bfe5a6749970b2..7ecf3eae345ca3 100644 --- a/chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager_unittest.cc +++ b/chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager_unittest.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include #include #include #include @@ -26,6 +27,7 @@ #include "chrome/browser/web_applications/web_app_install_info.h" #include "chrome/browser/web_applications/web_app_install_params.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/browser/web_applications/web_app_registry_update.h" #include "chrome/common/chrome_features.h" #include "components/webapps/browser/install_result_code.h" #include "testing/gtest/include/gtest/gtest.h" @@ -242,15 +244,18 @@ TEST_P(ShortcutMenuHandlingSubManagerConfigureTest, TestConfigure) { testing::Eq(base::StrCat( {kWebAppUrl.spec(), base::NumberToString(menu_index)}))); - EXPECT_TRUE(os_integration_state.shortcut_menus() - .shortcut_menu_info(menu_index) - .icon_data_any_size() == num_sizes); - EXPECT_TRUE(os_integration_state.shortcut_menus() - .shortcut_menu_info(menu_index) - .icon_data_maskable_size() == num_sizes); - EXPECT_TRUE(os_integration_state.shortcut_menus() - .shortcut_menu_info(menu_index) - .icon_data_monochrome_size() == num_sizes); + EXPECT_EQ(os_integration_state.shortcut_menus() + .shortcut_menu_info(menu_index) + .icon_data_any_size(), + num_sizes); + EXPECT_EQ(os_integration_state.shortcut_menus() + .shortcut_menu_info(menu_index) + .icon_data_maskable_size(), + num_sizes); + EXPECT_EQ(os_integration_state.shortcut_menus() + .shortcut_menu_info(menu_index) + .icon_data_monochrome_size(), + num_sizes); for (int size_index = 0; size_index < num_sizes; size_index++) { EXPECT_TRUE(os_integration_state.shortcut_menus() @@ -284,6 +289,70 @@ TEST_P(ShortcutMenuHandlingSubManagerConfigureTest, TestConfigure) { } } +// This tests our handling of https://crbug.com/1427444. +TEST_P(ShortcutMenuHandlingSubManagerConfigureTest, NoDownloadedIcons_1427444) { + const int num_menu_items = 2; + + const std::vector sizes = {icon_size::k64, icon_size::k128}; + const std::vector colors = {SK_ColorRED, SK_ColorRED}; + const AppId& app_id = InstallWebAppWithShortcutMenuIcons( + MakeIconBitmaps({{IconPurpose::ANY, sizes, colors}, + {IconPurpose::MASKABLE, sizes, colors}, + {IconPurpose::MONOCHROME, sizes, colors}}, + num_menu_items)); + // Remove the downloaded icons & resync os integration. + { + ScopedRegistryUpdate remove_downloaded(&provider().sync_bridge_unsafe()); + remove_downloaded->UpdateApp(app_id)->SetDownloadedShortcutsMenuIconsSizes( + {}); + } + if (AreOsIntegrationSubManagersEnabled()) { + base::test::TestFuture future; + provider().scheduler().SynchronizeOsIntegration(app_id, + future.GetCallback()); + ASSERT_TRUE(future.Wait()); + } + + auto state = + provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + if (AreOsIntegrationSubManagersEnabled()) { + EXPECT_TRUE( + os_integration_state.shortcut_menus().shortcut_menu_info_size() == + num_menu_items); + + for (int menu_index = 0; menu_index < num_menu_items; menu_index++) { + EXPECT_THAT(os_integration_state.shortcut_menus() + .shortcut_menu_info(menu_index) + .shortcut_name(), + testing::Eq(base::StrCat( + {"shortcut_name", base::NumberToString(menu_index)}))); + + EXPECT_THAT(os_integration_state.shortcut_menus() + .shortcut_menu_info(menu_index) + .shortcut_launch_url(), + testing::Eq(base::StrCat( + {kWebAppUrl.spec(), base::NumberToString(menu_index)}))); + + EXPECT_EQ(os_integration_state.shortcut_menus() + .shortcut_menu_info(menu_index) + .icon_data_any_size(), + 0); + EXPECT_EQ(os_integration_state.shortcut_menus() + .shortcut_menu_info(menu_index) + .icon_data_maskable_size(), + 0); + EXPECT_EQ(os_integration_state.shortcut_menus() + .shortcut_menu_info(menu_index) + .icon_data_monochrome_size(), + 0); + } + } else { + ASSERT_FALSE(os_integration_state.has_shortcut_menus()); + } +} + INSTANTIATE_TEST_SUITE_P( All, ShortcutMenuHandlingSubManagerConfigureTest, diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc index 5342debc96b100..ec729c3db773af 100644 --- a/chrome/browser/web_applications/test/web_app_test_utils.cc +++ b/chrome/browser/web_applications/test/web_app_test_utils.cc @@ -261,10 +261,11 @@ std::vector CreateRandomScopeExtensions( std::vector CreateRandomShortcutsMenuItemInfos( const GURL& scope, + int num, RandomHelper& random) { const uint32_t suffix = random.next_uint(); std::vector shortcuts_menu_item_infos; - for (int i = random.next_uint(4) + 1; i >= 0; --i) { + for (int i = num - 1; i >= 0; --i) { std::string suffix_str = base::NumberToString(suffix) + base::NumberToString(i); WebAppShortcutsMenuItemInfo shortcut_info; @@ -308,14 +309,15 @@ std::vector CreateRandomShortcutsMenuItemInfos( } std::vector CreateRandomDownloadedShortcutsMenuIconsSizes( + int num, RandomHelper& random) { std::vector results; - for (unsigned int i = 0; i < 3; ++i) { + for (int i = 0; i < num; ++i) { IconSizes result; std::vector shortcuts_menu_icon_sizes_any; std::vector shortcuts_menu_icon_sizes_maskable; std::vector shortcuts_menu_icon_sizes_monochrome; - for (unsigned int j = 0; j < i; ++j) { + for (int j = 0; j < i; ++j) { shortcuts_menu_icon_sizes_any.push_back(random.next_uint(256) + 1); shortcuts_menu_icon_sizes_maskable.push_back(random.next_uint(256) + 1); shortcuts_menu_icon_sizes_monochrome.push_back(random.next_uint(256) + 1); @@ -695,10 +697,14 @@ std::unique_ptr CreateRandomWebApp(const GURL& base_url, } app->SetAdditionalSearchTerms(std::move(additional_search_terms)); + int num_shortcut_menus = static_cast(random.next_uint(4)) + 1; app->SetShortcutsMenuItemInfos( - CreateRandomShortcutsMenuItemInfos(scope, random)); + CreateRandomShortcutsMenuItemInfos(scope, num_shortcut_menus, random)); app->SetDownloadedShortcutsMenuIconsSizes( - CreateRandomDownloadedShortcutsMenuIconsSizes(random)); + CreateRandomDownloadedShortcutsMenuIconsSizes(num_shortcut_menus, + random)); + CHECK_EQ(app->shortcuts_menu_item_infos().size(), + app->downloaded_shortcuts_menu_icons_sizes().size()); app->SetManifestUrl(base_url.Resolve("/manifest" + seed_str + ".json")); const int num_allowed_launch_protocols = random.next_uint(8); diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc index 1953b679893248..2b93f13ce40881 100644 --- a/chrome/browser/web_applications/web_app_database.cc +++ b/chrome/browser/web_applications/web_app_database.cc @@ -1097,16 +1097,13 @@ std::unique_ptr WebAppDatabase::CreateWebApp( file_handler.accept.push_back(std::move(accept_entry)); } - if (WebAppFileHandlerManager::IconsEnabled()) { - absl::optional> file_handler_icon_infos = - ParseAppIconInfos("WebApp", file_handler_proto.downloaded_icons()); - if (!file_handler_icon_infos) { - // ParseAppIconInfos() reports any errors. - return nullptr; - } - file_handler.downloaded_icons = - std::move(file_handler_icon_infos.value()); + absl::optional> file_handler_icon_infos = + ParseAppIconInfos("WebApp", file_handler_proto.downloaded_icons()); + if (!file_handler_icon_infos) { + // ParseAppIconInfos() reports any errors. + return nullptr; } + file_handler.downloaded_icons = std::move(file_handler_icon_infos.value()); file_handlers.push_back(std::move(file_handler)); } @@ -1194,6 +1191,7 @@ std::unique_ptr WebAppDatabase::CreateWebApp( } shortcuts_menu_item_infos.emplace_back(std::move(shortcut_info)); } + const size_t shortcut_menu_item_size = shortcuts_menu_item_infos.size(); web_app->SetShortcutsMenuItemInfos(std::move(shortcuts_menu_item_infos)); std::vector shortcuts_menu_icons_sizes; @@ -1217,6 +1215,11 @@ std::unique_ptr WebAppDatabase::CreateWebApp( shortcuts_menu_icons_sizes.push_back(std::move(icon_sizes)); } + // Due to the bitmaps possibly being not populated (see + // https://crbug.com/1427444), we just have empty bitmap data in that case. + while (shortcuts_menu_icons_sizes.size() < shortcut_menu_item_size) { + shortcuts_menu_icons_sizes.emplace_back(); + } web_app->SetDownloadedShortcutsMenuIconsSizes( std::move(shortcuts_menu_icons_sizes)); diff --git a/chrome/browser/web_applications/web_app_icon_manager.cc b/chrome/browser/web_applications/web_app_icon_manager.cc index 6e3dd40c020e7c..485b080f0205e7 100644 --- a/chrome/browser/web_applications/web_app_icon_manager.cc +++ b/chrome/browser/web_applications/web_app_icon_manager.cc @@ -462,6 +462,7 @@ TypedResult ReadShortcutsMenuIconsBlocking( // item. results.value.push_back(std::move(result)); } + CHECK_EQ(shortcuts_menu_icons_sizes.size(), results.value.size()); return results; } @@ -565,6 +566,7 @@ ReadShortcutMenuIconsWithTimestampBlocking( // item. results.value.push_back(std::move(data)); } + CHECK_EQ(shortcuts_menu_icons_sizes.size(), results.value.size()); return results; } diff --git a/chrome/browser/web_applications/web_app_install_info.h b/chrome/browser/web_applications/web_app_install_info.h index 471575136b86f7..2274c79441db90 100644 --- a/chrome/browser/web_applications/web_app_install_info.h +++ b/chrome/browser/web_applications/web_app_install_info.h @@ -290,6 +290,8 @@ struct WebAppInstallInfo { // Vector of shortcut icon bitmaps keyed by their square size. The index of a // given |IconBitmaps| matches that of the shortcut in // |shortcuts_menu_item_infos| whose bitmaps it contains. + // Notes: It is not guaranteed that these are populated if the menu items are. + // See https://crbug.com/1427444. ShortcutsMenuIconBitmaps shortcuts_menu_icon_bitmaps; // The URL protocols/schemes that the app can handle. diff --git a/chrome/browser/web_applications/web_app_install_utils.cc b/chrome/browser/web_applications/web_app_install_utils.cc index 7c7a92285e2c71..9890be915e3c0d 100644 --- a/chrome/browser/web_applications/web_app_install_utils.cc +++ b/chrome/browser/web_applications/web_app_install_utils.cc @@ -44,6 +44,7 @@ #include "chrome/browser/web_applications/web_app_chromeos_data.h" #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_icon_generator.h" +#include "chrome/browser/web_applications/web_app_install_info.h" #include "chrome/browser/web_applications/web_app_install_params.h" #include "chrome/browser/web_applications/web_app_sources.h" #include "chrome/browser/web_applications/web_app_utils.h" @@ -221,19 +222,32 @@ std::vector GetSquareSizePxs( } std::vector GetDownloadedShortcutsMenuIconsSizes( + const std::vector& shortcuts_menu_items, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps) { + // Due to the bitmaps possibly being not populated (see + // https://crbug.com/1427444), we create empty bitmaps in that case. We + // continue to check to make sure that there aren't MORE bitmaps than + // items. + CHECK_LE(shortcuts_menu_icon_bitmaps.size(), shortcuts_menu_items.size()); std::vector shortcuts_menu_icons_sizes; - shortcuts_menu_icons_sizes.reserve(shortcuts_menu_icon_bitmaps.size()); - for (const auto& shortcut_icon_bitmaps : shortcuts_menu_icon_bitmaps) { + shortcuts_menu_icons_sizes.reserve(shortcuts_menu_items.size()); + IconBitmaps empty_icon_bitmaps; + for (size_t i = 0; i < shortcuts_menu_items.size(); ++i) { + const IconBitmaps* shortcut_icon_bitmaps; + if (i < shortcuts_menu_icon_bitmaps.size()) { + shortcut_icon_bitmaps = &shortcuts_menu_icon_bitmaps[i]; + } else { + shortcut_icon_bitmaps = &empty_icon_bitmaps; + } IconSizes icon_sizes; icon_sizes.SetSizesForPurpose(IconPurpose::ANY, - GetSquareSizePxs(shortcut_icon_bitmaps.any)); + GetSquareSizePxs(shortcut_icon_bitmaps->any)); icon_sizes.SetSizesForPurpose( IconPurpose::MASKABLE, - GetSquareSizePxs(shortcut_icon_bitmaps.maskable)); + GetSquareSizePxs(shortcut_icon_bitmaps->maskable)); icon_sizes.SetSizesForPurpose( IconPurpose::MONOCHROME, - GetSquareSizePxs(shortcut_icon_bitmaps.monochrome)); + GetSquareSizePxs(shortcut_icon_bitmaps->monochrome)); shortcuts_menu_icons_sizes.push_back(std::move(icon_sizes)); } return shortcuts_menu_icons_sizes; @@ -362,6 +376,8 @@ void PopulateShortcutItemIcons(WebAppInstallInfo* web_app_info, web_app_info->shortcuts_menu_icon_bitmaps.emplace_back( std::move(shortcut_icon_bitmaps)); } + CHECK_EQ(web_app_info->shortcuts_menu_icon_bitmaps.size(), + web_app_info->shortcuts_menu_item_infos.size()); } // Reconcile the file handling icons that were specified in the manifest with @@ -1187,6 +1203,7 @@ void SetWebAppManifestFields(const WebAppInstallInfo& web_app_info, web_app.SetShortcutsMenuItemInfos(web_app_info.shortcuts_menu_item_infos); web_app.SetDownloadedShortcutsMenuIconsSizes( GetDownloadedShortcutsMenuIconsSizes( + web_app_info.shortcuts_menu_item_infos, web_app_info.shortcuts_menu_icon_bitmaps)); } diff --git a/chrome/test/data/web_apps/sample_web_app.json b/chrome/test/data/web_apps/sample_web_app.json index 8686fd0841dd43..2578f7a70c78cf 100644 --- a/chrome/test/data/web_apps/sample_web_app.json +++ b/chrome/test/data/web_apps/sample_web_app.json @@ -2,10 +2,10 @@ "!app_id": "eajjdjobhihlgobdfaehiiheinneagde", "!name": "Name1234", "additional_search_terms": [ "Foo_1234_0", "Foo_1234_1", "Foo_1234_2", "Foo_1234_3", "Foo_1234_4", "Foo_1234_5", "Foo_1234_6" ], - "allowed_launch_protocols": [ "web+test_1234_0" ], - "always_show_toolbar_in_fullscreen": false, + "allowed_launch_protocols": [ "web+test_1234_0", "web+test_1234_1", "web+test_1234_2", "web+test_1234_3", "web+test_1234_4", "web+test_1234_5", "web+test_1234_6" ], + "always_show_toolbar_in_fullscreen": true, "app_service_icon_url": "chrome://app-icon/eajjdjobhihlgobdfaehiiheinneagde/32", - "app_size_in_bytes": "2353265476", + "app_size_in_bytes": "4183807547", "background_color": "rgba(77,188,194,0.9686274509803922)", "capture_links": "kNone", "current_os_integration_states": { @@ -18,21 +18,21 @@ "shortcut_descriptions": { "description": "Description1234", "icon_size_to_timestamp_map": { - "32": "1970-02-18 08:29:15.376 UTC" + "32": "1970-02-18 04:08:22.550 UTC" }, "title": "Name1234" }, "shortcut_menus": [ ], "uninstall_registration": { "display_name": "Name1234", - "registered_with_os": true + "registered_with_os": false } }, "dark_mode_background_color": "none", "dark_mode_theme_color": "rgba(34,214,187,1)", - "data_size_in_bytes": "3216637306", + "data_size_in_bytes": "3342929543", "description": "Description1234", - "disallowed_launch_protocols": [ "web+disallowed_1234_0", "web+disallowed_1234_1", "web+disallowed_1234_2", "web+disallowed_1234_3", "web+disallowed_1234_4", "web+disallowed_1234_5" ], + "disallowed_launch_protocols": [ "web+disallowed_1234_0", "web+disallowed_1234_1", "web+disallowed_1234_2", "web+disallowed_1234_3", "web+disallowed_1234_4", "web+disallowed_1234_5", "web+disallowed_1234_6" ], "display_mode": "fullscreen", "display_override": [ "standalone", "fullscreen" ], "downloaded_icon_sizes": { @@ -46,15 +46,10 @@ "MONOCHROME": [ ], "index": 0 }, { - "ANY": [ 36 ], - "MASKABLE": [ 184 ], - "MONOCHROME": [ 60 ], + "ANY": [ 118 ], + "MASKABLE": [ 38 ], + "MONOCHROME": [ 228 ], "index": 1 - }, { - "ANY": [ 136, 6 ], - "MASKABLE": [ 98, 254 ], - "MONOCHROME": [ 109, 27 ], - "index": 2 } ], "file_handler_approval_state": "kRequiresPrompt", "file_handler_os_integration_state": "kDisabled", @@ -166,26 +161,26 @@ "is_uninstalling": false, "isolation_data": { "isolated_web_app_location": { - "dev_mode_bundle": { - "path": "1234" + "dev_mode_proxy": { + "proxy_url": "https://proxy-1234.com" } } }, "last_badging_time": "1970-01-15 16:10:56.662 UTC", "last_launch_time": "1970-01-21 15:31:39.413 UTC", - "latest_install_source": 26, + "latest_install_source": 16, "launch_handler": { - "client_mode": "kNavigateExisting" + "client_mode": "kNavigateNew" }, "launch_query_params": "944292860", "lock_screen_start_url": "https://example.com/scope1234/lock_screen_start_url3022990271", "management_type_to_external_configuration_map": { "Default": { - "install_urls": [ ], - "is_placeholder": true + "install_urls": [ "https://example.com/installer2_1234/" ], + "is_placeholder": false }, "SubApp": { - "install_urls": [ "https://example.com/installer2_1234/" ], + "install_urls": [ "https://example.com/installer1_1234/", "https://example.com/installer2_1234/" ], "is_placeholder": true }, "WebAppStore": { @@ -195,7 +190,7 @@ }, "manifest_icons": [ ], "manifest_id": null, - "manifest_update_time": "1970-02-12 16:20:18.762 UTC", + "manifest_update_time": "1970-01-24 05:49:58.819 UTC", "manifest_url": "https://example.com/manifest1234.json", "note_taking_new_note_url": "https://example.com/scope1234/new_note1289939860", "parent_app_id": "", @@ -233,73 +228,33 @@ "icons": { "ANY": [ { "square_size_px": 14, - "url": "https://example.com/shortcuts/icon28940158931" + "url": "https://example.com/shortcuts/icon24240987411" } ], "MASKABLE": [ { "square_size_px": 29, - "url": "https://example.com/shortcuts/icon28940158932" + "url": "https://example.com/shortcuts/icon24240987412" }, { "square_size_px": 7, - "url": "https://example.com/shortcuts/icon28940158930" + "url": "https://example.com/shortcuts/icon24240987410" } ], "MONOCHROME": [ ] }, - "name": "shortcut2894015893", - "url": "https://example.com/scope1234/shortcut2894015893" + "name": "shortcut2424098741", + "url": "https://example.com/scope1234/shortcut2424098741" }, { "icons": { "ANY": [ { "square_size_px": 0, - "url": "https://example.com/shortcuts/icon28940158920" + "url": "https://example.com/shortcuts/icon24240987400" } ], "MASKABLE": [ ], "MONOCHROME": [ { "square_size_px": 16, - "url": "https://example.com/shortcuts/icon28940158921" - } ] - }, - "name": "shortcut2894015892", - "url": "https://example.com/scope1234/shortcut2894015892" - }, { - "icons": { - "ANY": [ { - "square_size_px": 11, - "url": "https://example.com/shortcuts/icon28940158911" - } ], - "MASKABLE": [ { - "square_size_px": 21, - "url": "https://example.com/shortcuts/icon28940158912" - }, { - "square_size_px": 7, - "url": "https://example.com/shortcuts/icon28940158910" - } ], - "MONOCHROME": [ ] - }, - "name": "shortcut2894015891", - "url": "https://example.com/scope1234/shortcut2894015891" - }, { - "icons": { - "ANY": [ { - "square_size_px": 4, - "url": "https://example.com/shortcuts/icon28940158900" - } ], - "MASKABLE": [ { - "square_size_px": 34, - "url": "https://example.com/shortcuts/icon28940158903" - } ], - "MONOCHROME": [ { - "square_size_px": 44, - "url": "https://example.com/shortcuts/icon28940158904" - }, { - "square_size_px": 25, - "url": "https://example.com/shortcuts/icon28940158902" - }, { - "square_size_px": 10, - "url": "https://example.com/shortcuts/icon28940158901" + "url": "https://example.com/shortcuts/icon24240987401" } ] }, - "name": "shortcut2894015890", - "url": "https://example.com/scope1234/shortcut2894015890" + "name": "shortcut2424098740", + "url": "https://example.com/scope1234/shortcut2424098740" } ], "sources": [ "SubApp", "WebAppStore", "Sync", "Default" ], "start_url": "https://example.com/scope1234/start1234", @@ -309,7 +264,12 @@ "scope": "https://example.com/scope1234/", "theme_color": "rgba(61,127,69,0.8431372549019608)" }, - "tab_strip": null, + "tab_strip": { + "home_tab": "kAuto", + "new_tab_button": { + "url": "" + } + }, "theme_color": "rgba(151,34,83,0.8823529411764706)", "unhashed_app_id": "https://example.com/scope1234/start1234", "url_handlers": [ { @@ -332,4 +292,4 @@ "user_launch_ordinal": "INVALID[]", "user_page_ordinal": "INVALID[]", "window_controls_overlay_enabled": false -} +} \ No newline at end of file