#include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
#include <memory>
#include <optional>
#include <string_view>
#include <utility>
#include <vector>
#include "base/atomic_ref_count.h"
#include "base/auto_reset.h"
#include "base/barrier_callback.h"
#include "base/barrier_closure.h"
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/functional/callback_forward.h"
#include "base/functional/callback_helpers.h"
#include "base/functional/concurrent_closures.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/metrics/histogram_functions.h"
#include "base/no_destructor.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/task_traits.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h"
#include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_manager_observer.h"
#include "chrome/browser/web_applications/os_integration/file_handling_sub_manager.h"
#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h"
#include "chrome/browser/web_applications/os_integration/os_integration_test_override.h"
#include "chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h"
#include "chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h"
#include "chrome/browser/web_applications/os_integration/shortcut_menu_handling_sub_manager.h"
#include "chrome/browser/web_applications/os_integration/shortcut_sub_manager.h"
#include "chrome/browser/web_applications/os_integration/uninstallation_via_os_settings_sub_manager.h"
#include "chrome/browser/web_applications/os_integration/web_app_shortcut.h"
#include "chrome/browser/web_applications/os_integration/web_app_uninstallation_via_os_settings_registration.h"
#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
#include "chrome/browser/web_applications/web_app_constants.h"
#include "chrome/browser/web_applications/web_app_install_info.h"
#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/browser/web_applications/web_app_registrar.h"
#include "chrome/browser/web_applications/web_app_registry_update.h"
#include "chrome/browser/web_applications/web_app_sync_bridge.h"
#include "chrome/browser/web_applications/web_app_ui_manager.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h"
#include "components/webapps/common/web_app_id.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_switches.h"
#include "third_party/re2/src/re2/re2.h"
#include "ui/gfx/image/image_skia_rep_default.h"
#if BUILDFLAG(IS_MAC)
#include "base/system/sys_info.h"
#include "chrome/common/mac/app_mode_common.h"
#endif
#if BUILDFLAG(IS_MAC)
#include "chrome/browser/web_applications/os_integration/mac/app_shim_registry.h"
#endif
namespace web_app {
namespace {
base::AtomicRefCount& GetSuppressCount() { … }
#if BUILDFLAG(IS_MAC)
const int kCurrentAppShortcutsVersion = APP_SHIM_VERSION_NUMBER;
std::string CurrentAppShortcutsArch() {
return base::SysInfo::OperatingSystemArchitecture();
}
#else
const int kCurrentAppShortcutsVersion = …;
std::string CurrentAppShortcutsArch() { … }
#endif
const int kUpdateShortcutsForAllAppsDelay = …;
OsIntegrationManager::UpdateShortcutsForAllAppsCallback&
GetUpdateShortcutsForAllAppsCallback() { … }
}
OsIntegrationManager::ScopedSuppressForTesting::ScopedSuppressForTesting() { … }
OsIntegrationManager::ScopedSuppressForTesting::~ScopedSuppressForTesting() { … }
bool OsIntegrationManager::AreOsHooksSuppressedForTesting() { … }
void OsIntegrationManager::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) { … }
void OsIntegrationManager::SetUpdateShortcutsForAllAppsCallback(
UpdateShortcutsForAllAppsCallback callback) { … }
base::OnceClosure&
OsIntegrationManager::OnSetCurrentAppShortcutsVersionCallbackForTesting() { … }
OsIntegrationManager::OsIntegrationManager(
Profile* profile,
std::unique_ptr<WebAppFileHandlerManager> file_handler_manager,
std::unique_ptr<WebAppProtocolHandlerManager> protocol_handler_manager)
: … { … }
OsIntegrationManager::~OsIntegrationManager() = default;
void OsIntegrationManager::SetProvider(base::PassKey<WebAppProvider>,
WebAppProvider& provider) { … }
void OsIntegrationManager::Start() { … }
void OsIntegrationManager::Shutdown() { … }
void OsIntegrationManager::Synchronize(
const webapps::AppId& app_id,
base::OnceClosure callback,
std::optional<SynchronizeOsOptions> options) { … }
void OsIntegrationManager::GetAppExistingShortCutLocation(
ShortcutLocationCallback callback,
std::unique_ptr<ShortcutInfo> shortcut_info) { … }
void OsIntegrationManager::GetShortcutInfoForAppFromRegistrar(
const webapps::AppId& app_id,
GetShortcutInfoCallback callback) { … }
bool OsIntegrationManager::IsFileHandlingAPIAvailable(
const webapps::AppId& app_id) { … }
const apps::FileHandlers* OsIntegrationManager::GetEnabledFileHandlers(
const webapps::AppId& app_id) const { … }
std::optional<GURL> OsIntegrationManager::TranslateProtocolUrl(
const webapps::AppId& app_id,
const GURL& protocol_url) { … }
std::vector<custom_handlers::ProtocolHandler>
OsIntegrationManager::GetAppProtocolHandlers(const webapps::AppId& app_id) { … }
std::vector<custom_handlers::ProtocolHandler>
OsIntegrationManager::GetAllowedHandlersForProtocol(
const std::string& protocol) { … }
std::vector<custom_handlers::ProtocolHandler>
OsIntegrationManager::GetDisallowedHandlersForProtocol(
const std::string& protocol) { … }
WebAppProtocolHandlerManager&
OsIntegrationManager::protocol_handler_manager_for_testing() { … }
FakeOsIntegrationManager* OsIntegrationManager::AsTestOsIntegrationManager() { … }
void OsIntegrationManager::OnProfileMarkedForPermanentDeletion(
Profile* profile_to_be_deleted) { … }
void OsIntegrationManager::OnProfileManagerDestroying() { … }
void OsIntegrationManager::SetForceUnregisterCalledForTesting(
base::RepeatingCallback<void(const webapps::AppId&)> on_force_unregister) { … }
void OsIntegrationManager::StartSubManagerExecutionIfRequired(
const webapps::AppId& app_id,
std::optional<SynchronizeOsOptions> options,
std::unique_ptr<proto::WebAppOsIntegrationState> desired_states,
base::OnceClosure on_all_execution_done) { … }
void OsIntegrationManager::ExecuteNextSubmanager(
const webapps::AppId& app_id,
std::optional<SynchronizeOsOptions> options,
proto::WebAppOsIntegrationState* desired_state,
const proto::WebAppOsIntegrationState current_state,
size_t index,
base::OnceClosure on_all_execution_done_db_write) { … }
void OsIntegrationManager::WriteStateToDB(
const webapps::AppId& app_id,
std::unique_ptr<proto::WebAppOsIntegrationState> desired_states,
base::OnceClosure callback) { … }
void OsIntegrationManager::UnregisterOsIntegrationOnProfileMarkedForDeletion(
const webapps::AppId& app_id) { … }
void OsIntegrationManager::SubManagersUnregistered(
const webapps::AppId& app_id,
std::unique_ptr<ScopedProfileKeepAlive> keep_alive) { … }
void OsIntegrationManager::ForceUnregisterOsIntegrationOnSubManager(
const webapps::AppId& app_id,
size_t index,
base::OnceClosure final_callback) { … }
void OsIntegrationManager::UpdateShortcutsForAllAppsIfNeeded() { … }
void OsIntegrationManager::UpdateShortcutsForAllAppsNow() { … }
void OsIntegrationManager::SetCurrentAppShortcutsVersion() { … }
void OsIntegrationManager::OnIconsRead(
const webapps::AppId& app_id,
GetShortcutInfoCallback callback,
std::map<SquareSizePx, SkBitmap> icon_bitmaps) { … }
std::unique_ptr<ShortcutInfo> OsIntegrationManager::BuildShortcutInfoForWebApp(
const WebApp* app) { … }
}