text: // 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.
  
  #ifndef EXTENSIONS_COMMON_API_MESSAGING_MESSAGING_ENDPOINT_H_
  #define EXTENSIONS_COMMON_API_MESSAGING_MESSAGING_ENDPOINT_H_
  
  #include <string>
  
  #include "base/debug/crash_logging.h"
  #include "extensions/common/extension_id.h"
  #include "third_party/abseil-cpp/absl/types/optional.h"
  
  namespace extensions {
  
  struct MessagingEndpoint {
    // Type of the messaging source or destination - i.e., the type of the
    // component which talks to a messaging channel.
    enum class Type {
      // An extension.
      kExtension = 0,
      // A web page or a content script or a hosted app.
      kTab = 1,
      // A native application.
      kNativeApp = 2,
  
      // This item must be equal to the last actual enum item.
      kLast = kNativeApp,
    };
  
    static MessagingEndpoint ForExtension(ExtensionId extension_id);
    static MessagingEndpoint ForContentScript(ExtensionId extension_id);
    static MessagingEndpoint ForWebPage();
    static MessagingEndpoint ForNativeApp(std::string native_app_name);
  
    MessagingEndpoint();
    MessagingEndpoint(const MessagingEndpoint&);
    MessagingEndpoint(MessagingEndpoint&&);
  
    MessagingEndpoint& operator=(const MessagingEndpoint&);
  
    ~MessagingEndpoint();
  
    Type type = Type::kExtension;
  
    // Identifier of the extension (or the content script).  It is required for
    // |type| of kExtension.  For |type| of kTab, it is set if the endpoint is a
    // content script (otherwise, it's the web page).
    absl::optional<ExtensionId> extension_id;
  
    // Name of the native application.  It is required for |type| of kNativeApp.
    // It is not used for other types.
    absl::optional<std::string> native_app_name;
  };
  
  namespace debug {
  
  class ScopedMessagingEndpointCrashKeys {
   public:
    explicit ScopedMessagingEndpointCrashKeys(const MessagingEndpoint& endpoint);
    ~ScopedMessagingEndpointCrashKeys();
  
    ScopedMessagingEndpointCrashKeys(const ScopedMessagingEndpointCrashKeys&) =
        delete;
    ScopedMessagingEndpointCrashKeys& operator=(
        const ScopedMessagingEndpointCrashKeys&) = delete;
  
   private:
    base::debug::ScopedCrashKeyString type_;
    base::debug::ScopedCrashKeyString extension_id_or_app_name_;
  };
  
  }  // namespace debug
  
  }  // namespace extensions
  
  #endif  // EXTENSIONS_COMMON_API_MESSAGING_MESSAGING_ENDPOINT_H_
  