- Table of Contents
 - Copyright
 - Preface
 - 1. Mozilla Background
 - 2. The State of Mozilla
 - 3. Who Should Read This Book
 - 4. Platform and Applications
 - 5. Structure of the Book
 - 6. How This Book Was Written
 - 7. Mozilla Licensing Information
 - 8. Conventions
 - 9. Comments and Questions
 - 10. Acknowledgments
 
- 1. Mozilla as Platform
 - 1.1. Visualizing Mozilla's Front End
 - 1.1.1. XPFE Framework
 - 1.1.2. Comparing XPFE and DHTML
 - 1.1.3. Components of a Mozilla Application
 
- 1.2. Setting Up Your System
 - 1.3. Mozilla Applications
 - 1.3.1. Applications as Web Pages
 
- 2. Getting Started
 - 2.1. Simple XUL Example
 - 2.2. Basic XUL Concepts
 - 2.2.1. The XUL File Format
 - 2.2.2. Conventions
 - 2.2.3. The XUL Namespace
 - 2.2.4. Basic XUL Layout
 - 2.2.5. Using XUL Windows
 
- 2.3. Making Mozilla Work for You
 - 2.3.1. Importing Resources from Mozilla
 
- 2.4. Displaying XUL Files as Chrome
 - 2.5. Creating a Package
 - 2.5.1. Architecture of a Chrome Package
 - 2.5.2. Package Components
 - 2.5.3. Directory Structure
 - 2.5.4. Package Manifests
 - 2.5.5. Separating the Files
 - 2.5.6. Registering a Package
 
- 2.6. Launching the Application
 - 2.6.1. Windows launch
 
- 3. XUL Elements and Features
 - 3.1. The XUL Document Object
 - 3.1.1. XUL Parsing and the Document Object Model
 
- 3.2. Application Windows
 - 3.2.1. Dialogs
 - 3.2.2. Pages
 - 3.2.3. Wizards
 
- 3.3. Application Widgets
 - 3.3.1. The Toolbox
 - 3.3.2. Selection Lists
 
- 3.4. Tabular and Hierarchical Information
 - 3.4.1. List Boxes
 - 3.4.2. High Performance Trees
 - 3.4.3. Grid
 
- 3.5. Words and Pictures
 - 3.5.1. Text Input
 - 3.5.2. Text Display
 - 3.5.3. Images
 
- 3.6. Form Controls
 - 3.6.1. Radio
 - 3.6.2. Checkbox
 - 3.6.3. Buttons
 
- 3.7. Widget Interaction
 - 3.7.1. Broadcaster and Observers
 - 3.7.2. Commands
 
- 3.8. Content Panels
 - 3.8.1. Browser and IFrame
 - 3.8.2. Editor
 
- 3.9. The Box Model
 - 3.9.1. Box Attributes
 - 3.9.2. Box-Like Containers
 - 3.9.3. Additional Box Features
 - 3.9.4. Stacks and Decks
 
- 3.10. XUL Attributes
 - 3.10.1. Stretchiness
 - 3.10.2. Style
 - 3.10.3. Persistence
 - 3.10.4. The debug Attribute
 
- 3.11. Overlays
 - 3.11.1. How to Use Overlays
 - 3.11.2. Content Positioning
 
- 3.12. The Extras
 - 3.12.1. Tooltips
 - 3.12.2. Progress Meter
 - 3.12.3. Links
 
- 3.13. Building the Application Shell
 
- 4. CSS in Mozilla Applications
 - 4.1. Interface Basics
 - 4.1.1. Skins Versus Themes
 - 4.1.2. Limitations of a Skin
 - 4.1.3. Theme Abstraction (or Building Good Skins)
 - 4.1.4. Cross-Platform Interface Considerations
 
- 4.2. Introduction to CSS in Mozilla
 - 4.2.1. Basic XUL + CSS Interaction
 - 4.2.2. Stylesheet Syntax
 - 4.2.3. Special Mozilla Extensions
 - 4.2.4. Referencing Images in CSS
 - 4.2.5. Menu Skinning
 
- 4.3. Mozilla Skins
 - 4.3.1. CSS and Skin Hierarchies
 - 4.3.2. Basic Skin Structure
 - 4.3.3. The Modern and Classic Themes
 - 4.3.4. Skin Files
 
- 4.4. Creating New Skins
 - 4.4.1. Importing the Global Skin
 - 4.4.2. Getting Started with Custom Styles
 - 4.4.3. Creating Styles for the xFly Buttons
 - 4.4.4. Describing the Skin in RDF
 
