Résumé
Les aperçus PDF intégrés réinitialisent systématiquement leur position de défilement (retour à la page 1) lors du défilement dans un long sujet. Cela se produit parce que l’intégration PDF est détruite et réinsérée lorsque le message sort de la vue, probablement en raison du recyclage/de la virtualisation du flux de messages de Discourse.
Ceci affecte tous les navigateurs, tous les PDF, et se produit même avec tous les plugins et thèmes désactivés.
Étapes de reproduction
- Créez un sujet avec une pièce jointe PDF.
- Assurez-vous que le composant Aperçus PDF intégrés est actif.
- Faites défiler le sujet vers le bas jusqu’à ce que le message contenant le PDF quitte la zone visible (viewport).
- Faites défiler à nouveau vers le haut jusqu’à l’aperçu PDF en question.
- Résultat :
- Le PDF se recharge depuis le début.
- La position de défilement de l’aperçu est perdue.
- Le PDF est ré-affiché comme s’il venait d’être chargé.
Aucune requête réseau pour le PDF n’est effectuée, ce qui indique que le nœud DOM a été supprimé localement et recréé.
Comportement attendu
- L’aperçu PDF devrait conserver sa position de défilement et ne devrait pas se recharger simplement en faisant défiler le sujet.
- Les autres contenus intégrés (images, vidéos, Oneboxes) ne réinitialisent pas leur état lors du défilement ; les aperçus PDF devraient se comporter de manière cohérente.
Comportement actuel
- Dès que le message sort de la plage visible, Discourse décharge le nœud DOM.
- Lorsque le message revient dans la zone visible, l’intégration est reconstruite.
- Cela force le moteur de rendu PDF natif du navigateur à recommencer depuis la page 1.
- Cela se produit chaque fois que le message quitte la zone visible (vers le haut ou vers le bas).
Environnement
- Se produit sur tous les navigateurs testés : Chrome, Firefox, Safari, Edge
- Se produit avec tous les plugins désactivés (Mode sans échec)
- Se produit avec tous les composants de thème désactivés
- Se produit avec plusieurs fichiers PDF de tailles et formats différents
- Se produit sur la branche la plus récente de Discourse (tests-passed) (à la date de publication)
Notes techniques
Discourse semble démonter les composants de message hors écran dans le cadre de la virtualisation de flux. Étant donné que l’aperçu PDF utilise un simple <embed> / <iframe>, il ne dispose d’aucun mécanisme de persistance, il se réinitialise donc complètement chaque fois que :
willDestroyElement()est déclenché- le conteneur du message est ré-rendu
- le nœud DOM est recréé lors du retour dans la zone visible
Ceci est unique aux PDF car les visionneuses PDF natives du navigateur ne conservent pas l’état de défilement lors de la reconstruction du DOM.
Cela rend la lecture de longs sujets contenant des PDF frustrante, en particulier pour les pièces jointes de plusieurs pages.
Résolution demandée
- Empêcher la destruction du composant Aperçu PDF intégré lors du recyclage des messages OU
- Fournir un moyen aux composants de plugin/thème de déclarer un « état persistant » afin que Discourse ne les démonte pas
- Ou exposer un réglage de site pour désactiver le recyclage du flux de messages pour les messages contenant des visionneuses PDF intégrées
Même une correction partielle — par exemple, ignorer le recyclage pour les messages contenant des intégrations PDF — résoudrait le problème.
Contexte supplémentaire
Ce n’est pas un problème d’environnement isolé : il a été reproduit de manière fiable dans des versions de test propres, sur plusieurs navigateurs et avec différents PDF.
Il n’y a pas de sujets Meta décrivant ce comportement, il pourrait donc s’agir d’une régression non signalée ou d’une conséquence imprévue des améliorations de la virtualisation de flux.