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 ec7c01fada02f15e0136c657d661e206bb7ea090..5074448477c840411e6ba5c97d9e57eaafcf94d3 100644 |
| --- a/chrome/browser/android/webapk/webapk_installer.cc |
| +++ b/chrome/browser/android/webapk/webapk_installer.cc |
| @@ -108,7 +108,7 @@ void SetImageData(webapk::Image* image, const SkBitmap& icon) { |
| // Populates webapk::WebApk and returns it. |
| // Must be called on a worker thread because it encodes an SkBitmap. |
| -std::unique_ptr<webapk::WebApk> BuildProtoInBackground( |
| +std::unique_ptr<std::vector<uint8_t>> BuildProtoInBackground( |
| const ShortcutInfo& shortcut_info, |
| const SkBitmap& primary_icon, |
| const SkBitmap& badge_icon, |
| @@ -171,7 +171,12 @@ std::unique_ptr<webapk::WebApk> BuildProtoInBackground( |
| image->set_hash(entry.second); |
| } |
| - return webapk; |
| + size_t serialized_size = webapk->ByteSize(); |
| + std::unique_ptr<std::vector<uint8_t>> serialized_proto( |
| + new std::vector<uint8_t>); |
|
dominickn
2017/06/14 00:14:23
Use base::MakeUnique from base/memory/ptr_utils.h
|
| + serialized_proto->resize(serialized_size); |
| + webapk->SerializeToArray(serialized_proto->data(), serialized_size); |
| + return std::move(serialized_proto); |
| } |
| // Returns task runner for running background tasks. |
| @@ -196,47 +201,44 @@ void WebApkInstaller::InstallAsync(content::BrowserContext* context, |
| const SkBitmap& badge_icon, |
| const FinishCallback& finish_callback) { |
| // The installer will delete itself when it is done. |
| - WebApkInstaller* installer = |
| - new WebApkInstaller(context, shortcut_info, primary_icon, badge_icon); |
| - installer->InstallAsync(finish_callback); |
| + WebApkInstaller* installer = new WebApkInstaller(context); |
| + installer->InstallAsync(shortcut_info, primary_icon, badge_icon, |
| + finish_callback); |
| } |
| // static |
| void WebApkInstaller::UpdateAsync( |
| content::BrowserContext* context, |
| - const ShortcutInfo& shortcut_info, |
| - const SkBitmap& primary_icon, |
| const std::string& webapk_package, |
| - int webapk_version, |
| - const std::map<std::string, std::string>& icon_url_to_murmur2_hash, |
| - bool is_manifest_stale, |
| + const GURL& start_url, |
| + const base::string16& short_name, |
| + std::unique_ptr<std::vector<uint8_t>> serialized_proto, |
| const FinishCallback& finish_callback) { |
| // The installer will delete itself when it is done. |
| - WebApkInstaller* installer = new WebApkInstaller( |
| - context, shortcut_info, primary_icon, SkBitmap()); |
| - installer->UpdateAsync(webapk_package, webapk_version, |
| - icon_url_to_murmur2_hash, is_manifest_stale, |
| - finish_callback); |
| + WebApkInstaller* installer = new WebApkInstaller(context); |
| + installer->UpdateAsync(webapk_package, start_url, short_name, |
| + std::move(serialized_proto), finish_callback); |
| } |
| // staic |
|
dominickn
2017/06/14 00:14:23
Minor nit: "static"
|
| -void WebApkInstaller::InstallAsyncForTesting( |
| - WebApkInstaller* installer, |
| - const FinishCallback& finish_callback) { |
| - installer->InstallAsync(finish_callback); |
| +void WebApkInstaller::InstallAsyncForTesting(WebApkInstaller* installer, |
| + const ShortcutInfo& shortcut_info, |
| + const SkBitmap& primary_icon, |
| + const SkBitmap& badge_icon, |
| + const FinishCallback& callback) { |
| + installer->InstallAsync(shortcut_info, primary_icon, badge_icon, callback); |
| } |
| // static |
| void WebApkInstaller::UpdateAsyncForTesting( |
| WebApkInstaller* installer, |
| const std::string& webapk_package, |
| - int webapk_version, |
| - const std::map<std::string, std::string>& icon_url_to_murmur2_hash, |
| - bool is_manifest_stale, |
| + const GURL& start_url, |
| + const base::string16& short_name, |
| + std::unique_ptr<std::vector<uint8_t>> serialized_proto, |
| const FinishCallback& finish_callback) { |
| - installer->UpdateAsync(webapk_package, webapk_version, |
| - icon_url_to_murmur2_hash, is_manifest_stale, |
| - finish_callback); |
| + installer->UpdateAsync(webapk_package, start_url, short_name, |
| + std::move(serialized_proto), finish_callback); |
| } |
| void WebApkInstaller::SetTimeoutMs(int timeout_ms) { |
| @@ -259,7 +261,8 @@ void WebApkInstaller::BuildProto( |
| const std::string& version, |
| const std::map<std::string, std::string>& icon_url_to_murmur2_hash, |
| bool is_manifest_stale, |
| - const base::Callback<void(std::unique_ptr<webapk::WebApk>)>& callback) { |
| + const base::Callback<void(std::unique_ptr<std::vector<uint8_t>>)>& |
| + callback) { |
| base::PostTaskAndReplyWithResult( |
| GetBackgroundTaskRunner().get(), FROM_HERE, |
| base::Bind(&BuildProtoInBackground, shortcut_info, primary_icon, |
| @@ -282,17 +285,17 @@ void WebApkInstaller::InstallOrUpdateWebApk(const std::string& package_name, |
| base::android::ScopedJavaLocalRef<jstring> java_webapk_package = |
| base::android::ConvertUTF8ToJavaString(env, webapk_package_); |
| base::android::ScopedJavaLocalRef<jstring> java_title = |
| - base::android::ConvertUTF16ToJavaString(env, shortcut_info_.user_title); |
| + base::android::ConvertUTF16ToJavaString(env, short_name_); |
| base::android::ScopedJavaLocalRef<jstring> java_token = |
| base::android::ConvertUTF8ToJavaString(env, token); |
| base::android::ScopedJavaLocalRef<jstring> java_url = |
| - base::android::ConvertUTF8ToJavaString(env, shortcut_info_.url.spec()); |
| + base::android::ConvertUTF8ToJavaString(env, start_url_.spec()); |
| if (task_type_ == WebApkInstaller::INSTALL) { |
| webapk::TrackRequestTokenDuration(install_duration_timer_->Elapsed()); |
| - Java_WebApkInstaller_installWebApkAsync(env, java_ref_, java_webapk_package, |
| - version, java_title, java_token, |
| - java_url, shortcut_info_.source); |
| + Java_WebApkInstaller_installWebApkAsync( |
| + env, java_ref_, java_webapk_package, version, java_title, java_token, |
| + java_url, install_shortcut_info_->source); |
| } else { |
| Java_WebApkInstaller_updateAsync(env, java_ref_, java_webapk_package, |
| version, java_title, java_token, java_url); |
| @@ -316,15 +319,9 @@ void WebApkInstaller::OnResult(WebApkInstallResult result) { |
| delete this; |
| } |
| -WebApkInstaller::WebApkInstaller(content::BrowserContext* browser_context, |
| - const ShortcutInfo& shortcut_info, |
| - const SkBitmap& primary_icon, |
| - const SkBitmap& badge_icon) |
| +WebApkInstaller::WebApkInstaller(content::BrowserContext* browser_context) |
| : request_context_getter_( |
| Profile::FromBrowserContext(browser_context)->GetRequestContext()), |
| - shortcut_info_(shortcut_info), |
| - primary_icon_(primary_icon), |
| - badge_icon_(badge_icon), |
| server_url_(GetServerUrl()), |
| webapk_server_timeout_ms_(kWebApkDownloadUrlTimeoutMs), |
| relax_updates_(false), |
| @@ -339,9 +336,17 @@ void WebApkInstaller::CreateJavaRef() { |
| Java_WebApkInstaller_create(env, reinterpret_cast<intptr_t>(this))); |
| } |
| -void WebApkInstaller::InstallAsync(const FinishCallback& finish_callback) { |
| +void WebApkInstaller::InstallAsync(const ShortcutInfo& shortcut_info, |
| + const SkBitmap& primary_icon, |
| + const SkBitmap& badge_icon, |
| + const FinishCallback& finish_callback) { |
| install_duration_timer_.reset(new base::ElapsedTimer()); |
| + install_shortcut_info_.reset(new ShortcutInfo(shortcut_info)); |
| + install_primary_icon_ = primary_icon; |
| + install_badge_icon_ = badge_icon; |
| + start_url_ = shortcut_info.url; |
| + short_name_ = shortcut_info.short_name; |
| finish_callback_ = finish_callback; |
| task_type_ = INSTALL; |
| @@ -354,26 +359,29 @@ void WebApkInstaller::InstallAsync(const FinishCallback& finish_callback) { |
| // We redownload the icon in order to take the Murmur2 hash. The redownload |
| // should be fast because the icon should be in the HTTP cache. |
| WebApkIconHasher::DownloadAndComputeMurmur2Hash( |
| - request_context_getter_, shortcut_info_.best_primary_icon_url, |
| + request_context_getter_, install_shortcut_info_->best_primary_icon_url, |
| base::Bind(&WebApkInstaller::OnGotPrimaryIconMurmur2Hash, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |
| void WebApkInstaller::UpdateAsync( |
| const std::string& webapk_package, |
| - int webapk_version, |
| - const std::map<std::string, std::string>& icon_url_to_murmur2_hash, |
| - bool is_manifest_stale, |
| + const GURL& start_url, |
| + const base::string16& short_name, |
| + std::unique_ptr<std::vector<uint8_t>> serialized_proto, |
| const FinishCallback& finish_callback) { |
| webapk_package_ = webapk_package; |
| + start_url_ = start_url; |
| + short_name_ = short_name; |
| finish_callback_ = finish_callback; |
| task_type_ = UPDATE; |
| - BuildProto(shortcut_info_, primary_icon_, badge_icon_, webapk_package_, |
| - std::to_string(webapk_version), icon_url_to_murmur2_hash, |
| - is_manifest_stale, |
| - base::Bind(&WebApkInstaller::SendRequest, |
| - weak_ptr_factory_.GetWeakPtr())); |
| + if (!serialized_proto || serialized_proto->empty()) { |
| + OnResult(WebApkInstallResult::FAILURE); |
| + return; |
| + } |
| + |
| + SendRequest(std::move(serialized_proto)); |
| } |
| void WebApkInstaller::OnURLFetchComplete(const net::URLFetcher* source) { |
| @@ -425,11 +433,11 @@ void WebApkInstaller::OnGotPrimaryIconMurmur2Hash( |
| return; |
| } |
| - if (!shortcut_info_.best_badge_icon_url.is_empty() && |
| - shortcut_info_.best_badge_icon_url != |
| - shortcut_info_.best_primary_icon_url) { |
| + if (!install_shortcut_info_->best_badge_icon_url.is_empty() && |
| + install_shortcut_info_->best_badge_icon_url != |
| + install_shortcut_info_->best_primary_icon_url) { |
| WebApkIconHasher::DownloadAndComputeMurmur2Hash( |
| - request_context_getter_, shortcut_info_.best_badge_icon_url, |
| + request_context_getter_, install_shortcut_info_->best_badge_icon_url, |
| base::Bind(&WebApkInstaller::OnGotBadgeIconMurmur2Hash, |
| weak_ptr_factory_.GetWeakPtr(), true, primary_icon_hash)); |
| } else { |
| @@ -449,35 +457,36 @@ void WebApkInstaller::OnGotBadgeIconMurmur2Hash( |
| // Maps icon URLs to Murmur2 hashes. |
| std::map<std::string, std::string> icon_url_to_murmur2_hash; |
| - for (const std::string& icon_url : shortcut_info_.icon_urls) { |
| - if (icon_url == shortcut_info_.best_primary_icon_url.spec()) |
| + for (const std::string& icon_url : install_shortcut_info_->icon_urls) { |
| + if (icon_url == install_shortcut_info_->best_primary_icon_url.spec()) |
| icon_url_to_murmur2_hash[icon_url] = primary_icon_hash; |
| - else if (icon_url == shortcut_info_.best_badge_icon_url.spec()) |
| + else if (icon_url == install_shortcut_info_->best_badge_icon_url.spec()) |
| icon_url_to_murmur2_hash[icon_url] = badge_icon_hash; |
| else |
| icon_url_to_murmur2_hash[icon_url] = ""; |
| } |
| - BuildProto(shortcut_info_, primary_icon_, badge_icon_, "" /* package_name */, |
| - "" /* version */, icon_url_to_murmur2_hash, |
| - false /* is_manifest_stale */, |
| + BuildProto(*install_shortcut_info_, install_primary_icon_, |
| + install_badge_icon_, "" /* package_name */, "" /* version */, |
| + icon_url_to_murmur2_hash, false /* is_manifest_stale */, |
| base::Bind(&WebApkInstaller::SendRequest, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |
| void WebApkInstaller::SendRequest( |
| - std::unique_ptr<webapk::WebApk> request_proto) { |
| + std::unique_ptr<std::vector<uint8_t>> serialized_proto) { |
| timer_.Start( |
| FROM_HERE, base::TimeDelta::FromMilliseconds(webapk_server_timeout_ms_), |
| base::Bind(&WebApkInstaller::OnResult, weak_ptr_factory_.GetWeakPtr(), |
| WebApkInstallResult::FAILURE)); |
| + std::string serialized_proto_string(serialized_proto->begin(), |
| + serialized_proto->end()); |
| + |
| url_fetcher_ = |
| net::URLFetcher::Create(server_url_, net::URLFetcher::POST, this); |
| url_fetcher_->SetRequestContext(request_context_getter_); |
| - std::string serialized_request; |
| - request_proto->SerializeToString(&serialized_request); |
| - url_fetcher_->SetUploadData(kProtoMimeType, serialized_request); |
| + url_fetcher_->SetUploadData(kProtoMimeType, serialized_proto_string); |
| url_fetcher_->SetLoadFlags( |
| net::LOAD_DISABLE_CACHE | net::LOAD_DO_NOT_SEND_COOKIES | |
| net::LOAD_DO_NOT_SAVE_COOKIES | net::LOAD_DO_NOT_SEND_AUTH_DATA); |