- 4.5. What Is Possible in a Skin?
 - 4.5.1. Binding New Widgets to the Interface Using XBL
 - 4.5.2. User Stylesheets
 - 4.5.3. Theme Security Restrictions
 
- 5. Scripting Mozilla
 - 5.1. Faces of JavaScript in Mozilla
 - 5.2. JavaScript and the DOM
 - 5.2.1. What Is the DOM?
 - 5.2.2. The DOM Standards and Mozilla
 - 5.2.3. DOM Methods and Properties
 
- 5.3. Adding Scripts to the UI
 - 5.3.1. Handling Events from a XUL Element
 - 5.3.2. Events and the Mozilla Event Model
 - 5.3.3. Changing an Element's CSS Style Using JavaScript
 - 5.3.4. Creating Elements Dynamically
 - 5.3.5. Sharing Data Between Documents
 
- 5.4. XPConnect and Scriptable Components
 - 5.4.1. What Is XPConnect?
 
- 5.5. JavaScript Application Code
 - 5.5.1. JavaScript Libraries
 
- 6. Packaging and Installing Applications
 - 6.1. Packaging and Installing Overview
 - 6.2. Packaging Mozilla Applications
 - 6.2.1. Package Manifests
 - 6.2.2. Registering Packages
 - 6.2.3. Creating a Package
 - 6.2.4. The Chrome Registry
 
- 6.3. Installing Mozilla Applications
 - 6.3.1. The XPI File Format
 - 6.3.2. Installation Scripts
 - 6.3.3. XPInstall
 - 6.3.4. Uninstalling Applications
 
- 6.4. Finishing Things Up
 - 6.4.1. Creating the xFly XPI
 - 6.4.2. Adding the Installation Script
 - 6.4.3. Web Page Installer
 
- 6.5. Extra Tricks for Customizing an Application
 - 6.5.1. Icons
 - 6.5.2. Splash Screen
 
- 7. Extending the UI with XBL
 - 7.1. What Is XBL?
 - 7.1.1. XBL Terminology
 - 7.1.2. An XBL Document
 - 7.1.3. Namespaces and XBL
 - 7.1.4. XBL and HTML
 
- 7.2. Anatomy of a Binding
 - 7.2.1. CSS Attachment
 - 7.2.2. The XBL Content Element
 - 7.2.3. The Implementation Element
 - 7.2.4. Handlers
 - 7.2.5. Style
 
- 7.3. Adding Behavior to Bindings
 - 7.3.1. Binding Methods
 - 7.3.2. Binding Properties
 
- 7.4. XBL and the DOM
 - 7.4.1. The XBL DOM Interfaces
 - 7.4.2. Binding Parents
 - 7.4.3. Accessing Anonymous Nodes
 - 7.4.4. Extra Binding Content and Insertion Points
 
- 7.5. Inheritance
 - 7.5.1. Binding Inheritance
 - 7.5.2. Attribute Inheritance
 - 7.5.3. Implementation Inheritance
 
- 7.6. Event Handling
 - 7.6.1. The Time and Venue
 
- 7.7. Resources for Bindings
 - 7.7.1. Stylesheets in XBL
 
- 8. XPCOM
 - 8.1. What Is XPCOM?
 - 8.1.1. What Is a Component?
 - 8.1.2. XPConnect and the Component Object
 - 8.1.3. XPCOM Interfaces and the IDL
 - 8.1.4. XPCOM Type Libraries
 - 8.1.5. XPCOM Identifiers
 - 8.1.6. Component Manager
 - 8.1.7. Getting and Using XPCOM
 
- 8.2. Creating XPCOM Components
 - 8.2.1. Creating a JavaScript XPCOM Component
 - 8.2.2. Compiling the Component
 - 8.2.3. Testing the Component
 - 8.2.4. Useful C++ Macros and Types
 - 8.2.5. C++ Implementation of nsISimple
 - 8.2.6. The nsSimple module code
 - 8.2.7. Other Languages for XPCOM
 - 8.2.8. XPCOM as an Open Cross-Platform Solution
 
- 9. XUL Templates
 - 9.1. Understanding XUL Templates
 - 9.1.1. Basic template structure
 
- 9.2. Enhancing XUL Templates
 - 9.2.1. Nested Content Sample
 - 9.2.2. Using Data for Style
 - 9.2.3. Tree Template
 - 9.2.4. Multiple Rules Tree
 - 9.2.5. Multiple Rules Menubar
 
- 9.3. Using Other XUL Tags for Templates
 
- 10. RDF, RDF Tools, and the Content Model
 - 10.1. RDF Basics
 - 10.1.1. RDF Data Model
 - 10.1.2. RDF Syntax
 - 10.1.3. Building an RDF File from Scratch
 
- 10.2. The Mozilla Content Model
 - 10.2.1. Datasources
 
- 10.3. RDF Components and Interfaces
 - 10.3.1. What Is an RDF Component?
 - 10.3.2. What Are RDF Interfaces?
 - 10.3.3. nsIRDFService
 - 10.3.4. nsIRDFCompositeDataSource
 - 10.3.5. nsIRDFDataSource
 - 10.3.6. nsIRDFRemoteDataSource
 - 10.3.7. nsIRDFPurgeableDataSource
 - 10.3.8. nsIRDFNode, nsIRDFResource, and nsIRDFLiteral
 - 10.3.9. nsIRDFContainerUtils
 - 10.3.10. nsIRDFContainer
 - 10.3.11. nsIRDFXML Interfaces
 
- 10.4. Template Dynamics
 - 10.4.1. Template Dynamics in XBL
 
- 10.5. JSLib RDF Files
 - 10.6. Manifests
 - 10.6.1. RDF and Dynamic Overlays
 
- 11. Localization
 - 11.1. Localization Basics
 - 11.1.1. For the Developer
 - 11.1.2. Files and File Formats
 - 11.1.3. UI Aesthetics and Principles
 
- 11.2. DTD Entities
 - 11.2.1. Inserting Entities
 - 11.2.2. External and Inline Entities
 
- 11.3. String Bundles
 - 11.3.1. Inside a Bundle
 - 11.3.2. String Bundle Methods and Properties
 - 11.3.3. Creating Your Own Bundle
 
- 11.4. Programming and Localization
 - 11.4.1. Naming Conventions
 - 11.4.2. Breaking Up the Text
 - 11.4.3. Anonymous Content and Locale
 - 11.4.4. Localizable Resources in HTML
 - 11.4.5. Localizable Resources in RDF
 
- 11.5. The Chrome Registry and Locale
 - 11.5.1. The Directory Structure
 - 11.5.2. Interaction with the Chrome Registry
 - 11.5.3. Distribution
 
- 11.6. Localization Issues
 - 11.6.1. XPFE and Unicode
 - 11.6.2. Language Quirks
 
- 12. Remote Applications
 - 12.1. Directions in Remote Application Development
 - 12.2. Basic Remote Application Example
 - 12.2.1. Case Study: Snake (a.k.a. Hiss-zilla)
 
- 12.3. Setting Up XPFE for Remote Applications
 - 12.3.1. Server Configuration
 
- 12.4. Generated Content
 - 12.4.1. Generating Content with Scripting Languages
 - 12.4.2. Generating Content from a Database
 - 12.4.3. Localizing Remote Applications
 
- 12.5. Certificate Authorities and Digital Signatures
 - 12.5.1. Mozilla Network Security Services (NSS)
 - 12.5.2. CA Certificates, Signing Certificates, and the Certificate Chain
 - 12.5.3. Setting Up a Certificate Authority
 - 12.5.4. Issuing Signing Certificates
 - 12.5.5. Distributing Distribution Certificates
 
- 12.6. Creating Signed Remote Applications
 - 12.6.1. certs.mozdev.org CA Certificate
 - 12.6.2. Signing Certificates
 - 12.6.3. Creating and Signing the Application
 - 12.6.4. Receiving a Signed Application
 
- 12.7. Expanded Privileges in Mozilla
 - 12.8. Signed Remote Snake Game
 - 12.8.1. How to Expand Mozilla to Full Screen
 
- 12.9. Mozilla's XML Extras and SOAP
 - 12.9.1. Mozilla, SOAP, and .NET
 - 12.9.2. Setting Up a .NET Web Service
 - 12.9.3. .NET WSDL
 - 12.9.4. SOAP Call XML Formats
 - 12.9.5. Adding SnakeService SOAP to Snake
 - 12.9.6. Make SOAP Functions Work in XUL Documents
 - 12.9.7. Examining SOAP Functions for Snake
 
- 12.10. Looking Forward
 
- A. Getting and Building the Mozilla Source
 - A.1. Getting the Source Code
 - A.1.1. Downloading the Source with FTP
 - A.1.2. Downloading the Source with CVS
 - A.1.3. Working with Branching
 
