910e62b5创建于 1月15日历史提交
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_COMMON_API_MESSAGING_PORT_CONTEXT_H_
#define EXTENSIONS_COMMON_API_MESSAGING_PORT_CONTEXT_H_

#include <stddef.h>

#include <optional>
#include <string>

#include "base/debug/crash_logging.h"
#include "extensions/common/extension_id.h"

namespace extensions {

// A port can refer to a RenderFrame (FrameContext) or a Service Worker
// (WorkerContext) or a native messaging host.
struct PortContext {
 public:
  // This constructor is needed by our IPC code and tests. Clients should use
  // factory functions instead.
  PortContext();

  ~PortContext();
  PortContext(const PortContext& other);

  struct FrameContext {
    FrameContext();
    explicit FrameContext(int routing_id);

    auto operator<=>(const FrameContext&) const = default;

    // The routing id of the frame context.
    // This may be IPC::mojom::kRoutingIdNone if the context is process-wide and
    // isn't tied to a specific RenderFrame.
    int routing_id;
  };

  struct WorkerContext {
    WorkerContext();
    WorkerContext(int thread_id,
                  int64_t version_id,
                  int render_process_id,
                  const ExtensionId& extension_id);

    auto operator<=>(const WorkerContext&) const = default;

    int thread_id;
    int64_t version_id;
    int render_process_id;
    ExtensionId extension_id;
  };

  auto operator<=>(const PortContext&) const = default;

  static PortContext ForFrame(int routing_id);
  static PortContext ForWorker(int thread_id,
                               int64_t version_id,
                               int render_process_id,
                               const ExtensionId& extension_id);
  static PortContext ForNativeHost();

  bool is_for_render_frame() const { return frame.has_value(); }
  bool is_for_service_worker() const { return worker.has_value(); }
  bool is_for_native_host() const { return !frame && !worker; }

  std::optional<FrameContext> frame;
  std::optional<WorkerContext> worker;
};

namespace debug {

class ScopedPortContextCrashKeys {
 public:
  explicit ScopedPortContextCrashKeys(const PortContext& port_context);
  ~ScopedPortContextCrashKeys();

 private:
  std::optional<base::debug::ScopedCrashKeyString> extension_id_;
};

}  // namespace debug

}  // namespace extensions

#endif  // EXTENSIONS_COMMON_API_MESSAGING_PORT_CONTEXT_H_