blob: 8eba1fd86e8b963ec865ad5ac742d03c38315d85 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_APPS_APP_SERVICE_LAUNCH_UTILS_H_
#define CHROME_BROWSER_APPS_APP_SERVICE_LAUNCH_UTILS_H_
#include <stdint.h>
#include <string>
#include <vector>
#include "build/build_config.h"
#include "chrome/browser/apps/app_service/app_launch_params.h"
#include "components/services/app_service/public/cpp/app_launch_util.h"
#include "components/services/app_service/public/cpp/app_types.h"
#include "components/services/app_service/public/cpp/intent.h"
#include "extensions/common/constants.h"
#include "ui/base/window_open_disposition.h"
#if BUILDFLAG(IS_CHROMEOS)
#include "chrome/browser/apps/app_service/app_service_proxy_forward.h"
#include "chromeos/ash/experiences/arc/mojom/app.mojom-forward.h"
#endif // BUILDFLAG(IS_CHROMEOS)
class Browser;
class Profile;
namespace base {
class CommandLine;
class FilePath;
} // namespace base
namespace content {
class WebContents;
} // namespace content
namespace apps {
LaunchContainer ConvertWindowModeToAppLaunchContainer(WindowMode window_mode);
// Converts file arguments to an app on |command_line| into base::FilePaths.
std::vector<base::FilePath> GetLaunchFilesFromCommandLine(
const base::CommandLine& command_line);
// When a command line launch has an unknown app id, we open a browser with only
// the new tab page.
Browser* CreateBrowserWithNewTabPage(Profile* profile);
// Helper to create AppLaunchParams using event flags that allows user to
// override the user-configured container using modifier keys. |display_id| is
// the id of the display from which the app is launched.
AppLaunchParams CreateAppIdLaunchParamsWithEventFlags(
const std::string& app_id,
int event_flags,
LaunchSource source,
int64_t display_id,
LaunchContainer fallback_container);
AppLaunchParams CreateAppLaunchParamsForIntent(
const std::string& app_id,
int32_t event_flags,
LaunchSource source,
int64_t display_id,
LaunchContainer fallback_container,
IntentPtr&& intent,
Profile* profile);
extensions::AppLaunchSource GetAppLaunchSource(LaunchSource launch_source);
// Returns event flag for |disposition|. If |prefer_container|
// is true, |disposition| will be ignored. Otherwise, an event flag based on
// |disposition| will be returned.
int GetEventFlags(WindowOpenDisposition disposition, bool prefer_container);
// Returns the browser's session id for restoration if |web_contents| is valid
// for a system web app, or for a web app not opened in tab. Otherwise, returns
// an invalid session id.
int GetSessionIdForRestoreFromWebContents(
const content::WebContents* web_contents);
#if BUILDFLAG(IS_CHROMEOS)
// Helper to convert apps::mojom::WindowInfoPtr to arc::mojom::WindowInfoPtr.
arc::mojom::WindowInfoPtr MakeArcWindowInfo(WindowInfoPtr window_info);
// Container for holding possible app IDs that can launch a PWA for a given URL.
struct AppIdsToLaunchForUrl {
AppIdsToLaunchForUrl();
AppIdsToLaunchForUrl(AppIdsToLaunchForUrl&&);
~AppIdsToLaunchForUrl();
// Apps that can handle a given URL.
std::vector<std::string> candidates;
// The users preference for an app to handle a given URL.
std::optional<std::string> preferred;
};
// Takes a `url` and returns a vector of app IDs and the users preferred choice
// of app that can launch a PWA for the given `url`.
AppIdsToLaunchForUrl FindAppIdsToLaunchForUrl(AppServiceProxy* proxy,
const GURL& url);
// Checks to see if any apps handle `url` and is selected as the users
// preference. If so, launches the preferred app, otherwise opens `url` in a
// browser tab.
void MaybeLaunchPreferredAppForUrl(Profile* profile,
const GURL& url,
LaunchSource launch_source);
// Launches `url` in a suitable installed app, or in the browser if no app is
// installed. If one app is installed which can handle `url`, it will always be
// opened. If multiple apps are installed, any app which is preferred by the
// user will be opened.
void LaunchUrlInInstalledAppOrBrowser(Profile* profile,
const GURL& url,
LaunchSource launch_source);
#endif // BUILDFLAG(IS_CHROMEOS)
} // namespace apps
#endif // CHROME_BROWSER_APPS_APP_SERVICE_LAUNCH_UTILS_H_