#ifndef EXTENSIONS_BROWSER_API_MESSAGING_MESSAGE_PORT_H_
#define EXTENSIONS_BROWSER_API_MESSAGING_MESSAGE_PORT_H_
#include <optional>
#include <string>
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "extensions/browser/activity.h"
#include "extensions/browser/extension_api_frame_id_map.h"
#include "extensions/common/api/messaging/port_id.h"
#include "extensions/common/mojom/message_port.mojom.h"
#include "mojo/public/cpp/bindings/associated_receiver_set.h"
#include "url/origin.h"
class GURL;
namespace content {
class RenderFrameHost;
}
namespace extensions {
class Message;
struct MessagingEndpoint;
struct PortContext;
class MessagePort
: public mojom::MessagePortHost
{
public:
class ChannelDelegate {
public:
virtual void CloseChannel(const PortId& port_id,
const std::string& error_message) = 0;
virtual void ClosePort(const PortId& port_id,
int process_id,
const PortContext& port_context,
bool close_channel,
const std::string& error_message) = 0;
virtual void PostMessage(const PortId& port_id, const Message& message) = 0;
virtual void NotifyResponsePending(const PortId& port_id) = 0;
};
explicit MessagePort(base::WeakPtr<ChannelDelegate> channel_delegate,
const PortId& port_id);
MessagePort(const MessagePort&) = delete;
MessagePort& operator=(const MessagePort&) = delete;
~MessagePort() override;
virtual void RemoveCommonFrames(const MessagePort& port);
virtual bool HasFrame(
const content::GlobalRenderFrameHostToken& frame_token) const;
virtual bool IsValidPort() = 0;
virtual void RevalidatePort();
virtual void DispatchOnConnect(
mojom::ChannelType channel_type,
const std::string& channel_name,
std::optional<base::Value::Dict> source_tab,
const ExtensionApiFrameIdMap::FrameData& source_frame,
int guest_process_id,
int guest_render_frame_routing_id,
const MessagingEndpoint& source_endpoint,
const std::string& target_extension_id,
const GURL& source_url,
std::optional<url::Origin> source_origin,
const std::set<base::UnguessableToken>& open_channel_tracking_ids);
virtual void DispatchOnDisconnect(const std::string& error_message);
virtual void DispatchOnMessage(const Message& message) = 0;
virtual void OpenPort(int process_id, const PortContext& port_context);
virtual void ClosePort(int process_id, int routing_id, int worker_thread_id);
virtual void IncrementLazyKeepaliveCount(Activity::Type activity_type);
virtual void DecrementLazyKeepaliveCount(Activity::Type activity_type);
virtual void NotifyResponsePending();
bool should_have_strong_keepalive() const {
return should_have_strong_keepalive_;
}
bool is_for_onetime_channel() const { return is_for_onetime_channel_; }
void set_should_have_strong_keepalive(bool should_have_strong_keepalive) {
should_have_strong_keepalive_ = should_have_strong_keepalive;
}
void set_is_for_onetime_channel(bool is_for_onetime_channel) {
is_for_onetime_channel_ = is_for_onetime_channel;
}
void AddReceiver(
mojo::PendingAssociatedReceiver<mojom::MessagePortHost> receiver,
int render_process_id,
const PortContext& port_context);
protected:
MessagePort();
void ClosePort(bool close_channel,
const std::optional<std::string>& error_message) override;
void PostMessage(Message message) override;
void ResponsePending() override;
base::WeakPtr<ChannelDelegate> weak_channel_delegate_;
const PortId port_id_;
private:
bool should_have_strong_keepalive_ = false;
bool is_for_onetime_channel_ = false;
mojo::AssociatedReceiverSet<mojom::MessagePortHost,
std::pair<int, PortContext>>
receivers_;
};
}
#endif