(onCreateWindow dans Webchromeclient) | |
Ouvrir un pop-up dynamique | ![]() |
Ouvrir un pop-up nouvelle URL | ![]() |
Ouvrir une page web contenant un Iframe | ![]() |
Les Pop-up
Les Webviews d'Android sont assez faciles à utiliser à l'exception notable de la Webchromeclient onCreateWindow. Il est appelé lorsque la webview souhaite que l'application hôte crée une nouvelle fenêtre. Et new est la clé. Si on ne cré pas une nouvelle webview, l'appel à onCreateWindow échoue, et celà sans exceptions ni erreurs !!.
Aprés avoir essayer pas mal de choses différentes qui toutes fonctionnaient de façon bancale, il m'a semblé que pour obtenir un résultat acceptable au fonctionnement de onCreateWindow, il faut créér un layout spécifique. Dans le layout de l'activité principale (webview) on rajoute à la vue Web principale une mise en page relative qui tiendra lieu de vue Web enfant une fois qu'elle est créée.
onCreateWindow est déclenché à chaque fois que l'utilisateur ouvre une fenêtre de type Popup si on autorise l'ouverture dans la webView : setJavaScriptCanOpenWindowsAutomatically(true);. Dans un navigateur, cela provoque l'ouverture du lien de destination dans une nouvelle fenêtre ou un nouvel onglet, mais dans une vue Web, il n'y a aucun moyen de le faire sans l'aide de l'application parent, d'ou l'appel à onCreateWindow et son comportement de lancer le navigateur si l'appel échoue.
C'est le travail de la méthode onCreateWindow. dans un premier temps la méthode supprime toutes les fenêtres enfants qui peuvent encore être attachés à browserLayout, ensuite, il rend l'ensemble enfantLayout visible qui par défaut est défini invisible. Ensuite, il faut créer une nouvelle webview et lui donner quelques paramètres pour la faire fonctionner correctement. Il s'agit alors d'informer la nouvelle webview qu'elle sera utilisée pour afficher le nouveau lien.
Ensuite, il faut définir le client webview pour avoir accès à la méthode onPageFinished qui permet,outre, de lire le titre de la vue, et de définir ce texte dans mainTitleText Textview.
Pour informer le système que la nouvelle webview sera utilisée pour la page du lien, on convertit les resultatsMsg.obj en Webviewtransport, et on appelle setWebView avec une référence à la nouvelle webview.
Les i-Frame
Pas de problème particulier. Les i-Frame sont chargées avec la page demandée.
ATTENTION
Le comportement des Pop-Up et I-Frame constitue une nouvelle classe de vulnérabilités WebView Android appelées vulnérabilités de contexte différentiel ou VCD.
En effet un iframe/popup web non fiable à l’intérieur de WebView peut être dangereux en pouvant lancer des attaques sur les solutions de défense existantes, et obtenir des privilèges tels que briser l’intégrité de la messagerie web, accéder furtivement à des fonctionnalités mobiles sensibles et effectuer des attaques d’hameçonnage.
Princialement en raison de l’absence de la barre d’adresse il est difficile pour les utilisateurs de savoir quel type de contenu web est chargé.