Non standard
Cette fonctionnalité n'est ni standard, ni en voie de standardisation. Ne l'utilisez pas pour des sites accessibles sur le Web : elle ne fonctionnera pas pour tout utilisateur. Il peut également y avoir d'importantes incompatibilités entre les implémentations et son comportement peut être modifié dans le futur.
Cette API est disponible sur Firefox OS pour des applications privilégiées ou certifiées seulement.
Résumé
L'API HTML Browser (Navigateur HTML) est une extension de l'élément <iframe>
qui permet aux applications d'implémenter des navigateurs ou des applications de navigations. Cela implique deux choses principales :
- Il faut faire apparaître l'élément
iframe
comme une fenêtre de navigation à part entière au sein du contenu intégré. Cela signifie que les propriétéswindow.top
,window.parent
,window.frameElement
et autres ne devraient pas refléter la structure de la frame. Il est également possible d'exprimer ce qui est intégré au sein de l'application web. - Une API pour manipuler et surveiller l'état du contenu.
Il est également possible de communiquer sur le fait que le contenu intégré soit une application web. Dans ce cas, le contenu sera chargé avec le contexte pertinent (comme les permissions).
Utilisation
Un élément <iframe>
est transformé en fenêtre de navigateur en utilisant l'attribut mozbrowser
:
<iframe src="https://hostname.tld" mozbrowser>
Afin d'intégrer une application web, il faut également renseigner l'attribut mozapp
, la valeur sera le chemin vers le manifeste de l'application :
<iframe src="https://hostname.tld" mozapp='https://chemin/du/manifeste.webapp' mozbrowser>
Enfin, en utilisant l'attribut remote
le contenu de l'élément<iframe>
peut être chargé en utilisant uniquement un processus fils qui sera séparé de celui de la page qui contient l'élément <iframe>
.
<iframe src="https://hostname.tld" mozbrowser remote>
Warning : Ce dernier attribut est indispensable pour des raisons de sécurité lors du chargement de contenu provenant d'une origine inconnue. Si vous ne l'utilisez pas, cela rendra votre application vulnérable aux attaques d'un site web malveillant.
Permissions de l'application
Chaque application qui souhaite intégrer une fenêtre de navigateur devra avoir la permission browser
au sein du manifeste d'application.
{ "permissions": { "browser": {} } }
Si elle souhaite intégrer une application web, l'application hôte devra disposer de la permission embed-apps
.
{ "permissions": { "browser": {}, "embed-apps": {} } }
Méthodes supplémentaires
Afin d'être conforme aux spécifications d'un navigateur <iframe>
, Firefox OS étend l'interface DOM HTMLIFrameElement
. Ces nouvelles méthodes permettent d'augmenter les capacités de l'élément <iframe>
:
Les méthodes de navigation
Ces méthodes permettent de naviguer au sein de l'historique de l'élément <iframe>
. Elles sont nécessaires afin d'implémenter les boutons de pages précédentes, suivantes ou le bouton d'actualisation de la page.
reload()
: permet de recharger le contenu de l'élément<iframe>
.stop()
: permet d'arrêter le chargement du contenu de l'élément<iframe>
.getCanGoBack()
: permet de de savoir s'il est possible de naviguer dans les pages précédentes (s'il y en a).goBack()
: remplace l'emplacement de l'élément<iframe>
par l'emplacement précédent contenu dans l'historique.getCanGoForward()
: permet de savoir s'il est possible de naviguer vers la (les) page(s) suivante(s).goForward()
: remplace l'emplacement de l'élément<iframe>
par l'emplacement suivant contenu dans l'historique.
Les méthodes liées aux performances
Ces méthodes sont utilisées pour gérer les ressources utilisées par un navigateur contenu dans un élément <iframe>
. Cela est particulièrement utile lorsqu'il s'agit d'un navigateur utilisant des onglets.
setVisible()
: modifie la visibilité du navigateur<iframe>
. Cela peut avoir un impact sur l'allocation des ressources et des fonctions d'utilisations commerequestAnimationFrame
.getVisible()
: permet de connaître l'état de visibilité du navigateur<iframe>
à un moment.purgeHistory()
: permet de supprimer toutes les ressources associées au navigateur<iframe>
(comme les cookies, le cache...) .
Méthodes liées aux événements
Afin de gérer le contenu du navigateur <iframe>
il est nécessaire d'introduire de nouveaux événements (voir ci-après). Les méthodes suivantes peuvent être utilisées pour manipuler ces événements :
- L'élément
<iframe>
aura le support des méthodes suivantes de l'interfaceEventTarget
:addEventListener()
,removeEventListener()
etdispatchEvent()
. sendMouseEvent()
: permet d'envoyer un événementMouseEvent
au contenu de l'élément<iframe>
.sendTouchEvent()
: permet d'envoyer un événementTouchEvent
au contenu de l'élément<iframe>
. Cette méthode n'est disponible que pour les appareils disposant d'une interface tactile.addNextPaintListener()
: permet de définir un gestionnaire d'événement pour surveiller le premier événementMozAfterPaint
du navigateur<iframe>
.removeNextPaintListener()
: permet de supprimer un gestionnaire d'événement qui avait été créé avecaddNextPaintListener()
.
Méthodes diverses
Ces méthodes sont des utilitaires destinés aux applications qui conteiennent un navigateur <iframe>
.
getScreenshot()
: permet de prendre une capture d'écran du contenu du navigateur<iframe>
. Ceci est surtout utile pour avoir un aperçu en vignettes pour une application de navigation à onglets.
Événements
Afin de permettre à une application de manipuler le navigateur <iframe>
, l'application peut écouter, surveiller les nouveaux événements qui se passent au sein du navigateur <iframe>
. Il est possible de surveiller les événements suivant :
mozbrowserasyncscroll
: est envoyé lorsque la position du déroulement (scrolling) change au sein du navigateur<iframe>
mozbrowserclose
: est envoyé lorsque la méthodewindow.close()
est appelée au sein du navigateur<iframe>
.mozbrowsercontextmenu
: est envoyé lorsque le navigateur<iframe>
tente d'ouvrir un menu contextuel. Cela permet notamment de manipuler l'élément<menuitem>
disponible dans le contenu du navigateur<iframe>
.mozbrowsererror
: est envoyé lorsqu'il y a une erreur pendant le chargement d'un contenu dans le navigateur<iframe>
.mozbrowsericonchange
: est envoyé lorsqu'il y a une modification du favicon du navigateur<iframe>
.mozbrowserloadend
: est envoyé lorsque le navigateur<iframe>
a terminé de charger tout ses composants.mozbrowserloadstart
: est envoyé lorsque le navigateur<iframe>
commence à charger une nouvelle page.mozbrowserlocationchange
: est envoyé lorsqu'il y a un changement d'emplacement (un changement de page par exemple) dans le navigateur<iframe>
.mozbrowseropenwindow
: est envoyé lorsque la méthodewindow.open()
est appelée à partir du navigateur<iframe>
.mozbrowsersecuritychange
: est envoyé lorsqu'il y a un changement de l'état SSL du navigateur<iframe>
. Cet événement fournit deux propriétés :state
qui est une chaîne de caractères qui peut prendre les valeurs"broken"
,"secure"
ou"insecure"
;isEV
qui doit valoirtrue
si le certificat SSL courant est un certificat Extend Validation (cependant, à l'heure actuelle, il renvoie toujoursfalse
tant que le bogue bug 764496 n'est pas réparé).mozbrowsershowmodalprompt
: est envoyé lorsque les méthodesalert()
,confirm()
ouprompt()
sont appelées depuis un navigateur<iframe>
.mozbrowsertitlechange
: est envoyé lorsqu'il y a un changement de la propriétédocument.title
dans le navigateur<iframe>
.mozbrowserusernameandpasswordrequired
: est envoyé lorsqu'une authentification HTTP est demandée.
Exemple
Dans cet exemple, nous verrons comment implémenter un navigateur intégré de manière simplifiée.
HTML
Dans le code HTML, il faut juste ajouter une barre pour la saisie de l'URL, un bouton « Aller à », un bouton « Arrêter » et un élément <iframe>
pour le navigateur.
<header> <input id="url"> <button id="go">Aller à</button> <button id="stop">Arrêter</button> </header> <iframe src="about:blank" mozbrowser remote></iframe>
CSS
Il est possible de passer du bouton « Aller à » au bouton « Arrêter » (et vice versa) en utilisant ce fragment de code CSS :
button:disabled { display: none; }
JavaScript
Et maintenant, il faut ajouter les fonctionnalités nécessaires au navigateur :
document.addEventListener("DOMContentLoaded", function () { var url = document.getElementById("url"); var go = document.getElementById("go"); var stop = document.getElementById("stop"); var browser = document.getElementsByTagName("iframe")[0]; // Cette fonction permet de passer entre le bouton "Aller" au bouton "Arreter" // (et vice versa). Si le navigateur charge, le bouton "Aller" est désactivé // et le bouton "Arrêter" est activé. Sinon, on a l'état inverse. function uiLoading(isLoading) { go.disabled = isLoading; stop.disabled = !isLoading; } go.addEventListener("touchend", function () { browser.setAttribute("src", url.value); }); stop.addEventListener("touchend", function () { browser.stop(); }); // Quand le navigateur charge, on change l'état des boutons "Aller" et "Arrêter" browser.addEventListener('mozbrowserloadstart', function () { uiLoading(true); }); // Quand le navigateur a fini de charger du contenu, // on change l'état des boutons "Aller" et "Arrêter" browser.addEventListener('mozbrowserloadend', function () { uiLoading(false); }); // Si jamais il y a une erreur il faut également // changer l'état des boutons "Aller" et "Arrêter" browser.addEventListener('mozbrowsererror', function (event) { uiLoading(false); alert("Erreur de chargement : " + event.detail); }); // Lorsqu'un utilisateur suit un lien il faut s'assurer que // l'emplacement de la nouvelle page apparaît dans la barre d'URL browser.addEventListener('mozbrowserlocationchange', function (event) { url.value = event.detail; }); });