Abandon et suppression d'API dans Chrome 54

Dans presque toutes les versions de Chrome, nous apportons un nombre important de mises à jour et d'améliorations au produit, à ses performances et aux fonctionnalités de la plate-forme Web. Cet article décrit les obsolescences et les suppressions dans Chrome 54, qui est en version bêta depuis le 15 septembre. Cette liste peut être modifiée à tout moment.

Désactiver les navigations dans le gestionnaire de déchargement

En bref : toutes les navigations cross-origin seront interdites dans les gestionnaires d'événements window.onunload pour que Chrome soit conforme à la spécification HTML, ainsi qu'à Firefox et Safari.

Intention de suppression | Outil de suivi Chromestatus | Bug Chromium

Les versions précédentes de Chrome permettaient d'interrompre la navigation multi-origine dans window.onunload. en définissant window.location.href = '#fragment'. Selon la spécification HTML, seules les navigations sur la même page sont autorisées dans les gestionnaires de déchargement. Dans les versions précédentes de Chrome, les autres méthodes de navigation étaient bloquées, comme l'exige la spécification. À partir de Chrome 54, ces navigations seront interdites pour nous aligner sur la spécification, ainsi que sur Firefox et Safari.

HTTP/0.9 obsolète

En bref : HTTP/0.9 est obsolète. Les développeurs doivent passer à une version ultérieure, de préférence HTTP/2.

Intention de suppression | Outil de suivi Chromestatus | Bug Chromium

HTTP/0.9 est l'ancêtre de HTTP/1.x. Il manque de nombreuses fonctionnalités de ses successeurs. Un problème particulier du Web moderne est son manque d'en-têtes de réponse. Sans eux, il est impossible de vérifier qu'une réponse HTTP/0.9 est réellement une réponse HTTP/0.9. Cela peut entraîner plusieurs problèmes. Voici quelques exemples de problèmes :

  • Clients qui traitent certaines réponses d'erreur comme des réponses HTTP/0.9 valides.
  • Les serveurs qui ne parviennent pas à fermer le socket de requête, ce qui amène les clients à traiter les réponses comme des requêtes GET en attente qui restent actives indéfiniment ou jusqu'à ce qu'un utilisateur quitte la page qui a envoyé la requête.
  • Serveurs qui ne peuvent pas indiquer au navigateur qu'une requête a échoué, ce qui peut entraîner des problèmes avec les heuristiques de mise en cache.

La seule façon infaillible de résoudre les problèmes liés à HTTP/0.9 est de supprimer complètement la compatibilité. C'est pourquoi la compatibilité avec HTTP/0.9 a été supprimée dans Chrome 54.

L'utilisation de initTouchEvent est supprimée

En bref : initTouchEvent a été abandonné au profit de TouchEvent constructor pour améliorer la conformité aux spécifications et sera complètement supprimé dans Chrome 54.

Intention de suppression | Outil de suivi Chromestatus | Bug Chromium

Depuis longtemps, les développeurs peuvent créer des événements tactiles synthétiques dans Chrome à l'aide de l'API initTouchEvent. Ils sont fréquemment utilisés pour simuler des événements tactiles, que ce soit pour tester ou automatiser certaines UI de votre site. Depuis Chrome 49, l'avertissement suivant s'affiche pour cette API obsolète .

Vigilance événement tactile
TouchEvent.initTouchEvent est obsolète et sera supprimé dans M53, vers septembre 2016. Veuillez plutôt utiliser le constructeur TouchEvent. Pour en savoir plus, consultez https://www.chromestatus.com/features/5730982598541312.

En plus de ne pas figurer dans la spécification des événements tactiles, il existe plusieurs raisons pour lesquelles ce changement est positif. L'implémentation initTouchEvent de Chrome n'était pas du tout compatible avec l'API initTouchEvent de Safari et était différente de celle de Firefox sur Android. Enfin, le constructeur TouchEvent est beaucoup plus facile à utiliser.

Pour ces raisons, nous avons décidé de suivre la spécification plutôt que de maintenir une API qui n'est ni spécifiée ni compatible avec la seule autre implémentation. Les développeurs qui ont besoin d'une alternative doivent utiliser le constructeur TouchEvent.

Étant donné que les implémentations iOS et Android/Chrome de l'API initTouchEvent étaient très différentes, les sites avaient souvent un code de ce type (en oubliant souvent Firefox) :

    var event = document.createEvent('TouchEvent');
    
    if(ua === 'Android') {
      event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
        300, 300, 200, 200, false, false, false, false);
    } else {
      event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
        200, false, false, false, false, touches, targetTouches, changedTouches, 0, 0);
    }
    
    document.body.dispatchEvent(touchEvent);

