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

WebApp: Use vector<WebApplicationIconInfo> icon infos in WebAppIconManager.

Decouple icons pixel data from WebApplicationInfo metadata.

The Update and Sync-Initiated installs will use it to override icon pixel
data. See next CL:
https://chromium-review.googlesource.com/c/chromium/src/+/1858025

Bug: 860583
Change-Id: Ief987de76bfd1389835c1318e57fb7d79ac4728d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1861443
Commit-Queue: Alexey Baskakov <loyso@chromium.org>
Reviewed-by: default avatarEric Willigers <ericwilligers@chromium.org>
Cr-Commit-Position: refs/heads/master@{#706698}
parent 4d0e81a5
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "chrome/browser/web_applications/file_utils_wrapper.h" #include "chrome/browser/web_applications/file_utils_wrapper.h"
#include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app.h"
#include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_registrar.h"
#include "chrome/common/web_application_info.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/codec/png_codec.h" #include "ui/gfx/codec/png_codec.h"
...@@ -84,14 +85,14 @@ bool WriteIcon(FileUtilsWrapper* utils, ...@@ -84,14 +85,14 @@ bool WriteIcon(FileUtilsWrapper* utils,
bool WriteIcons(FileUtilsWrapper* utils, bool WriteIcons(FileUtilsWrapper* utils,
const base::FilePath& app_dir, const base::FilePath& app_dir,
const WebApplicationInfo& web_app_info) { const std::vector<WebApplicationIconInfo>& icon_infos) {
const base::FilePath icons_dir = app_dir.Append(kIconsDirectoryName); const base::FilePath icons_dir = app_dir.Append(kIconsDirectoryName);
if (!utils->CreateDirectory(icons_dir)) { if (!utils->CreateDirectory(icons_dir)) {
LOG(ERROR) << "Could not create icons directory."; LOG(ERROR) << "Could not create icons directory.";
return false; return false;
} }
for (const WebApplicationIconInfo& icon_info : web_app_info.icons) { for (const WebApplicationIconInfo& icon_info : icon_infos) {
// Skip unfetched bitmaps. // Skip unfetched bitmaps.
if (icon_info.data.colorType() == kUnknown_SkColorType) if (icon_info.data.colorType() == kUnknown_SkColorType)
continue; continue;
...@@ -104,11 +105,11 @@ bool WriteIcons(FileUtilsWrapper* utils, ...@@ -104,11 +105,11 @@ bool WriteIcons(FileUtilsWrapper* utils,
} }
// Performs blocking I/O. May be called on another thread. // Performs blocking I/O. May be called on another thread.
// Returns true if no errors occured. // Returns true if no errors occurred.
bool WriteDataBlocking(std::unique_ptr<FileUtilsWrapper> utils, bool WriteDataBlocking(std::unique_ptr<FileUtilsWrapper> utils,
base::FilePath web_apps_directory, base::FilePath web_apps_directory,
AppId app_id, AppId app_id,
std::unique_ptr<WebApplicationInfo> web_app_info) { std::vector<WebApplicationIconInfo> icon_infos) {
const base::FilePath temp_dir = GetTempDir(utils.get(), web_apps_directory); const base::FilePath temp_dir = GetTempDir(utils.get(), web_apps_directory);
if (temp_dir.empty()) { if (temp_dir.empty()) {
LOG(ERROR) LOG(ERROR)
...@@ -122,7 +123,7 @@ bool WriteDataBlocking(std::unique_ptr<FileUtilsWrapper> utils, ...@@ -122,7 +123,7 @@ bool WriteDataBlocking(std::unique_ptr<FileUtilsWrapper> utils,
return false; return false;
} }
if (!WriteIcons(utils.get(), app_temp_dir.GetPath(), *web_app_info)) if (!WriteIcons(utils.get(), app_temp_dir.GetPath(), icon_infos))
return false; return false;
// Commit: move whole app data dir to final destination in one mv operation. // Commit: move whole app data dir to final destination in one mv operation.
...@@ -137,7 +138,7 @@ bool WriteDataBlocking(std::unique_ptr<FileUtilsWrapper> utils, ...@@ -137,7 +138,7 @@ bool WriteDataBlocking(std::unique_ptr<FileUtilsWrapper> utils,
} }
// Performs blocking I/O. May be called on another thread. // Performs blocking I/O. May be called on another thread.
// Returns empty SkBitmap if any errors occured. // Returns empty SkBitmap if any errors occurred.
SkBitmap ReadIconBlocking(std::unique_ptr<FileUtilsWrapper> utils, SkBitmap ReadIconBlocking(std::unique_ptr<FileUtilsWrapper> utils,
base::FilePath web_apps_directory, base::FilePath web_apps_directory,
AppId app_id, AppId app_id,
...@@ -182,14 +183,14 @@ WebAppIconManager::~WebAppIconManager() = default; ...@@ -182,14 +183,14 @@ WebAppIconManager::~WebAppIconManager() = default;
void WebAppIconManager::WriteData( void WebAppIconManager::WriteData(
AppId app_id, AppId app_id,
std::unique_ptr<WebApplicationInfo> web_app_info, std::vector<WebApplicationIconInfo> icon_infos,
WriteDataCallback callback) { WriteDataCallback callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
base::PostTaskAndReplyWithResult( base::PostTaskAndReplyWithResult(
FROM_HERE, kTaskTraits, FROM_HERE, kTaskTraits,
base::BindOnce(WriteDataBlocking, utils_->Clone(), web_apps_directory_, base::BindOnce(WriteDataBlocking, utils_->Clone(), web_apps_directory_,
std::move(app_id), std::move(web_app_info)), std::move(app_id), std::move(icon_infos)),
std::move(callback)); std::move(callback));
} }
......
...@@ -6,13 +6,14 @@ ...@@ -6,13 +6,14 @@
#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_ICON_MANAGER_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_ICON_MANAGER_H_
#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"
#include "chrome/browser/web_applications/components/app_icon_manager.h" #include "chrome/browser/web_applications/components/app_icon_manager.h"
#include "chrome/common/web_application_info.h"
class Profile; class Profile;
struct WebApplicationIconInfo;
namespace web_app { namespace web_app {
...@@ -30,7 +31,7 @@ class WebAppIconManager : public AppIconManager { ...@@ -30,7 +31,7 @@ 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)>;
void WriteData(AppId app_id, void WriteData(AppId app_id,
std::unique_ptr<WebApplicationInfo> web_app_info, std::vector<WebApplicationIconInfo> icon_infos,
WriteDataCallback callback); WriteDataCallback callback);
// AppIconManager: // AppIconManager:
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app.h"
#include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_registrar.h"
#include "chrome/browser/web_applications/web_app_sync_bridge.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h"
#include "chrome/common/web_application_info.h"
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/mojom/manifest/display_mode.mojom.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
...@@ -48,17 +49,18 @@ class WebAppIconManagerTest : public WebAppTest { ...@@ -48,17 +49,18 @@ class WebAppIconManagerTest : public WebAppTest {
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());
auto web_app_info = std::make_unique<WebApplicationInfo>();
web_app_info->icons.reserve(sizes_px.size()); std::vector<WebApplicationIconInfo> icon_infos;
icon_infos.reserve(sizes_px.size());
for (size_t i = 0; i < sizes_px.size(); ++i) { for (size_t i = 0; i < sizes_px.size(); ++i) {
std::string icon_name = base::StringPrintf("app-%d.ico", sizes_px[i]); std::string icon_name = base::StringPrintf("app-%d.ico", sizes_px[i]);
GURL icon_url = app_url.Resolve(icon_name); GURL icon_url = app_url.Resolve(icon_name);
web_app_info->icons.push_back( icon_infos.push_back(GenerateIconInfo(icon_url, sizes_px[i], colors[i]));
GenerateIconInfo(icon_url, sizes_px[i], colors[i]));
} }
base::RunLoop run_loop; base::RunLoop run_loop;
icon_manager_->WriteData(app_id, std::move(web_app_info), icon_manager_->WriteData(app_id, std::move(icon_infos),
base::BindLambdaForTesting([&](bool success) { base::BindLambdaForTesting([&](bool success) {
EXPECT_TRUE(success); EXPECT_TRUE(success);
run_loop.Quit(); run_loop.Quit();
......
...@@ -64,10 +64,11 @@ Source::Type InferSourceFromMetricsInstallSource( ...@@ -64,10 +64,11 @@ Source::Type InferSourceFromMetricsInstallSource(
} }
} }
void SetIcons(const WebApplicationInfo& web_app_info, WebApp* web_app) { void SetWebAppIcons(const std::vector<WebApplicationIconInfo>& icon_infos,
WebApp* web_app) {
WebApp::Icons web_app_icons; WebApp::Icons web_app_icons;
for (const WebApplicationIconInfo& icon_info : web_app_info.icons) { for (const WebApplicationIconInfo& icon_info : icon_infos) {
// Skip unfetched bitmaps. // Skip unfetched bitmaps.
if (icon_info.data.colorType() == kUnknown_SkColorType) if (icon_info.data.colorType() == kUnknown_SkColorType)
continue; continue;
...@@ -128,7 +129,7 @@ void WebAppInstallFinalizer::FinalizeInstall( ...@@ -128,7 +129,7 @@ void WebAppInstallFinalizer::FinalizeInstall(
: blink::mojom::DisplayMode::kBrowser); : blink::mojom::DisplayMode::kBrowser);
web_app->SetIsLocallyInstalled(options.locally_installed); web_app->SetIsLocallyInstalled(options.locally_installed);
SetIcons(web_app_info, web_app.get()); SetWebAppIcons(web_app_info.icons, web_app.get());
web_app->SetIsInSyncInstall(false); web_app->SetIsInSyncInstall(false);
WebApp::SyncData sync_data; WebApp::SyncData sync_data;
...@@ -137,7 +138,7 @@ void WebAppInstallFinalizer::FinalizeInstall( ...@@ -137,7 +138,7 @@ void WebAppInstallFinalizer::FinalizeInstall(
web_app->SetSyncData(std::move(sync_data)); web_app->SetSyncData(std::move(sync_data));
icon_manager_->WriteData( icon_manager_->WriteData(
std::move(app_id), std::make_unique<WebApplicationInfo>(web_app_info), std::move(app_id), web_app_info.icons,
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))); std::move(web_app)));
......
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