blob: 4fe7fe64505410d37aa804e339521bad855c0450 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// 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/isolated_web_apps/test/iwa_test_server_configurator.h"
#include <string>
#include "base/strings/utf_string_conversions.h"
#include "services/network/test/test_url_loader_factory.h"
#include "services/network/test/test_utils.h"
namespace {
// TODO(peletskyi): Read manifest from the signed web bundle file.
blink::mojom::ManifestPtr CreateDefaultManifest(const GURL& application_url) {
auto manifest = blink::mojom::Manifest::New();
manifest->id = application_url.DeprecatedGetOriginAsURL();
manifest->scope = application_url.Resolve("/");
manifest->start_url = application_url.Resolve("/testing-start-url.html");
manifest->display = web_app::DisplayMode::kStandalone;
manifest->short_name = u"App name";
manifest->version = u"1.0.0";
return manifest;
}
void ConfigureFakeWebContentsManager(
const web_package::SignedWebBundleId& id,
web_app::FakeWebContentsManager& fake_web_contents_manager) {
const GURL origin_url =
web_app::IsolatedWebAppUrlInfo::CreateFromSignedWebBundleId(id)
.origin()
.GetURL();
const GURL install_url =
origin_url.Resolve("/.well-known/_generated_install_page.html");
auto& page_state =
fake_web_contents_manager.GetOrCreatePageState(install_url);
page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
page_state.manifest_url = origin_url.Resolve("manifest.webmanifest");
page_state.valid_manifest_for_web_app = true;
page_state.manifest_before_default_processing =
CreateDefaultManifest(origin_url);
}
} // namespace
namespace web_app {
IwaTestServerConfigurator::IwaTestServerConfigurator() = default;
IwaTestServerConfigurator::~IwaTestServerConfigurator() = default;
void IwaTestServerConfigurator::AddUpdateManifest(std::string relative_url,
std::string manifest_value) {
served_update_manifests_.push_back(
{.relative_url_ = std::move(relative_url),
.manifest_value_ = std::move(manifest_value)});
}
void IwaTestServerConfigurator::AddSignedWebBundle(
std::string relative_url,
web_app::TestSignedWebBundle web_bundle) {
served_signed_web_bundles_.push_back(
{.relative_url_ = std::move(relative_url),
.web_bundle_ = std::move(web_bundle)});
}
void IwaTestServerConfigurator::ConfigureURLLoader(
const GURL& base_url,
network::TestURLLoaderFactory& test_factory,
FakeWebContentsManager& fake_web_contents_manager) {
for (const auto& served_update_manifest : served_update_manifests_) {
const GURL url = base_url.Resolve(served_update_manifest.relative_url_);
network::mojom::URLResponseHeadPtr head =
network::CreateURLResponseHead(net::HttpStatusCode::HTTP_OK);
head->mime_type = "application/json";
const network::URLLoaderCompletionStatus status;
test_factory.AddResponse(url, std::move(head),
served_update_manifest.manifest_value_, status);
}
for (const auto& served_web_bundle : served_signed_web_bundles_) {
const GURL url = base_url.Resolve(served_web_bundle.relative_url_);
const std::string web_bundle_str(served_web_bundle.web_bundle_.data.begin(),
served_web_bundle.web_bundle_.data.end());
test_factory.AddResponse(url.spec(), web_bundle_str);
ConfigureFakeWebContentsManager(served_web_bundle.web_bundle_.id,
fake_web_contents_manager);
}
}
} // namespace web_app