C'est une mauvaise pratique, car elle recherche "Android" dans l'User-Agent. Chrome sur Android correspondra et atteindra cette obsolescence. Toutefois, vous ne pouvez pas encore le supprimer, car d'autres navigateurs basés sur WebKit et d'anciennes versions de Blink seront disponibles sur Android pendant un certain temps. Vous devrez donc toujours prendre en charge l'ancienne API.

Pour gérer correctement les TouchEvent sur le Web, vous devez modifier votre code pour qu'il soit compatible avec Firefox, IE Edge et Chrome. Pour ce faire, vérifiez l'existence de TouchEvent sur l'objet window. Si sa "longueur" est positive (ce qui indique qu'il s'agit d'un constructeur qui accepte un argument), vous devez l'utiliser.

    if('TouchEvent' in window && TouchEvent.length > 0) {
      var touch = new Touch({
        identifier: 42,
        target: document.body,
        clientX: 200,
        clientY: 200,
        screenX: 300,
        screenY: 300,
        pageX: 200,
        pageY: 200,
        radiusX: 5,
        radiusY: 5
      });
    
      event = new TouchEvent("touchstart", {
        cancelable: true,
        bubbles: true,
        touches: [touch],
        targetTouches: [touch],
        changedTouches: [touch]
      });
    }
    else {
      event = document.createEvent('TouchEvent');
    
      if(ua === 'Android') {
        event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
          300, 300, 200, 200, false, false, false, false);
      } else {
        event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
          200, false, false, false, false, touches, targetTouches, 
          changedTouches, 0, 0);
      }
    }
    
    document.body.dispatchEvent(touchEvent);

Suppression de l'attribut KeyboardEvent.keyIdentifier

En bref : la propriété keyboardEvent.keyIdentifier, peu prise en charge, est supprimée au profit de la propriété KeyboardEvent.key, basée sur les normes.

Intention de suppression | Outil de suivi Chromestatus | Bug Chromium

L'attribut keyboardEvent.keyIdentifier a brièvement fait partie d'une spécification W3C en 2009 et 2010. Cependant, elle n'a jamais été implémentée dans WebKit.

Les développeurs qui doivent remplacer cet attribut peuvent utiliser la propriété KeyboardEvent.key basée sur les normes ou la propriété KeyboardEvent.code (comme décrit dans un article publié au printemps dernier). Le premier est le plus largement implémenté, car il est compatible avec tous les principaux navigateurs pour ordinateur, à l'exception de Safari. Ce dernier est actuellement compatible avec Chrome, Firefox et Opera. La suppression de cette fonctionnalité vise à favoriser l'adoption de la propriété KeyboardEvent.key. Apple n'a pas indiqué s'il prendrait en charge cette fonctionnalité. Toutefois, les propriétés KeyboardEvent.keyCode et KeyboardEvent.charCode, qui sont également obsolètes (mais pas encore supprimées de Chrome), sont toujours disponibles sur Safari.

Supprimer l'événement et l'attribut MediaStream ended ainsi que l'attribut onended

En bref : L'événement et l'attribut ended, ainsi que le gestionnaire d'événements onended, sont supprimés, car ils ont été supprimés de la spécification Media Capture and Streams.

Intention de suppression | Outil de suivi Chromestatus | Bug Chromium

L'événement ended et le gestionnaire d'événements onended ne font plus partie de la spécification WebRTC depuis environ trois ans. Les développeurs qui souhaitent observer des événements doivent utiliser MediaStreamTracks au lieu de MediaStreams.

Abandon de SVGSVGElement.viewPort

L'implémentation ne fonctionne pas dans Chrome depuis 2012. L'attribut n'est pas du tout présent dans les autres navigateurs et a été supprimé de la spécification. Pour ces raisons, la propriété est abandonnée. La suppression est prévue dans Chrome 55.

Intention de suppression | Outil de suivi Chromestatus | Bug Chromium

Abandon de SVGViewElement.viewTarget

L'attribut SVGViewElement.viewTarget ne fait pas partie de la spécification SVG2.0 et son utilisation est faible, voire inexistante. Cet attribut est obsolète dans Chrome 54. La suppression est prévue dans Chrome 56.

Intention de suppression | Outil de suivi Chromestatus | Bug Chromium

Supprimer SVGZoomEvent

L'élément SVGZoomEvent ne fait pas partie de la spécification SVG2.0 et ne fonctionne pas dans Chromium. Malgré cela, la fonctionnalité reste détectable, ce qui peut induire les développeurs en erreur. Il sera supprimé.

Intention de suppression | Outil de suivi Chromestatus | Bug Chromium