Window.opener null dans une publication

,

Bonjour,

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.

image

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 });

Version=4.0.P25
BuiltOn=2021-03-24 00:20 (revision 0ab578dff484419fee9205b41be7f805473ce9a4)

Est-ce quelque chose a pu changer à ce niveau ?

Merci d’avance !
Emmanuelle

Non j’en doute.
Si la fenêtre s’ouvre via un “window.open”, le opener ne peut pas être null ou alors il a été fermé.

  • il manque des quotes sur le “new” sauf si c’est un pb de copier/collé dans le post
  • il faut que votre code teste la présence du opener avant d’appeler le display au cas où

ui && ui.displayForm(...)

En fait je ne pense pas avoir accès à la façon dont la fenêtre est ouverte, c’est une publication
image

Quand j’inspecte l’imprimante

<button type="button" class="btn btn-default btn-print action-not-xs" data-action="print_BCE" data-rowid="1" data-toggle="tooltip" data-placement="bottom" data-html="true" title="" data-original-title="BCE"><img src="https://ear.k8s-stage.grouperci.com/resource?type=ICO&amp;code=printer&amp;d=responsive_ThemeAdmin_color&amp;_=cc3e1c0a38d7b0549d655541696b9efd34201031_20210412152222" class="icon"></button>

Et l’erreur quand j’exécute mon code

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

La publication est créée avec l’api Bootstrap

		BootstrapWebPage wp = new BootstrapWebPage(
			HTMLTool.getRoot(),
			"App_BCE_" + getFieldDisplayValue("rciSubName"),
			true
		);

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.

image

  • 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.

D’accord merci beaucoup, ça explique pourquoi ça fonctionnait avant.
En effet avec une action et un window.open je n’ai plus le problème.

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.

1 Like

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.