- A.2. Building the Source Code
 - A.2.1. Unix Environment
 - A.2.2. Windows Environment
 - A.2.3. Macintosh Environment
 
- B. Development Tools
 - B.1. XULKit
 - B.1.1. new-from-template.pl Script
 - B.1.2. makexpi.pl Script
 - B.1.3. Using XULKit
 
- B.2. Patch Maker 2.0
 - B.2.1. CVS Mode
 - B.2.2. Build Mode
 
- B.3. The DOM Inspector
 - B.4. The Component Viewer
 - B.5. Venkman: The JavaScript Debugger
 - B.6. MozillaTranslator
 - B.7. Missing Parts
 - B.7.1. Visual XUL Editors
 - B.7.2. Toolkits and Libraries
 - B.7.3. Integrating the Pieces
 
- C. Programmer's Reference
 - C.1. XUL Element Set
 - action -- Child element in a XUL template structure that draws content for matched data
 - arrowscrollbox -- Container box for scrolling contents
 - autorepeatbutton -- Provides arrows for a scrolling area
 - binding -- Child element in a XUL template that optionally matches in the data
 - bindings -- Substructure in a XUL template that collects the optional binding rules
 - box -- Generic container and layout element
 - broadcaster -- Notifies elements when a change occurs in the UI
 - broadcasterset -- Container for broadcaster elements
 - browser -- Web-content container
 - button -- A widget that activates some functionality when pressed
 - caption -- Provides heading for a groupbox element
 - checkbox -- Indicates a specified feature's on/off state
 - colorpicker -- Widget used to choose a color
 - column -- A column in a grid
 - columns -- Container for the number of columns in a grid
 - command -- Defines functionality that can be called from multiple sources
 - commands -- Container for a group of command sets
 - commandset -- A container for multiple command elements
 - conditions -- Defines the conditions within a template rule
 - content -- Binds variables in a template
 - deck -- Box container that displays one child element at a time
 - description -- Holder for block of text that can wrap to multiple lines
 - dialog -- Root element for secondary XUL window
 - dialogheader -- Styled text heading for UI panel
 - editor -- Content area for editable web content
 - grid -- Widget for laying out content in a structured tabular fashion
 - grippy -- Visible widget used on a grippy bar to expand or collapse a UI region
 - groupbox -- Box with frame surrounding it
 - hbox -- Box container whose children are laid out horizontally
 - iframe -- Web content area
 - image -- Display of a supported type image
 - key -- Definition for a keyboard shortcut
 - keybinding -- Container for a keyset or group of keysets
 - keyset -- Container for one or more key elements 
 - label -- Simple text display element and label for a control element
 - listbox -- Used for display of a flat list of items
 - listcell -- Single cell of a listbox
 - listcol -- Listbox column definition
 - listcols -- Container for listbox columns (listcol)
 - listhead -- Container for column header in list boxes (listheader)
 - listheader -- Text header for listbox column
 - listitem -- Listbox row definition
 - member -- Matches container relationships  in which the parent element is given by  a container element and the child by a child element
 - menu -- A menu element for containing menu items
 - menubar -- Containing element for one or more menus
 - menuitem -- Single selectable choice in a menu
 - menulist -- Drop-down list of selectable items
 - menupopup -- Pop-up container for menu items
 - menuseparator -- Line separating menu items
 - observes -- Broadcast event and attribute listener
 - overlay -- Root element in a separate file that contains reusable XUL content
 - page -- Root element of XUL file loaded in a content frame
 - popup -- Box container as child window
 - popupset -- Container for popup elements
 - progressmeter -- Visual progress indicator of a time-consuming operation
 - radio -- Single on/off choice represented as selectable circle
 - radiogroup -- Framed box for containing radio elements
 - resizer -- Window-resizing element
 - row -- Container for grid cells laid out consecutively
 - rows -- Definition for grid rows
 - rule -- Defines rules for rendering data as XUL
 - script -- Declaration of script used in XUL file
 - scrollbar -- Widget for scrolling in a container
 - scrollbarbutton -- Button used to move position of scrollbar thumb
 - scrollbox -- Box for scrolling content
 - separator -- Bar between elements
 - slider -- A scrollbar without buttons
 - spacer -- Blank space separating element
 - splitter -- Element for dragging and resizing associated elements
 - stack -- Shows children one on top of one another, all at the same time
 - statusbar -- Box container for status elements
 - statusbarpanel -- Single unit of a statusbar
 - stringbundle -- Holder of localized properties for use in script
 - stringbundleset -- Container for stringbundle elements
 - tab -- A single selectable tab of a tabbox
 - tabbox -- Box container for tab panels
 - tabbrowser -- Tabbed holder for a set of web content views
 - tabpanel -- A single panel of a tabbox
 - tabpanels -- Container for tabpanel elements
 - tabs -- Container for tab elements
 - template -- A high-level widget used to build content dynamically from data
 - textbox -- Accepts text input from user
 - thumb -- Object used to move content in scrollable area
 - toolbar -- Holder of buttons for quick-access UI functionality
 - toolbarbutton -- Specially adapted button for use in a toolbar
 - toolbarseparator -- Visible separator for elements contained in a toolbar
 - toolbox -- Optional container for menu bars and toolbars
 - tooltip -- Pop-up window for context-sensitive help
 - tree -- Hierarchical holder of information represented as rows
 - treecell -- A single cell in a tree
 - treechildren -- The main body of a tree; a container for treeitems
 - treecol -- A single column of a tree
 - treecols -- Container for tree columns
 - treeitem -- A treerow container
 - treerow -- A single row of a tree
 - triple -- Substructure of a template that matches RDF statements in the data
 - vbox -- Box container with vertically laid out children
 - window -- Root element of a top-level XUL window document
 - wizard -- Window used to step though a task
 - wizardpage -- A single panel (step) of a wizard
 
- C.2. XBL Element Set
 - binding -- A single XBL binding
 - bindings -- An XBL document's root element
 - body -- Container for JavaScript code to be executed by an XBL method
 - children -- Insertion point for children of a bound element, or inherited binding
 - constructor -- Container for code to be executed when a binding is created
 - content -- Container for anonymous content to be inserted into a bound document
 - destructor -- Container for code to be executed when a binding is destroyed
 - element -- Insertion point for bound elements in anonymous content
 - field -- Holder property for simple data
 - getter -- Script access point for an element's property
 - handler -- Single event handler for an XBL element
 - handlers -- Container for event-handler elements
 - image -- An image resource in a binding
 - implementation -- Container for binding methods and properties 
 - method -- Script function to be accessed on a binding object
 - parameter -- Single paramter declaration for a method
 - property -- Definition of a single binding object property
 - resources -- Container for list of resources that can be used by a binding
 - setter -- Change a binding property's value
 - stylesheet -- Captures an external stylesheet for use by anonymous content
 
- C.3. Event Attributes
 - onblur -- //FIXME purpose should go here
 - onbroadcast -- //FIXME purpose should go here
 - onchange -- //FIXME purpose should go here
 - onclick -- //FIXME purpose should go here
 - onclose -- //FIXME purpose should go here
 - oncommand -- //FIXME purpose should go here
 - oncommandupdate -- //FIXME purpose should go here
 - oncontextmenu -- //FIXME purpose should go here
 - oncreate -- //FIXME purpose should go here
 - ondblclick -- //FIXME purpose should go here
 - ondestroy -- //FIXME purpose should go here
 - ondragdrop -- //FIXME purpose should go here
 - ondragenter -- //FIXME purpose should go here
 - ondragexit -- //FIXME purpose should go here
 - ondraggesture -- //FIXME purpose should go here
 - ondragover -- //FIXME purpose should go here
 - onfocus -- //FIXME purpose should go here
 - oninput -- //FIXME purpose should go here
 - onkeydown -- //FIXME purpose should go here
 - onkeypress -- //FIXME purpose should go here
 - onkeyup -- //FIXME purpose should go here
 - onload -- //FIXME purpose should go here
 - onmousedown -- //FIXME purpose should go here
 - onmousemove -- //FIXME purpose should go here
 - onmouseout -- //FIXME purpose should go here
 - onmouseover -- //FIXME purpose should go here
 - onmouseup -- //FIXME purpose should go here
 - onoverflow -- //FIXME purpose should go here
 - onoverflowchanged -- //FIXME purpose should go here
 - onpopuphidden -- //FIXME purpose should go here
 - onpopuphiding -- //FIXME purpose should go here
 - onpopupshowing -- //FIXME purpose should go here
 - onpopupshown -- //FIXME purpose should go here
 - onselect -- //FIXME purpose should go here
 - onunderflow -- //FIXME purpose should go here
 - onunload -- //FIXME purpose should go here
 
- Colophon