blob: 680831f75a9dc377480b64e1098113fd74d67383 [file] [log] [blame]
// Copyright 2013 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/extensions/launch_util.h"
#include <optional>
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/extensions/extension_sync_service.h"
#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/launch_util.h"
#include "extensions/common/extension.h"
namespace extensions {
void SetLaunchType(content::BrowserContext* context,
const std::string& extension_id,
LaunchType launch_type) {
SetLaunchTypePrefValue(context, extension_id, launch_type);
// Sync the launch type.
const Extension* extension =
ExtensionRegistry::Get(context)
->GetExtensionById(extension_id, ExtensionRegistry::EVERYTHING);
if (extension)
ExtensionSyncService::Get(context)->SyncExtensionChangeIfNeeded(*extension);
}
apps::LaunchContainer GetLaunchContainer(const ExtensionPrefs* prefs,
const Extension* extension) {
apps::LaunchContainer manifest_launch_container =
AppLaunchInfo::GetLaunchContainer(extension);
std::optional<apps::LaunchContainer> result;
if (manifest_launch_container ==
apps::LaunchContainer::kLaunchContainerPanelDeprecated) {
result = manifest_launch_container;
} else if (manifest_launch_container ==
apps::LaunchContainer::kLaunchContainerTab) {
// Look for prefs that indicate the user's choice of launch container. The
// app's menu on the NTP provides a UI to set this preference.
LaunchType prefs_launch_type = GetLaunchType(prefs, extension);
if (prefs_launch_type == LAUNCH_TYPE_WINDOW) {
// If the pref is set to launch a window (or no pref is set, and
// window opening is the default), make the container a window.
result = apps::LaunchContainer::kLaunchContainerWindow;
#if BUILDFLAG(IS_CHROMEOS)
} else if (prefs_launch_type == LAUNCH_TYPE_FULLSCREEN) {
// LAUNCH_TYPE_FULLSCREEN launches in a maximized app window in ash.
// For desktop chrome AURA on all platforms we should open the
// application in full screen mode in the current tab, on the same
// lines as non AURA chrome.
result = apps::LaunchContainer::kLaunchContainerWindow;
#endif
} else {
// All other launch types (tab, pinned, fullscreen) are
// implemented as tabs in a window.
result = apps::LaunchContainer::kLaunchContainerTab;
}
} else {
// If a new value for app.launch.container is added, logic for it should be
// added here. apps::LaunchContainer::kLaunchContainerWindow is not
// present because there is no way to set it in a manifest.
NOTREACHED() << static_cast<int>(manifest_launch_container);
}
// All paths should set |result|.
if (!result) {
DLOG(FATAL) << "Failed to set a launch container.";
result = apps::LaunchContainer::kLaunchContainerTab;
}
return *result;
}
} // namespace extensions