blob: 89cc8ea3677d0c42ea0f5ee7cead5d337383bb92 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/web_applications/test/test_data_retriever.h"
#include <utility>
#include "base/bind.h"
#include "base/check.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/web_applications/components/web_app_constants.h"
#include "chrome/common/web_application_info.h"
#include "third_party/blink/public/common/manifest/manifest.h"
namespace web_app {
TestDataRetriever::TestDataRetriever() = default;
TestDataRetriever::~TestDataRetriever() {
if (destruction_callback_)
std::move(destruction_callback_).Run();
}
void TestDataRetriever::GetWebApplicationInfo(
content::WebContents* web_contents,
GetWebApplicationInfoCallback callback) {
DCHECK(web_contents);
completion_callback_ =
base::BindOnce(std::move(callback), std::move(web_app_info_));
ScheduleCompletionCallback();
}
void TestDataRetriever::CheckInstallabilityAndRetrieveManifest(
content::WebContents* web_contents,
bool bypass_service_worker_check,
CheckInstallabilityCallback callback) {
base::Optional<blink::Manifest> opt_manifest;
if (manifest_ && !manifest_->IsEmpty())
opt_manifest = *manifest_;
completion_callback_ =
base::BindOnce(std::move(callback), opt_manifest,
/*valid_manifest_for_web_app=*/true, is_installable_);
ScheduleCompletionCallback();
}
void TestDataRetriever::GetIcons(content::WebContents* web_contents,
const std::vector<GURL>& icon_urls,
bool skip_page_favicons,
WebAppIconDownloader::Histogram histogram,
GetIconsCallback callback) {
if (get_icons_delegate_) {
icons_map_ =
get_icons_delegate_.Run(web_contents, icon_urls, skip_page_favicons);
}
completion_callback_ =
base::BindOnce(std::move(callback), std::move(icons_map_));
ScheduleCompletionCallback();
icons_map_.clear();
}
void TestDataRetriever::SetRendererWebApplicationInfo(
std::unique_ptr<WebApplicationInfo> web_app_info) {
web_app_info_ = std::move(web_app_info);
}
void TestDataRetriever::SetEmptyRendererWebApplicationInfo() {
SetRendererWebApplicationInfo(std::make_unique<WebApplicationInfo>());
}
void TestDataRetriever::SetManifest(std::unique_ptr<blink::Manifest> manifest,
bool is_installable) {
manifest_ = std::move(manifest);
is_installable_ = is_installable;
}
void TestDataRetriever::SetIcons(IconsMap icons_map) {
DCHECK(!get_icons_delegate_);
icons_map_ = std::move(icons_map);
}
void TestDataRetriever::SetGetIconsDelegate(
GetIconsDelegate get_icons_delegate) {
DCHECK(icons_map_.empty());
get_icons_delegate_ = std::move(get_icons_delegate);
}
void TestDataRetriever::SetDestructionCallback(base::OnceClosure callback) {
destruction_callback_ = std::move(callback);
}
void TestDataRetriever::BuildDefaultDataToRetrieve(const GURL& url,
const GURL& scope) {
SetEmptyRendererWebApplicationInfo();
auto manifest = std::make_unique<blink::Manifest>();
manifest->start_url = url;
manifest->scope = scope;
manifest->display = DisplayMode::kStandalone;
manifest->short_name =
base::NullableString16(base::ASCIIToUTF16("Manifest Name"), false);
SetManifest(std::move(manifest), /*is_installable=*/true);
SetIcons(IconsMap{});
}
void TestDataRetriever::ScheduleCompletionCallback() {
// If |this| DataRetriever destroyed, the completion callback gets cancelled.
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&TestDataRetriever::CallCompletionCallback,
weak_ptr_factory_.GetWeakPtr()));
}
void TestDataRetriever::CallCompletionCallback() {
std::move(completion_callback_).Run();
}
} // namespace web_app