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: