(Ebook) Programming Firefox: Building Rich Internet Applications with XUL by Kenneth C. Feldt ISBN 9780596102432, 0596102437 pdf download
(Ebook) Programming Firefox: Building Rich Internet Applications with XUL by Kenneth C. Feldt ISBN 9780596102432, 0596102437 pdf download
https://ebooknice.com/product/programming-firefox-building-rich-
internet-applications-with-xul-975672
https://ebooknice.com/product/essential-xul-programming-1077066
https://ebooknice.com/product/professional-blazeds-creating-rich-
internet-applications-with-flex-and-java-55582902
https://ebooknice.com/product/learning-flex-3-getting-up-to-speed-
with-rich-internet-applications-1222752
https://ebooknice.com/product/professional-blazeds-creating-rich-
internet-applications-with-flex-and-java-wrox-programmer-to-
programmer-2205766
(Ebook) HTML5: Designing Rich Internet Applications by Matthew David
ISBN 9780240813288, 0240813286
https://ebooknice.com/product/html5-designing-rich-internet-
applications-4579392
https://ebooknice.com/product/qt6-c-gui-programming-cookbook-
practical-recipes-for-building-cross-platform-gui-applications-
widgets-and-animations-with-qt6-58733138
https://ebooknice.com/product/programming-kotlin-applications-
building-mobile-and-server-side-applications-with-kotlin-23277566
https://ebooknice.com/product/javafx-developing-rich-internet-
applications-2089008
https://ebooknice.com/product/programming-flex-2-the-comprehensive-
guide-to-creating-rich-media-applications-with-adobe-flex-978156
Programming Firefox
Other resources from O’Reilly
Related titles Ajax Design Patterns JavaScript: The Definitive
Ajax Hacks™ Guide
Creating Applications with Learning JavaScript
Mozilla Practical RDF
CSS: The Definitive Guide XML Hacks™
Greasemonkey Hacks™ XML in a Nutshell
Kenneth C. Feldt
Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472.
O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions
are also available for most titles (safari.oreilly.com). For more information, contact our
corporate/institutional sales department: (800) 998-9938 or [email protected].
Printing History:
April 2007: First Edition.
Nutshell Handbook, the Nutshell Handbook logo, and the O’Reilly logo are registered trademarks of
O’Reilly Media, Inc. Programming Firefox, the image of a red fox, and related trade dress are trademarks
of O’Reilly Media, Inc.
Many of the designations used by manufacturers and sellers to distinguish their products are claimed as
trademarks. Where those designations appear in this book, and O’Reilly Media, Inc. was aware of a
trademark claim, the designations have been printed in caps or initial caps.
While every precaution has been taken in the preparation of this book, the publisher and author assume
no responsibility for errors or omissions, or for damages resulting from the use of the information
contained herein.
ISBN-10: 0-596-10243-7
ISBN-13: 978-0-596-10243-2
[M]
Table of Contents
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix
2. XUL Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
File Structure 12
XUL Widgets 15
Introducing Input Controls 24
More Complex Containers 28
Managing the Display Space 35
Content Display Panels 38
Miscellaneous Widgets 39
Helper Features 40
Mozilla Style Declarations 42
Summary 44
v
4. Configuring for Chrome and a Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Chrome Overview 76
Running as a Local Installation 78
XUL-to-Server Communications 80
Serving XUL Files 100
Summary 107
8. Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
A Sample Graphing Project 265
XHTML Review 266
SVG Overview 267
Data-to-Graphics Transformation 272
HTML Canvas 292
Summary 299
vi | Table of Contents
10. XForms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Basic XForms Structure 335
An Example Transfer to the Server 336
XForms Validation Features 341
XForms Events and Actions 359
User Interaction and Dynamic Presentation 363
What to Do When Things Go Wrong 373
Summary 373
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
ix
The goal of this book has little to do with searching for a victor in the browser wars.
Rather, this book is intended to discuss, through example, the application of interna-
tional standards in helping to launch the “next generation” of Internet applications.
The Mozilla technology is one of the best technologies, and one of the best tools
available, to make such a discussion possible.
Intended Audience
This book is intended for designers and developers charged with delivering innova-
tive standards-based Internet applications. This includes those responsible for server
applications or for the development of Internet-enabled desktop applications.
This book is designed to cover many of the practical issues related to the nuances of
XML User Interface (XUL)-based design. Rather than trying to be the authoritative
resource on browser internals, it focuses on the nuts and bolts of using the existing
tools to take advantage of the Firefox framework.
The development setting for this audience may involve any number of tools—the
Personal Hypertext Processor (PHP) or Java on the server side, and the Firefox
browser engine on the client side. The dominant language for the client platform is
most likely to be JavaScript, and developers should have a good understanding of
HTML and, hopefully, some exposure to eXtensible Markup Language (XML)-based
documents such as XHTML.
Members of the target audience could be developers of commercial applications,
extensions to the Firefox browser, or corporate applications. Some knowledge of
JavaScript will be very helpful, although most developers can pick up the language
quickly enough to learn it on the fly.
Most importantly, this book is targeted to those developers who are interested in
(and maybe committed to) using this technology to see what the next generation of
Internet applications will look like.
x | Preface
works well for reference lookups or quick reminders, but thoroughly covering a topic
from start to finish (as in the case of building XUL applications) requires a more
comprehensive approach that involves text, illustrations, and code.
The Web is also at a crossroads. Browser technologies are now stabilizing to the
point where security and reliability are a given. Growing use of web standards to
encode page content is also helping to improve the consistent look of content across
rendering engines.
The time is now ripe for the browser community to explore the next generation of
web standards, and to initiate a wider range of support for new document models to
render graphics, deliver music, and audit user input without needlessly imposing
simple tasks on tomorrow’s web servers.
This book doesn’t serve as just a reference source; it is a practical, hands-on intro-
duction to some of these evolving standards that allow developers to combine cre-
ativity with technology. Programming Firefox is less of a how-to book and more of a
what-if exploration that encourages developers to push the envelope of the Internet
experience.
Preface | xi
Terms and Usage
This book discusses applications of a software engine consisting of a collection of
cross-platform libraries written in C++. This collection of libraries was first wrapped
together as a browser named Mozilla.
Technically, I should call this book’s main topic the Mozilla Cross-Platform Compo-
nent Model (XPCOM) framework. Not all XPCOM libraries are used in the Firefox
browser, however, so I use the term Firefox framework—those libraries that are distrib-
uted as part of the browser-only components supported by the Mozilla Foundation.
A Tag or an Element?
This book is about interface elements, document elements, and technologies, each
having its own terminology. Several terms are used repeatedly throughout this book
and should be clarified here:
Widget
The actual physical representation of an interface element. The term widget is
most often used when discussing the physical appearance of a document. Wid-
gets include buttons, listboxes, and checkboxes.
Element
The basic unit that composes XHTML documents. Tables and divs are exam-
ples of elements.
Tag
The XML encoding of a document element. Examples of tags are <table>, <div>,
and <button>.
xii | Preface
Chapter 3, Coding and Testing for the Real World
Explains how to use the tools for development, including the JavaScript debug-
ger and Document Object Model (DOM) inspector. This chapter is a good foun-
dation for understanding the Firefox development tools and the process used to
design and build applications.
Chapter 4, Configuring for Chrome and a Server
Sketches out the first NewsSearch application—understanding the chrome URL
and how Firefox applications can communicate with a server using the asyn-
chronous HTTP Request protocol.
Chapter 5, Multiframe XUL
Covers managing an application with multiple content areas, and moving con-
tent selections between windows. This section deals somewhat with accessing
DOM data structures, and dealing with the sometimes thorny issue of managing
multiple frames of content.
Chapter 6, Trees, Templates, and Datasources
Describes connecting interface elements to the server-based Resource Descrip-
tion Framework (RDF). Here you’ll find a good introduction to RDF and how
the Firefox interface renders RDF content with trees, as well as how a JavaScript
program can manipulate RDF content.
Chapter 7, DOM Manipulation and Input/Output
Discusses altering document content and appearance using the DOM. This is a
more extensive discussion than that in Chapter 5, including steps to insert con-
tent and dynamically modify display styles.
Chapter 8, Graphics
Covers displaying graphics-rich documents using the Scalable Vector Graphics
(SVG) standard, and painting document regions using the drawing features of
the HTML Canvas element.
Chapter 9, Extending the Interface
Explains how to make the most of the Firefox framework by extending the func-
tionality of existing graphics elements as well as the Firefox interface.
Chapter 10, XForms
Discusses implementing the next-generation Forms interface through XForms, a
technology designed to increase validation features while reducing the overhead
on server logic.
Chapter 11, Installation and Deployment
Outlines developing for different languages and different deployment options.
Chapter 12, XUL Widget Reference
Gives an overview of the XUL widgets.
Glossary, XUL Widgets: Attributes, Properties, and Methods
Provides a list of attribute names used within the Firefox framework.
Preface | xiii
Demonstration Platforms
Throughout this book are numerous screenshots of example sessions using code
samples. Many of the images are from an OS X implementation; I’ve also included
several images from the Windows XP platform. There is no (intentional) emphasis
on one operating system’s implementation over another—only a reasonable effort to
show a good mix of cross-platform support.
xiv | Preface
For more information about our books, conferences, Resource Centers, and the
O’Reilly Network, see our web site at:
http://www.oreilly.com
Safari® Enabled
When you see a Safari® Enabled icon on the cover of your favorite tech-
nology book, that means the book is available online through the
O’Reilly Network Safari Bookshelf.
Safari offers a solution that’s better than e-books. It’s a virtual library that lets you
easily search thousands of top tech books, cut and paste code samples, download
chapters, and find quick answers when you need the most accurate, current informa-
tion. Try it for free at http://safari.oreilly.com.
Acknowledgments
Designing reusable frameworks and writing the implementation code is grueling,
exhausting work.
Making that effort pay off requires patient, persistent work to promote it and edu-
cate users about how such a new product can be used, what benefits it provides, and
yes, even what shortcomings exist.
This book would not be possible if it weren’t for those developers and designers
who took the time to explain the technology through newsgroups, emails, and
online documentation.
Particularly critical was the work done at XULPlanet.com (Aaron Anderson and Neil
Deakin). Their original documentation and examples gave me the confidence that a
sufficient foundation of information was available to take the “next step” in present-
ing an updated overview of XUL technology.
Also helpful were the contributors at mozilla.dev.tech.xul on news.mozilla.org who
responded to my questions with patience and grace. The work being done there by
Christian Biesinger and the other “regulars” has resulted in an invaluable tool avail-
able to the online community in supporting Mozilla/Firefox technology.
I also extend thanks to my editor, Simon St.Laurent, who provided positive feed-
back when I needed it most. Sincere thanks also goes to those who provided techni-
cal and editorial review—those who took the time to point out that even in technical
books, readers expect to be able to read and understand sentences.
Preface | xv
I would also be remiss if I did not extend a thank you to the pioneering companies
and businesses that risk much to integrate Mozilla and forward-looking Internet
technologies into their operations. No single event is more important to a new tech-
nology than the choice to use it in the affairs of business. The decision to tie one’s
economic future to an evolving family of technologies is the ultimate commitment to
“just make it work.” And without that commitment, there would be no need for bug
fixes, new revisions, conferences...or this book.
Finally, my thanks goes to the family members who sacrificed much in companion-
ship and demeanor during the difficult weeks that accompany such a project. I am
especially grateful to my mom, who gave me passion for the written word, and to
Betsy, whose interest and pride helped sustain my effort.
xvi | Preface
Chapter 1 CHAPTER 1
Firefox and Friends 1
1
The Mozilla browser was actually a suite of applications that incorporated both a
browser and an email and newsreader client. To reduce the perceived “bloat” of the
suite, Mozilla decided to break the browser portion out of the suite.
The initial browser was referred to as Phoenix, was renamed Firebird, and finally was
released as Firefox version 1.0 in November 2004.
Today the Mozilla Foundation operates as a nonprofit organization to manage the
open source development aspects of the program. The foundation owns the for-
profit Mozilla Corporation, which focuses on browser support for end users and
commercialization programs.
The Mozilla code base now supports the Firefox browser, the Thunderbird email cli-
ent (Figure 1-1), and the Camino browser for OS X. The complete application suite
(formerly the Mozilla suite) is now branded as the SeaMonkey Internet application
suite. All the browser engines implement the same rendering logic (the code that
paints the screen web content), known as the Gecko rendering engine. The Mozilla
suite offers tools to allow developers to embed the Gecko engine alone in custom-
ized applications.
XML Technologies
As I just mentioned, XUL stands for XML User Interface Language. In fact, many of
the key technologies discussed here are based on XML, or the Extensible Markup
Language. As the XML form so dominates both the interface design and the struc-
ture of displayed documents, it makes sense to consider what XML is, why it is so
important, and what impact it has on electronic document structure.
XML History
XML has its roots in the Standard Generalized Markup Language (SGML). SGML
was developed out of a 1960s IBM project to develop documents whose content
could be machine-readable. SGML was a metalanguage, a self-describing form that
allowed document contents to describe how it was encoded, facilitating machine-
driven typographic processes and, eventually, decoding and cataloging.
But SGML was very complex, and with the advent of the “GUI-friendly” Web, work
was initiated to carry over some of SGML’s advantages of portability to Internet-
rendered documents.
In 1995, work began under the auspices of the World Wide Web Consortium (W3C),
and XML version 1.0 became a consortium recommendation in February 1998.
XML’s power lies in a simple tree structure of text fields, and the capability to define
document types that enable decoders to interpret text fields in different ways. The
tree structure means that any software accessing a well-formed XML file “knows”
how to traverse the contents, which themselves are a feature of some utility.
But more exciting is the capability of an XML document to include a document type
reference that adds a context to the tree elements, giving meaning to the document’s
content. For example, an XML document type can define a row as a horizontal align-
ment of text, but a different document type can define a row as a portion of a mathe-
matical formula. That context can be used to direct the document renderer to display
graphics tables or math formulas.
XML Technologies | 3
Exploring the Variety of Random
Documents with Different Content
Division No. 91, O. R. C., along with the officers of the different
transportation companies, will long be remembered for their generous
manner toward us. “Views of Portland, Oregon, and the Columbia River,” a
beautiful pamphlet souvenir issued by Mt. Hood Division, was presented to
each member of our party, and is highly prized. In connection with the
pamphlet is “a ticket of welcome” of coupon form, and is quite lengthy, but
all right, the first clause of which reads, “This contract with coupons
attached entitles the holder to a hearty welcome and a first-class reception
on entering the State of Oregon, and the courtesies of the Southern Pacific
Company, the Oregon Railroad and Navigation Company, and the Northern
Pacific Railway.
R. Koehler, E. P. Rogers,
General Manager S. P. A. G. P. A., S. P.
E. McNeill, B. Campbell,
Pres. & Mgr. O. R. & N. Traffic Mgr. O. R. & N.
W. H. Hulburt, J. W. Kendrick,
G. P. A., O. R. & N. Co. Genl. Mgr. N. P. Ry.
J. H. Hannaford, C. S. Fee,
Genl. Traffic Mgr. N. P. Ry. G. P. A., N. P. Ry.”
There are five clauses in the contract. The last clause reads, “The
Reception Committee will not be responsible for the loss of any diamonds
(kings and queens excepted), baggage, meals, or sleep on this run.
J. M. Poorman, J. W. Crocker,
Sec. & Treas. C. C.
“Mt. Hood Division No. 91, O. R. C.”
There are six coupons, each reading to and fro over a line between
different points of interest, and bearing at the bottom the name of the
superintendent over whose line it reads. The whole is a nicely gotten up
affair and a valued addition to our collection of souvenirs.
We leave here at 8.45 A. M., and the hour of departure being at hand (as
is always the case), a number of our new-found friends are at hand to see us
off. All along our route we have been constantly reminding the people who
we are by a yell we give in concert, with a vim that would drown the racket
of a college football team; and now, gathered in a bunch, we let go:—
“Who are we? O. R. C.
“Pennsylvania employé.
“Rah! rah! boom—ah!” The ladies of our party are ready and let go:—
“Who are we? Who are we?
“The wives and the daughters of the O. R. C.
“Rah! rah! boom—ah!”
And now the cooks and waiters gathered at the windows and on the
platform of the “Lafayette” let go:—
“Who are we? P. P. C.
pines and cedars, natural growth of the soil, and amongst them, growing in
wild profusion, great ferns six feet in height. In inclosures can be seen deer,
elk, and bear, natives of the wilds. Through this great forest park bridle
paths lead in all directions, and about 80 miles of bicycle track is built. The
park is situated on a high eminence overlooking Puget Sound. By a series of
steep paths and stairs we descend to the beach. The sound is a great body of
water with hardly a ripple on its surface. A half hour is spent here gathering
pebbles and shells, and then we head for the smelter, half a mile up the
beach.
A boathouse furnishes rowboats for those who want them, and a number
avail themselves of this opportunity to avoid a tiresome walk. Those who
walk ascend again the steps and steep pathway, and going along the forest
walk they arrive at the smelter the same time as those who rowed. We are
taken through the great hot, smoky building and shown the treatment ore
receives in all its stages from the smelter to the crucible. This immense
plant, owned and operated by the Tacoma Smelting and Refining Company,
handles gold, silver, and copper ore, and has an annual output of over
$900,000. A train of cars await us when we emerge from the works, flat
cars, fitted up with seats for the occasion; upon these we climb, and find as
we are slowly taken along the sound front that no conveyance could afford
a better view. Tacoma has 12 miles of a water front, upon which splendid
wharves, great warehouses, monster elevators, immense saw and flour mills
are built, the whole 12 miles being lined with industries of this character.
This trip over, we return to our train and find dinner awaiting us, after
which our train is run to the steamboat landing and we are taken aboard the
“City of Kingston,” belonging to the Northern Pacific Railway, for a trip of
28 miles to Seattle. We can hardly realize as the boat leaves the wharf that
our visit to Tacoma is over, so rapidly were we hustled along; but we are
highly pleased with the treatment we received and feel that Tacoma is a
wonderful place and her people will make her still more wonderful by their
thrift, their push, and activity. They have our best wishes for their future
progress and advancement.
The “City of Kingston” is a splendid boat and rides like a feather over
the waters of the sound, and from the expressions of delight on every hand
it is evident our people are enjoying the trip. The boat is in charge of
Engineer G. H. Lent and a gentlemanly purser, who have won the goodwill
of our party by kindly allowing us the freedom of the boat and showing us
through many of the elegantly-furnished state rooms with which the boat is
equipped. Arriving at Seattle, we are loaded in a large cable car and taken
through the city for about four miles and back again. It is so dark we cannot
see the town and can only enjoy the ride. We are taken to the station, where
we wait for half an hour for our train to arrive, which has been sent from
Tacoma to overtake us. We are all pretty thoroughly tired out, and are glad
when at about eleven o’clock our train arrives, and we are soon making
ourselves comfortable inside. M. M. Davis, Esq., a press representative of
Seattle, and Conductor Thomas Doyle in search of an “item” gave us a short
call just after our train came over from Tacoma. Brother Reagan and
“Alfalfa” are the only ones I see as
SPOKANE, WASHINGTON.
Spokane. Mr. McMaster took Brothers Maxwell and Reagan around with
his own team and Captain Hale took Manager Wyman. The street-car party
was under the escort of James Mendenhall, Esq., an old schoolmate of
Brother James Matthews. Mr. Mendenhall came West several years ago,
located at Spokane, and engaged in real estate business. He is now one of
the prominent citizens of the place and closely identified with the business
interests and enterprises of the city. We also met Mark Mendenhall, Esq., a
brother of James, who is a leading attorney in Spokane. No, we will not
forget the courtesy and kindness of the good people of Spokane, and the
good people of Spokane will not forget us, for they have only to remember
that on the afternoon of May 27th, 1897, street-railway traffic was blocked
for thirty minutes by a car abandoned by the Pennsylvania Railroad
conductors and kept waiting for them while they viewed the grandeur of
Spokane Falls for half an hour from the rear balcony of the brewery.
At 7.40 P. M. Eastern (4.40 P. M. Pacific) time we are all aboard our
train once more, and with Engineer Secord at the throttle of engine No. 119
we quickly leave beautiful Spokane far in our rear. Captain Hale is still with
us, his brakeman being A. S. Harding. A hobo is discovered lying on the
truss rods of the combined car; he can be seen by looking around the side of
the car; his position seems a perilous one, but our train makes no stop till it
gets to Hope, 84 miles, so he is allowed to remain and take his chances. For
several miles we pass through magnificent cattle ranges and fine farming
lands. As we approach Hope the road skirts the shores of Lake Pend
d’Oreille for about three miles, giving us a fine view of this beautiful body
of water. We arrive at Hope 10.00 Eastern (7.00 Pacific) time and stop
twenty-five minutes to change engines. Here a change is also made in time;
it changes from Pacific to Mountain time, one hour later than Pacific and
two hours earlier than Eastern time. Hobo No. 2 changed his position from
the truss rods of the combined car to a pile of ties when the train stopped at
Hope. He was given a lunch by one of the dining-car boys and advised not
to anchor himself in the same place again, as the position was not only a
dangerous one, but very conspicuous. When asked his name he said it was
J. W. Kelsey, that he was trying to get home, had been away for two years,
and wanted to see his mother. Hobo No. 1 lays low, for he knows should he
for a moment vacate his narrow quarters under the “Lafayette” there would
be a scramble for his place. It is growing dusk, and through the gloom of
the dying day we have counted no less than fifteen skulking forms about the
train, watching for an opportunity to secrete themselves underneath or about
the train for the purpose of obtaining free transportation.
Bidding adieu to big-hearted, genial Captain Hale, who has been with us
for 357 miles, we leave Hope at 10.25 P. M. Eastern (8.25 P. M. Mountain)
time with N. P. engine No. 438, with Engineer Jim Bailey at the throttle,
whose fireman is John Ryan. Conductor William Gilbert has charge of the
train and his brakemen are T. S. McEachran and F. R. Foote. This crew runs
us to Helena, 297 miles. Ten miles from Hope we cross Clark’s Fork, a
branch of the Columbia River,
and through the gathering darkness we can see that we have entered a wild
and rocky region, the road winding around and among mountain ranges and
snow-capped peaks, following the course of the stream we just crossed for
60 miles.
Captain Gilbert and his brakemen are lively, interesting company, and
entertain us during the evening with anecdotes and stories of Western life.
“Are you troubled much with tramps, captain?” some one asks, as
Conductor Gilbert, during the conversation, made some allusion to the
profession. “They do not give us much real trouble,” is the reply, “yet they
are a matter of concern, for we are never without them, and need to be
constantly on guard; there is always a Wandering Willie around somewhere,
and you never know what mischief he may be up to. There are at least a
dozen on this train to-night. The trucks are full and several on top of the
cars.” This is rather startling information, and I notice Brother Sheppard
clap his hand on his right hip pocket to make sure the “critter” is there, and
Alfalfa quietly unlocks the cupboard door, where “our artillery” is kept. I
see no sign of fear on the serene countenance of Captain Gilbert and believe
we’re not in danger; yet Brothers Maxwell and Terry start through the train
to make sure the vestibule doors are barred and step traps fastened down. At
Trout Creek, a small station 48 miles from Hope, we stopped for water, and
F. Hartman, roadmaster of the Missoula and Hope Division, got aboard and
went with us to Horse Plains. It is now near midnight, and making my way
from the smoker to the “Marco” I turn in, wondering how the poor fellows
who are hanging on to the brake beams are enjoying themselves, for Bailey
with the “438” is switching them around the curves at a pretty lively rate.
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
ebooknice.com