Développement de Plug-In Netscape sous MacOS


Pourquoi cette page existe t'elle ?

Il y'a diverses raisons qui font que cette page existe :

Quels Navigateurs Mac supportent les Plug-In ?

Je n'ai pas encore vérifié les cas de Hot-Java et d'Opéra. Le premier étant nul à ch... comme navigateur sous MacOS, le second n'étant pas encore disponible.

Où trouver le Kit de Développement et la documentation ?

Il faut savoir tout d'avord qu'il existe deux versions du Kit de Développement : En résumé :

 Téléchargez le SDK 4.01a.

En ce qui concerne la documentation, il existe là aussi deux versions :

Je conseille fortement de lire la documentation, elle éclaire sur certains points qui sont complètements obscurs dans le SDK et les exemples fournis. Personnellement, je préfère la version PDF qui fatigue moins mes yeux à la lecture.

En résumé :

 Téléchargez la version PDF.

Par où commencer ?

Le plus simple et le plus plaisant est de commencer par la compilation d'un exemple fourni dans le SDK.

Si vous avez téléchargé la version 4.01 du SDK, ouvrez le projet Simple Macintosh, compilez le, et installez un alias du Plug-In dans le répertoire Plug-In de Netscape Communicator.

Vous remarquerez que je parle ici du Browser de Netscape uniquement. Et ce pour une bonne raison: ce Plug-In d'exemple ne fonctionnera que sur Netscape Communicator/ Navigator et plantera sous Internet Explorer.

Après avoir fait mumuse avec ce Plug-In, il est temps pour vous d'affronter la vraie vie.

Pour commencer le développement d'un Plug-In, je conseille de partir du projet exemple MacTemplate; ceci pour deux raisons :

Quelques petites modifications sont nécessaires pour faire compiler le programme mais bon vous êtes un vrai développeur, oui ou non ?

Où placer mon Plug-In ?

Dans le répertoire Plug-In du Navigateur, bien sûr... que NON !

Placez un alias du Plug-In dans le répertoire du Navigateur, pas l'original. Ceci vous permettra de n'avoir qu'un seul vrai Plug-In pour tous les navigateurs: adieu la gestion des versions. Ensuite cela vous permet de compiler une nouvelle version d'un Plug-In et de n'avoir qu'à relancer le navigateur.

Comment dessiner dans un Plug-In ?

Si vous souhaitez faire un Plug-In, c'est que vous souhaitez généralement afficher quelque chose dans la fenêtre du Navigateur (à part les Plug-In audios, je ne vois guère de Plug-In qui n'afficherait rien. Ah si les virus sous forme de Plug-In).

En ce qui concerne le dessin, on peut s'inspirer très fortement du code du fichier MacShell.cpp. En effet, le Plug-In doit mettre en place son contexte de dessin chaque fois qu'on lui demande de se dessiner.

Si comme moi, vous êtes un chieur de première, vous n'allez pas manquer de vous interroger sur la signification exacte des structures NP_Port et NPWindow.

Quelques heures de débuggages à la lueur de la bougie m'ont donné certains éléments de réponses que l'on ne trouve pas dans la documentation. Ils ne sont pas évidents à retenir vu que au moment où j'écris ces lignes, je dois avoir le code sous les yeux pour vérifier.

En tout premier lieu, tous les dessins que vous effectuez sont clippés. Ceci est géré à l'aide de la données clipRect de la structure NPWindow et des données portx et porty du NP_Port.

Les données portx et porty servent aussi généralement à définir la nouvelle origine QuickDraw pour le Plug-In.

Les données width et height de la structure NPWindow vous permettent de connaîtrent les dimensions du Plug-In.

A quoi peuvent bien servir les coordonnées x et y de NPWindow ? Ce sont en fait les coordonées réelles du coint supérieur gauche du Plug-In.

Si vous souhaitez gérer une vue OpenGL dans un Plug-In, je tiens à vous signaler tout de suite que du point de vue des coordonnées, c'est un véritable cauchemar.

Un autre point important concerne le redimensionnement et le scrolling du Plug-In.

Vous êtes averti du redimensionnement du Plug-In par un nouvel appel à la fonction NPP_SetWindow.

En ce qui concerne le scrolling, vous n'êtes jamais averti. Ce sont justes les valeurs des données NPWindow et NP_port que l'on vous donne au moment du dessin du Plug-In qui sont modifiées. Donc se méfier.

