discovery-media-player 0.1.125 → 0.1.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discovery-media-player",
3
- "version": "0.1.125",
3
+ "version": "0.1.126",
4
4
  "description": "Self-hosted document viewer: per-recipient tracked links, reading analytics, live presentation. The core knows nothing about the application hosting it — everything it borrows arrives through an injected context.",
5
5
  "keywords": [
6
6
  "pdf-viewer",
@@ -322,6 +322,11 @@ ${LEGAL_CSS}
322
322
  var taches={}; // n -> RenderTask, pour pouvoir ANNULER
323
323
  var enCours={}; // n -> 1 tant que la page n a pas abouti
324
324
  var MARGE_PAGES=2; // on garde la page courante et deux de chaque cote
325
+ // ATTENTION : UNE GENERATION PAR PAGE. La generation globale (renderGen) ne bouge qu au build ;
326
+ // une page liberee PENDANT que son rendu ou sa couche texte est en vol gardait donc la meme
327
+ // generation, et le resultat tardif se posait sur une page remise en reserve. On incremente
328
+ // donc a chaque liberation, et chaque callback verifie SA page.
329
+ var genPage=Object.create(null);
325
330
  var DPR_MAX=2; // au-dela, le gain visuel est nul et le cout quadratique
326
331
  var PIXELS_MAX=4e6; // plafond par canvas : ~4 M pixels = ~16 Mo de tampon
327
332
  var onePage=false, soloOffered=false; // mode « une seule page » (présentation guidée) + offre de découverte solo
@@ -754,6 +759,7 @@ ${LEGAL_CSS}
754
759
  // Rend une page a l etat de reserve : on retire le canvas et la couche texte, on remet la boite
755
760
  // avec sa hauteur estimee. Le defilement ne bouge pas, et la page se re-rendra si on y revient.
756
761
  function libererPage(n){
762
+ genPage[n]=(genPage[n]||0)+1; // invalide tout callback en vol pour CETTE page
757
763
  var el=pagesEl.querySelector('.page[data-p="'+n+'"]'); if(!el)return;
758
764
  if(taches[n]){ try{ taches[n].cancel(); }catch(e){} delete taches[n]; }
759
765
  var w=Math.round(targetWidth());
@@ -766,10 +772,25 @@ ${LEGAL_CSS}
766
772
  // passer le cas qui fait tomber l onglet. On garde donc la fenetre courante, et on evince
767
773
  // au-dela — le nombre de canvas reste borne quel que soit le parcours du document.
768
774
  function evincerLoin(centre){
769
- if(onePage) return; // une seule page affichee : rien a evincer
770
- for(var k in rendered){
775
+ // ATTENTION : LE MODE UNE-PAGE EVINCAIT ZERO, ET MON COMMENTAIRE DISAIT POURQUOI — A TORT.
776
+ //
777
+ // Il portait « une seule page affichee : rien a evincer ». Une seule est AFFICHEE, mais
778
+ // showPage() rend la page courante ET la suivante a chaque navigation, et toutes les
779
+ // precedentes restent dans le DOM. Une presentation guidee de 100 pages finissait donc avec
780
+ // pres de 100 canvas — exactement le defaut que la fenetre glissante ferme ailleurs.
781
+ // Un raisonnement faux ecrit avec assurance fait passer un defaut pour une intention.
782
+ // (Releve par un audit externe.)
783
+ var marge = onePage ? 1 : MARGE_PAGES; // une-page : courante, suivante, precedente
784
+ // ATTENTION : ON PARCOURT L UNION DES TROIS REGISTRES. rendered seul ignore ce qui est EN
785
+ // VOL : une page eloignee dont le getPage n est pas resolu continuait a travailler, et sa
786
+ // couche texte pouvait se poser plus tard sur une page deja liberee.
787
+ var vus = Object.create(null);
788
+ for(var a in rendered) vus[a]=1;
789
+ for(var b in enCours) vus[b]=1;
790
+ for(var c in taches) vus[c]=1;
791
+ for(var k in vus){
771
792
  var n=+k;
772
- if(n<centre-MARGE_PAGES || n>centre+MARGE_PAGES) libererPage(n);
793
+ if(n<centre-marge || n>centre+marge) libererPage(n);
773
794
  }
774
795
  }
775
796
  function renderPage(n,el){
@@ -778,7 +799,7 @@ ${LEGAL_CSS}
778
799
  // donc un echec de getPage ou de render laissait la page marquee pour toujours : elle ne se
779
800
  // retentait jamais et restait vide. On distingue « en cours » de « aboutie ».
780
801
  enCours[n]=1;
781
- var gen=renderGen;
802
+ var gen=renderGen, monGenPage=genPage[n]||0;
782
803
  if(IS_IMG){
783
804
  var w=Math.round(targetWidth());
784
805
  var im=document.createElement('img');
@@ -791,17 +812,28 @@ ${LEGAL_CSS}
791
812
  return;
792
813
  }
793
814
  pdfDoc.getPage(n).then(function(page){
794
- if(gen!==renderGen){ delete enCours[n]; return; } // un build() est passe : ce rendu n est plus attendu
815
+ // Un build() est passe (generation globale), ou CETTE page a ete liberee entre-temps.
816
+ if(gen!==renderGen || monGenPage!==(genPage[n]||0)){ delete enCours[n]; return; }
795
817
  // ATTENTION : LE DPR N ETAIT PAS PLAFONNE. Sur un ecran ×3, une page de 900 px de large fait
796
818
  // pres de 10 M pixels, soit environ 39 Mo de tampon pour UNE page — le gain visuel au-dela de
797
819
  // ×2 est nul, le cout est quadratique. On plafonne le DPR, puis on plafonne le NOMBRE DE
798
820
  // PIXELS du canvas : deux bornes, parce que le zoom peut faire grandir la page independamment
799
821
  // de la densite de l ecran.
800
- var dpr=Math.min(DPR_MAX, window.devicePixelRatio||1);
801
822
  var scale=Math.min(5,targetWidth()/page.getViewport({scale:1}).width);
802
823
  var v=page.getViewport({scale:scale});
803
- var pixels=Math.floor(v.width*dpr)*Math.floor(v.height*dpr);
804
- if(pixels>PIXELS_MAX) dpr=Math.max(1, dpr*Math.sqrt(PIXELS_MAX/pixels));
824
+ // ATTENTION : LE PLANCHER A 1 CREVAIT LE BUDGET, ET LE BUDGET ETAIT ANNONCE.
825
+ //
826
+ // L ancienne formule reduisait le DPR sans jamais le laisser descendre SOUS 1. Or au zoom
827
+ // maximal la taille CSS a elle seule depasse le budget : a 300 %, une page de 4110×5319 CSS
828
+ // faisait 21,9 M pixels — soit ×5,5 le plafond annonce, environ 83 Mo de tampon pour UNE
829
+ // page. Le plancher visait la nettete ; il annulait la borne exactement quand elle servait.
830
+ //
831
+ // Le facteur se calcule donc depuis la taille CSS, borne par trois choses a la fois : le
832
+ // plafond de densite, la densite REELLE de l ecran (ne jamais sur-rendre), et le budget de
833
+ // pixels — qui peut le faire descendre sous 1. Verifie par calcul sur cinq configurations
834
+ // avant d etre ecrit. (Releve par un audit externe.)
835
+ var pixelsCss=Math.max(1, v.width*v.height);
836
+ var dpr=Math.min(DPR_MAX, window.devicePixelRatio||1, Math.sqrt(PIXELS_MAX/pixelsCss));
805
837
  var c=document.createElement('canvas');
806
838
  c.setAttribute('role','img'); c.setAttribute('aria-label','Page '+n);
807
839
  c.width=Math.floor(v.width*dpr); c.height=Math.floor(v.height*dpr); // backing store HD → net comme du natif
@@ -811,7 +843,7 @@ ${LEGAL_CSS}
811
843
  taches[n]=tache;
812
844
  tache.promise.then(function(){
813
845
  if(taches[n]===tache) delete taches[n];
814
- if(gen!==renderGen){ delete enCours[n]; return; }
846
+ if(gen!==renderGen || monGenPage!==(genPage[n]||0)){ delete enCours[n]; return; }
815
847
  delete enCours[n]; rendered[n]=1; // AVEREE, pas seulement demandee
816
848
  hideLoader(); if(n===cur)setTimeout(vsplitTint,60);
817
849
  },function(){
@@ -822,6 +854,10 @@ ${LEGAL_CSS}
822
854
  // Couche texte (sélection). En pdf.js v3, les spans utilisent font-size:calc(var(--scale-factor)*Npx)
823
855
  // → SANS --scale-factor, taille nulle = pas de sélection. On le pose sur le conteneur.
824
856
  try{ page.getTextContent().then(function(tc){
857
+ // ATTENTION : LA COUCHE TEXTE ARRIVE APRES, ET SE POSAIT SUR UNE PAGE LIBEREE. Elle
858
+ // ressuscitait alors une page remise en reserve — visible comme un bloc de texte
859
+ // selectionnable flottant sur un cadre vide.
860
+ if(gen!==renderGen || monGenPage!==(genPage[n]||0)) return;
825
861
  var tl=document.createElement('div'); tl.className='textLayer';
826
862
  tl.style.width=v.width+'px'; tl.style.height=v.height+'px'; tl.style.setProperty('--scale-factor', scale);
827
863
  el.appendChild(tl);