blob: b4475b5867e09a645c5c070af05be4f5a3d000e6 [file] [log] [blame]
// Copyright 2012 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_EXTENSIONS_API_MESSAGING_NATIVE_PROCESS_LAUNCHER_H_
#define CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_PROCESS_LAUNCHER_H_
#include <memory>
#include <string>
#include "base/files/platform_file.h"
#include "base/functional/callback_forward.h"
#include "base/process/process.h"
#include "ui/gfx/native_widget_types.h"
class GURL;
namespace base {
class FilePath;
}
namespace net {
class FileStream;
}
class Profile;
namespace extensions {
class NativeProcessLauncher {
public:
enum LaunchResult {
RESULT_SUCCESS,
RESULT_INVALID_NAME,
RESULT_NOT_FOUND,
RESULT_FORBIDDEN,
RESULT_FAILED_TO_START,
};
// Callback that's called after the process has been launched. Handler must
// take ownership of the process and streams. `read_file`, supplied only on
// POSIX, is the file descriptor owned by `read_stream`.
using LaunchedCallback =
base::OnceCallback<void(LaunchResult result,
base::Process process,
base::PlatformFile read_file,
std::unique_ptr<net::FileStream> read_stream,
std::unique_ptr<net::FileStream> write_stream)>;
// Creates default launcher for the current OS. `native_view` refers to the
// window that contains calling page. Can be nullptr, e.g. for background
// pages. If `profile_directory` is non-empty and the host supports
// native-initiated connections, additional reconnect args will be passed to
// the host. If `require_native_initiated_connections` is true, the connection
// will be allowed only if the native messaging host sets
// "supports_native_initiated_connections" to true in its manifest.
// If `error_arg` is non-empty, the reconnect args are omitted, and instead
// the error value is passed as a command line argument to the host.
static std::unique_ptr<NativeProcessLauncher> CreateDefault(
bool allow_user_level_hosts,
gfx::NativeView native_view,
const base::FilePath& profile_directory,
bool require_native_initiated_connections,
const std::string& connect_id,
const std::string& error_arg,
Profile* profile);
NativeProcessLauncher(const NativeProcessLauncher&) = delete;
NativeProcessLauncher& operator=(const NativeProcessLauncher&) = delete;
virtual ~NativeProcessLauncher() = default;
// Finds native messaging host with the specified name and launches it
// asynchronously. Also checks that the specified `origin` is permitted to
// access the host. `callback` is called after the process has been started.
// If the launcher is destroyed before the callback is called then the call is
// canceled and the process is stopped if it has been started already (by
// closing IO pipes).
virtual void Launch(const GURL& origin,
const std::string& native_host_name,
LaunchedCallback callback) const = 0;
protected:
NativeProcessLauncher() = default;
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_PROCESS_LAUNCHER_H_