blob: c872da789eb9f816e81a4d2ba0e51de74197541d [file] [log] [blame]
// Copyright 2019 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/test/web_app_test_observers.h"
#include <sstream>
#include "base/run_loop.h"
#include "base/task/sequenced_task_runner.h"
#include "base/test/bind.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/web_applications/web_app.h"
#include "chrome/browser/web_applications/web_app_provider.h"
namespace web_app {
namespace {
#if DCHECK_IS_ON()
bool IsAnyIdEmpty(const std::set<webapps::AppId>& app_ids) {
for (const webapps::AppId& id : app_ids) {
if (id.empty())
return true;
}
return false;
}
#endif
template <typename Container>
std::string ContainerToString(const Container& container) {
std::ostringstream ss;
ss << "[";
bool first_item = true;
for (const auto& item : container) {
if (!first_item) {
ss << ", ";
}
ss << base::ToString(item);
first_item = false;
}
ss << "]";
return ss.str();
}
} // namespace
WebAppInstallManagerObserverAdapter::WebAppInstallManagerObserverAdapter(
WebAppInstallManager* install_manager) {
observation_.Observe(install_manager);
}
WebAppInstallManagerObserverAdapter::WebAppInstallManagerObserverAdapter(
Profile* profile)
: WebAppInstallManagerObserverAdapter(
&WebAppProvider::GetForWebApps(profile)->install_manager()) {}
WebAppInstallManagerObserverAdapter::~WebAppInstallManagerObserverAdapter() =
default;
void WebAppInstallManagerObserverAdapter::SetWebAppInstalledDelegate(
WebAppInstalledDelegate delegate) {
app_installed_delegate_ = std::move(delegate);
}
void WebAppInstallManagerObserverAdapter::SetWebAppInstalledWithOsHooksDelegate(
WebAppInstalledWithOsHooksDelegate delegate) {
app_installed_with_os_hooks_delegate_ = std::move(delegate);
}
void WebAppInstallManagerObserverAdapter::SetWebAppWillBeUninstalledDelegate(
WebAppWillBeUninstalledDelegate delegate) {
app_will_be_uninstalled_delegate_ = std::move(delegate);
}
void WebAppInstallManagerObserverAdapter::SetWebAppUninstalledDelegate(
WebAppUninstalledDelegate delegate) {
app_uninstalled_delegate_ = std::move(delegate);
}
void WebAppInstallManagerObserverAdapter::SetWebAppManifestUpdateDelegate(
WebAppManifestUpdateDelegate delegate) {
app_manifest_updated_delegate_ = std::move(delegate);
}
void WebAppInstallManagerObserverAdapter::SetWebAppSourceRemovedDelegate(
WebAppSourceRemovedDelegate delegate) {
app_source_removed_delegate_ = std::move(delegate);
}
void WebAppInstallManagerObserverAdapter::OnWebAppInstalled(
const webapps::AppId& app_id) {
if (app_installed_delegate_)
app_installed_delegate_.Run(app_id);
}
void WebAppInstallManagerObserverAdapter::OnWebAppInstalledWithOsHooks(
const webapps::AppId& app_id) {
if (app_installed_with_os_hooks_delegate_)
app_installed_with_os_hooks_delegate_.Run(app_id);
}
void WebAppInstallManagerObserverAdapter::OnWebAppManifestUpdated(
const webapps::AppId& app_id) {
if (app_manifest_updated_delegate_)
app_manifest_updated_delegate_.Run(app_id);
}
void WebAppInstallManagerObserverAdapter::OnWebAppWillBeUninstalled(
const webapps::AppId& app_id) {
if (app_will_be_uninstalled_delegate_)
app_will_be_uninstalled_delegate_.Run(app_id);
}
void WebAppInstallManagerObserverAdapter::OnWebAppUninstalled(
const webapps::AppId& app_id,
webapps::WebappUninstallSource uninstall_source) {
if (app_uninstalled_delegate_)
app_uninstalled_delegate_.Run(app_id);
}
void WebAppInstallManagerObserverAdapter::OnWebAppInstallManagerDestroyed() {
observation_.Reset();
}
void WebAppInstallManagerObserverAdapter::OnWebAppSourceRemoved(
const webapps::AppId& app_id) {
if (app_source_removed_delegate_) {
app_source_removed_delegate_.Run(app_id);
}
}
void WebAppInstallManagerObserverAdapter::SignalRunLoopAndStoreAppId(
const webapps::AppId& app_id) {
if (!is_listening_)
return;
optional_app_ids_.erase(app_id);
if (!optional_app_ids_.empty())
return;
last_app_id_ = app_id;
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, wait_loop_.QuitClosure());
is_listening_ = false;
}
WebAppTestRegistryObserverAdapter::WebAppTestRegistryObserverAdapter(
WebAppRegistrar* registrar) {
observation_.Observe(registrar);
}
WebAppTestRegistryObserverAdapter::WebAppTestRegistryObserverAdapter(
Profile* profile)
: WebAppTestRegistryObserverAdapter(
&WebAppProvider::GetForTest(profile)->registrar_unsafe()) {}
WebAppTestRegistryObserverAdapter::~WebAppTestRegistryObserverAdapter() =
default;
void WebAppTestRegistryObserverAdapter::SetWebAppWillBeUpdatedFromSyncDelegate(
WebAppWillBeUpdatedFromSyncDelegate delegate) {
app_will_be_updated_from_sync_delegate_ = std::move(delegate);
}
void WebAppTestRegistryObserverAdapter::SetWebAppLastBadgingTimeChangedDelegate(
WebAppLastBadgingTimeChangedDelegate delegate) {
app_last_badging_time_changed_delegate_ = std::move(delegate);
}
void WebAppTestRegistryObserverAdapter::
SetWebAppProtocolSettingsChangedDelegate(
WebAppProtocolSettingsChangedDelegate delegate) {
app_protocol_settings_changed_delegate_ = std::move(delegate);
}
void WebAppTestRegistryObserverAdapter::OnWebAppsWillBeUpdatedFromSync(
const std::vector<const WebApp*>& new_apps_state) {
if (app_will_be_updated_from_sync_delegate_)
app_will_be_updated_from_sync_delegate_.Run(new_apps_state);
}
void WebAppTestRegistryObserverAdapter::OnWebAppLastBadgingTimeChanged(
const webapps::AppId& app_id,
const base::Time& time) {
if (app_last_badging_time_changed_delegate_)
app_last_badging_time_changed_delegate_.Run(app_id, time);
}
void WebAppTestRegistryObserverAdapter::OnWebAppProtocolSettingsChanged(
const webapps::AppId& app_id) {
if (app_protocol_settings_changed_delegate_)
app_protocol_settings_changed_delegate_.Run();
}
void WebAppTestRegistryObserverAdapter::OnAppRegistrarDestroyed() {
observation_.Reset();
}
void WebAppTestRegistryObserverAdapter::SignalRunLoopAndStoreAppId(
const webapps::AppId& app_id) {
if (!is_listening_)
return;
optional_app_ids_.erase(app_id);
if (!optional_app_ids_.empty())
return;
last_app_id_ = app_id;
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, wait_loop_.QuitClosure());
is_listening_ = false;
}
WebAppTestInstallObserver::WebAppTestInstallObserver(Profile* profile)
: WebAppInstallManagerObserverAdapter(profile) {}
WebAppTestInstallObserver::~WebAppTestInstallObserver() = default;
void WebAppTestInstallObserver::BeginListening(
const std::set<webapps::AppId>& optional_app_ids) {
optional_app_ids_ = optional_app_ids;
#if DCHECK_IS_ON()
DCHECK(!IsAnyIdEmpty(optional_app_ids_)) << "Cannot listen for empty ids.";
#endif
is_listening_ = true;
app_installed_delegate_ = base::BindRepeating(
&WebAppTestInstallObserver::SignalRunLoopAndStoreAppId,
weak_factory_.GetWeakPtr());
}
webapps::AppId WebAppTestInstallObserver::Wait() {
wait_loop_.Run();
if (last_app_id_.empty()) {
LOG(ERROR) << "Could not find any of "
<< ContainerToString(optional_app_ids_);
}
return last_app_id_;
}
webapps::AppId WebAppTestInstallObserver::BeginListeningAndWait(
const std::set<webapps::AppId>& optional_app_ids) {
BeginListening(optional_app_ids);
webapps::AppId id = Wait();
return id;
}
WebAppTestInstallWithOsHooksObserver::WebAppTestInstallWithOsHooksObserver(
Profile* profile)
: WebAppInstallManagerObserverAdapter(profile) {}
WebAppTestInstallWithOsHooksObserver::~WebAppTestInstallWithOsHooksObserver() =
default;
void WebAppTestInstallWithOsHooksObserver::BeginListening(
const std::set<webapps::AppId>& optional_app_ids) {
optional_app_ids_ = optional_app_ids;
#if DCHECK_IS_ON()
DCHECK(!IsAnyIdEmpty(optional_app_ids_)) << "Cannot listen for empty ids.";
#endif
is_listening_ = true;
app_installed_with_os_hooks_delegate_ = base::BindRepeating(
&WebAppTestInstallWithOsHooksObserver::SignalRunLoopAndStoreAppId,
weak_factory_.GetWeakPtr());
}
webapps::AppId WebAppTestInstallWithOsHooksObserver::Wait() {
wait_loop_.Run();
if (last_app_id_.empty()) {
LOG(ERROR) << "Could not find any of "
<< ContainerToString(optional_app_ids_);
}
return last_app_id_;
}
webapps::AppId WebAppTestInstallWithOsHooksObserver::BeginListeningAndWait(
const std::set<webapps::AppId>& optional_app_ids) {
BeginListening(optional_app_ids);
webapps::AppId id = Wait();
return id;
}
WebAppTestManifestUpdatedObserver::WebAppTestManifestUpdatedObserver(
WebAppInstallManager* install_manager)
: WebAppInstallManagerObserverAdapter(install_manager) {}
WebAppTestManifestUpdatedObserver::~WebAppTestManifestUpdatedObserver() =
default;
void WebAppTestManifestUpdatedObserver::BeginListening(
const std::set<webapps::AppId>& optional_app_ids) {
optional_app_ids_ = optional_app_ids;
#if DCHECK_IS_ON()
DCHECK(!IsAnyIdEmpty(optional_app_ids_)) << "Cannot listen for empty ids.";
#endif
is_listening_ = true;
app_manifest_updated_delegate_ = base::BindRepeating(
&WebAppTestManifestUpdatedObserver::SignalRunLoopAndStoreAppId,
weak_factory_.GetWeakPtr());
}
webapps::AppId WebAppTestManifestUpdatedObserver::Wait() {
wait_loop_.Run();
if (last_app_id_.empty()) {
LOG(ERROR) << "Could not find any of "
<< ContainerToString(optional_app_ids_);
}
return last_app_id_;
}
webapps::AppId WebAppTestManifestUpdatedObserver::BeginListeningAndWait(
const std::set<webapps::AppId>& optional_app_ids) {
BeginListening(optional_app_ids);
webapps::AppId id = Wait();
return id;
}
WebAppTestUninstallObserver::WebAppTestUninstallObserver(Profile* profile)
: WebAppInstallManagerObserverAdapter(profile) {}
WebAppTestUninstallObserver::~WebAppTestUninstallObserver() = default;
void WebAppTestUninstallObserver::BeginListening(
const std::set<webapps::AppId>& optional_app_ids) {
optional_app_ids_ = optional_app_ids;
#if DCHECK_IS_ON()
DCHECK(!IsAnyIdEmpty(optional_app_ids_)) << "Cannot listen for empty ids.";
#endif
is_listening_ = true;
app_uninstalled_delegate_ = base::BindRepeating(
&WebAppTestUninstallObserver::SignalRunLoopAndStoreAppId,
weak_factory_.GetWeakPtr());
}
webapps::AppId WebAppTestUninstallObserver::Wait() {
wait_loop_.Run();
if (last_app_id_.empty()) {
LOG(ERROR) << "Could not find any of "
<< ContainerToString(optional_app_ids_);
}
return last_app_id_;
}
webapps::AppId WebAppTestUninstallObserver::BeginListeningAndWait(
const std::set<webapps::AppId>& optional_app_ids) {
BeginListening(optional_app_ids);
webapps::AppId id = Wait();
return id;
}
} // namespace web_app