Chromium Code Reviews| 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 348c336ccc867c6c2cc8f7b7523249ddcd72029f..98a95cb2d1fcd8f79387b40a3457a70fa1041e2b 100644 |
| --- a/chrome/browser/android/webapk/webapk_installer.cc |
| +++ b/chrome/browser/android/webapk/webapk_installer.cc |
| @@ -110,7 +110,8 @@ std::string getCurrentAbi() { |
| std::unique_ptr<webapk::WebApk> BuildWebApkProtoInBackground( |
|
pkotwicz
2016/12/07 20:41:30
We should test the behavior of this method when Sh
Xi Han
2016/12/09 18:40:11
It is easier to parse the created proto directly.
|
| const ShortcutInfo& shortcut_info, |
| const SkBitmap& shortcut_icon, |
| - const std::string& shortcut_icon_murmur2_hash) { |
| + bool stale_manifest, |
| + std::map<std::string, std::string> icon_url_hash_map) { |
| DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
| std::unique_ptr<webapk::WebApk> webapk(new webapk::WebApk); |
| @@ -119,11 +120,7 @@ std::unique_ptr<webapk::WebApk> BuildWebApkProtoInBackground( |
| 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->set_stale_manifest(stale_manifest); |
| webapk::WebAppManifest* web_app_manifest = webapk->mutable_manifest(); |
| web_app_manifest->set_name(base::UTF16ToUTF8(shortcut_info.name)); |
| @@ -143,17 +140,30 @@ std::unique_ptr<webapk::WebApk> BuildWebApkProtoInBackground( |
| 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::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_hash_map.find(best_icon_url); |
| + if (it != icon_url_hash_map.end()) |
| + best_image->set_hash(it->second); |
| + else |
| + best_image->set_hash(""); |
|
pkotwicz
2016/12/07 20:41:30
Is line 150 necessary? What would go wrong if we j
Xi Han
2016/12/09 18:40:11
Looks like should be fine. Removed.
|
| 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()) |
| + for (const std::pair<std::string, std::string>& entry : icon_url_hash_map) { |
| + if (entry.first == shortcut_info.best_icon_url.spec()) |
| continue; |
| webapk::Image* image = web_app_manifest->add_icons(); |
| - image->set_src(icon_url); |
| + image->set_src(entry.first); |
| + // crbug.com/669060. Sends all the icon hashes when the Web Manifest has |
| + // been removed and can't be fetched by the WebAPK server. The WebAPK server |
| + // will be able to create the same AndroidManifest.xml as before, therefore |
| + // prevents unnecessary request for update if the Web Manifest becomes |
| + // available again. |
| + if (stale_manifest) |
| + image->set_hash(entry.second); |
|
pkotwicz
2016/12/07 20:41:30
Can't we always set the hash and remove line 165?
Xi Han
2016/12/09 18:40:11
Personally I don't prefer to do that, since more d
pkotwicz
2016/12/09 20:09:44
Always sending the hashes makes things clearer. Th
|
| } |
| return webapk; |
| @@ -249,33 +259,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_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_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_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_hash_map), |
| base::Bind(&WebApkInstaller::SendUpdateWebApkRequest, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |
| @@ -365,18 +378,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_hash_map; |
| + for (const std::string& icon_url: shortcut_info_.icon_urls) { |
|
pkotwicz
2016/12/07 20:41:30
Nit: Space before ':'
Xi Han
2016/12/09 18:40:11
Done.
|
| + if (icon_url != shortcut_info_.best_icon_url.spec()) |
| + icon_url_hash_map[icon_url] = ""; |
| + else |
| + icon_url_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_hash_map), |
| base::Bind(&WebApkInstaller::SendCreateWebApkRequest, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |