gecko-dev/cmd/xfe/plugins/textplugin/README

253 строки
10 KiB
Plaintext

-*- Mode: Text; tab-width: 4; indent-tabs-mode: nil -*-
The contents of this file are subject to the Netscape Public License
Version 1.0 (the "NPL"); you may not use this file except in
compliance with the NPL. You may obtain a copy of the NPL at
http://www.mozilla.org/NPL/
Software distributed under the NPL is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
for the specific language governing rights and limitations under the
NPL.
The Initial Developer of this code under the NPL is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998 Netscape Communications Corporation. All Rights
Reserved.
-----------------------------------------------------------------------
Netscape Navigator Unix Plugin Architecture V 0.9
-----------------------------------------------------------------------
Wed May 15 23:28:24 PDT 1996 dp@netscape.com
This document describes the architecture of the unix plugins.
This would help developers write their own plugins and interface them
with netscape.
Intended Audience
----------------------------------------------------------------------
- Plugin developers on unix platforms
This assumes that the developer is aware of when and why a plugin is
required.
Platforms currently supported
----------------------------------------------------------------------
- SunOS 4.1.3 and above
- Solaris 5.3
- Solaris 5.4
- IRIX 5.2 and above
- OSF1 V2.0 alpha and above
- HPUX 09.* 10.*
- Linux 1.2 (ELF)
Plugins require one of the following versions of the a unix navigator
- Atlas Release
- 3.0 browser
Contents
----------------------------------------------------------------------
- General architecture of Netscape Unix Plugins SDK
- How to write a plugin
- Sample Text plugin
- How to run the sample text plugin
- Trouble Shooting the sample text plugin
- Do's and Dont's
- Resources
General architecture of Netscape Unix Plugins SDK
----------------------------------------------------------------------
----------------------------------------------------------------------
| |
| |
Netscape | Wrapper | Plugin Developer
Navigator | npunix.c | npshell.c
| |
Talks with the | Implements function | Can ignore the existence of
the plugin via | tables as required | functions tables and call NPN_*()
wrapper code | by the navigator's | functions to call the navigator
in npunix.c | plugin interface and | and implement NPP_* functions
| provides plugin | to hookup to the navigator.
| developers with a |
| std. set of functions |
| |
| WONT NEED TO EDIT THIS. | FILL UP functions in npshell.c
| NEED TO COMPILE WITH | and write many more...
| THIS. |
----------------------------------------------------------------------
The plugin in the unix platform is implemented as a dynamically loadable
module (.so) The navigator searches for these dynamically loadable modules
in the list of directories as specified by the environment variable
NPX_PLUGIN_PATH. This variable can be set to a ':' separated list of
directories. The default path if this environment variable is not set
is "/usr/local/lib/netscape/plugins/:$HOME/.netscape/plugins/"
NOTE: On SunOS4.1.3, if there are any non-loadable modules in
any of the directories specified by NPX_PLUGIN_PATH, then
the dlopen() library call exits rather than giving an error.
thus causing the navigator to terminate.
The navigator detect which MIME types are recognized by a plugin by calling
NPP_GetMIMEDescription() in npshell.c (via NP_GetMIMEDescription() in
npunix.c). From then on, whenever it detect data of the
particular MIME type, it loads the plugin and creates instances of the
corresponding plugin object. Before creating the first plugin instance
the navigator will call NPP_Initialize() in npshell.c (via NP_Initialize()
in npunix.c). Also after the last plugin instance has been destroyed,
the navigator will call NPP_Shutdown() in npshell.c (via NP_Shutdown()
in npunix.c)
How to write a plugin
----------------------------------------------------------------------
1. Fill up all the necessary functions in npshell.c
To hook up and talk with the navigator. Refer to
"The plugin API" for more information on these
functions.
2. Add new functions/files as required by your plugin.
Use npapi.h for a description of data structures passed
between the navigator and the plugin code.
3. Compile the plugin code with npunix.c, npshell.c into
a platform specific dynamically loadable module.
4. Install the dynamically loadable module in NPX_PLUGIN_PATH,
"/usr/local/lib/netscape/plugins/:$HOME/.netscape/plugins/"
by default.
5. Start the navigator. From now on, whenever the MIME type
of interest to the plugin is encountered, the navigator
will call the appropriate functions in the plugin.
Sample Text plugin
----------------------------------------------------------------------
As an example, here is a text plugin. This plugin is intended only to
demonstrate how plugin developers can write plugins. The text plugin
operates on MIME type and extension "text/plain;.txt"
So whenever the navigator gets data with mime type "text/plain"
(or) needs to display a file with the extension ".txt", it passes the
data over to the plugin code as discussed by the Plugin API. The text
plugin creates a scrolled window using motif and displays the data
it received in the window. All code that is specific to the text
plugin is ifdeffed TEXT_PLUGIN in npshell.c
How to run the sample text plugin
----------------------------------------------------------------------
1. Compile the text plugin code to get a libtextplugin.so
2. Make a directory say, $HOME/.netscape/plugins
mkdir $HOME/.netscape/plugins
3. Copy the libtextplugin.so to that directory
cp libtextplugin.so $HOME/.netscape/plugins
4. Set NPX_PLUGIN_PATH to that directory
for csh:
setenv NPX_PLUGIN_PATH $HOME/.netscape/plugins
for ksh/sh:
NPX_PLUGIN_PATH=$HOME/.netscape/plugins; export NPX_PLUGIN_PATH
5. Invoke the netscape that is plugin enabled. In the location
field type in the file URL address of Test1.html
e.g if Test1.html was found in /home/dp/plugins/SDK/Test.html
the URL to use would be
file:/home/dp/plugins/SDK/Test1.html
Result:
You will see a page with a motif Multiline Text Widget
that shows the contents of file Test.txt
You might get some debug prints in stderr. To turn them
off, compile your plugin without defining PLUGIN_TRACE.
This change can be made in the makefile.
Trouble Shooting the sample text plugin
----------------------------------------------------------------------
If you dont see the text plugin,
(a) See if the file Test1.txt is accessible using a http address
(b) Check if the server returns "text/plain" as the mime type for
http access to Test1.txt
(c) Select Options->General Preferences->Helpers (if available)
in the browser and ensure that for the mime-type text/plain,
the Sample Text Plugin is enabled.
(d) LINUX ELF: if you are writing a plugin for Linux that uses
the Motif library, that plugin will need to be linked statically
against Motif. The reason for this is that the Mozilla executable
is itself compiled statically against Motif (since most Linux users
don't have libXm.so at all); and therefore, the Motif symbols are
not accessible to plugins.
The test/ directory has a few plugin tests that you could run
to verify if things are ok. Each test is a html file and explains
how to run the test and verify the result.
Do's and Dont's
----------------------------------------------------------------------
- INSTALL YOUR OWN EVENT HANDLERS FOR THE PLUGIN WINDOW TO
GET EVENTS.
Netscape Navigator uses Xt/Motif for its display. Plugins
can use them and install their own event handlers for their
window.
- DONT USE WorkProcs IN Xt.
WorkProcs will not be called.
- USE THE X RESOURCE NAME SPACE WITH CARE.
plugins and netscape share the same X resources space.
So be sure your plugin gets it resources separately.
The navigator resources do not follow a pattern although
we eventually will. Until then, chose unique names that
are not used by the navigator for its X resources for
X resources and names of widgets used by plugins.
- TAKE CARE WHEN INSTALLING TIMERS TO GET IDLE CYCLES.
Plugins installing TIMERS to get idle cycles (e.g for doing
some animation as long as the plugin is in view) by using the
XtAppAddTimeOut() should take care to not install 0 interval
timer callbacks. If they do, then the network events will never
happen.
Resources
----------------------------------------------------------------------
A collection of resources that will be helpful in plugin development.
This collection is as of 15 May 1996.
http://home.netscape.com/comprod/development_partners/plugin_api/index.html
ftp://ftp.netscape.com/pub/navigator/sdk/
- SDK is available here.
http://home.netscape.com/eng/mozilla/2.0/handbook/plugins/index.html
- Plugin development handbook.
http://cgi.netscape.com/eng/mozilla/2.0/extensions/info.cgi
- Default plugin will take you here.
snews://secnews.netscape.com/netscape.devs-plugins
- Secure news group for netscape developement partners. All plugin
related discussion happens here. To enroll into this contact
developer relations at http://developer.netscape.com