| 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 31966bd9cc7c8962be0be72ec78456a571b4905e..663093dd268ea2aad1fd27e9021fe38aae605a07 100644
|
| --- a/chrome/browser/android/webapk/webapk_installer.cc
|
| +++ b/chrome/browser/android/webapk/webapk_installer.cc
|
| @@ -4,12 +4,15 @@
|
|
|
| #include "chrome/browser/android/webapk/webapk_installer.h"
|
|
|
| +#include <utility>
|
| +
|
| #include "base/android/build_info.h"
|
| #include "base/android/jni_android.h"
|
| #include "base/android/jni_string.h"
|
| #include "base/android/path_utils.h"
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_util.h"
|
| @@ -108,7 +111,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 +174,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 =
|
| + base::MakeUnique<std::vector<uint8_t>>();
|
| + serialized_proto->resize(serialized_size);
|
| + webapk->SerializeToArray(serialized_proto->data(), serialized_size);
|
| + return serialized_proto;
|
| }
|
|
|
| // Returns task runner for running background tasks.
|
| @@ -196,48 +204,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 SkBitmap& badge_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, badge_icon);
|
| - 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
|
| -void WebApkInstaller::InstallAsyncForTesting(
|
| - WebApkInstaller* installer,
|
| - const FinishCallback& finish_callback) {
|
| - installer->InstallAsync(finish_callback);
|
| +// static
|
| +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) {
|
| @@ -260,7 +264,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,
|
| @@ -283,17 +288,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);
|
| @@ -317,15 +322,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),
|
| @@ -340,9 +339,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;
|
|
|
| @@ -355,26 +362,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) {
|
| @@ -426,11 +436,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 {
|
| @@ -450,35 +460,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);
|
|
|