Skip to content
This repository has been archived by the owner on Feb 26, 2022. It is now read-only.

Commit

Permalink
Bug 673187 - Remove docs server, first part; r=warner
Browse files Browse the repository at this point in the history
  • Loading branch information
Will Bamberg committed Sep 12, 2011
1 parent da3c144 commit 6d19ec4
Show file tree
Hide file tree
Showing 120 changed files with 1,018 additions and 247 deletions.
6 changes: 5 additions & 1 deletion .gitignore
Expand Up @@ -3,7 +3,11 @@ python-lib/cuddlefish/app-extension/components/jetpack.xpt
testdocs.tgz
jetpack-sdk-docs.tgz
.test_tmp/
jetpack-sdk-docs/
doc/dev-guide/
doc/index.html
doc/packages/
doc/status.md5


# If you want to add other files here, like *.pyc and *.DS_Store,
# please add them to a global git ignore file.
Expand Down
Expand Up @@ -170,7 +170,7 @@ overview-amo-review-process/](http://blog.mozilla.com/addons/2011/02/04/overview
You should see the highlight appearing when you move the mouse over certain elements:

<img class="image-center"
src="media/annotator/highlight.png" alt="Annotator Highlighting">
src="static-files/media/annotator/highlight.png" alt="Annotator Highlighting">

Click on the highlight and you should see something like this in the console
output:
Expand Down Expand Up @@ -323,7 +323,7 @@ element and click the element when it is highlighted. You should see a panel
with a text area for a note:

<img class="image-center"
src="media/annotator/editor-panel.png" alt="Annotator Editor Panel">
src="static-files/media/annotator/editor-panel.png" alt="Annotator Editor Panel">
<br>

Enter the note and press the return key: you should see console output like
Expand Down
Expand Up @@ -191,13 +191,13 @@ Execute `cfx run` one last time. Activate the annotator and enter an
annotation. You should see a yellow border around the item you annotated:

<img class="image-center"
src="media/annotator/matcher.png" alt="Annotator Matcher">
src="static-files/media/annotator/matcher.png" alt="Annotator Matcher">
<br>

When you move your mouse over the item, the annotation should appear:

<img class="image-center"
src="media/annotator/annotation-panel.png" alt="Annotation Panel">
src="static-files/media/annotator/annotation-panel.png" alt="Annotation Panel">
<br>

Obviously this add-on isn't complete yet. It could do with more beautiful
Expand Down
Expand Up @@ -10,7 +10,7 @@ We could represent the basic interactions between the `main` module and the
various content scripts like this:

<img class="image-center"
src="media/annotator/annotator-design.png" alt="Annotator Design">
src="static-files/media/annotator/annotator-design.png" alt="Annotator Design">

## User Interface ##

Expand Down
Expand Up @@ -233,7 +233,7 @@ Firefox. Activate the add-on, add an annotation, and then right-click the
widget. You should see something like this:

<img class="image-center"
src="media/annotator/annotation-list.png" alt="Annotation List">
src="static-files/media/annotator/annotation-list.png" alt="Annotation List">
<br>

<span class="aside">
Expand Down
Expand Up @@ -46,8 +46,8 @@ Save this in your `data/widget` directory as `widget.js`.

You can copy the widget's icons from here:

<img style="margin-left:40px; margin-right:20px;" src="media/annotator/pencil-on.png" alt="Active Annotator">
<img style="margin-left:20px; margin-right:20px;" src="media/annotator/pencil-off.png" alt="Inactive Annotator">
<img style="margin-left:40px; margin-right:20px;" src="static-files/media/annotator/pencil-on.png" alt="Active Annotator">
<img style="margin-left:20px; margin-right:20px;" src="static-files/media/annotator/pencil-off.png" alt="Inactive Annotator">

(Or make your own if you're feeling creative.) Save them in your `data/widget` directory.

Expand Down Expand Up @@ -100,7 +100,7 @@ Now from the `annotator` directory type `cfx run`. You should see the widget
in the add-on bar:

<div align="center">
<img src="media/annotator/widget-icon.png" alt="Widget Icon">
<img src="static-files/media/annotator/widget-icon.png" alt="Widget Icon">
</div>
<br>

Expand Down
Expand Up @@ -22,7 +22,7 @@ You can build or load the content locally or load it from a remote server.
The screenshot below shows a panel whose content is built from the list of
currently open tabs:

<img class="image-center" src="media/screenshots/modules/panel-tabs-osx.png"
<img class="image-center" src="static-files/media/screenshots/modules/panel-tabs-osx.png"
alt="List open tabs panel">
<br>

Expand All @@ -40,7 +40,7 @@ Widgets are generally used in one of two different contexts:
the time in a selected time zone or the weather. The screenshot below shows a
widget that displays the time in the selected city:

<img class="image-center" src="media/screenshots/modules/widget-content-osx.png"
<img class="image-center" src="static-files/media/screenshots/modules/widget-content-osx.png"
alt="Mozilla widget content">
<br>

Expand All @@ -49,15 +49,15 @@ interface. For example, a widget might display only an icon, but open a
settings dialog when the user clicks it. The widget below displays only the
Mozilla icon:

<img class="image-center" src="media/screenshots/modules/widget-icon-osx.png"
<img class="image-center" src="static-files/media/screenshots/modules/widget-icon-osx.png"
alt="Mozilla widget icon">
<br>

To simplify your code in the latter case, you can assign a panel object to
your widget. Then when the user clicks the widget, the widget will display
the panel anchored to the widget:

<img class="image-center" src="media/screenshots/modules/widget-panel-osx.png"
<img class="image-center" src="static-files/media/screenshots/modules/widget-panel-osx.png"
alt="Panel anchored to widget">
<br>

Expand All @@ -73,7 +73,7 @@ is selected) or define your own contexts using scripts.
In the screenshot below an add-on has added a new submenu to the context menu
associated with `img` elements:

<img class="image-center" src="media/screenshots/modules/context-menu-image-osx.png"
<img class="image-center" src="static-files/media/screenshots/modules/context-menu-image-osx.png"
alt="Context-menu">
<br>

Expand All @@ -86,7 +86,7 @@ OS X and Windows, libnotify on Linux), so the notification will look slightly
different on different platforms. On Mac OS X a notification will look
something like this:

