Commit a061cb16 authored by Alexey Baskakov's avatar Alexey Baskakov Committed by Commit Bot

WebApp: Redesign WebAppIconManager read icon methods API.

All async WebAppIconManager read icon methods must return void.

A call site should check if an app has appropriate icon
via corresponding Has*Icon methods.

These changes are required for integration with AppService.

This code is disabled by default behind kDesktopPWAsWithoutExtensions
base feature.

Bug: 1029221
Change-Id: Iad46ea383f062d0b3787e11d20b5f89a08eb61f7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1943650Reviewed-by: default avatarEric Willigers <ericwilligers@chromium.org>
Commit-Queue: Alexey Baskakov <loyso@chromium.org>
Cr-Commit-Position: refs/heads/master@{#720123}
parent a30b5d7e
...@@ -49,10 +49,12 @@ gfx::ImageSkia WebAppBrowserController::GetWindowAppIcon() const { ...@@ -49,10 +49,12 @@ gfx::ImageSkia WebAppBrowserController::GetWindowAppIcon() const {
return *app_icon_; return *app_icon_;
app_icon_ = GetFallbackAppIcon(); app_icon_ = GetFallbackAppIcon();
provider_.icon_manager().ReadSmallestIcon( if (provider_.icon_manager().HasSmallestIcon(GetAppId(), gfx::kFaviconSize)) {
GetAppId(), gfx::kFaviconSize, provider_.icon_manager().ReadSmallestIcon(
base::BindOnce(&WebAppBrowserController::OnReadIcon, GetAppId(), gfx::kFaviconSize,
weak_ptr_factory_.GetWeakPtr())); base::BindOnce(&WebAppBrowserController::OnReadIcon,
weak_ptr_factory_.GetWeakPtr()));
}
return *app_icon_; return *app_icon_;
} }
......
...@@ -22,26 +22,30 @@ class AppIconManager { ...@@ -22,26 +22,30 @@ class AppIconManager {
AppIconManager(); AppIconManager();
virtual ~AppIconManager(); virtual ~AppIconManager();
// Reads icon's bitmap for an app. Returns false if no IconInfo for // Returns false if no downloaded icon with precise |icon_size_in_px|.
// |icon_size_in_px|. Returns empty SkBitmap in |callback| if IO error. virtual bool HasIcon(const AppId& app_id, int icon_size_in_px) const = 0;
// Returns false if no downloaded icon matching |icon_size_in_px|.
virtual bool HasSmallestIcon(const AppId& app_id,
int icon_size_in_px) const = 0;
// Reads icon's bitmap for an app. Returns empty SkBitmap in |callback| if IO
// error.
using ReadIconCallback = base::OnceCallback<void(const SkBitmap&)>; using ReadIconCallback = base::OnceCallback<void(const SkBitmap&)>;
virtual bool ReadIcon(const AppId& app_id, virtual void ReadIcon(const AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const = 0; ReadIconCallback callback) const = 0;
// Reads smallest icon with size at least |icon_size_in_px|. // Reads smallest icon with size at least |icon_size_in_px|. Returns empty
// Returns false if there is no such icon. // SkBitmap in |callback| if IO error.
// Returns empty SkBitmap in |callback| if IO error. virtual void ReadSmallestIcon(const AppId& app_id,
virtual bool ReadSmallestIcon(const AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const = 0; ReadIconCallback callback) const = 0;
// Reads smallest icon, compressed as PNG with size at least // Reads smallest icon, compressed as PNG with size at least
// |icon_size_in_px|. Returns false if there is no such icon. Returns empty // |icon_size_in_px|. Returns empty |data| in |callback| if IO error.
// |data| in |callback| if IO error.
using ReadCompressedIconCallback = using ReadCompressedIconCallback =
base::OnceCallback<void(std::vector<uint8_t> data)>; base::OnceCallback<void(std::vector<uint8_t> data)>;
virtual bool ReadSmallestCompressedIcon( virtual void ReadSmallestCompressedIcon(
const AppId& app_id, const AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadCompressedIconCallback callback) const = 0; ReadCompressedIconCallback callback) const = 0;
......
...@@ -23,17 +23,21 @@ void OnExtensionIconLoaded(BookmarkAppIconManager::ReadIconCallback callback, ...@@ -23,17 +23,21 @@ void OnExtensionIconLoaded(BookmarkAppIconManager::ReadIconCallback callback,
std::move(callback).Run(image.IsEmpty() ? SkBitmap() : *image.ToSkBitmap()); std::move(callback).Run(image.IsEmpty() ? SkBitmap() : *image.ToSkBitmap());
} }
bool ReadExtensionIcon(Profile* profile, const Extension* GetBookmarkApp(Profile* profile,
const web_app::AppId& app_id) {
const Extension* extension =
ExtensionRegistry::Get(profile)->enabled_extensions().GetByID(app_id);
return (extension && extension->from_bookmark()) ? extension : nullptr;
}
void ReadExtensionIcon(Profile* profile,
const web_app::AppId& app_id, const web_app::AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ExtensionIconSet::MatchType match_type, ExtensionIconSet::MatchType match_type,
BookmarkAppIconManager::ReadIconCallback callback) { BookmarkAppIconManager::ReadIconCallback callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
const Extension* extension = const Extension* extension = GetBookmarkApp(profile, app_id);
ExtensionRegistry::Get(profile)->enabled_extensions().GetByID(app_id); DCHECK(extension);
if (!extension)
return false;
DCHECK(extension->from_bookmark());
ImageLoader* loader = ImageLoader::Get(profile); ImageLoader* loader = ImageLoader::Get(profile);
loader->LoadImageAsync( loader->LoadImageAsync(
...@@ -41,7 +45,6 @@ bool ReadExtensionIcon(Profile* profile, ...@@ -41,7 +45,6 @@ bool ReadExtensionIcon(Profile* profile,
IconsInfo::GetIconResource(extension, icon_size_in_px, match_type), IconsInfo::GetIconResource(extension, icon_size_in_px, match_type),
gfx::Size(icon_size_in_px, icon_size_in_px), gfx::Size(icon_size_in_px, icon_size_in_px),
base::BindOnce(&OnExtensionIconLoaded, std::move(callback))); base::BindOnce(&OnExtensionIconLoaded, std::move(callback)));
return true;
} }
} // anonymous namespace } // anonymous namespace
...@@ -51,27 +54,39 @@ BookmarkAppIconManager::BookmarkAppIconManager(Profile* profile) ...@@ -51,27 +54,39 @@ BookmarkAppIconManager::BookmarkAppIconManager(Profile* profile)
BookmarkAppIconManager::~BookmarkAppIconManager() = default; BookmarkAppIconManager::~BookmarkAppIconManager() = default;
bool BookmarkAppIconManager::ReadIcon(const web_app::AppId& app_id, bool BookmarkAppIconManager::HasIcon(const web_app::AppId& app_id,
int icon_size_in_px) const {
return GetBookmarkApp(profile_, app_id);
}
bool BookmarkAppIconManager::HasSmallestIcon(const web_app::AppId& app_id,
int icon_size_in_px) const {
return GetBookmarkApp(profile_, app_id);
}
void BookmarkAppIconManager::ReadIcon(const web_app::AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const { ReadIconCallback callback) const {
return ReadExtensionIcon(profile_, app_id, icon_size_in_px, DCHECK(HasIcon(app_id, icon_size_in_px));
ExtensionIconSet::MATCH_EXACTLY, ReadExtensionIcon(profile_, app_id, icon_size_in_px,
std::move(callback)); ExtensionIconSet::MATCH_EXACTLY, std::move(callback));
} }
bool BookmarkAppIconManager::ReadSmallestIcon(const web_app::AppId& app_id, void BookmarkAppIconManager::ReadSmallestIcon(const web_app::AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const { ReadIconCallback callback) const {
return ReadExtensionIcon(profile_, app_id, icon_size_in_px, DCHECK(HasSmallestIcon(app_id, icon_size_in_px));
ExtensionIconSet::MATCH_BIGGER, std::move(callback)); ReadExtensionIcon(profile_, app_id, icon_size_in_px,
ExtensionIconSet::MATCH_BIGGER, std::move(callback));
} }
bool BookmarkAppIconManager::ReadSmallestCompressedIcon( void BookmarkAppIconManager::ReadSmallestCompressedIcon(
const web_app::AppId& app_id, const web_app::AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadCompressedIconCallback callback) const { ReadCompressedIconCallback callback) const {
NOTIMPLEMENTED(); NOTIMPLEMENTED();
return false; DCHECK(HasSmallestIcon(app_id, icon_size_in_px));
std::move(callback).Run(std::vector<uint8_t>());
} }
} // namespace extensions } // namespace extensions
...@@ -20,13 +20,17 @@ class BookmarkAppIconManager : public web_app::AppIconManager { ...@@ -20,13 +20,17 @@ class BookmarkAppIconManager : public web_app::AppIconManager {
~BookmarkAppIconManager() override; ~BookmarkAppIconManager() override;
// AppIconManager: // AppIconManager:
bool ReadIcon(const web_app::AppId& app_id, bool HasIcon(const web_app::AppId& app_id,
int icon_size_in_px) const override;
bool HasSmallestIcon(const web_app::AppId& app_id,
int icon_size_in_px) const override;
void ReadIcon(const web_app::AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const override; ReadIconCallback callback) const override;
bool ReadSmallestIcon(const web_app::AppId& app_id, void ReadSmallestIcon(const web_app::AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const override; ReadIconCallback callback) const override;
bool ReadSmallestCompressedIcon( void ReadSmallestCompressedIcon(
const web_app::AppId& app_id, const web_app::AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadCompressedIconCallback callback) const override; ReadCompressedIconCallback callback) const override;
......
...@@ -258,55 +258,64 @@ void WebAppIconManager::DeleteData(AppId app_id, WriteDataCallback callback) { ...@@ -258,55 +258,64 @@ void WebAppIconManager::DeleteData(AppId app_id, WriteDataCallback callback) {
std::move(callback)); std::move(callback));
} }
bool WebAppIconManager::ReadIcon(const AppId& app_id, bool WebAppIconManager::HasIcon(const AppId& app_id,
int icon_size_in_px, int icon_size_in_px) const {
ReadIconCallback callback) const {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
const WebApp* web_app = registrar_.GetAppById(app_id); const WebApp* web_app = registrar_.GetAppById(app_id);
if (!web_app) if (!web_app)
return false; return false;
for (const WebApp::IconInfo& icon_info : web_app->icons()) { for (const WebApp::IconInfo& icon_info : web_app->icons()) {
if (icon_info.size_in_px == icon_size_in_px) { if (icon_info.size_in_px == icon_size_in_px)
ReadIconInternal(app_id, icon_size_in_px, std::move(callback));
return true; return true;
}
} }
return false; return false;
} }
bool WebAppIconManager::ReadSmallestIcon(const AppId& app_id, bool WebAppIconManager::HasSmallestIcon(const AppId& app_id,
int icon_size_in_px) const {
int best_size_in_px = 0;
return FindBestSizeInPx(app_id, icon_size_in_px, &best_size_in_px);
}
void WebAppIconManager::ReadIcon(const AppId& app_id,
int icon_size_in_px,
ReadIconCallback callback) const {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(HasIcon(app_id, icon_size_in_px));
ReadIconInternal(app_id, icon_size_in_px, std::move(callback));
}
void WebAppIconManager::ReadSmallestIcon(const AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const { ReadIconCallback callback) const {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
int best_size_in_px = 0; int best_size_in_px = 0;
if (!FindBestSizeInPx(app_id, icon_size_in_px, &best_size_in_px)) bool has_smallest_icon =
return false; FindBestSizeInPx(app_id, icon_size_in_px, &best_size_in_px);
DCHECK(has_smallest_icon);
ReadIconInternal(app_id, best_size_in_px, std::move(callback)); ReadIconInternal(app_id, best_size_in_px, std::move(callback));
return true;
} }
bool WebAppIconManager::ReadSmallestCompressedIcon( void WebAppIconManager::ReadSmallestCompressedIcon(
const AppId& app_id, const AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadCompressedIconCallback callback) const { ReadCompressedIconCallback callback) const {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
int best_size_in_px = 0; int best_size_in_px = 0;
if (!FindBestSizeInPx(app_id, icon_size_in_px, &best_size_in_px)) bool has_smallest_icon =
return false; FindBestSizeInPx(app_id, icon_size_in_px, &best_size_in_px);
DCHECK(has_smallest_icon);
base::PostTaskAndReplyWithResult( base::PostTaskAndReplyWithResult(
FROM_HERE, kTaskTraits, FROM_HERE, kTaskTraits,
base::BindOnce(ReadCompressedIconBlocking, utils_->Clone(), base::BindOnce(ReadCompressedIconBlocking, utils_->Clone(),
web_apps_directory_, app_id, best_size_in_px), web_apps_directory_, app_id, best_size_in_px),
std::move(callback)); std::move(callback));
return true;
} }
bool WebAppIconManager::FindBestSizeInPx(const AppId& app_id, bool WebAppIconManager::FindBestSizeInPx(const AppId& app_id,
......
...@@ -36,13 +36,15 @@ class WebAppIconManager : public AppIconManager { ...@@ -36,13 +36,15 @@ class WebAppIconManager : public AppIconManager {
void DeleteData(AppId app_id, WriteDataCallback callback); void DeleteData(AppId app_id, WriteDataCallback callback);
// AppIconManager: // AppIconManager:
bool ReadIcon(const AppId& app_id, bool HasIcon(const AppId& app_id, int icon_size_in_px) const override;
bool HasSmallestIcon(const AppId& app_id, int icon_size_in_px) const override;
void ReadIcon(const AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const override; ReadIconCallback callback) const override;
bool ReadSmallestIcon(const AppId& app_id, void ReadSmallestIcon(const AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadIconCallback callback) const override; ReadIconCallback callback) const override;
bool ReadSmallestCompressedIcon( void ReadSmallestCompressedIcon(
const AppId& app_id, const AppId& app_id,
int icon_size_in_px, int icon_size_in_px,
ReadCompressedIconCallback callback) const override; ReadCompressedIconCallback callback) const override;
......
...@@ -85,17 +85,18 @@ class WebAppIconManagerTest : public WebAppTest { ...@@ -85,17 +85,18 @@ class WebAppIconManagerTest : public WebAppTest {
std::vector<uint8_t> ReadSmallestCompressedIcon(const AppId& app_id, std::vector<uint8_t> ReadSmallestCompressedIcon(const AppId& app_id,
int icon_size_in_px) { int icon_size_in_px) {
EXPECT_TRUE(icon_manager().HasSmallestIcon(app_id, icon_size_in_px));
std::vector<uint8_t> result; std::vector<uint8_t> result;
base::RunLoop run_loop; base::RunLoop run_loop;
bool icon_requested = icon_manager().ReadSmallestCompressedIcon( icon_manager().ReadSmallestCompressedIcon(
app_id, icon_size_in_px, app_id, icon_size_in_px,
base::BindLambdaForTesting([&](std::vector<uint8_t> data) { base::BindLambdaForTesting([&](std::vector<uint8_t> data) {
result = std::move(data); result = std::move(data);
run_loop.Quit(); run_loop.Quit();
})); }));
EXPECT_TRUE(icon_requested);
run_loop.Run(); run_loop.Run();
return result; return result;
} }
...@@ -146,17 +147,17 @@ TEST_F(WebAppIconManagerTest, WriteAndReadIcon) { ...@@ -146,17 +147,17 @@ TEST_F(WebAppIconManagerTest, WriteAndReadIcon) {
controller().RegisterApp(std::move(web_app)); controller().RegisterApp(std::move(web_app));
EXPECT_TRUE(icon_manager().HasIcon(app_id, sizes_px[0]));
{ {
base::RunLoop run_loop; base::RunLoop run_loop;
const bool icon_requested = icon_manager().ReadIcon( icon_manager().ReadIcon(
app_id, sizes_px[0], app_id, sizes_px[0],
base::BindLambdaForTesting([&](const SkBitmap& bitmap) { base::BindLambdaForTesting([&](const SkBitmap& bitmap) {
EXPECT_FALSE(bitmap.empty()); EXPECT_FALSE(bitmap.empty());
EXPECT_EQ(colors[0], bitmap.getColor(0, 0)); EXPECT_EQ(colors[0], bitmap.getColor(0, 0));
run_loop.Quit(); run_loop.Quit();
})); }));
EXPECT_TRUE(icon_requested);
run_loop.Run(); run_loop.Run();
} }
...@@ -176,20 +177,20 @@ TEST_F(WebAppIconManagerTest, ReadIconFailed) { ...@@ -176,20 +177,20 @@ TEST_F(WebAppIconManagerTest, ReadIconFailed) {
controller().RegisterApp(std::move(web_app)); controller().RegisterApp(std::move(web_app));
// Request non-existing icon size. // Check non-existing icon size.
EXPECT_FALSE( EXPECT_FALSE(icon_manager().HasIcon(app_id, icon_size::k96));
icon_manager().ReadIcon(app_id, icon_size::k96, base::DoNothing()));
EXPECT_TRUE(icon_manager().HasIcon(app_id, icon_size_px));
// Request existing icon size which doesn't exist on disk. // Request existing icon size which doesn't exist on disk.
base::RunLoop run_loop; base::RunLoop run_loop;
const bool icon_requested = icon_manager().ReadIcon( icon_manager().ReadIcon(
app_id, icon_size_px, app_id, icon_size_px,
base::BindLambdaForTesting([&](const SkBitmap& bitmap) { base::BindLambdaForTesting([&](const SkBitmap& bitmap) {
EXPECT_TRUE(bitmap.empty()); EXPECT_TRUE(bitmap.empty());
run_loop.Quit(); run_loop.Quit();
})); }));
EXPECT_TRUE(icon_requested);
run_loop.Run(); run_loop.Run();
} }
...@@ -207,24 +208,19 @@ TEST_F(WebAppIconManagerTest, FindExact) { ...@@ -207,24 +208,19 @@ TEST_F(WebAppIconManagerTest, FindExact) {
controller().RegisterApp(std::move(web_app)); controller().RegisterApp(std::move(web_app));
{ EXPECT_FALSE(icon_manager().HasIcon(app_id, 40));
const bool icon_requested = icon_manager().ReadIcon(
app_id, 40, base::BindLambdaForTesting([&](const SkBitmap& bitmap) {
NOTREACHED();
}));
EXPECT_FALSE(icon_requested);
}
{ {
base::RunLoop run_loop; base::RunLoop run_loop;
const bool icon_requested = icon_manager().ReadIcon( EXPECT_TRUE(icon_manager().HasIcon(app_id, 20));
icon_manager().ReadIcon(
app_id, 20, base::BindLambdaForTesting([&](const SkBitmap& bitmap) { app_id, 20, base::BindLambdaForTesting([&](const SkBitmap& bitmap) {
EXPECT_FALSE(bitmap.empty()); EXPECT_FALSE(bitmap.empty());
EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(0, 0)); EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(0, 0));
run_loop.Quit(); run_loop.Quit();
})); }));
EXPECT_TRUE(icon_requested);
run_loop.Run(); run_loop.Run();
} }
...@@ -243,24 +239,18 @@ TEST_F(WebAppIconManagerTest, FindSmallest) { ...@@ -243,24 +239,18 @@ TEST_F(WebAppIconManagerTest, FindSmallest) {
controller().RegisterApp(std::move(web_app)); controller().RegisterApp(std::move(web_app));
{ EXPECT_FALSE(icon_manager().HasIcon(app_id, 70));
const bool icon_requested = icon_manager().ReadSmallestIcon(
app_id, 70, base::BindLambdaForTesting([&](const SkBitmap& bitmap) {
NOTREACHED();
}));
EXPECT_FALSE(icon_requested);
}
{ {
base::RunLoop run_loop; base::RunLoop run_loop;
const bool icon_requested = icon_manager().ReadSmallestIcon( EXPECT_TRUE(icon_manager().HasSmallestIcon(app_id, 40));
icon_manager().ReadSmallestIcon(
app_id, 40, base::BindLambdaForTesting([&](const SkBitmap& bitmap) { app_id, 40, base::BindLambdaForTesting([&](const SkBitmap& bitmap) {
EXPECT_FALSE(bitmap.empty()); EXPECT_FALSE(bitmap.empty());
EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 0)); EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 0));
run_loop.Quit(); run_loop.Quit();
})); }));
EXPECT_TRUE(icon_requested);
run_loop.Run(); run_loop.Run();
} }
...@@ -268,13 +258,13 @@ TEST_F(WebAppIconManagerTest, FindSmallest) { ...@@ -268,13 +258,13 @@ TEST_F(WebAppIconManagerTest, FindSmallest) {
{ {
base::RunLoop run_loop; base::RunLoop run_loop;
const bool icon_requested = icon_manager().ReadSmallestIcon( EXPECT_TRUE(icon_manager().HasSmallestIcon(app_id, 20));
icon_manager().ReadSmallestIcon(
app_id, 20, base::BindLambdaForTesting([&](const SkBitmap& bitmap) { app_id, 20, base::BindLambdaForTesting([&](const SkBitmap& bitmap) {
EXPECT_FALSE(bitmap.empty()); EXPECT_FALSE(bitmap.empty());
EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(0, 0)); EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(0, 0));
run_loop.Quit(); run_loop.Quit();
})); }));
EXPECT_TRUE(icon_requested);
run_loop.Run(); run_loop.Run();
} }
......
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