Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3531)

Unified Diff: chrome/browser/android/webapk/webapk_installer.cc

Issue 2528073002: Add a flag in WebAPK's proto when the Web App Manifest is no longer available. (Closed)
Patch Set: Update unit tests and nits. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/android/webapk/webapk_installer.cc
diff --git a/chrome/browser/android/webapk/webapk_installer.cc b/chrome/browser/android/webapk/webapk_installer.cc
index 840e1147b10384bafe8f733ff94de58fd64767f1..13ee327e700aafd46d12c45f6b3c93fed8f96587 100644
--- a/chrome/browser/android/webapk/webapk_installer.cc
+++ b/chrome/browser/android/webapk/webapk_installer.cc
@@ -106,60 +106,6 @@ std::string getCurrentAbi() {
#endif
}
-// Populates webapk::WebApk and returns it.
-// Must be called on a worker thread because it encodes an SkBitmap.
-std::unique_ptr<webapk::WebApk> BuildWebApkProtoInBackground(
- const ShortcutInfo& shortcut_info,
- const SkBitmap& shortcut_icon,
- const std::string& shortcut_icon_murmur2_hash) {
- DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
-
- std::unique_ptr<webapk::WebApk> webapk(new webapk::WebApk);
- webapk->set_manifest_url(shortcut_info.manifest_url.spec());
- webapk->set_requester_application_package(
- base::android::BuildInfo::GetInstance()->package_name());
- webapk->set_requester_application_version(version_info::GetVersionNumber());
- webapk->set_android_abi(getCurrentAbi());
-
- // TODO(hanxi): crbug.com/665078. Add a flag in WebAPK's proto to indicate
- // that the Web Manifest data in the proto might be stale.
- if (shortcut_icon_murmur2_hash.empty())
- return webapk;
-
- webapk::WebAppManifest* web_app_manifest = webapk->mutable_manifest();
- web_app_manifest->set_name(base::UTF16ToUTF8(shortcut_info.name));
- web_app_manifest->set_short_name(
- base::UTF16ToUTF8(shortcut_info.short_name));
- web_app_manifest->set_start_url(shortcut_info.url.spec());
- web_app_manifest->set_orientation(
- content::WebScreenOrientationLockTypeToString(
- shortcut_info.orientation));
- web_app_manifest->set_display_mode(
- content::WebDisplayModeToString(shortcut_info.display));
- web_app_manifest->set_background_color(
- ColorToString(shortcut_info.background_color));
- web_app_manifest->set_theme_color(ColorToString(shortcut_info.theme_color));
-
- std::string* scope = web_app_manifest->add_scopes();
- scope->assign(GetScope(shortcut_info).spec());
-
- webapk::Image* best_image = web_app_manifest->add_icons();
- best_image->set_src(shortcut_info.best_icon_url.spec());
- best_image->set_hash(shortcut_icon_murmur2_hash);
- std::vector<unsigned char> png_bytes;
- gfx::PNGCodec::EncodeBGRASkBitmap(shortcut_icon, false, &png_bytes);
- best_image->set_image_data(&png_bytes.front(), png_bytes.size());
-
- for (const std::string& icon_url : shortcut_info.icon_urls) {
- if (icon_url == shortcut_info.best_icon_url.spec())
- continue;
- webapk::Image* image = web_app_manifest->add_icons();
- image->set_src(icon_url);
- }
-
- return webapk;
-}
-
// Returns task runner for running background tasks.
scoped_refptr<base::TaskRunner> GetBackgroundTaskRunner() {
return content::BrowserThread::GetBlockingPool()
@@ -250,33 +196,36 @@ void WebApkInstaller::InstallAsyncWithURLRequestContextGetter(
DownloadAppIconAndComputeMurmur2Hash();
}
-void WebApkInstaller::UpdateAsync(content::BrowserContext* browser_context,
- const FinishCallback& finish_callback,
- const std::string& icon_murmur2_hash,
- const std::string& webapk_package,
- int webapk_version) {
+void WebApkInstaller::UpdateAsync(
+ content::BrowserContext* browser_context,
+ const FinishCallback& finish_callback,
+ const std::string& webapk_package,
+ int webapk_version,
+ bool stale_manifest,
+ const std::map<std::string, std::string>& icon_url_to_murmur2_hash_map) {
UpdateAsyncWithURLRequestContextGetter(
Profile::FromBrowserContext(browser_context)->GetRequestContext(),
- finish_callback, icon_murmur2_hash, webapk_package, webapk_version);
+ finish_callback, webapk_package, webapk_version, stale_manifest,
+ icon_url_to_murmur2_hash_map);
}
void WebApkInstaller::UpdateAsyncWithURLRequestContextGetter(
net::URLRequestContextGetter* request_context_getter,
const FinishCallback& finish_callback,
- const std::string& icon_murmur2_hash,
const std::string& webapk_package,
- int webapk_version) {
+ int webapk_version,
+ bool stale_manifest,
+ const std::map<std::string, std::string>& icon_url_to_murmur2_hash_map) {
request_context_getter_ = request_context_getter;
finish_callback_ = finish_callback;
- shortcut_icon_murmur2_hash_ = icon_murmur2_hash;
webapk_package_ = webapk_package;
webapk_version_ = webapk_version;
task_type_ = UPDATE;
base::PostTaskAndReplyWithResult(
GetBackgroundTaskRunner().get(), FROM_HERE,
- base::Bind(&BuildWebApkProtoInBackground, shortcut_info_,
- shortcut_icon_, shortcut_icon_murmur2_hash_),
+ base::Bind(&BuildWebApkProtoInBackground, shortcut_info_, shortcut_icon_,
+ stale_manifest, icon_url_to_murmur2_hash_map),
base::Bind(&WebApkInstaller::SendUpdateWebApkRequest,
weak_ptr_factory_.GetWeakPtr()));
}
@@ -410,18 +359,24 @@ void WebApkInstaller::OnGotIconMurmur2Hash(
timer_.Stop();
icon_hasher_.reset();
- shortcut_icon_murmur2_hash_ = icon_murmur2_hash;
-
// An empty hash indicates that |icon_hasher_| encountered an error.
if (icon_murmur2_hash.empty()) {
OnFailure();
return;
}
+ std::map<std::string, std::string> icon_url_to_murmur2_hash_map;
+ for (const std::string& icon_url : shortcut_info_.icon_urls) {
+ if (icon_url != shortcut_info_.best_icon_url.spec())
+ icon_url_to_murmur2_hash_map[icon_url] = "";
+ else
+ icon_url_to_murmur2_hash_map[icon_url] = icon_murmur2_hash;
+ }
+
base::PostTaskAndReplyWithResult(
GetBackgroundTaskRunner().get(), FROM_HERE,
- base::Bind(&BuildWebApkProtoInBackground, shortcut_info_,
- shortcut_icon_, shortcut_icon_murmur2_hash_),
+ base::Bind(&BuildWebApkProtoInBackground, shortcut_info_, shortcut_icon_,
+ false, icon_url_to_murmur2_hash_map),
base::Bind(&WebApkInstaller::SendCreateWebApkRequest,
weak_ptr_factory_.GetWeakPtr()));
}
@@ -567,3 +522,59 @@ void WebApkInstaller::OnFailure() {
finish_callback_.Run(false, webapk_package_);
delete this;
}
+
+// static
+std::unique_ptr<webapk::WebApk> WebApkInstaller::BuildWebApkProtoInBackground(
+ const ShortcutInfo& shortcut_info,
+ const SkBitmap& shortcut_icon,
+ bool stale_manifest,
+ std::map<std::string, std::string> icon_url_to_murmur2_hash_map) {
+ DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
+
+ std::unique_ptr<webapk::WebApk> webapk(new webapk::WebApk);
+ webapk->set_manifest_url(shortcut_info.manifest_url.spec());
+ webapk->set_requester_application_package(
+ base::android::BuildInfo::GetInstance()->package_name());
+ webapk->set_requester_application_version(version_info::GetVersionNumber());
+ webapk->set_android_abi(getCurrentAbi());
+ webapk->set_stale_manifest(stale_manifest);
+
+ webapk::WebAppManifest* web_app_manifest = webapk->mutable_manifest();
+ web_app_manifest->set_name(base::UTF16ToUTF8(shortcut_info.name));
+ web_app_manifest->set_short_name(
+ base::UTF16ToUTF8(shortcut_info.short_name));
+ web_app_manifest->set_start_url(shortcut_info.url.spec());
+ web_app_manifest->set_orientation(
+ content::WebScreenOrientationLockTypeToString(
+ shortcut_info.orientation));
+ web_app_manifest->set_display_mode(
+ content::WebDisplayModeToString(shortcut_info.display));
+ web_app_manifest->set_background_color(
+ ColorToString(shortcut_info.background_color));
+ web_app_manifest->set_theme_color(ColorToString(shortcut_info.theme_color));
+
+ std::string* scope = web_app_manifest->add_scopes();
+ scope->assign(GetScope(shortcut_info).spec());
+
+ webapk::Image* best_image = web_app_manifest->add_icons();
+ std::string best_icon_url = shortcut_info.best_icon_url.spec();
+ best_image->set_src(best_icon_url);
+ std::map<std::string, std::string>::iterator it =
+ icon_url_to_murmur2_hash_map.find(best_icon_url);
+ if (it != icon_url_to_murmur2_hash_map.end())
+ best_image->set_hash(it->second);
+ std::vector<unsigned char> png_bytes;
+ gfx::PNGCodec::EncodeBGRASkBitmap(shortcut_icon, false, &png_bytes);
+ best_image->set_image_data(&png_bytes.front(), png_bytes.size());
+
+ for (const std::pair<std::string, std::string>& entry :
+ icon_url_to_murmur2_hash_map) {
+ if (entry.first == shortcut_info.best_icon_url.spec())
+ continue;
+ webapk::Image* image = web_app_manifest->add_icons();
+ image->set_src(entry.first);
+ image->set_hash(entry.second);
+ }
+
+ return webapk;
+}

Powered by Google App Engine
This is Rietveld 408576698