Sur un de mes objets j’ai une publication qui ouvre une page HTML dans un nouvel onglet.
Certains des éléments de cette page sont cliquables et ouvrent un formulaire d’objet dans la fenêtre mère.
Cela fonctionnait mais je constate aujourd’hui que j’ai une erreur due au opener qui est devenu null.
Le code qui plante
var ui = window.$ui || window.parent.$ui || window.opener.$ui;
ui.displayForm(null, RciApplication, this.getAttribute('id'), { showNav: true, nav: new });
Uncaught TypeError: Cannot read property ‘$ui’ of null
at HTMLDivElement. (RciSubsidiary?template=BCE&inst=the_ajax_RciSubsidiary&row_id=2:196)
at HTMLDivElement.dispatch (jquery-1.11.1.min.js:3)
at HTMLDivElement.r.handle (jquery-1.11.1.min.js:3)
Je peux tester le opener pour éviter l’erreur mais ça ne va pas m’aider à récupérer le $ui
Ca ne dit pas qui est null dans votre expression var ui = window.$ui || window.parent.$ui || window.opener.$ui;
si ça se trouve c’est le parent = pas d’iframe.
Essayez un code plus robuste en debug :
debugger
var ui = window.$ui;
if (!ui && window.parent) // cas iframe
ui = window.parent.$ui;
if (!ui && window.opener) // cas window.open
ui = window.opener.$ui;
if (ui)
ui.displayForm...
else
alert("No UI to display the form");
En fait je voyais dans le watch que c’est le opener qui est null. Window et parent n’ont pas d’UI parce que c’est une fenêtre HTML ouverte via le bouton print.
Normalement le opener a une UI mais je ne comprends pas pourquoi il est null. C’est pour ça que j’essaie de trouver la commande qui ouvre ma page HTML.
Si tout est nul, le bouton Print fait surement un $ui.openURL = <a href=... target="_blank"> et pas un window.open() pour éviter un blocage anti-popup du navigateur, seul Firefox fait un “window.open”
En général un contenu HTML est encapsulé dans une <iframe> pour ne pas interférer avec la UI.
Essayez de créer une Action (de type front qui fait explicitement un “window.open” vers une URL d’objet externe dont le display équivaut à votre publication) plutôt qu’une Publication, pour voir si le opener est toujours null ?
Je vais voir de mon côté si un $('<a href=... target="_blank">').click() fait perdre son opener.
Il y a effectivement eu des modifications récentes sur les navigateurs pour éviter des failles XSS.
Il semblerait que le rel="noopener" soit devenu la valeur par défaut sur chrome (alors que la norme d’un target=_blank était rel=“opener” par défaut sans avoir besoin de le spécifier).
On va devoir investiguer plus en détail sur tous les navigateurs récents.
C’était bien ça, depuis la version Chrome 88 de Janvier dernier, le window.opener est null par défaut quand on ouvre un TAB via un <a target=_blank>.
On a forcé le rel="opener" et tout est rentré dans l’ordre, en espérant que Chrome ne change pas encore la règle de sécurité, auquel cas on sera contraint de faire un window.open (qui ouvre un navigateur et pas un simple TAB). Idem pour Edge qui utilise chromium.
Firefox ne supportant pas le target=_blank n’avait pas ce problème.