Chrome : comment Google travaille pour limiter Javascript
Publié par Clément Bohic le | Mis à jour le
Pour minimiser l'impact de JavaScript sur Chrome, Google tente d'en limiter l'exécution en arrière-plan. Revue de détail des méthodes et des contraintes.
Comment rendre Chrome moins gourmand en ressources ? Google a dernièrement ouvert au public un aperçu de ses travaux en la matière.
La démarche qu'il met en lumière consiste à réduire l'activité JavaScript sur les onglets d'arrière-plan en jouant sur les minuteurs qui déterminent les délais d'exécution des fonctions.
Les tests réalisés sur un MacBook Pro ont démontré un gain d'autonomie allant jusqu'à 28 %.
La méthode employée repose sur trois critères, appliqués aux pages qui sont en arrière-plan depuis au moins 5 minutes :
Google fournit un exemple de code (voir ci-dessous) qu'on peut analyser ainsi :
Des cadres perméables
Cette approche réduit effectivement le nombre d'exécutions de fonctions JavaScript sur les pages pourvues de minuteurs aux timeouts courts. La deuxième règle sus-évoquée permet en outre d'assurer le fonctionnement d'applications de type alarme ou compte à rebours.
Reste qu'en vertu de la troisième règle, lorsqu'un minuteur au timeout supérieur à 5 minutes arrive à terme, tous les autres minuteurs de la page peuvent exécuter les fonctions qu'ils gouvernent. Et cela pose un souci de sécurité. Les cadres HTML deviennent « perméables », au sens où chacun est susceptible d'obtenir des informations relatives aux minuteurs qui se trouvent dans des cadres partageant la même origine.
Pour résoudre le problème, les équipes de Google proposent une autre méthode. Dans une fenêtre dont le cadre principal est masqué depuis 5 minutes :
Cette approche n'affecte pas les pages où des minuteurs s'exécutent à moins d'une minute d'écart les uns des autres. Elle maintient le fonctionnement des alarmes et comptes à rebours. Et résout le problème de perméabilité des cadres. en fonction de la façon dont sont gérées les origines dites « opaques ».
Origine contrôlée
Un cadre a cette caractéristique lorsqu'on lui a associé l'attribut sandbox. Auquel cas son origine ne devrait jamais être considérée comme équivalente à celle du cadre parent. Dans l'absolu, cela signifie qu'utiliser une infinité de ces cadres permet de dépasser la limitation d'intervalle à 1 minute (chacun de ces cadres ayant sa propre origine, la première exécution dans chacun d'entre eux échappe à la règle).
Pour pallier cette faiblesse, les équipes de Google formulent une troisième méthode. Toujours dans une fenêtre dont le cadre principal est masqué depuis 5 minutes :
Le code ci-dessous illustre l'approche. Il suppose un cadre principal d'origine A et trois sous-cadres : le premier d'origine A, le deuxième d'origine A « sandboxé » et le troisième d'origine B. Le minuteur a s'exécute après 31 secondes, aucun minuteur n'étant arrivé à terme sur les 60 secondes précédentes. Le minuteur b s'exécute avec lui, les cadres étant de même origine. Et le minuteur c s'exécute une minute après (bloqué par b), comme d (sandbox) et e (origine différente).
Le problème de contournement signalé plus haut disparaît ainsi.
Pour déterminer si un cadre a la même origine que le cadre principal, Google utilise Frame::IsCrossOriginToMainFrame(). Cette méthode prend en compte les modifications sur le domaine du document. Elle pose, affirment les auteurs des travaux, moins de risques d'erreur que de manipuler SecurityOrigins dans le code du planificateur.
Illustration principale © portalgda - Shutterstock