Retour au Centre de connaissances
Plateforme

Presentation API : limites d écran et de session

Concevez un flux Presentation API avec disponibilité d écran, activation utilisateur, reconnexion, fermeture, messages bornés et repli dans la page.

BotBrowser Team

Documentation

Vous voulez la documentation structurée pour Plateforme ?

Cet article fait partie de la bibliothèque éditoriale. Pour les étapes de configuration, la référence et les mises à jour continues, passez directement à la section docs.

BotBrowser peut valider un flux Presentation API autorisé quand un navigateur contrôlé expose les méthodes et qu'une action déclarée démarre la demande. Il ne peut pas créer un récepteur ou un écran physique, choisir un destinataire ni prouver une livraison. La limite utile est un état visible : la page demande, le navigateur arbitre, la présentation peut se connecter et la même tâche reste dans la page si une limite refuse la demande.

Une action utilisateur passe par la disponibilité d écran vers PresentationRequest, des messages bornés, la reconnexion, la fermeture et un repli dans la page

TL;DR

Presentation API relie un contexte de navigation contrôleur à un écran de présentation, sans transformer cet écran en appareil adressable par la page. Détectez PresentationRequest, observez PresentationAvailability comme un signal d’exécution et appelez start() depuis un clic ou une touche. Considérez connected, closed, terminated, les promesses rejetées et l’absence d’écran comme des états ordinaires. Gardez une prévisualisation ou des commandes dans la page.

La spécification W3C Presentation API décrit le démarrage, la reconnexion, la disponibilité, les événements et les messages. MDN indique une disponibilité limitée. BotBrowser peut enregistrer les états exposés par le navigateur, mais ne prouve ni un second écran physique ni le fait qu’une personne ait vu un message.

Sommaire

La disponibilité n’est pas un inventaire

PresentationRequest contient des URL que l’agent utilisateur peut charger dans un récepteur choisi par le navigateur. PresentationAvailability indique seulement si une présentation compatible semble disponible. Ce n’est pas une liste de téléviseurs, de projecteurs ou de personnes. availability.value === true peut activer un bouton, mais n’identifie aucun écran.

La sélection appartient au navigateur. Ne mémorisez pas un nom supposé d’appareil. Les URL sont des routes applicatives, non des adresses matérielles. Si le constructeur manque, si une politique refuse l’API ou si la disponibilité vaut false, affichez la même vue dans la page. Le guide propriétés d’écran et de viewport distingue déjà géométrie et identité ; Presentation API ajoute une session médiée, pas une empreinte d’écran.

const presentation =
  'PresentationRequest' in window ? new PresentationRequest(['/present/board', '/present/fallback']) : null;

let displayAvailable = false;
if (presentation) {
  try {
    const availability = await presentation.getAvailability();
    displayAvailable = availability.value;
    availability.onchange = () => {
      displayAvailable = availability.value;
      renderPresentationControl({ displayAvailable });
    };
  } catch {
    renderPresentationControl({ displayAvailable: false });
  }
}

Démarrer avec une activation utilisateur

Appelez presentation.start() dans le gestionnaire d’un bouton ou d’une touche. Pas au chargement, dans un minuteur ou après une réponse réseau. Le navigateur peut rejeter la promesse pour un problème de support, d’activation, de politique ou de sélection d’écran. L’activation transitoire peut disparaître pendant une attente inutile.

async function startPresentation() {
  if (!presentation) return showInline('unsupported');
  if (!displayAvailable) return showInline('unavailable');
  setPresentationState('starting');
  try {
    const connection = await presentation.start();
    attachConnection(connection);
    setPresentationState(connection.state);
  } catch (error) {
    setPresentationState(classifyPresentationError(error));
    showInline('fallback');
  }
}
startButton.addEventListener('click', startPresentation);

La disponibilité est une indication antérieure au clic ; le résultat de start() décide de cet essai. Évitez les doubles demandes avec starting, puis permettez une nouvelle tentative. Pour une autre remise médiée par le navigateur, Web Share API : limites de permission et repli sépare aussi capacité, activation et livraison.

Modéliser le cycle complet

Une connexion peut passer par connecting, connected, closed et terminated. Écoutez onconnect, onclose, onterminate et onmessage, puis libérez les écouteurs à la fermeture. La reconnexion est une action distincte : un identifiant de présentation est opaque, peut expirer et ne prouve pas le retour du même écran physique.

function attachConnection(connection) {
  connection.onconnect = () => setPresentationState('connected');
  connection.onclose = () => {
    setPresentationState('closed');
    showInline('fallback');
  };
  connection.onterminate = () => {
    setPresentationState('terminated');
    showInline('fallback');
  };
  connection.onmessage = event => acceptBoundedMessage(event.data);
}

Si la disponibilité devient false, attendez l’événement de connexion avant de déclarer la session fermée. Après close ou terminate, ne laissez pas le texte « connecté » persister. La page conserve son travail. Document Picture-in-Picture : fenêtres et permissions permet de comparer une fenêtre auxiliaire et une session de présentation.

Messages bornés et repli local

Définissez une enveloppe avec version, revision, une liste de types et une taille maximale. Refusez les types inconnus et les révisions anciennes. Un message reçu est un événement de protocole, pas une preuve de pixels ni de lecture humaine. Validez la route et la version côté récepteur, échappez le contenu et fermez en cas de protocole inconnu.

const MAX_MESSAGE_BYTES = 16_384;
let revision = 0;
function makeMessage(type, content) {
  const message = { version: 1, revision: ++revision, type, content };
  const encoded = JSON.stringify(message);
  if (new TextEncoder().encode(encoded).length > MAX_MESSAGE_BYTES) throw new Error('message-too-large');
  return encoded;
}

Conservez le modèle métier dans le magasin normal de la page et dérivez une petite vue de présentation. Après fermeture, l’édition locale continue ; après reconnexion, envoyez la révision courante. Un délai borné et une seule reprise évitent la boucle infinie.

Table de décision

État observéAction sûreNe pas affirmer
PresentationRequest absentAfficher la vue localeSupport universel
Disponibilité falseGarder le repliAucun écran physique n’existe
start() rejetéEnregistrer la catégorieUn appareil nommé a refusé
connectedEnvoyer une révision bornéeChaque pixel a été rendu
Message reçuValider l’enveloppeUne personne l’a confirmé
close ou terminateLibérer et proposer une nouvelle tentativeL’écran reste disponible
Reconnexion rejetéeEffacer le jeton après le budgetLe même écran a été récupéré

Tester la limite visible avec BotBrowser

Un contexte contrôlé BotBrowser peut lancer un bouton déterministe et enregistrer constructeur, disponibilité, transitions et visibilité du repli. Un résultat unsupported, unavailable ou start-rejected est valide si le repli reste fonctionnel. La documentation des fonctions avancées BotBrowser ne transforme pas le lanceur en récepteur physique.

{
  "request": "PresentationRequest",
  "availability": "unknown",
  "states": ["starting", "fallback"],
  "messagesAccepted": 0,
  "fallbackVisible": true,
  "delivery": "not-observed",
  "physicalDisplay": "not-asserted"
}

Répétez le fixture en ne changeant qu’une variable : version du navigateur, geste, disponibilité, réseau ou identifiant. Comparez la première transition divergente sans transformer une exécution locale en promesse universelle.

Conclusion

La page possède l’état et le navigateur la médiation d’écran. Détectez le support, démarrez avec une action visible, bornez les messages et traitez fermeture, terminaison et échec de reconnexion comme des états attendus. BotBrowser peut rejouer et comparer ce contrat visible dans des contextes autorisés ; il ne crée pas de second écran, ne choisit pas de destinataire et ne garantit pas la livraison.

Sources publiques

À lire ensuite

Voir Document Picture-in-Picture : limites de permission et de fenêtre et Web Share API : limites de permission et repli sûr.

#Presentation API#Second Écran#Sessions Navigateur#Confidentialité#BotBrowser

Cet article fait partie du guide : Surfaces de la plateforme web : carte de revue

Faites passer BotBrowser de la recherche à la production

Utilisez ces guides pour comprendre le modèle, puis passez à la validation multi-plateforme, aux contextes isolés et au déploiement navigateur prêt pour l'échelle.