blob: 95d19a3b8a69b695eaf63fcd7f98490106607f8c [file] [log] [blame]
// Copyright 2019 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/web_app_constants.h"
#include <ostream>
#include "base/compiler_specific.h"
#include "chrome/browser/web_applications/user_display_mode.h"
#include "chrome/common/chrome_features.h"
#include "components/services/app_service/public/mojom/types.mojom.h"
#include "content/public/common/content_features.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace web_app {
const char kRunOnOsLoginModeWindowed[] = "windowed";
namespace {
// Note: This can never return kBrowser. This is because the user has
// specified that the web app should be displayed in a window, and thus
// the lowest fallback that we can go to is kMinimalUi.
DisplayMode ResolveAppDisplayModeForStandaloneLaunchContainer(
DisplayMode app_display_mode) {
switch (app_display_mode) {
case DisplayMode::kBrowser:
case DisplayMode::kMinimalUi:
return DisplayMode::kMinimalUi;
case DisplayMode::kUndefined:
NOTREACHED();
[[fallthrough]];
case DisplayMode::kStandalone:
case DisplayMode::kFullscreen:
return DisplayMode::kStandalone;
case DisplayMode::kWindowControlsOverlay:
return DisplayMode::kWindowControlsOverlay;
case DisplayMode::kTabbed:
if (base::FeatureList::IsEnabled(features::kDesktopPWAsTabStrip))
return DisplayMode::kTabbed;
else
return DisplayMode::kStandalone;
}
}
} // namespace
static_assert(WebAppManagement::kMinValue == 0,
"Source enum should be zero based");
std::ostream& operator<<(std::ostream& os, WebAppManagement::Type type) {
switch (type) {
case WebAppManagement::Type::kSystem:
return os << "System";
case WebAppManagement::Type::kPolicy:
return os << "Policy";
case WebAppManagement::Type::kSubApp:
return os << "SubApp";
case WebAppManagement::Type::kWebAppStore:
return os << "WebAppStore";
case WebAppManagement::Type::kSync:
return os << "Sync";
case WebAppManagement::Type::kDefault:
return os << "Default";
}
}
static_assert(OsHookType::kShortcuts == 0,
"OsHookType enum should be zero based");
namespace {
absl::optional<DisplayMode> TryResolveUserDisplayMode(
UserDisplayMode user_display_mode) {
switch (user_display_mode) {
case UserDisplayMode::kBrowser:
return DisplayMode::kBrowser;
case UserDisplayMode::kTabbed:
if (base::FeatureList::IsEnabled(features::kDesktopPWAsTabStripSettings))
return DisplayMode::kTabbed;
// Treat as standalone.
[[fallthrough]];
case UserDisplayMode::kStandalone:
break;
}
return absl::nullopt;
}
absl::optional<DisplayMode> TryResolveOverridesDisplayMode(
const std::vector<DisplayMode>& display_mode_overrides) {
for (DisplayMode override_display_mode : display_mode_overrides) {
DisplayMode resolved_display_mode =
ResolveAppDisplayModeForStandaloneLaunchContainer(
override_display_mode);
if (override_display_mode == resolved_display_mode) {
return resolved_display_mode;
}
}
return absl::nullopt;
}
DisplayMode ResolveNonIsolatedEffectiveDisplayMode(
DisplayMode app_display_mode,
const std::vector<DisplayMode>& display_mode_overrides,
UserDisplayMode user_display_mode) {
const absl::optional<DisplayMode> resolved_display_mode =
TryResolveUserDisplayMode(user_display_mode);
if (resolved_display_mode.has_value()) {
return *resolved_display_mode;
}
const absl::optional<DisplayMode> resolved_override_display_mode =
TryResolveOverridesDisplayMode(display_mode_overrides);
if (resolved_override_display_mode.has_value()) {
return *resolved_override_display_mode;
}
return ResolveAppDisplayModeForStandaloneLaunchContainer(app_display_mode);
}
} // namespace
DisplayMode ResolveEffectiveDisplayMode(
DisplayMode app_display_mode,
const std::vector<DisplayMode>& app_display_mode_overrides,
UserDisplayMode user_display_mode,
bool is_isolated) {
const DisplayMode resolved_display_mode =
ResolveNonIsolatedEffectiveDisplayMode(
app_display_mode, app_display_mode_overrides, user_display_mode);
if (is_isolated && resolved_display_mode == DisplayMode::kBrowser) {
return DisplayMode::kStandalone;
}
return resolved_display_mode;
}
apps::mojom::LaunchContainer ConvertDisplayModeToAppLaunchContainer(
DisplayMode display_mode) {
switch (display_mode) {
case DisplayMode::kBrowser:
return apps::mojom::LaunchContainer::kLaunchContainerTab;
case DisplayMode::kMinimalUi:
case DisplayMode::kStandalone:
case DisplayMode::kFullscreen:
case DisplayMode::kWindowControlsOverlay:
case DisplayMode::kTabbed:
return apps::mojom::LaunchContainer::kLaunchContainerWindow;
case DisplayMode::kUndefined:
return apps::mojom::LaunchContainer::kLaunchContainerNone;
}
}
std::string RunOnOsLoginModeToString(RunOnOsLoginMode mode) {
switch (mode) {
case RunOnOsLoginMode::kWindowed:
return "windowed";
case RunOnOsLoginMode::kMinimized:
return "minimized";
case RunOnOsLoginMode::kNotRun:
return "not run";
}
}
const char* IconsDownloadedResultToString(IconsDownloadedResult result) {
switch (result) {
case IconsDownloadedResult::kCompleted:
return "Completed";
case IconsDownloadedResult::kPrimaryPageChanged:
return "PrimaryPageChanged";
case IconsDownloadedResult::kAbortedDueToFailure:
return "AbortedDueToFailure";
}
}
} // namespace web_app