#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PRESENTATION_PRESENTATION_CONTROLLER_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PRESENTATION_PRESENTATION_CONTROLLER_H_
#include <vector>
#include "third_party/blink/public/mojom/presentation/presentation.mojom-blink.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/modules/presentation/presentation.h"
#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
namespace blink {
class ControllerPresentationConnection;
class LocalDOMWindow;
class PresentationAvailabilityObserver;
class PresentationAvailabilityState;
class MODULES_EXPORT PresentationController
: public GarbageCollected<PresentationController>,
public mojom::blink::PresentationController,
public GarbageCollectedMixin {
public:
static const unsigned kSupplementIndex;
explicit PresentationController(LocalDOMWindow&);
PresentationController(const PresentationController&) = delete;
PresentationController& operator=(const PresentationController&) = delete;
~PresentationController() override;
static PresentationController* From(LocalDOMWindow&);
static PresentationController* FromContext(ExecutionContext*);
void Trace(Visitor*) const override;
void SetPresentation(Presentation*);
void RegisterConnection(ControllerPresentationConnection*);
ControllerPresentationConnection* FindExistingConnection(
const std::vector<blink::WebURL>& presentation_urls,
const WebString& presentation_id);
HeapMojoRemote<mojom::blink::PresentationService>& GetPresentationService();
PresentationAvailabilityState* GetAvailabilityState();
LocalDOMWindow* GetLocalDOMWindow() const { return local_dom_window_; }
virtual void AddAvailabilityObserver(PresentationAvailabilityObserver*);
virtual void RemoveAvailabilityObserver(PresentationAvailabilityObserver*);
private:
void OnScreenAvailabilityUpdated(const KURL&,
mojom::blink::ScreenAvailability) override;
void OnConnectionStateChanged(
mojom::blink::PresentationInfoPtr,
mojom::blink::PresentationConnectionState) override;
void OnConnectionClosed(mojom::blink::PresentationInfoPtr,
mojom::blink::PresentationConnectionCloseReason,
const String& message) override;
void OnDefaultPresentationStarted(
mojom::blink::PresentationConnectionResultPtr result) override;
ControllerPresentationConnection* FindConnection(
const mojom::blink::PresentationInfo&) const;
Member<LocalDOMWindow> local_dom_window_;
Member<PresentationAvailabilityState> availability_state_;
WeakMember<Presentation> presentation_;
HeapHashSet<WeakMember<ControllerPresentationConnection>> connections_;
blink::HeapMojoRemote<mojom::blink::PresentationService>
presentation_service_remote_;
HeapMojoReceiver<mojom::blink::PresentationController, PresentationController>
presentation_controller_receiver_;
};
}
#endif