| 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 b483f915bf0b2a634aeccf407fa07bc1e115ffdc..07c07cc1b186e29f27837258dd0063eba285c9b4 100644
|
| --- a/chrome/browser/android/webapk/webapk_installer.cc
|
| +++ b/chrome/browser/android/webapk/webapk_installer.cc
|
| @@ -36,7 +36,10 @@ namespace {
|
|
|
| // The default WebAPK server URL.
|
| const char kDefaultWebApkServerUrl[] =
|
| - "https://webapk.googleapis.com/v1alpha/webApks?alt=proto";
|
| + "https://webapk.googleapis.com/v1alpha/webApks/";
|
| +
|
| +// The response format type expected from the WebAPK server.
|
| +const char kDefaultWebApkServerUrlResponseType[] = "?alt=proto";
|
|
|
| // The MIME type of the POST data sent to the server.
|
| const char kProtoMimeType[] = "application/x-protobuf";
|
| @@ -118,6 +121,13 @@ scoped_refptr<base::TaskRunner> GetBackgroundTaskRunner() {
|
| base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
|
| }
|
|
|
| +GURL GetServerUrlForUpdate(const GURL& server_url,
|
| + const std::string& webapk_package) {
|
| + // crbug.com/636552. Simplify the server URL.
|
| + return GURL(server_url.spec() + webapk_package + "/" +
|
| + kDefaultWebApkServerUrlResponseType);
|
| +}
|
| +
|
| } // anonymous namespace
|
|
|
| WebApkInstaller::WebApkInstaller(const ShortcutInfo& shortcut_info,
|
| @@ -126,6 +136,7 @@ WebApkInstaller::WebApkInstaller(const ShortcutInfo& shortcut_info,
|
| shortcut_icon_(shortcut_icon),
|
| webapk_download_url_timeout_ms_(kWebApkDownloadUrlTimeoutMs),
|
| download_timeout_ms_(kDownloadTimeoutMs),
|
| + task_type_(UNDEFINED),
|
| weak_ptr_factory_(this) {
|
| base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
| server_url_ =
|
| @@ -148,6 +159,7 @@ void WebApkInstaller::InstallAsyncWithURLRequestContextGetter(
|
| const FinishCallback& finish_callback) {
|
| request_context_getter_ = request_context_getter;
|
| finish_callback_ = finish_callback;
|
| + task_type_ = INSTALL;
|
|
|
| if (!shortcut_info_.icon_url.is_valid()) {
|
| OnFailure();
|
| @@ -170,7 +182,35 @@ void WebApkInstaller::SetTimeoutMs(int timeout_ms) {
|
| download_timeout_ms_ = timeout_ms;
|
| }
|
|
|
| -bool WebApkInstaller::StartDownloadedWebApkInstall(
|
| +void WebApkInstaller::UpdateAsync(content::BrowserContext* browser_context,
|
| + const FinishCallback& finish_callback,
|
| + const std::string& webapk_package,
|
| + int webapk_version) {
|
| + UpdateAsyncWithURLRequestContextGetter(
|
| + Profile::FromBrowserContext(browser_context)->GetRequestContext(),
|
| + finish_callback, webapk_package, webapk_version);
|
| +}
|
| +
|
| +void WebApkInstaller::UpdateAsyncWithURLRequestContextGetter(
|
| + net::URLRequestContextGetter* request_context_getter,
|
| + const FinishCallback& finish_callback,
|
| + const std::string& webapk_package,
|
| + int webapk_version) {
|
| + request_context_getter_ = request_context_getter;
|
| + finish_callback_ = finish_callback;
|
| + webapk_package_ = webapk_package;
|
| + webapk_version_ = webapk_version;
|
| + task_type_ = UPDATE;
|
| +
|
| + if (!shortcut_info_.icon_url.is_valid()) {
|
| + OnFailure();
|
| + return;
|
| + }
|
| +
|
| + DownloadAppIconAndComputeMurmur2Hash();
|
| +}
|
| +
|
| +bool WebApkInstaller::StartInstallingDownloadedWebApk(
|
| JNIEnv* env,
|
| const base::android::ScopedJavaLocalRef<jstring>& java_file_path,
|
| const base::android::ScopedJavaLocalRef<jstring>& java_package_name) {
|
| @@ -178,6 +218,14 @@ bool WebApkInstaller::StartDownloadedWebApkInstall(
|
| java_package_name);
|
| }
|
|
|
| +bool WebApkInstaller::StartUpdateUsingDownloadedWebApk(
|
| + JNIEnv* env,
|
| + const base::android::ScopedJavaLocalRef<jstring>& java_file_path,
|
| + const base::android::ScopedJavaLocalRef<jstring>& java_package_name) {
|
| + return Java_WebApkInstaller_updateAsyncFromNative(env, java_file_path,
|
| + java_package_name);
|
| +}
|
| +
|
| void WebApkInstaller::OnURLFetchComplete(const net::URLFetcher* source) {
|
| timer_.Stop();
|
|
|
| @@ -230,26 +278,50 @@ void WebApkInstaller::OnGotIconMurmur2Hash(
|
| return;
|
| }
|
|
|
| - base::PostTaskAndReplyWithResult(
|
| - GetBackgroundTaskRunner().get(), FROM_HERE,
|
| - base::Bind(&BuildWebApkProtoInBackground, shortcut_info_, shortcut_icon_,
|
| - shortcut_icon_murmur2_hash_),
|
| - base::Bind(&WebApkInstaller::SendCreateWebApkRequest,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| + if (task_type_ == INSTALL) {
|
| + base::PostTaskAndReplyWithResult(
|
| + GetBackgroundTaskRunner().get(), FROM_HERE,
|
| + base::Bind(&BuildWebApkProtoInBackground, shortcut_info_,
|
| + shortcut_icon_, shortcut_icon_murmur2_hash_),
|
| + base::Bind(&WebApkInstaller::SendCreateWebApkRequest,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| + } else if (task_type_ == UPDATE) {
|
| + base::PostTaskAndReplyWithResult(
|
| + GetBackgroundTaskRunner().get(), FROM_HERE,
|
| + base::Bind(&BuildWebApkProtoInBackground, shortcut_info_,
|
| + shortcut_icon_, shortcut_icon_murmur2_hash_),
|
| + base::Bind(&WebApkInstaller::SendUpdateWebApkRequest,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| + }
|
| }
|
|
|
| void WebApkInstaller::SendCreateWebApkRequest(
|
| - std::unique_ptr<webapk::WebApk> webapk_proto) {
|
| + std::unique_ptr<webapk::WebApk> webapk) {
|
| + GURL server_url(server_url_.spec() + kDefaultWebApkServerUrlResponseType);
|
| + SendRequest(std::move(webapk), net::URLFetcher::POST, server_url);
|
| +}
|
| +
|
| +void WebApkInstaller::SendUpdateWebApkRequest(
|
| + std::unique_ptr<webapk::WebApk> webapk) {
|
| + webapk->set_package_name(webapk_package_);
|
| + webapk->set_version(std::to_string(webapk_version_));
|
| +
|
| + SendRequest(std::move(webapk), net::URLFetcher::PUT,
|
| + GetServerUrlForUpdate(server_url_, webapk_package_));
|
| +}
|
| +
|
| +void WebApkInstaller::SendRequest(std::unique_ptr<webapk::WebApk> request_proto,
|
| + net::URLFetcher::RequestType request_type,
|
| + const GURL& server_url) {
|
| timer_.Start(
|
| FROM_HERE,
|
| base::TimeDelta::FromMilliseconds(webapk_download_url_timeout_ms_),
|
| base::Bind(&WebApkInstaller::OnTimeout, weak_ptr_factory_.GetWeakPtr()));
|
|
|
| - url_fetcher_ =
|
| - net::URLFetcher::Create(server_url_, net::URLFetcher::POST, this);
|
| + url_fetcher_ = net::URLFetcher::Create(server_url, request_type, this);
|
| url_fetcher_->SetRequestContext(request_context_getter_);
|
| std::string serialized_request;
|
| - webapk_proto->SerializeToString(&serialized_request);
|
| + request_proto->SerializeToString(&serialized_request);
|
| url_fetcher_->SetUploadData(kProtoMimeType, serialized_request);
|
| url_fetcher_->Start();
|
| }
|
| @@ -308,8 +380,14 @@ void WebApkInstaller::OnWebApkMadeWorldReadable(
|
| base::android::ConvertUTF8ToJavaString(env, file_path.value());
|
| base::android::ScopedJavaLocalRef<jstring> java_package_name =
|
| base::android::ConvertUTF8ToJavaString(env, package_name);
|
| - bool success =
|
| - StartDownloadedWebApkInstall(env, java_file_path, java_package_name);
|
| + bool success = false;
|
| + if (task_type_ == INSTALL) {
|
| + success = StartInstallingDownloadedWebApk(env, java_file_path,
|
| + java_package_name);
|
| + } else if (task_type_ == UPDATE) {
|
| + success = StartUpdateUsingDownloadedWebApk(env, java_file_path,
|
| + java_package_name);
|
| + }
|
| if (success)
|
| OnSuccess();
|
| else
|
|
|