Dépistage d'un dysfonctionnement de rendu et de capture d'événements dans les modales Ant Design sous DingTalk WebView

Analyse contextuelle et signalement

Lors de l'audit de conformité sur une branche de production, un rapport critique indique que les fenêtres modales activées par les utilisateurs finaux restent inopérantes et invisibles. La reproduction locale dans les environnements de test standardisés confirme un fonctionnement nominal, ce qui oriente immédiatement l'investigation vers des spécificités liées à l'environnement d'exécution cible.

Identification des disparités d'environnement

L'application web est distribuée via l'interface intégrée à DingTalk. Les métadonnées UA remises par le parc client pointent vers DingTalk 7.6.47 tournant sous macOS Catalina (10.15.7) sur architecture Intel. En parallèle, la chaîne de développement utilise majoritairement des machines Apple Silicon et des versions récentes d'OS. Cet écart technique suggère une incompatibilité avec le moteur de rendu Chrmoium embarqué (NW.js/DingTalk Webview), qui applique souvent des politiques de sécurité ou de layout différentes des navigateurs grand public.

Diagnostic initial et vérification distante

Pour écarter un impact lié aux calculs graphiques, les transitions CSS associées à l'ouverture et à la superposition sont désactivées :

<MyDialogComponent
  isOpen={true}
  animateEntering={false}
  animateExiting={false}
  hideOverlayOnClose={false}
/>

Cette modification n'influe pas sur le comportement observé. Un accès à distance via des outils de monitoring DOM révèle que l'arbre généré est structuralement valide. Le nœud parent existe bel et bien, mais conserve une visibilité nulle et intercepte aucune interaction tactile. L'ouverture du même flux URL dans Safari native fonctionne parfaitement, confirmant que le point de défaillance réside exclusivement dans le navigateur personnalisé.

Investigation structurelle et correction CSS

La virtualisation d'un Mac Intel sous Catalina a permis de stabiliser les tests. L'examen attentif du modèle de boîte montre que le mécanisme de centrage dynamique (généralement piloté par Flexbox ou Grid moderne) échoue à calculer les hauteurs relatives dans ce contexte WebView legacy.

Trois axes de correcsion ont été évalués :

  • Indice de superposition (z-index) : Aucun élément frère ne recouvre la modale, cette piste est invalidée.
  • Accélération matérielle (transform) : Forcer un contexte de rendu GPU ne restaure pas l'expansion spatiale du conteneur.
  • Contraintes de positionnement explicites : Le défaut provient d'un calcul de hauteur intrinsèque nullifié par le moteur de layout du WebView.

La résolution effective nécessite d'imposer une référence absolue et des bornes dimensionnelles garanties, contournant ainsi le comportement par défaut :

.overlay-layer-backdrop {
  position: absolute;
  inset: 0;
  min-height: 100vh;
  width: 100%;
  pointer-events: auto;
}

.dialog-wrapper-container {
  position: absolute;
  top: 6vh;
  left: 50%;
  transform: translateX(-50%);
  min-height: calc(100vh - 12vh);
  display: flex;
  flex-direction: column;
  align-items: center;
}

Application de ces déclarations CSS restaure la géométrie réelle du composant. La zone Interactive (hit area) se redimensionne correctement, autorisant la propagation des événements clavier et souris jusqu'aux contrôleurs internes.

Retours d'expérience technique

Ce scénario met en lumière les limites des modèles de layout flexibles lorsqu'ils sont exécutés dans des forks propriétaires datant de plusieurs années. Les composants front-end contemporains reposent sur des polyfills et des optimisations CSS supposant des standards récents. Lorsqu'un WebView ne suppotre pas certaines propriétés de calcul de dimension, le recours à des positions fixes (fixed ou absolute) couplées à des hauteurs minimales explicites constitue un mécanisme de fallback fiable. La démarche structurée d'isolation des couches graphiques, comparée systématiquement entre moteur natif et embarqué, demeure la méthode la plus efficace pour résoudre ces anomalies de rendu silencieuses.

Étiquettes: AntDesign React CSSPositioning DingTalkWebView ChromiumRenderingEngine

Publié le 10 septembre à 16h19