1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
// 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 COMPONENTS_CAST_API_BINDINGS_MANAGER_H_
#define COMPONENTS_CAST_API_BINDINGS_MANAGER_H_
#include <map>
#include <string>
#include <string_view>
#include "base/containers/flat_map.h"
#include "base/functional/callback.h"
#include "components/cast/cast_component_export.h"
#include "components/cast/message_port/message_port.h"
namespace cast_api_bindings {
// Allows the caller to specify the JS that should be injected into a container,
// and to register handlers for communication with the content.
class CAST_COMPONENT_EXPORT Manager {
public:
using MessagePortConnectedHandler = base::RepeatingCallback<void(
std::unique_ptr<cast_api_bindings::MessagePort>)>;
Manager();
Manager(const Manager&) = delete;
Manager& operator=(const Manager&) = delete;
virtual ~Manager();
// Registers a |handler| which will receive MessagePorts originating from
// the frame's web content. |port_name| is an alphanumeric string that is
// consistent across JS and native code.
// All handlers must be Unregistered() before |this| is destroyed.
void RegisterPortHandler(std::string_view port_name,
MessagePortConnectedHandler handler);
// Unregisters a previously registered handler.
// The owner of Manager is responsible for ensuring that all
// handlers are unregistered before |this| is deleted.
void UnregisterPortHandler(std::string_view port_name);
// Registers a |binding_script| for injection in the frame.
// Replaces registered bindings with the same |binding_name|.
virtual void AddBinding(std::string_view binding_name,
std::string_view binding_script) = 0;
protected:
// Called by platform-specific implementations when the content requests a
// connection to |port_name|.
// Returns |false| if the port was invalid or not registered in advance, at
// which point the matchmaking port should be dropped.
bool OnPortConnected(std::string_view port_name,
std::unique_ptr<cast_api_bindings::MessagePort> port);
private:
base::flat_map<std::string, MessagePortConnectedHandler> port_handlers_;
};
} // namespace cast_api_bindings
#endif // COMPONENTS_CAST_API_BINDINGS_MANAGER_H_
|