blob: c85f91240f1fd96d684444931de670e529e0f606 [file] [log] [blame]
// Copyright 2017 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.
#include <memory>
#include "base/macros.h"
#include "third_party/blink/public/mojom/presentation/presentation.mojom-blink.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/modules/presentation/presentation_availability_callbacks.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
class PresentationAvailabilityObserver;
// Maintains the states of PresentationAvailability objects in a frame. It is
// also responsible for querying the availability values from
// PresentationService for the URLs given in a PresentationRequest. As an
// optimization, the result will be cached and shared with other
// PresentationRequests containing the same URL. PresentationAvailabilityState
// is owned by PresentationController in the same frame.
// TODO( Improve encapsulation of PresentationAvailability and
// this class by moving the multiple URL tracking logic to the former, and
// consolidating this class's APIs to take repeating callbacks.
class MODULES_EXPORT PresentationAvailabilityState final
: public GarbageCollected<PresentationAvailabilityState> {
explicit PresentationAvailabilityState(mojom::blink::PresentationService*);
// Requests availability for the given URLs and invokes the given callbacks
// with the determined availability value. The callbacks will only be invoked
// once and will be deleted afterwards.
void RequestAvailability(const Vector<KURL>&,
PresentationAvailabilityCallbacks* callbacks);
// Starts/stops listening for availability with the given observer.
void AddObserver(PresentationAvailabilityObserver*);
void RemoveObserver(PresentationAvailabilityObserver*);
// Updates the availability value for a given URL, and invoking any affected
// callbacks and observers.
void UpdateAvailability(const KURL&, mojom::blink::ScreenAvailability);
void Trace(blink::Visitor*);
enum class ListeningState {
// Tracks listeners of presentation displays availability for
// |availability_urls|. Shared with PresentationRequest objects with the same
// set of URLs.
class AvailabilityListener final
: public GarbageCollected<AvailabilityListener> {
explicit AvailabilityListener(const Vector<KURL>& availability_urls);
const Vector<KURL> urls;
HeapVector<Member<PresentationAvailabilityObserver>> availability_observers;
void Trace(blink::Visitor*);
// Tracks listening status and screen availability of |availability_url|.
struct ListeningStatus {
explicit ListeningStatus(const KURL& availability_url);
const KURL url;
mojom::blink::ScreenAvailability last_known_availability;
ListeningState listening_state;
// Starts listening for availability for the given URL, and calls
// PresentationService if needed.
void StartListeningToURL(const KURL&);
// Stops listening for availability for the given URL if there are no
// remaining callbacks or observers registered to it, and calls
// PresentationService if needed.
void MaybeStopListeningToURL(const KURL&);
// Returns AVAILABLE if any url in |urls| has screen availability AVAILABLE;
// otherwise returns DISABLED if at least one url in |urls| has screen
// availability DISABLED;
// otherwise, returns SOURCE_NOT_SUPPORTED if any url in |urls| has screen
// availability SOURCE_NOT_SUPPORTED;
// otherwise, returns UNAVAILABLE if any url in |urls| has screen
// availability UNAVAILABLE;
// otherwise returns UNKNOWN.
mojom::blink::ScreenAvailability GetScreenAvailability(
const Vector<KURL>&) const;
// Returns nullptr if there is no AvailabilityListener for the given URLs.
AvailabilityListener* GetAvailabilityListener(const Vector<KURL>&);
// Removes the given listener from |availability_set_| if it has no callbacks
// and no observers.
void TryRemoveAvailabilityListener(AvailabilityListener*);
// Returns nullptr if there is no status for the given URL.
ListeningStatus* GetListeningStatus(const KURL&) const;
// ListeningStatus for known URLs.
Vector<std::unique_ptr<ListeningStatus>> availability_listening_status_;
// Set of AvailabilityListener for known PresentationRequests.
HeapVector<Member<AvailabilityListener>> availability_listeners_;
// A pointer to PresentationService owned by PresentationController.
mojom::blink::PresentationService* const presentation_service_;
} // namespace blink