Vigilar plugins

Resumen

Ya est谩 disponible un nuevo componente de los plugin que permite saber cuanto tiempo le toma a un determinado plugin (p.e. Adobe Flash) ejecutar sus llamadas. Este componente presenta el runtime del plugin usando el observer service a cualquiera que reciba la notificaci贸n. Este art铆culo cuenta c贸mo los desarrolladores pueden hacer uso de esta facilidad.


Datos del Runtime

La informaci贸n del runtime presentada es siempre en fracciones de segundo. Ya que el componente mide el tiempo que le toma a las llamadas de bloque del plugin, el valor incluye tanto el tiempo de CPU, el tiempo de espera entre asignaciones de tiempo de CPU al proceso, como cualquier tiempo de e/s del disco. Es t茅cnicamente incorrecto decir que el runtime es una medida del uso de CPU, sin embargo, es una buena representaci贸n de los recursos totales consumidos por el plugin.

Uso

Para hacer uso del nuevo componente, debes registrarte para recibir las notificaciones del runtime usando el observer service. El t贸pico de la notificaci贸n es experimental-notify-plugin-call. Si eres novato con el servicio de observaci贸n de Mozilla, querr谩s familiarizarte con 茅l antes de proseguir. Puedes encontrar informaci贸n acerca del servicio de observaci贸n aqu铆 y aqu铆.

Debajo hay un n煤mero de conversaciones sobre JavaScript que podr铆an ser 煤tiles para desarrolladores que quieran usar esta facilidad:

Registro

Para registrase en el servicio de notificaciones con el observador debes crear una clase con un m茅todo observe que recibe tres par谩metros (subject, topic y data) as铆 como un m茅todo register que contiene el siguiente c贸digo:


var observerService = Components.classes["@mozilla.org/observer-service;1"]
                        .getService (Components.interfaces.nsIObserverService);
observerService.addObserver(this, "experimental-notify-plugin-call", false);


Observando

Como hemos dicho arriba, para especificar lo que quieres que se haga cuando llega una notificaci贸n, tu clase debe tener un m茅todo observe, que recibe tres par谩metros (subject, topic y data). El topic contiene el t贸pico de la notificaci贸n - experimental-notify-plugin-call en este caso, data es el runtime en mili segundos y subject es siempre null y no deber铆a usarse.

Aqu铆 hay un ejemplo que muestra el runtime en una caja de alerta al usuario si el runtime excede medio segundo de longitud:

 observe: function(subject, topic, data) {
   if (topic == "experimental-notify-plugin-call" ) {
     if (data > 0.500) {
       alert("Runtime is: " + data);
     }
   }
 }

NOTA: Esto es un ejemplo simplificado y se desaconseja el uso de alert() ya que el componente puede enviar cientos de notificaciones por segundo y puede, potencialmente, causar la parada del navegador si se abre un n煤mero excesivo de cajas de alerta.

T茅ngase tambi茅n en cuenta que en el ejemplo anterior una sentencia if primero comprueba que el t贸pico de la notificaci贸n es el correcto. Esto es 煤til en casos en los que la clase se registra para recibir notificaciones de m谩s de un t贸pico en el servicio de observaci贸n.

Limpieza

Para des-registrar tu clase en el servicio de observaci贸n - cuando ya no quieres escuchar las notificaciones del runtime - tu clase debe incluir un m茅todo unregister que contenga el siguiente c贸digo:

var observerService = Components.classes["@mozilla.org/observer-service;1"]
                       .getService(Components.interfaces.nsIObserverService);
observerService.removeObserver(this, "experimental-notify-plugin-call");


Esquema de una clase para el observador

A continuaci贸n presentamos un esquema de una clase que puedes usar para escuchar el servicio de notificaciones:

 function PluginObserver() {
   this.registered = false;
   this.register();	// se cuida de registrar esta clase en el servicio de observaci贸n como un observador para el servicio de notificaci贸n
 }

 PluginWatcherObserver.prototype = {
   observe: function(subject, topic, data) {

     if (topic == "experimental-notify-plugin-call") //En caso de que tu clase est茅 registrada para escuchar otros t贸picos
       //Esto es ejecutado cada vez que llega una notificaci贸n
       // --AQU脥 VA TU C脫DIGO--
     }


   },
   //Se cuida de registrar el observador para el t贸pico "experimental-notify-plugin-call"
   register: function() {
     if (this.registered == false) { //Este evento previene el doble registro -- 隆algo que quieres evitar!
       var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                       .getService(Components.interfaces.nsIObserverService);
       observerService.addObserver(this, "experimental-notify-plugin-call", false);
       this.registered = true;
     }
   },
   //Des-registra del servicio de observaci贸n
   unregister: function() {
     if (this.registered == true) {
       var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                       .getService(Components.interfaces.nsIObserverService);
       observerService.removeObserver(this, "experimental-notify-plugin-call");
       this.registered = false;
     }
   }
 }


Recursos adicionales

M谩s informaci贸n sobre el servicio de observaci贸n: