// Copyright 2016 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_MEDIA_ROUTER_BROWSER_PRESENTATION_LOCAL_PRESENTATION_MANAGER_H_ #define COMPONENTS_MEDIA_ROUTER_BROWSER_PRESENTATION_LOCAL_PRESENTATION_MANAGER_H_ #include <map> #include <memory> #include <optional> #include <string> #include <unordered_map> #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/threading/thread_checker.h" #include "components/keyed_service/core/keyed_service.h" #include "components/media_router/common/media_route.h" #include "content/public/browser/global_routing_id.h" #include "content/public/browser/presentation_service_delegate.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/blink/public/mojom/presentation/presentation.mojom.h" namespace content { class WebContents; } namespace media_router { // Manages all local presentations started in the associated Profile and // facilitates communication between the controllers and the receiver of a // local presentation. A local presentation may be an offscreen presentation for // Presentation API 1-UA mode, or a presentation to a wired display. // // Design doc: // https://docs.google.com/document/d/1XM3jhMJTQyhEC5PDAAJFNIaKh6UUEihqZDz_ztEe4Co/edit#heading=h.hadpx5oi0gml // // Example usage: // // Receiver is created to host the local presentation and registers itself // so that controller frames can connect to it: // // LocalPresentationManager* manager = // LocalPresentationManagerFactory::GetOrCreateForBrowserContext( // web_contents_->GetBrowserContext()); // manager->OnLocalPresentationReceiverCreated(presentation_info, // base::BindRepeating( // &PresentationServiceImpl::OnReceiverConnectionAvailable)); // // Controlling frame establishes connection with the receiver side, resulting // in a connection with the two endpoints being the controller // PresentationConnectionRemote and receiver PresentationConnectionReceiver. // Note calling this will trigger receiver frame's // PresentationServiceImpl::OnReceiverConnectionAvailable. // // manager->RegisterLocalPresentationController( // presentation_info, // std::move(controller_connection_remote), // std::move(receiver_connection_receiver)); // // Invoked on receiver's PresentationServiceImpl when controller connection is // established. // // |presentation_receiver_remote_|: mojo::Remote<T> for the implementation of // the blink::mojom::PresentationService interface in the renderer process. // |controller_connection_remote|: mojo::PendingRemote<T> for // blink::PresentationConnection object in controlling frame's render process. // |receiver_connection_receiver|: mojo::PendingReceiver<T> to be bind to // blink::PresentationConnection object in receiver frame's render process. // void PresentationServiceImpl::OnReceiverConnectionAvailable( // const blink::mojom::PresentationInfo& presentation_info, // PresentationConnectionRemote controller_connection_remote, // PresentationConnectionReceiver receiver_connection_receiver) { // presentation_receiver_remote_->OnReceiverConnectionAvailable( // blink::mojom::PresentationInfo::From(presentation_info), // std::move(controller_connection_remote), // std::move(receiver_connection_receiver)); // } // // Send message from controlling/receiver frame to receiver/controlling frame: // // |target_connection_|: member variable of mojo::PendingRemote<T> for // blink::PresentationConnection type, referring to // remote PresentationConnectionProxy object on // receiver/controlling frame. // |message|: Text message to be sent. // PresentationConnctionPtr::SendString( // const blink::WebString& message) { // target_connection_->OnMessage( // blink::mojom::PresentationConnectionMessage::NewMessage( // message.Utf8()), // base::BindOnce(&OnMessageReceived)); // } // // A controller or receiver leaves the local presentation (e.g., due to // navigation) by unregistering themselves from LocalPresentation object. // // When the receiver is no longer associated with a local presentation, it // shall unregister itself with LocalPresentationManager. Unregistration // will prevent additional controllers from establishing a connection with the // receiver: // // In receiver's PSImpl::Reset() { // local_presentation_manager-> // OnLocalPresentationReceiverTerminated(presentation_id); // } // // This class is not thread safe. All functions must be invoked on the UI // thread. All callbacks passed into this class will also be invoked on UI // thread. class LocalPresentationManager : public KeyedService { … }; } // namespace media_router #endif // COMPONENTS_MEDIA_ROUTER_BROWSER_PRESENTATION_LOCAL_PRESENTATION_MANAGER_H_