Comment gérer le clavier et le curseur ?

Si vous utilisez les exemples du SDK pour écrire votre plug-in et que vous implantiez à un moment les frappes claviers. Attendez vous à une surprise de taille: Aucune frappe clavier n'est prise en compte. Vous pouvez vous amuser à vérifier les évènements keyUp et keyDown. Vous ne les recevez pas.

Ce détail crucial est en fait expliqué dans la documentation (mais il est toujours difficile de retrouver le bon passage qui en parle).

Sous MacOS, la gestion des évènements souris, clavier, de dessin, se fait par la fonction NPP_HandleEvent. Cette fonction supporte la plupart des évènements MacOS et 3 de plus :

Sur l'événement getFocusEvent, vous devez positionner la valeur de retour de NPP_HandleEvent à true. Cela indique que votre Plug-In est bien au courant qu'il a maintenant le Focus clavier et qu'il va prendre en compte les frappes claviers.

En ce qui concerne le curseur, c'est une très mauvais idée d'utiliser la globale qd. Il faut en fait utiliser gQDPtr qui est récupéré par le Plug-In. Une fois que votre code supporte ces évènements, vous verrez que le support du clavier est assuré.

Comment lire des resources dans mon Plug-In ? [ Mis à jour]

On dispose d'une référence sur la partie ressource du PlugIn au travers de la variable locale gResFile définie dans le fichier npmac.cpp.

Il suffit donc simplement d'appeler UseResFile comme d'habitude.

Comment débugger un Plug-In ?

Si vous ne développez que du code correct, passez à la question suivante mais sachez cependant que vous m'écoeurez.

Sous CodeWarrior il est relativement simple de débugger un Plug-In, qui est en fait une Shared Library. Dans le panneau préférence du projet, rubrique Target, sélectionnez la sous-rubrique Runtime Settings.

Vous pouvez à l'aide du bouton Choose... indiquer le binaire qui lance votre Shared Library. Choisissez donc Internet Explorer ou Netscape. Il suffit ensuite de glisser sur la fenêtre du Navigateur la page HTML faisant appel à votre Plug-In.

Remarque : Dans mes divers essais, il s'est avéré que cette technique ne marchait pas avec iCab.

Les incompatibilités avec Internet Explorer
(ou la joie du développeur de Plug-In enfin expliquée) [ Mis à jour]

Vous venez de compiler une magnifique version de votre Plug-In et l'avez testée avec succès sous Netscape Communicator.
Vous êtes le meilleur, vous allez de ce pas demander une augmentation voire demander à être Grand Calife à la place du Grand Calife.

HALTE !

Vérifier que votre Plug-In fonctionne sous Internet Explorer avant de commettre ce suicide professionnel.

He oui ma brave dame, c'est un monde pourri dans lequel nous vivons avec tous ces satellites qu'ils nous envoient dans le ciel et qui perturbent le climat: Internet Explorer ne supporte pas toutes les fonctionallités du SDK.

Les incompatibilités que j'ai répertorié à ce jour avec la version 4.5 d'Internet Explorer :

En résumé :

 Méfiez vous d'Internet Explorer et des autres Browsers. Le fait que votre Plug-In tourne sous Netscape Communicator ne signifie pas qu'il fonctionnera sur les autres navigateurs.

Sécurité et Plug-In sont sur un bateau...

Sécurité tombe à l'eau.

A partir d'un Plug-In, vous avez accès à tous les appels de la ToolBox. Tels que FSpDelete, FSpRename, etc, ... Vous pouvez donc effacer un disque dur entier si vous le souhaitez.

Pourquoi n'est ce pas sécurisé comme le sont les applets Java ?

Tout simplement parce que c'est l'utilisateur qui choisit de downloader un Plug-In, c'est lui encore qui installe le Plug-In. Sans le consentement de l'utilisateur un Plug-In ne peut pas s'installer dans le répertoire Plug-In du Navigateur. Même la technique de téléchargement de Plug-In spécifique à Netscape Communicator demande une confirmation auprès de l'utilisateur.

En résumé :

 L'utilisateur sait ce qu'il fait et assume le cas échéant.

Autres notes

Code Source

Le code source MacTemplate correspond à une version modifiée de l'exemple MacTemplate.

Ceci est un project CodeWarrior Pro 5.