<img class="image-center" src="media/screenshots/modules/notification-growl-osx.png"
<img class="image-center" src="static-files/media/screenshots/modules/notification-growl-osx.png"
alt="Growl notification">
<br>

Expand Down
Expand Up @@ -23,8 +23,24 @@ applicable to a subset of the commands.

### cfx docs ###

This command launches an HTTP server on the localhost to view web-based
documentation in a new Firefox window.
This command displays the documentation for the SDK. The documentation is
shipped with the SDK in [Markdown](http://daringfireball.net/projects/markdown/)
format. The first time this command is executed, and any time after the
Markdown files on disk have changed, `cfx docs` will generate a set of HTML
pages from them and launch a web browser to display them. If the Markdown files
haven't changed, `cfx docs` just launches a browser initialized to the set of
generated pages.

To regenerate the documentation associated with a single file, you can
specify the file as an argument. For example:

<pre>
cfx docs doc/dev-guide-source/addon-development/cfx-tool.md
</pre>

This command will regenerate only the HTML page you're reading.
This is useful if you're iteratively editing a single file, and don't want to wait for cfx to
regenerate the complete documentation tree.

### cfx init ####
Create a new directory, change into it, and run `cfx init`.
Expand Down
Expand Up @@ -19,7 +19,7 @@ module wants to make available to other modules
object of another module. Your translator add-on uses `require` to import the
SDK modules it uses.

![CommonJS modules](media/commonjs-modules.jpg)
![CommonJS modules](static-files/media/commonjs-modules.jpg)

The SDK
[freezes](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/freeze)
Expand Down Expand Up @@ -62,7 +62,7 @@ soon as Firefox has enabled the add-on.
So in terms of CommonJS objects the translator consists of a package that
contains a single module called `main`, and which imports three SDK modules:

![CommonJS translator](media/commonjs-translator.jpg)
![CommonJS translator](static-files/media/commonjs-translator.jpg)

Because an add-on is a CommonJS package it's possible to include more than one
module in an add-on, and to make your modules available to any code that want
Expand Down
179 changes: 179 additions & 0 deletions doc/dev-guide-source/addon-development/content-scripts/using-port.md
@@ -0,0 +1,179 @@

# Communicating using "port" #

To enable add-on scripts and content scripts to communicate with each other,
each end of the conversation has access to a `port` object which defines two
functions:

**`emit()`** is used to emit an event. It may be called with any number of
parameters, but is most likely to be called with a name for the event and
an optional payload. The payload can be any value that is
<a href = "dev-guide/addon-development/content-scripts/using-port.html#json_serializable">serializable to JSON</a>

port.emit("myEvent", myEventPayload);

**`on()`** takes two parameters: the name of the event and a function to handle it:

port.on("myEvent", function handleMyEvent(myEventPayload) {
// Handle the event
});

Here's simple add-on that sends a message to a content script using `port`:

var tabs = require("tabs");

var alertContentScript = "self.port.on('alert', function(message) {" +
" window.alert(message);" +
"})";

tabs.on("ready", function(tab) {
worker = tab.attach({
contentScript: alertContentScript
});
worker.port.emit("alert", "Message from the add-on");
});

tabs.open("http://www.mozilla.org");

We could depict the interface between add-on code and content script code like
this:

<img class="image-center" src="static-files/media/content-scripting-events.png"
alt="Content script events">

Events are asynchronous: that is, the sender does not wait for a reply from
the recipient but just emits the event and continues processing.

## Accessing `port` in the Content Script ##

<span class="aside">Note that the global `self` object is completely
different from the [`self` module](packages/addon-kit/docs/self.html), which
provides an API for an add-on to access its data files and ID.</span>

In the content script the `port` object is available as a property of the
global `self` object. Thus, to emit an event from a content script:

self.port.emit("myContentScriptEvent", myContentScriptEventPayload);

To receive an event from the add-on code:

self.port.on("myAddonEvent", function(myAddonEventPayload) {
// Handle the event
});

Compare this to the technique used to receive _built-in_ events in the
content script. For example, to receive the `context` event in a content script
associated with a [context menu](packages/addon-kit/docs/context-menu.html)
object, you would call the `on` function attached to the global `self` object:

self.on("context", function() {
// Handle the event
});

So the `port` property is essentially used here as a namespace for
user-defined events.

## Accessing `port` in the Add-on Script ##

In the add-on code, the channel of communication between the add-on and a
particular content script context is encapsulated by the `worker` object. Thus
the `port` object for communicating with a content script is a property of the
corresponding `worker` object.

However, the worker is not exposed to add-on code in quite the same way
in all modules. The `panel` and `page-worker` objects integrate the
worker API directly. So to receive events from a content script associated
with a panel you use `panel.port.on()`:

var panel = require("panel").Panel({
contentScript: "self.port.emit('showing', 'panel is showing');"
});

panel.port.on("showing", function(text) {
console.log(text);
});

panel.show();

Conversely, to emit user-defined events from your add-on you can just call
`panel.port.emit()`:

var panel = require("panel").Panel({
contentScript: "self.port.on('alert', function(text) {" +
" console.log(text);" +
"});"
});

panel.show();
panel.port.emit("alert", "panel is showing");

The `panel` and `page-worker` objects only host a single page at a time,
so each distinct page object only needs a single channel of communication
to its content scripts. But some modules, such as `page-mod`, might need to
handle multiple pages, each with its own context in which the content scripts
are executing, so it needs a separate channel (worker) for each page.

So `page-mod` does not integrate the worker API directly: instead, each time a
content script is attached to a page, the worker associated with the page is
supplied to the page-mod in its `onAttach` function. By supplying a target for
this function in the page-mod's constructor you can register to receive
events from the content script, and take a reference to the worker so as to
emit events to it.

var pageModScript = "window.addEventListener('click', function(event) {" +
" self.port.emit('click', event.target.toString());" +
" event.stopPropagation();" +
" event.preventDefault();" +
"}, false);" +
"self.port.on('warning', function(message) {" +
"window.alert(message);" +
"});"

var pageMod = require('page-mod').PageMod({
include: ['*'],
contentScript: pageModScript,
onAttach: function(worker) {
worker.port.on('click', function(html) {
worker.port.emit('warning', 'Do not click this again');
});
}
});

In the add-on above there are two user-defined events:

* `click` is sent from the page-mod to the add-on, when the user clicks an
element in the page
* `warning` sends a silly string back to the page-mod

## <a name="json_serializable">JSON-Serializable Values</a> ##

The payload for an event can be any JSON-serializable value. When events are
sent their payloads are automatically serialized, and when events are received
their payloads are automatically deserialized, so you don't need to worry
about serialization.

However, you _do_ have to ensure that the payload can be serialized to JSON.
This means that it needs to be a string, number, boolean, null, array of
JSON-serializable values, or an object whose property values are themselves
JSON-serializable. This means you can't send functions, and if the object
contains methods they won't be encoded.

For example, to include an array of strings in the payload:

var pageModScript = "self.port.emit('loaded'," +
" [" +
" document.location.toString()," +
" document.title" +
" ]" +
");"

var pageMod = require('page-mod').PageMod({
include: ['*'],
contentScript: pageModScript,
onAttach: function(worker) {
worker.port.on('loaded', function(pageInfo) {
console.log(pageInfo[0]);
console.log(pageInfo[1]);
});
}
});
Expand Up @@ -250,12 +250,12 @@ page containing some text that is not in English, for example:
Select some text on that page and right-click to activate the context menu.
You should see a new item labeled "Translate Selection":

![translator context-menu](media/screenshots/translator/context-menu-osx.png)
![translator context-menu](static-files/media/screenshots/translator/context-menu-osx.png)

Select that item and the text you selected should be replaced with its English
translation:

![translator context-menu](media/screenshots/translator/translated-osx.png)
![translator context-menu](static-files/media/screenshots/translator/translated-osx.png)

You will also see output like this appear in your command shell:

Expand Down
Expand Up @@ -114,7 +114,7 @@ add-on for distribution, view documentation, and run unit tests.
## cfx docs ##

If you're reading these documents online, try running `cfx docs`. This will
run a self-hosted documentation server and open it in your web browser.
build the documentation for the SDK and display it in a browser.

## Problems? ##

Expand Down
Expand Up @@ -49,7 +49,7 @@ to the event-handling interfaces described in the
The diagram below shows an overview of the main components and their
relationships. The gray fill represents code written by the add-on developer.

<img class="image-center" src="media/content-scripting-overview.png"
<img class="image-center" src="static-files/media/content-scripting-overview.png"
alt="Content script events">

This might sound complicated but it doesn't need to be. The following add-on
Expand Down

0 comments on commit 6d19ec4

Please sign in to comment.