Permalink
Browse files

Bug 673187 - Remove docs server, first part; r=warner

  • Loading branch information...
1 parent da3c144 commit 6d19ec4b68fd651da5b0163bdc62bc5d6b418f33 @wbamberg wbamberg committed Sep 12, 2011
Showing with 1,018 additions and 247 deletions.
  1. +5 −1 .gitignore
  2. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/about.md
  3. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/annotator/annotator.md
  4. +2 −2 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/annotator/creating.md
  5. +2 −2 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/annotator/displaying.md
  6. +1 −1 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/annotator/overview.md
  7. +1 −1 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/annotator/storing.md
  8. +3 −3 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/annotator/widget.md
  9. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/api-idioms.md
  10. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/api-intro.md
  11. +6 −6 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/api-modules.md
  12. +18 −2 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/cfx-tool.md
  13. +2 −2 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/commonjs.md
  14. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/console.md
  15. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/content-scripts/access.md
  16. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/content-scripts/loading.md
  17. 0 ...ic-files/md/dev-guide → doc/dev-guide-source}/addon-development/content-scripts/reddit-example.md
  18. +179 −0 doc/dev-guide-source/addon-development/content-scripts/using-port.md
  19. 0 ...files/md/dev-guide → doc/dev-guide-source}/addon-development/content-scripts/using-postmessage.md
  20. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/events.md
  21. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/getting-started.md
  22. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/guides.md
  23. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/implementing-reusable-module.md
  24. +2 −2 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/implementing-simple-addon.md
  25. +1 −1 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/installation.md
  26. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/module-search.md
  27. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/package-spec.md
  28. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/program-id.md
  29. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/reference.md
  30. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/troubleshooting.md
  31. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/tutorials.md
  32. 0 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/two-types-of-scripts.md
  33. +1 −1 {static-files/md/dev-guide → doc/dev-guide-source}/addon-development/web-content.md
  34. 0 {static-files/md/dev-guide → doc/dev-guide-source}/appendices/credits.md
  35. 0 {static-files/md/dev-guide → doc/dev-guide-source}/appendices/glossary.md
  36. 0 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/about.md
  37. 0 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/best-practices.md
  38. 0 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/chrome.md
  39. +1 −1 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/e10s.md
  40. 0 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/globals.md
  41. 0 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/guides.md
  42. 0 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/reference.md
  43. 0 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/tutorials.md
  44. 0 {static-files/md/dev-guide → doc/dev-guide-source}/module-development/xpi.md
  45. 0 {static-files/md/dev-guide → doc/dev-guide-source}/welcome.md
  46. +15 −15 { → doc}/static-files/base.html
  47. 0 { → doc}/static-files/css/api-reference.css
  48. 0 { → doc}/static-files/css/base.css
  49. 0 { → doc}/static-files/css/footer.css
  50. 0 { → doc}/static-files/css/header.css
  51. 0 { → doc}/static-files/css/sdk-docs.css
  52. 0 { → doc}/static-files/js/jquery.js
  53. +0 −24 { → doc}/static-files/js/main.js
  54. +175 −0 doc/static-files/md/dev-guide/addon-development/content-scripts/access.md
  55. +60 −0 doc/static-files/md/dev-guide/addon-development/content-scripts/loading.md
  56. +67 −0 doc/static-files/md/dev-guide/addon-development/content-scripts/reddit-example.md
  57. 0 { → doc}/static-files/md/dev-guide/addon-development/content-scripts/using-port.md
  58. +136 −0 doc/static-files/md/dev-guide/addon-development/content-scripts/using-postmessage.md
  59. BIN { → doc}/static-files/media/annotator/annotation-list.png
  60. BIN { → doc}/static-files/media/annotator/annotation-panel.png
  61. BIN { → doc}/static-files/media/annotator/annotator-design.png
  62. BIN { → doc}/static-files/media/annotator/editor-panel.png
  63. BIN { → doc}/static-files/media/annotator/highlight.png
  64. BIN { → doc}/static-files/media/annotator/matcher.png
  65. BIN { → doc}/static-files/media/annotator/pencil-off.png
  66. BIN { → doc}/static-files/media/annotator/pencil-on.png
  67. BIN { → doc}/static-files/media/annotator/widget-icon.png
  68. BIN { → doc}/static-files/media/bg-footer.png
  69. BIN { → doc}/static-files/media/bg-header.png
  70. BIN { → doc}/static-files/media/commonjs-modules.jpg
  71. BIN { → doc}/static-files/media/commonjs-translator.jpg
  72. BIN { → doc}/static-files/media/content-scripting-events.png
  73. BIN { → doc}/static-files/media/content-scripting-overview.png
  74. BIN { → doc}/static-files/media/favicon.png
  75. BIN { → doc}/static-files/media/firefox-32.png
  76. BIN { → doc}/static-files/media/firefox-logo.png
  77. BIN { → doc}/static-files/media/footer-logo-med.png
  78. BIN { → doc}/static-files/media/mozilla-tab.png
  79. BIN { → doc}/static-files/media/multiple-workers.jpg
  80. BIN { → doc}/static-files/media/screenshots/default-panel-osx.png
  81. BIN { → doc}/static-files/media/screenshots/default-panel-ubuntu.png
  82. BIN { → doc}/static-files/media/screenshots/default-panel-windows.png
  83. BIN { → doc}/static-files/media/screenshots/modules/context-menu-image-osx.png
  84. BIN { → doc}/static-files/media/screenshots/modules/notification-growl-osx.png
  85. BIN { → doc}/static-files/media/screenshots/modules/panel-tabs-osx.png
  86. BIN { → doc}/static-files/media/screenshots/modules/widget-content-osx.png
  87. BIN { → doc}/static-files/media/screenshots/modules/widget-icon-osx.png
  88. BIN { → doc}/static-files/media/screenshots/modules/widget-panel-osx.png
  89. BIN { → doc}/static-files/media/screenshots/translator/context-menu-osx.png
  90. BIN { → doc}/static-files/media/screenshots/translator/translated-osx.png
  91. BIN { → doc}/static-files/media/screenshots/widget-panel-clock.png
  92. BIN { → doc}/static-files/media/twitter-widget.png
  93. 0 { → doc}/static-files/syntaxhighlighter/MIT-LICENSE
  94. 0 { → doc}/static-files/syntaxhighlighter/scripts/shBrushCss.js
  95. 0 { → doc}/static-files/syntaxhighlighter/scripts/shBrushJScript.js
  96. 0 { → doc}/static-files/syntaxhighlighter/scripts/shBrushXml.js
  97. 0 { → doc}/static-files/syntaxhighlighter/scripts/shCore.js
  98. 0 { → doc}/static-files/syntaxhighlighter/styles/shCore.css
  99. 0 { → doc}/static-files/syntaxhighlighter/styles/shThemeDefault.css
  100. +1 −1 packages/addon-kit/docs/page-mod.md
  101. +3 −3 packages/addon-kit/docs/panel.md
  102. +1 −1 packages/addon-kit/docs/widget.md
  103. +9 −15 python-lib/cuddlefish/__init__.py
  104. 0 python-lib/cuddlefish/docs/__init__.py
  105. 0 python-lib/cuddlefish/{ → docs}/apiparser.py
  106. 0 python-lib/cuddlefish/{ → docs}/apirenderer.py
  107. +224 −0 python-lib/cuddlefish/docs/generate.py
  108. +3 −3 python-lib/cuddlefish/{ → docs}/webdocs.py
  109. +4 −115 python-lib/cuddlefish/server.py
  110. +1 −1 python-lib/cuddlefish/tests/__init__.py
  111. 0 python-lib/cuddlefish/tests/static-files/{static-files/md/dev-guide → doc/dev-guide-source}/no_h1.md
  112. 0 ...n-lib/cuddlefish/tests/static-files/{static-files/md/dev-guide → doc/dev-guide-source}/welcome.md
  113. 0 python-lib/cuddlefish/tests/static-files/{ → doc}/static-files/base.html
  114. 0 python-lib/cuddlefish/tests/static-files/{ → doc}/static-files/index.html
  115. +1 −0 python-lib/cuddlefish/tests/static-files/doc/status.md5
  116. +1 −1 python-lib/cuddlefish/tests/test_apiparser.py
  117. +2 −2 python-lib/cuddlefish/tests/test_apirenderer.py
  118. +87 −0 python-lib/cuddlefish/tests/test_generate.py
  119. +1 −38 python-lib/cuddlefish/tests/test_server.py
  120. +3 −3 python-lib/cuddlefish/tests/test_webdocs.py
View
@@ -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.
@@ -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:
@@ -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
@@ -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
@@ -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 ##
@@ -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">
@@ -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.
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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`.
@@ -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)
@@ -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
@@ -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]);
+ });
+ }
+ });
@@ -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:
@@ -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? ##
@@ -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
Oops, something went wrong.

0 comments on commit 6d19ec4

Please sign in to comment.