Commit 853f91d6 authored by Rahul Singh's avatar Rahul Singh Committed by Commit Bot

desktop-pwas: Implement WebAppIconManager::WriteShortcutIconsData()

In the initial CL for Shortcuts Menu (https://crrev.com/c/2146212), we
used the WebAppIconManager::WriteData method to write both app icon
and shortcut icon data to disk.

App icons are for the web app as a whole. Shortcut icons on the other
hand, are specified for a shortcut in the web app manifest's shortcuts
member array. So, in the interest of code readability and debuggability
we should write these to disk separately.

With this in mind, I left a TODO in the initial CL to create separate
methods for writing these 2 different kinds of icon data to disk.

This CL addresses that TODO. It adds a separate
WebAppIconManager::WriteShortcutIconsData method. It also reverts
WebAppIconManager::WriteData to only write app icon specific data.

Additionally, it updates existing unittests to work with the refactored
code and adds new tests for reading and writing shortcut icon data.

Finally, it renames  occurrences of *ShortcutIcon*/*shortcut_icon* to
*ShortcutsMenuIcon*/*shortcuts_menu_icon*.

Bug: 1069308
Change-Id: I530b3af75277f1d6c5f2b0ed6a67ce469bba7fed
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2204972
Commit-Queue: Rahul Singh <rahsin@microsoft.com>
Reviewed-by: default avatarAlexey Baskakov <loyso@chromium.org>
Cr-Commit-Position: refs/heads/master@{#772442}
parent c54e521e
...@@ -42,16 +42,17 @@ class AppIconManager { ...@@ -42,16 +42,17 @@ class AppIconManager {
const std::vector<SquareSizePx>& icon_sizes_in_px, const std::vector<SquareSizePx>& icon_sizes_in_px,
ReadIconsCallback callback) const = 0; ReadIconsCallback callback) const = 0;
using ReadShortcutIconsCallback = base::OnceCallback<void( using ReadShortcutsMenuIconsCallback =
std::vector<std::map<SquareSizePx, SkBitmap>> shortcut_icons_bitmaps)>; base::OnceCallback<void(std::vector<std::map<SquareSizePx, SkBitmap>>
shortcuts_menu_icons_bitmaps)>;
// Reads bitmaps for all shortcut icons for an app. Returns a vector of // Reads bitmaps for all shortcuts menu icons for an app. Returns a vector of
// map<SquareSizePx, SkBitmap>. The index of a map in the vector is the same // map<SquareSizePx, SkBitmap>. The index of a map in the vector is the same
// as that of its corresponding shortcut in the manifest's shortcuts vector. // as that of its corresponding shortcut in the manifest's shortcuts vector.
// Returns empty vector in |callback| if we hit any error. // Returns empty vector in |callback| if we hit any error.
virtual void ReadAllShortcutIcons( virtual void ReadAllShortcutsMenuIcons(
const AppId& app_id, const AppId& app_id,
ReadShortcutIconsCallback callback) const = 0; ReadShortcutsMenuIconsCallback callback) const = 0;
// Reads all icon bitmaps for an app. Returns empty |icon_bitmaps| in // Reads all icon bitmaps for an app. Returns empty |icon_bitmaps| in
// |callback| if IO error. // |callback| if IO error.
......
...@@ -4,6 +4,10 @@ ...@@ -4,6 +4,10 @@
#include "chrome/browser/web_applications/extensions/bookmark_app_icon_manager.h" #include "chrome/browser/web_applications/extensions/bookmark_app_icon_manager.h"
#include <map>
#include <string>
#include <utility>
#include "base/check_op.h" #include "base/check_op.h"
#include "base/notreached.h" #include "base/notreached.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
...@@ -142,9 +146,9 @@ void BookmarkAppIconManager::ReadAllIcons(const web_app::AppId& app_id, ...@@ -142,9 +146,9 @@ void BookmarkAppIconManager::ReadAllIcons(const web_app::AppId& app_id,
std::move(callback)); std::move(callback));
} }
void BookmarkAppIconManager::ReadAllShortcutIcons( void BookmarkAppIconManager::ReadAllShortcutsMenuIcons(
const web_app::AppId& app_id, const web_app::AppId& app_id,
ReadShortcutIconsCallback callback) const { ReadShortcutsMenuIconsCallback callback) const {
// TODO(https://crbug.com/926083): This needs to be implemented to support // TODO(https://crbug.com/926083): This needs to be implemented to support
// Manifest update and local installs. // Manifest update and local installs.
NOTIMPLEMENTED(); NOTIMPLEMENTED();
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_ICON_MANAGER_H_ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_ICON_MANAGER_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_ICON_MANAGER_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_ICON_MANAGER_H_
#include <vector>
#include "chrome/browser/web_applications/components/app_icon_manager.h" #include "chrome/browser/web_applications/components/app_icon_manager.h"
class Profile; class Profile;
...@@ -30,8 +32,9 @@ class BookmarkAppIconManager : public web_app::AppIconManager { ...@@ -30,8 +32,9 @@ class BookmarkAppIconManager : public web_app::AppIconManager {
ReadIconsCallback callback) const override; ReadIconsCallback callback) const override;
void ReadAllIcons(const web_app::AppId& app_id, void ReadAllIcons(const web_app::AppId& app_id,
ReadIconsCallback callback) const override; ReadIconsCallback callback) const override;
void ReadAllShortcutIcons(const web_app::AppId& app_id, void ReadAllShortcutsMenuIcons(
ReadShortcutIconsCallback callback) const override; const web_app::AppId& app_id,
ReadShortcutsMenuIconsCallback callback) const override;
void ReadSmallestIcon(const web_app::AppId& app_id, void ReadSmallestIcon(const web_app::AppId& app_id,
SquareSizePx icon_size_in_px, SquareSizePx icon_size_in_px,
ReadIconCallback callback) const override; ReadIconCallback callback) const override;
......
...@@ -179,32 +179,32 @@ void WebApp::SetAdditionalSearchTerms( ...@@ -179,32 +179,32 @@ void WebApp::SetAdditionalSearchTerms(
} }
void WebApp::SetShortcutInfos( void WebApp::SetShortcutInfos(
std::vector<WebAppShortcutMenuItemInfo> shortcut_infos) { std::vector<WebAppShortcutsMenuItemInfo> shortcut_infos) {
shortcut_infos_ = std::move(shortcut_infos); shortcut_infos_ = std::move(shortcut_infos);
} }
void WebApp::SetDownloadedShortcutIconsSizes( void WebApp::SetDownloadedShortcutsMenuIconsSizes(
std::vector<std::vector<SquareSizePx>> sizes) { std::vector<std::vector<SquareSizePx>> sizes) {
downloaded_shortcut_icons_sizes_ = std::move(sizes); downloaded_shortcuts_menu_icons_sizes_ = std::move(sizes);
} }
WebApp::WebAppShortcutMenuItemInfo::WebAppShortcutMenuItemInfo() = default; WebApp::WebAppShortcutsMenuItemInfo::WebAppShortcutsMenuItemInfo() = default;
WebApp::WebAppShortcutMenuItemInfo::WebAppShortcutMenuItemInfo( WebApp::WebAppShortcutsMenuItemInfo::WebAppShortcutsMenuItemInfo(
const WebAppShortcutMenuItemInfo& other) = default; const WebAppShortcutsMenuItemInfo& other) = default;
WebApp::WebAppShortcutMenuItemInfo::WebAppShortcutMenuItemInfo( WebApp::WebAppShortcutsMenuItemInfo::WebAppShortcutsMenuItemInfo(
WebAppShortcutMenuItemInfo&&) noexcept = default; WebAppShortcutsMenuItemInfo&&) noexcept = default;
WebApp::WebAppShortcutMenuItemInfo::~WebAppShortcutMenuItemInfo() = default; WebApp::WebAppShortcutsMenuItemInfo::~WebAppShortcutsMenuItemInfo() = default;
WebApp::WebAppShortcutMenuItemInfo& WebApp::WebAppShortcutsMenuItemInfo&
WebApp::WebAppShortcutMenuItemInfo::operator=( WebApp::WebAppShortcutsMenuItemInfo::operator=(
const WebAppShortcutMenuItemInfo&) = default; const WebAppShortcutsMenuItemInfo&) = default;
WebApp::WebAppShortcutMenuItemInfo& WebApp::WebAppShortcutsMenuItemInfo&
WebApp::WebAppShortcutMenuItemInfo::operator=( WebApp::WebAppShortcutsMenuItemInfo::operator=(
WebAppShortcutMenuItemInfo&&) noexcept = default; WebAppShortcutsMenuItemInfo&&) noexcept = default;
void WebApp::SetSyncData(SyncData sync_data) { void WebApp::SetSyncData(SyncData sync_data) {
sync_data_ = std::move(sync_data); sync_data_ = std::move(sync_data);
......
...@@ -100,36 +100,37 @@ class WebApp { ...@@ -100,36 +100,37 @@ class WebApp {
const SyncData& sync_data() const { return sync_data_; } const SyncData& sync_data() const { return sync_data_; }
// Stores info needed to create app icon shortcuts menu and for downloading // Stores info needed to create app icon shortcuts menu and for downloading
// associated shortcut icons when supported by OS platform (eg. Windows). // associated shortcuts menu icons when supported by OS platform (eg.
struct WebAppShortcutMenuItemInfo { // Windows).
WebAppShortcutMenuItemInfo(); struct WebAppShortcutsMenuItemInfo {
WebAppShortcutMenuItemInfo(const WebAppShortcutMenuItemInfo&); WebAppShortcutsMenuItemInfo();
WebAppShortcutMenuItemInfo(WebAppShortcutMenuItemInfo&&) noexcept; WebAppShortcutsMenuItemInfo(const WebAppShortcutsMenuItemInfo&);
~WebAppShortcutMenuItemInfo(); WebAppShortcutsMenuItemInfo(WebAppShortcutsMenuItemInfo&&) noexcept;
WebAppShortcutMenuItemInfo& operator=(const WebAppShortcutMenuItemInfo&); ~WebAppShortcutsMenuItemInfo();
WebAppShortcutMenuItemInfo& operator=( WebAppShortcutsMenuItemInfo& operator=(const WebAppShortcutsMenuItemInfo&);
WebAppShortcutMenuItemInfo&&) noexcept; WebAppShortcutsMenuItemInfo& operator=(
WebAppShortcutsMenuItemInfo&&) noexcept;
// Title of shortcut item in App Icon Shortcut Menu.
// Title of shortcuts menu item in App Icon Shortcut Menu.
base::string16 name; base::string16 name;
// URL launched when shortcut item is selected. // URL launched when shortcuts menu item is selected.
GURL url; GURL url;
// List of shortcut icon URLs with associated square size. // List of shortcuts menu icon URLs with associated square size.
std::vector<WebApplicationIconInfo> shortcut_icon_infos; std::vector<WebApplicationIconInfo> shortcuts_menu_icon_infos;
}; };
// Represents the "shortcuts" field in the manifest. // Represents the "shortcuts" field in the manifest.
const std::vector<WebAppShortcutMenuItemInfo>& shortcut_infos() const { const std::vector<WebAppShortcutsMenuItemInfo>& shortcut_infos() const {
return shortcut_infos_; return shortcut_infos_;
} }
// Represents which shortcut icon sizes we successfully downloaded from the // Represents which shortcuts menu icon sizes we successfully downloaded for
// shortcut_infos. // each WebAppShortcutsMenuItemInfo.shortcuts_menu_icon_infos.
const std::vector<std::vector<SquareSizePx>>& const std::vector<std::vector<SquareSizePx>>&
downloaded_shortcut_icons_sizes() const { downloaded_shortcuts_menu_icons_sizes() const {
return downloaded_shortcut_icons_sizes_; return downloaded_shortcuts_menu_icons_sizes_;
} }
// A Web App can be installed from multiple sources simultaneously. Installs // A Web App can be installed from multiple sources simultaneously. Installs
...@@ -161,8 +162,9 @@ class WebApp { ...@@ -161,8 +162,9 @@ class WebApp {
void SetIconInfos(std::vector<WebApplicationIconInfo> icon_infos); void SetIconInfos(std::vector<WebApplicationIconInfo> icon_infos);
// Performs sorting of |sizes| vector. Must be called rarely. // Performs sorting of |sizes| vector. Must be called rarely.
void SetDownloadedIconSizes(std::vector<SquareSizePx> sizes); void SetDownloadedIconSizes(std::vector<SquareSizePx> sizes);
void SetShortcutInfos(std::vector<WebAppShortcutMenuItemInfo> shortcut_infos); void SetShortcutInfos(
void SetDownloadedShortcutIconsSizes( std::vector<WebAppShortcutsMenuItemInfo> shortcut_infos);
void SetDownloadedShortcutsMenuIconsSizes(
std::vector<std::vector<SquareSizePx>> icon_sizes); std::vector<std::vector<SquareSizePx>> icon_sizes);
void SetFileHandlers(apps::FileHandlers file_handlers); void SetFileHandlers(apps::FileHandlers file_handlers);
void SetAdditionalSearchTerms( void SetAdditionalSearchTerms(
...@@ -198,9 +200,9 @@ class WebApp { ...@@ -198,9 +200,9 @@ class WebApp {
std::vector<WebApplicationIconInfo> icon_infos_; std::vector<WebApplicationIconInfo> icon_infos_;
std::vector<SquareSizePx> downloaded_icon_sizes_; std::vector<SquareSizePx> downloaded_icon_sizes_;
// TODO(https://crbug.com/1069312): Serialize shortcut_infos_ and // TODO(https://crbug.com/1069312): Serialize shortcut_infos_ and
// downloaded_shortcut_icons_sizes_ fields in WebAppDatabase. // downloaded_shortcuts_menu_icons_sizes_ fields in WebAppDatabase.
std::vector<WebAppShortcutMenuItemInfo> shortcut_infos_; std::vector<WebAppShortcutsMenuItemInfo> shortcut_infos_;
std::vector<std::vector<SquareSizePx>> downloaded_shortcut_icons_sizes_; std::vector<std::vector<SquareSizePx>> downloaded_shortcuts_menu_icons_sizes_;
apps::FileHandlers file_handlers_; apps::FileHandlers file_handlers_;
std::vector<std::string> additional_search_terms_; std::vector<std::string> additional_search_terms_;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <map> #include <map>
#include <memory> #include <memory>
#include <vector>
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/macros.h" #include "base/macros.h"
...@@ -31,12 +32,14 @@ class WebAppIconManager : public AppIconManager { ...@@ -31,12 +32,14 @@ class WebAppIconManager : public AppIconManager {
// Writes all data (icons) for an app. // Writes all data (icons) for an app.
using WriteDataCallback = base::OnceCallback<void(bool success)>; using WriteDataCallback = base::OnceCallback<void(bool success)>;
// TODO(https://crbug.com/1069308): Create a dedicated WriteShortcutIconsData
// method here, so we can write shortcuts_icons_bitmaps separately.
void WriteData(AppId app_id, void WriteData(AppId app_id,
std::map<SquareSizePx, SkBitmap> icons, std::map<SquareSizePx, SkBitmap> icons,
std::vector<std::map<SquareSizePx, SkBitmap>> shortcut_icons,
WriteDataCallback callback); WriteDataCallback callback);
void WriteShortcutsMenuIconsData(
AppId app_id,
std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons,
WriteDataCallback callback);
void DeleteData(AppId app_id, WriteDataCallback callback); void DeleteData(AppId app_id, WriteDataCallback callback);
// AppIconManager: // AppIconManager:
...@@ -50,8 +53,9 @@ class WebAppIconManager : public AppIconManager { ...@@ -50,8 +53,9 @@ class WebAppIconManager : public AppIconManager {
ReadIconsCallback callback) const override; ReadIconsCallback callback) const override;
void ReadAllIcons(const AppId& app_id, void ReadAllIcons(const AppId& app_id,
ReadIconsCallback callback) const override; ReadIconsCallback callback) const override;
void ReadAllShortcutIcons(const AppId& app_id, void ReadAllShortcutsMenuIcons(
ReadShortcutIconsCallback callback) const override; const AppId& app_id,
ReadShortcutsMenuIconsCallback callback) const override;
void ReadSmallestIcon(const AppId& app_id, void ReadSmallestIcon(const AppId& app_id,
SquareSizePx icon_size_in_px, SquareSizePx icon_size_in_px,
ReadIconCallback callback) const override; ReadIconCallback callback) const override;
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include <algorithm> #include <algorithm>
#include <memory> #include <memory>
#include <string>
#include <utility>
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "base/files/file_enumerator.h" #include "base/files/file_enumerator.h"
...@@ -65,7 +67,6 @@ class WebAppIconManagerTest : public WebAppTest { ...@@ -65,7 +67,6 @@ class WebAppIconManagerTest : public WebAppTest {
base::RunLoop run_loop; base::RunLoop run_loop;
icon_manager_->WriteData(app_id, std::move(web_app_info->icon_bitmaps), icon_manager_->WriteData(app_id, std::move(web_app_info->icon_bitmaps),
std::vector<std::map<SquareSizePx, SkBitmap>>(),
base::BindLambdaForTesting([&](bool success) { base::BindLambdaForTesting([&](bool success) {
EXPECT_TRUE(success); EXPECT_TRUE(success);
run_loop.Quit(); run_loop.Quit();
...@@ -73,38 +74,53 @@ class WebAppIconManagerTest : public WebAppTest { ...@@ -73,38 +74,53 @@ class WebAppIconManagerTest : public WebAppTest {
run_loop.Run(); run_loop.Run();
} }
void WriteShortcutIcons(const AppId& app_id, void WriteShortcutsMenuIcons(const AppId& app_id,
const std::vector<int>& sizes_px, const std::vector<int>& sizes_px,
const std::vector<SkColor>& colors) { const std::vector<SkColor>& colors) {
DCHECK_EQ(sizes_px.size(), colors.size()); DCHECK_EQ(sizes_px.size(), colors.size());
std::vector<std::map<SquareSizePx, SkBitmap>> shortcut_icons; std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons;
for (size_t i = 0; i < sizes_px.size(); i++) { for (size_t i = 0; i < sizes_px.size(); i++) {
std::map<SquareSizePx, SkBitmap> shortcut_icon_map; std::map<SquareSizePx, SkBitmap> shortcuts_menu_icon_map;
std::vector<SquareSizePx> icon_sizes; std::vector<SquareSizePx> icon_sizes;
shortcut_icon_map.emplace(sizes_px[i], shortcuts_menu_icon_map.emplace(sizes_px[i],
CreateSquareIcon(sizes_px[i], colors[i])); CreateSquareIcon(sizes_px[i], colors[i]));
shortcut_icons.push_back(std::move(shortcut_icon_map)); shortcuts_menu_icons.push_back(std::move(shortcuts_menu_icon_map));
} }
base::RunLoop run_loop;
icon_manager_->WriteShortcutsMenuIconsData(
app_id, std::move(shortcuts_menu_icons),
base::BindLambdaForTesting([&](bool success) {
EXPECT_TRUE(success);
run_loop.Quit();
}));
run_loop.Run();
}
std::vector<std::map<SquareSizePx, SkBitmap>> ReadAllShortcutsMenuIcons(
const AppId& app_id) {
std::vector<std::map<SquareSizePx, SkBitmap>> result;
base::RunLoop run_loop; base::RunLoop run_loop;
icon_manager_->WriteData(app_id, std::map<SquareSizePx, SkBitmap>(), icon_manager().ReadAllShortcutsMenuIcons(
shortcut_icons, app_id, base::BindLambdaForTesting(
base::BindLambdaForTesting([&](bool success) { [&](std::vector<std::map<SquareSizePx, SkBitmap>>
EXPECT_TRUE(success); shortcuts_menu_icons_map) {
run_loop.Quit(); result = std::move(shortcuts_menu_icons_map);
})); run_loop.Quit();
}));
run_loop.Run(); run_loop.Run();
return result;
} }
std::vector<std::vector<SquareSizePx>> CreateDownloadedShortcutIconsSizes( std::vector<std::vector<SquareSizePx>>
std::vector<SquareSizePx> sizes_px) { CreateDownloadedShortcutsMenuIconsSizes(std::vector<SquareSizePx> sizes_px) {
std::vector<std::vector<SquareSizePx>> downloaded_shortcut_icons_sizes; std::vector<std::vector<SquareSizePx>>
downloaded_shortcuts_menu_icons_sizes;
for (const auto& size : sizes_px) { for (const auto& size : sizes_px) {
std::vector<SquareSizePx> icon_sizes; std::vector<SquareSizePx> icon_sizes;
icon_sizes.push_back(size); icon_sizes.push_back(size);
downloaded_shortcut_icons_sizes.push_back(std::move(icon_sizes)); downloaded_shortcuts_menu_icons_sizes.push_back(std::move(icon_sizes));
} }
return downloaded_shortcut_icons_sizes; return downloaded_shortcuts_menu_icons_sizes;
} }
std::vector<uint8_t> ReadSmallestCompressedIcon(const AppId& app_id, std::vector<uint8_t> ReadSmallestCompressedIcon(const AppId& app_id,
...@@ -245,7 +261,6 @@ TEST_F(WebAppIconManagerTest, OverwriteIcons) { ...@@ -245,7 +261,6 @@ TEST_F(WebAppIconManagerTest, OverwriteIcons) {
// Overwrite red icons with green ones. // Overwrite red icons with green ones.
icon_manager().WriteData(app_id, std::move(icon_bitmaps), icon_manager().WriteData(app_id, std::move(icon_bitmaps),
std::vector<std::map<SquareSizePx, SkBitmap>>(),
base::BindLambdaForTesting([&](bool success) { base::BindLambdaForTesting([&](bool success) {
EXPECT_TRUE(success); EXPECT_TRUE(success);
run_loop.Quit(); run_loop.Quit();
...@@ -309,7 +324,28 @@ TEST_F(WebAppIconManagerTest, ReadAllIcons) { ...@@ -309,7 +324,28 @@ TEST_F(WebAppIconManagerTest, ReadAllIcons) {
} }
} }
TEST_F(WebAppIconManagerTest, WriteAndReadAllShortcutIcons) { TEST_F(WebAppIconManagerTest, ReadShortcutsMenuIconsFailed) {
auto web_app = CreateWebApp();
const AppId app_id = web_app->app_id();
const std::vector<SquareSizePx> sizes_px{icon_size::k96, icon_size::k256};
// Set shortcuts menu icons meta-info but don't write bitmaps to disk.
web_app->SetDownloadedShortcutsMenuIconsSizes(
CreateDownloadedShortcutsMenuIconsSizes(sizes_px));
controller().RegisterApp(std::move(web_app));
// Request shortcuts menu icons which don't exist on disk.
std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons_map =
ReadAllShortcutsMenuIcons(app_id);
EXPECT_EQ(sizes_px.size(), shortcuts_menu_icons_map.size());
for (const auto& icon_map : shortcuts_menu_icons_map) {
EXPECT_EQ(0u, icon_map.size());
}
}
TEST_F(WebAppIconManagerTest, WriteAndReadAllShortcutsMenuIcons) {
auto web_app = CreateWebApp(); auto web_app = CreateWebApp();
const AppId app_id = web_app->app_id(); const AppId app_id = web_app->app_id();
...@@ -318,35 +354,50 @@ TEST_F(WebAppIconManagerTest, WriteAndReadAllShortcutIcons) { ...@@ -318,35 +354,50 @@ TEST_F(WebAppIconManagerTest, WriteAndReadAllShortcutIcons) {
const std::vector<SkColor> colors = {SK_ColorRED, SK_ColorWHITE, const std::vector<SkColor> colors = {SK_ColorRED, SK_ColorWHITE,
SK_ColorBLUE}; SK_ColorBLUE};
WriteShortcutIcons(app_id, sizes_px, colors); WriteShortcutsMenuIcons(app_id, sizes_px, colors);
web_app->SetDownloadedShortcutIconsSizes( web_app->SetDownloadedShortcutsMenuIconsSizes(
CreateDownloadedShortcutIconsSizes(sizes_px)); CreateDownloadedShortcutsMenuIconsSizes(sizes_px));
controller().RegisterApp(std::move(web_app)); controller().RegisterApp(std::move(web_app));
{
base::RunLoop run_loop;
icon_manager().ReadAllShortcutIcons( std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons_map =
app_id, ReadAllShortcutsMenuIcons(app_id);
base::BindLambdaForTesting( EXPECT_EQ(3u, shortcuts_menu_icons_map.size());
[&](std::vector<std::map<SquareSizePx, SkBitmap>> EXPECT_EQ(sizes_px[0], shortcuts_menu_icons_map[0].begin()->first);
shortcut_icons_map) { EXPECT_EQ(colors[0],
EXPECT_EQ(3u, shortcut_icons_map.size()); shortcuts_menu_icons_map[0].begin()->second.getColor(0, 0));
EXPECT_EQ(sizes_px[0], shortcut_icons_map[0].begin()->first); EXPECT_EQ(sizes_px[1], shortcuts_menu_icons_map[1].begin()->first);
EXPECT_EQ(colors[0], EXPECT_EQ(colors[1],
shortcut_icons_map[0].begin()->second.getColor(0, 0)); shortcuts_menu_icons_map[1].begin()->second.getColor(0, 0));
EXPECT_EQ(sizes_px[1], shortcut_icons_map[1].begin()->first); EXPECT_EQ(sizes_px[2], shortcuts_menu_icons_map[2].begin()->first);
EXPECT_EQ(colors[1], EXPECT_EQ(colors[2],
shortcut_icons_map[1].begin()->second.getColor(0, 0)); shortcuts_menu_icons_map[2].begin()->second.getColor(0, 0));
EXPECT_EQ(sizes_px[2], shortcut_icons_map[2].begin()->first); }
EXPECT_EQ(colors[2],
shortcut_icons_map[2].begin()->second.getColor(0, 0));
run_loop.Quit();
}));
run_loop.Run(); TEST_F(WebAppIconManagerTest, WriteShortcutsMenuIconsEmptyMap) {
} auto web_app = CreateWebApp();
const AppId app_id = web_app->app_id();
web_app->SetDownloadedShortcutsMenuIconsSizes(
CreateDownloadedShortcutsMenuIconsSizes(std::vector<SquareSizePx>{}));
controller().RegisterApp(std::move(web_app));
std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons;
base::RunLoop run_loop;
icon_manager().WriteShortcutsMenuIconsData(
app_id, std::move(shortcuts_menu_icons),
base::BindLambdaForTesting([&](bool success) {
EXPECT_FALSE(success);
run_loop.Quit();
}));
run_loop.Run();
// Make sure that nothing was written to disk.
std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons_map =
ReadAllShortcutsMenuIcons(app_id);
EXPECT_EQ(0u, shortcuts_menu_icons_map.size());
} }
TEST_F(WebAppIconManagerTest, ReadIconsFailed) { TEST_F(WebAppIconManagerTest, ReadIconsFailed) {
......
...@@ -242,10 +242,10 @@ void WebAppInstallFinalizer::FinalizeFallbackInstallAfterSync( ...@@ -242,10 +242,10 @@ void WebAppInstallFinalizer::FinalizeFallbackInstallAfterSync(
icon_manager_->WriteData( icon_manager_->WriteData(
std::move(app_id), std::move(icon_bitmaps), std::move(app_id), std::move(icon_bitmaps),
std::vector<std::map<SquareSizePx, SkBitmap>>(),
base::BindOnce(&WebAppInstallFinalizer::OnIconsDataWritten, base::BindOnce(&WebAppInstallFinalizer::OnIconsDataWritten,
weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(),
std::move(fallback_install_callback), std::move(web_app), std::move(fallback_install_callback), std::move(web_app),
std::vector<std::map<SquareSizePx, SkBitmap>>(),
/*is_new_install=*/true)); /*is_new_install=*/true));
} }
...@@ -424,38 +424,63 @@ void WebAppInstallFinalizer::SetWebAppManifestFieldsAndWriteData( ...@@ -424,38 +424,63 @@ void WebAppInstallFinalizer::SetWebAppManifestFieldsAndWriteData(
web_app->SetIconInfos(web_app_info.icon_infos); web_app->SetIconInfos(web_app_info.icon_infos);
web_app->SetDownloadedIconSizes(GetSquareSizePxs(web_app_info.icon_bitmaps)); web_app->SetDownloadedIconSizes(GetSquareSizePxs(web_app_info.icon_bitmaps));
std::vector<WebApp::WebAppShortcutMenuItemInfo> web_app_shortcut_infos; std::vector<WebApp::WebAppShortcutsMenuItemInfo> web_app_shortcut_infos;
std::vector<std::vector<SquareSizePx>> downloaded_shortcut_icons_sizes; std::vector<std::vector<SquareSizePx>> downloaded_shortcuts_menu_icons_sizes;
for (const auto& shortcut : web_app_info.shortcut_infos) { for (const auto& shortcut : web_app_info.shortcut_infos) {
WebApp::WebAppShortcutMenuItemInfo shortcut_info; WebApp::WebAppShortcutsMenuItemInfo shortcut_info;
shortcut_info.name = shortcut.name; shortcut_info.name = shortcut.name;
shortcut_info.url = shortcut.url; shortcut_info.url = shortcut.url;
shortcut_info.shortcut_icon_infos = shortcut.shortcut_icon_infos; shortcut_info.shortcuts_menu_icon_infos = shortcut.shortcut_icon_infos;
web_app_shortcut_infos.push_back(shortcut_info); web_app_shortcut_infos.push_back(shortcut_info);
downloaded_shortcut_icons_sizes.push_back( downloaded_shortcuts_menu_icons_sizes.push_back(
GetSquareSizePxs(shortcut.shortcut_icon_bitmaps)); GetSquareSizePxs(shortcut.shortcut_icon_bitmaps));
} }
web_app->SetShortcutInfos(std::move(web_app_shortcut_infos)); web_app->SetShortcutInfos(std::move(web_app_shortcut_infos));
web_app->SetDownloadedShortcutIconsSizes( web_app->SetDownloadedShortcutsMenuIconsSizes(
std::move(downloaded_shortcut_icons_sizes)); std::move(downloaded_shortcuts_menu_icons_sizes));
SetWebAppFileHandlers(web_app_info.file_handlers, web_app.get()); SetWebAppFileHandlers(web_app_info.file_handlers, web_app.get());
AppId app_id = web_app->app_id(); AppId app_id = web_app->app_id();
std::vector<std::map<SquareSizePx, SkBitmap>> shortcut_icons_bitmaps; std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons_bitmaps;
for (const auto& shortcut : web_app_info.shortcut_infos) for (const auto& shortcut : web_app_info.shortcut_infos)
shortcut_icons_bitmaps.push_back(shortcut.shortcut_icon_bitmaps); shortcuts_menu_icons_bitmaps.push_back(shortcut.shortcut_icon_bitmaps);
icon_manager_->WriteData( icon_manager_->WriteData(
std::move(app_id), web_app_info.icon_bitmaps, std::move(app_id), web_app_info.icon_bitmaps,
std::move(shortcut_icons_bitmaps),
base::BindOnce(&WebAppInstallFinalizer::OnIconsDataWritten, base::BindOnce(&WebAppInstallFinalizer::OnIconsDataWritten,
weak_ptr_factory_.GetWeakPtr(), std::move(callback), weak_ptr_factory_.GetWeakPtr(), std::move(callback),
std::move(web_app), is_new_install)); std::move(web_app),
std::move(shortcuts_menu_icons_bitmaps), is_new_install));
} }
void WebAppInstallFinalizer::OnIconsDataWritten( void WebAppInstallFinalizer::OnIconsDataWritten(
InstallFinalizedCallback callback,
std::unique_ptr<WebApp> web_app,
std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons,
bool is_new_install,
bool success) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (!success) {
std::move(callback).Run(AppId(), InstallResultCode::kWriteDataFailed);
return;
}
if (shortcuts_menu_icons.empty()) {
OnShortcutsMenuIconsDataWritten(std::move(callback), std::move(web_app),
is_new_install, success);
} else {
AppId app_id = web_app->app_id();
icon_manager_->WriteShortcutsMenuIconsData(
app_id, shortcuts_menu_icons,
base::BindOnce(&WebAppInstallFinalizer::OnShortcutsMenuIconsDataWritten,
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
std::move(web_app), is_new_install));
}
}
void WebAppInstallFinalizer::OnShortcutsMenuIconsDataWritten(
InstallFinalizedCallback callback, InstallFinalizedCallback callback,
std::unique_ptr<WebApp> web_app, std::unique_ptr<WebApp> web_app,
bool is_new_install, bool is_new_install,
......
...@@ -5,15 +5,18 @@ ...@@ -5,15 +5,18 @@
#ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_INSTALL_FINALIZER_H_ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_INSTALL_FINALIZER_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_INSTALL_FINALIZER_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_INSTALL_FINALIZER_H_
#include <map>
#include <memory> #include <memory>
#include <vector>
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "chrome/browser/web_applications/components/install_finalizer.h" #include "chrome/browser/web_applications/components/install_finalizer.h"
#include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_constants.h"
#include "chrome/common/web_application_info.h"
#include "third_party/skia/include/core/SkBitmap.h"
class Profile; class Profile;
struct WebApplicationInfo;
namespace web_app { namespace web_app {
...@@ -63,10 +66,18 @@ class WebAppInstallFinalizer final : public InstallFinalizer { ...@@ -63,10 +66,18 @@ class WebAppInstallFinalizer final : public InstallFinalizer {
bool is_new_install, bool is_new_install,
InstallFinalizedCallback callback); InstallFinalizedCallback callback);
void OnIconsDataWritten(InstallFinalizedCallback callback, void OnIconsDataWritten(
std::unique_ptr<WebApp> web_app, InstallFinalizedCallback callback,
bool is_new_install, std::unique_ptr<WebApp> web_app,
bool success); std::vector<std::map<SquareSizePx, SkBitmap>> shortcuts_menu_icons,
bool is_new_install,
bool success);
void OnShortcutsMenuIconsDataWritten(InstallFinalizedCallback callback,
std::unique_ptr<WebApp> web_app,
bool is_new_install,
bool success);
void OnIconsDataDeleted(const AppId& app_id, void OnIconsDataDeleted(const AppId& app_id,
UninstallWebAppCallback callback, UninstallWebAppCallback callback,
bool success); bool success);
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chrome/browser/web_applications/web_app_migration_manager.h" #include "chrome/browser/web_applications/web_app_migration_manager.h"
#include <map>
#include <utility> #include <utility>
#include "base/bind.h" #include "base/bind.h"
...@@ -121,7 +122,6 @@ void WebAppMigrationManager::OnBookmarkAppIconsRead( ...@@ -121,7 +122,6 @@ void WebAppMigrationManager::OnBookmarkAppIconsRead(
// old extension's representation to new web app representation (project BMO). // old extension's representation to new web app representation (project BMO).
web_app_icon_manager_->WriteData( web_app_icon_manager_->WriteData(
app_id, std::move(icon_bitmaps), app_id, std::move(icon_bitmaps),
std::vector<std::map<SquareSizePx, SkBitmap>>(),
base::BindOnce(&WebAppMigrationManager::OnWebAppIconsWritten, base::BindOnce(&WebAppMigrationManager::OnWebAppIconsWritten,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment