Exemple d’utilisation de Capabilities : détection des capacités du système

Flash Player 9 et les versions ultérieures

L’exemple CapabilitiesExplorer vous montre comment utiliser la classe flash.system.Capabilities pour déterminer les fonctions prises en charge par la version du moteur d’exécution Flash de l’utilisateur. Cet exemple étudie les techniques suivantes :

  • Détection des fonctions prises en charge par la version du moteur d’exécution Flash de l’utilisateur à l’aide de la classe Capabilities

  • Utilisation de la classe ExternalInterface pour détecter les paramètres de navigation pris en charge par le navigateur de l’utilisateur

Pour obtenir les fichiers d’application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers d’application CapabilitiesExplorer se trouvent dans le dossier Samples/CapabilitiesExplorer. Cette application se compose des fichiers suivants :

Fichier

Description

CapabilitiesExplorer.fla

ou

CapabilitiesExplorer.mxml

Fichier d’application principal dans Flash (FLA) ou Flex (MXML).

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

Classe fournissant la principale fonctionnalité de l’application, notamment l’ajout des capacités du système dans un tableau, le tri des éléments et l’extraction des capacités du navigateur à l’aide de la classe ExternalInterface.

capabilities.html

Conteneur HTML comprenant le code JavaScript nécessaire à la communication avec l’API externe.

Présentation de CapabilitiesExplorer

Le fichier CapabilitiesExplorer.mxml se charge de définir l’interface utilisateur de l’application CapabilitiesExplorer. Les capacités de la version du moteur d’exécution Flash de l’utilisateur sont affichées dans une occurrence du composant DataGrid sur la scène. Les capacités du navigateur sont également affichées si l’application est exécutée à partir d’un conteneur HTML et si l’API externe est disponible.

Une fois que l’événement creationComplete du fichier de l’application principale est distribué, la méthode initApp() est appelée. La méthode initApp() appelle la méthode getCapabilities() à partir de la classe com.example.programmingas3.capabilities.CapabilitiesGrabber. Le code de la méthode initApp() se présente comme suit :

private function initApp():void 
{ 
    var dp:Array = CapabilitiesGrabber.getCapabilities(); 
    capabilitiesGrid.dataProvider = dp; 
}

La méthode CapabilitiesGrabber.getCapabilities() renvoie un tableau trié contenant les capacités du moteur d’exécution Flash et du navigateur, qui est alors affecté à la propriété dataProvider de l’occurrence du composant DataGrid capabilitiesGrid sur la scène.

Présentation de la classe CapabilitiesGrabber

La méthode statique getCapabilities() de la classe CapabilitiesGrabber ajoute chaque propriété de la classe flash.system.Capabilities dans un tableau (capDP). Elle appelle ensuite la méthode statique getBrowserObjects() de la classe CapabilitiesGrabber. La méthode getBrowserObjects() utilise l’API externe pour passer en boucle sur l’objet navigator du navigateur, qui contient les capacités du navigateur. La méthode getCapabilities() se présente comme suit :

public static function getCapabilities():Array 
{ 
    var capDP:Array = new Array(); 
    capDP.push({name:"Capabilities.avHardwareDisable", value:Capabilities.avHardwareDisable});  
    capDP.push({name:"Capabilities.hasAccessibility", value:Capabilities.hasAccessibility});  
    capDP.push({name:"Capabilities.hasAudio", value:Capabilities.hasAudio}); 
    ... 
    capDP.push({name:"Capabilities.version", value:Capabilities.version}); 
    var navArr:Array = CapabilitiesGrabber.getBrowserObjects(); 
    if (navArr.length > 0) 
    { 
        capDP = capDP.concat(navArr); 
    } 
    capDP.sortOn("name", Array.CASEINSENSITIVE); 
    return capDP; 
}

La méthode getBrowserObjects() renvoie un tableau de toutes les propriétés de l’objet navigator du navigateur. Si ce tableau contient un élément ou plus, le tableau des capacités du navigateur (navArr) s’ajoute au tableau des capacités de Flash Player (capDP) et le tableau résultant est trié par ordre alphabétique. Enfin, le tableau trié est renvoyé au fichier de l’application principale, qui ensuite remplit la grille de données. Le code de la méthode getBrowserObjects() se présente comme suit :

private static function getBrowserObjects():Array 
{ 
    var itemArr:Array = new Array(); 
    var itemVars:URLVariables; 
    if (ExternalInterface.available) 
    { 
        try 
        { 
            var tempStr:String = ExternalInterface.call("JS_getBrowserObjects"); 
            itemVars = new URLVariables(tempStr); 
            for (var i:String in itemVars) 
            { 
                itemArr.push({name:i, value:itemVars[i]}); 
            } 
        } 
        catch (error:SecurityError) 
        { 
            // ignore 
        } 
    } 
    return itemArr; 
}

Si l’API externe est disponible dans l’environnement de l’utilisateur, le moteur d’exécution Flash appelle la méthode JavaScript JS_getBrowserObjects(), qui passe en boucle sur l’objet navigator du navigateur et renvoie une chaîne de valeurs au format URL à ActionScript. Cette chaîne est alors convertie en un objet URLVariables (itemVars) et ajoutée au tableau itemArr, qui est renvoyé au script appelant.

Communication avec JavaScript

La dernière étape dans la construction de l’application CapabilitiesExplorer consiste à écrire le code JavaScript nécessaire au passage en boucle de chaque élément de l’objet navigator du navigateur et à l’ajout d’une paire nom-valeur dans un tableau temporaire. Le code de la méthode JavaScript JS_getBrowserObjects() dans le fichier container.html est le suivant :

<script language="JavaScript"> 
    function JS_getBrowserObjects() 
    { 
        // Create an array to hold each of the browser's items. 
        var tempArr = new Array(); 
 
        // Loop over each item in the browser's navigator object. 
        for (var name in navigator) 
        { 
            var value = navigator[name]; 
 
            // If the current value is a string or Boolean object, add it to the 
            // array, otherwise ignore the item. 
            switch (typeof(value)) 
            { 
                case "string": 
                case "boolean": 
 
                    // Create a temporary string which will be added to the array. 
                    // Make sure that we URL-encode the values using JavaScript's 
                    // escape() function. 
                    var tempStr = "navigator." + name + "=" + escape(value); 
                    // Push the URL-encoded name/value pair onto the array. 
                    tempArr.push(tempStr); 
                    break; 
            } 
        } 
        // Loop over each item in the browser's screen object. 
        for (var name in screen) 
        { 
            var value = screen[name]; 
 
            // If the current value is a number, add it to the array, otherwise 
            // ignore the item. 
            switch (typeof(value)) 
            { 
                case "number": 
                    var tempStr = "screen." + name + "=" + escape(value); 
                    tempArr.push(tempStr); 
                    break; 
            } 
        } 
        // Return the array as a URL-encoded string of name-value pairs. 
        return tempArr.join("&"); 
    } 
</script>

Le code commence par créer un tableau temporaire qui contiendra toutes les paires nom-valeur de l’objet navigator. Une boucle for..in est ensuite appliquée à l’objet navigator, et le type de données de la valeur actuelle est évaluée pour éliminer les valeurs indésirables. Dans cette application, seules les valeurs String ou Boolean nous intéressent. Les autres types de données (par exemple les fonctions ou les tableaux) sont ignorés. Chaque valeur String ou Boolean de l’objet navigator est ajoutée au tableau tempArr. Une boucle for..in est ensuite appliquée à l’objet screen du navigateur, et chaque valeur numérique est ajoutée au tableau tempArr. Enfin, le tableau temporaire est converti en chaîne à l’aide de la méthode Array.join(). Ce tableau utilise l’esperluette (&) comme délimiteur, ce qui permet à ActionScript d’analyser facilement les données à l’aide de la classe URLVariables.