diff options
Diffstat (limited to 'doc/librejs.texi')
-rw-r--r-- | doc/librejs.texi | 878 |
1 files changed, 878 insertions, 0 deletions
diff --git a/doc/librejs.texi b/doc/librejs.texi new file mode 100644 index 0000000..2ff6271 --- /dev/null +++ b/doc/librejs.texi @@ -0,0 +1,878 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename librejs.info +@include version.texi +@settitle GNU LibreJS @value{VERSION} + +@copying +This manual is for GNU LibreJS (version @value{VERSION}, @value{UPDATED}), +a GNU IceCat extension to detect and block nonfree nontrivial +JavaScript on webpages. + +Copyright @copyright{} 2011 2012 2014 Loic J. Duros + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, with no Front-Cover Texts, and with no Back-Cover +Texts. A copy of the license is included in the section entitled +``GNU Free Documentation License''. +@end quotation +@end copying + +@dircategory GNUzilla +@direntry +* LibreJS: (librejs). Detect nonfree nontrivial in GNU Icecat +@end direntry + +@titlepage +@title GNU LibreJS +@subtitle for version @value{VERSION}, @value{UPDATED} +@author Loic J. Duros (@email{librejs@@lduros.net}) +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + + +@contents + + +@node Top +@top LibreJS +This manual is for GNU LibreJS (version @value{VERSION}, @value{UPDATED}). + +@menu +* Overview:: General purpose and information. +* Disclaimer:: Emphasize what LibreJS does and does not. +* Installation:: Installing LibreJS from source. +* How to Use:: How to use LibreJS in IceCat. +* JavaScript Detection:: How LibreJS detects nontrivial Javascript. +* Free Licenses Detection:: List of licenses detected by LibreJS. +* Setting Your JavaScript Free:: Information for website owners/maintainers. +* Installation Requirements:: Requirements to build and install LibreJS. +* LibreJS Internals:: How LibreJS works under the hood. +* Tests:: Test LibreJS and better understand it. +* GNU Free Documentation License:: Copying and sharing this documentation. +@end menu + +@node Overview +@chapter Overview + +@cindex overview +GNU LibreJS ---an add-on for GNU IceCat and Mozilla Firefox--- detects +and blocks nonfree nontrivial JavaScript while allowing its execution on +pages containing code that is either trivial and/or free. + +Many websites run nontrivial JavaScript on your computer. Some use it +for complex tasks; many use it gratuitously for minor jobs that could be +done easily with plain HTML. Sometimes this JavaScript code is +malicious. Either way, the JavaScript code is often nonfree. For +explanation of the issue, see "The JavaScript +Trap"(@url{http://www.gnu.org/philosophy/javascript-trap.html}). + +If you care about freedom in your computing, and don't wish to let all +and sundry make you run nonfree programs, now you can prevent it by +using LibreJS. + + +@node Disclaimer +@chapter Disclaimer + +@cindex disclaimer + +@itemize @bullet +@item +LibreJS is not a security tool. Its goal is to detect nonfree nontrivial +JavaScript, and it currently does not detect whether free or trivial +code is malicious or not. Other free Mozilla extensions and add-ons may +be available for this purpose. + +@item +LibreJS is always a work in progress. If you find a bug, please report +it to @email{bug-librejs@@gnu.org}. + +@end itemize + +@node Installation +@chapter Installation +@cindex Installation + +You can install LibreJS directly using a generated @file{librejs.xpi} +file, or by building it from source. + + +@section Building the Package +After enabling the Add-on SDK, you should be able to use the @code{make} +command to build LibreJS from source. + +After running @code{make}, a new file, @file{librejs.xpi} should be +generated. This is the file that can be installed in a Mozilla browser. + +@section Installing LibreJS +To install the add-on for all users, run: +@example +sudo make install +@end example + +or as root: +@example +make install +@end example + +Next time you open a Mozilla-browser as a user of your system, you +should be notified that a new add-on (in this case, LibreJS) as been +installed and whether to allow it to run or not. + +@node How to Use +@chapter How to Use + +@section LibreJS in action + +After installing the add-on, you will see the LibreJS widget in the +add-on bar at the bottom of the browser window. After loading a page, +left-click on the widget to view the deactivated JavaScript code from +the page (both on page and external) and, if applicable, the scripts +that were accepted. + +@section Complaint Feature + +It is very important to complain when a site has nonfree JavaScript +code, especially if it won't work without that code. LibreJS makes it +easy to complain by heuristically finding where to send the complaint. + +When nonfree/nontrivial code is detected in a page, LibreJS attempts to +find a relevant contact link or email for the website you are +visiting. In order to do so, it will attempt to visit a few links from +the current page (for instance, a link labeled ``contact'' on the same +domain as the current page, @dots{}) + +LibreJS detects contact pages, email addresses that are likely to be +owned by the maintainer of the site, Twitter and identi.ca links, and +phone numbers. + +After LibreJS detects any of the above, a ``Complain'' tab will appear +on the right of your web browser. When you click on this tab, a large +panel will appear with contact information. Ideally, at the top you will +find the email address of the maintainer, labeled as the ``Email you +should use''. + +When you complain to the website for their nonfree nontrivial +JavaScript, provide them with the link to the JavaScript Trap essay so +that they can get more information on what the issue is and how they can +solve it on their own site. + +LibreJS includes a default subject line and body for the complaint email, +with a link to the JavaScript Trap essay. This can be configured in the +LibreJS add-on preferences in your web browser. + + +@section Options + +@table @dfn +@item Whitelist +LibreJS lets you whitelist domain names and subdomains to bypass the +regular JavaScript check. This might be useful, for example, if you are +running your own code in a local web server. In order to add a +whitelisted domain or url, go to Tools >> Add-ons, or press @kbd{Control ++ Shift + A}. Inside the add-on window, click on @dfn{Extensions}, and in +the list, where you see LibreJS, click on the @dfn{Preferences} button. +You will see an input field labeled @dfn{Whitelist}. In the field, +enter comma-separated domain names. Do not enter the protocol. For +instance to whitelist all the pages of @url{http://www.gnu.org} and +@url{https://gnu.org}, enter @samp{gnu.org}. To allow all subdomains from +gnu.org, enter: @samp{*.gnu.org}. This will match such sites as +@url{http://savannah.gnu.org} and @url{http://audio-video.gnu.org}. + +@item Complaint tab +This specifies whether the complaint tab appears when a site is running +nonfree JavaScript. + +@item Display notifications of JavaScript analysis +This option enables an info bar of realtime JavaScript analysis. + +@item Complaint email subject +Configure the default subject used in complaint emails. + +@item Complaint email body +Configure the default body used in complaint emails. +@end table + +@node JavaScript Detection +@chapter JavaScript Detection +@cindex javascript + +@itemize +LibreJS considers JavaScript on a page nontrivial if any of the +following are true: + +@item +It makes an AJAX request or is loaded along with scripts that make +an AJAX request, + +@item +It loads external scripts dynamically or is loaded along with +scripts that do, + +@item +It defines functions or methods and either loads an external script +(from HTML) or is loaded as one, + +@item +It uses dynamic JavaScript constructs that are difficult to analyze +without interpreting the program or is loaded along with scripts +that use such constructs. These constructs are: +@itemize +@item +Using the eval function +@item +Calling methods with the square bracket notation +@item +Using any other construct than a string literal with certain methods +(@code{Obj.write}, @code{Obj.createElement}, @dots{}). +@end itemize +@end itemize + +In practice, the JavaScript code in your page may be found trivial by +LibreJS if, as a whole: +@itemize @bullet + +@item +It does not define functions and it does not load external scripts +(with the HTML src attribute in a @code{<script>} tag). + +@item +It does not make AJAX calls. + +@item +It does not load external scripts with dynamic constructs. + +@item +It does not use constructs that may be used to do any of the above in +a non-obvious way (use of the @code{eval()} method, use of square bracket +method calls, use of concatenation with certain constructs or method +calls, @dots{}). + +@end itemize + +However, in some instances, you may be required by LibreJS to add a +stylized comment to JavaScript code that may be otherwise trivial. + +When an external file defines a function, it becomes available +to all other external scripts. That is the case if another script +defines a function that makes AJAX calls, when an external script +loads other scripts dynamically (which in turn could also make AJAX +calls, @dots{}), or when a script is written with constructs that may do +any of these. + +For instance, if your page contains the following: +@example +<script src="jquery.js"></script> +<script> +$.doSomething(); +</script> +@end example + +While @code{$.doSomething();} may seem trivial, you will nevertheless +have to add a stylized license comment on your main HTML page because +the external script (in this case jQuery) has been found to define +methods that make AJAX calls. @code{$.doSomething()} might make an AJAX call, +and LibreJS does not check for that. The rule of thumb is that when you +use a library or code that handles AJAX, JSON, JSONP, the loading of +scripts dynamically, you should have license mentions for all your +JavaScript files and for your main page regardless. In practice this is +a case that happens very often with code that uses libraries. + +In practice also, the JavaScript code in an external file (an external +@file{.js} file loaded on your page) may be found trivial if it does not +define functions/methods. + +And in the same manner it will be considered nontrivial if AJAX calls, +dynamic script loading, or non-obvious dynamic JavaScript constructs +are used in another script. + +If your JavaScript code makes AJAX requests, it's important to get an +accurate @dfn{Content-Type} in the response from the server. For +example, if you're using JSON, set it to @code{application/json}. +This is because LibreJS alters the content of @code{text/html} +responses. + +@node Free Licenses Detection +@chapter Free Licenses Detection +@cindex freelicenses + +@section Detected Free Licenses + +In order for a file to be detected as free, the license notice should +appear in a JavaScript file above all code, at the very top of the file. + +For inline JavaScript code inside @code{<script>} tags in HTML pages, +the license notice should appear once per page as a comment inside a +@code{<script>} tag, before all the code in that script. When the only +inline JavaScript code is within element attributes (@code{onload}, +@code{onclick}), place the license notice in an otherwise empty +@code{<script>} at the top of the page. This is sometimes needed when an +external script performs AJAX calls or embeds scripts dynamically, and +the only inline JavaScript is an event attribute making a method call, +e.g.: @code{<body onload="methodCall('remote-data.xml');">} + +When people speak of the ``MIT license'' they mean either the X11 license +or the Expat license. Please see which license the code uses, and label +it accordingly. + +Currently LibreJS checks for the following licenses: + +@itemize @bullet + +@item +Creative Commons CC0 1.0 Universal +@itemize @bullet +@item +Identifier: @samp{CC0-1.0} +@item +URL: @url{http://creativecommons.org/publicdomain/zero/1.0/legalcode} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt} +@end itemize + +@item +Public Domain +@itemize @bullet +@item +Public domain is not a license (see +@url{https://www.gnu.org/licenses/license-list.html#PublicDomain}). If +you want to release your work to the public domain, the FSF recommends +using CC0. +@item +Magnet Link: @indicateurl{magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt} +@end itemize + +@item +GNU General Public License (GPL) version 2 +@itemize @bullet +@item +Identifier: @samp{GNU-GPL-2.0} +@item +URL: @url{http://www.gnu.org/licenses/gpl-2.0.html} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt} +@end itemize + +@item +GNU General Public License (GPL) version 3 +@itemize @bullet +@item +Identifier: @samp{GNU-GPL-3.0} +@item +URL: @url{http://www.gnu.org/licenses/gpl-3.0.html} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt} +@end itemize + +@item +Apache License, Version 2.0 +@itemize @bullet +@item +Identifier: @samp{Apache-2.0} +@item +URL: @url{http://www.apache.org/licenses/LICENSE-2.0} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt} +@end itemize + +@item +GNU Lesser General Public License, version 2.1 +@itemize @bullet +@item +Identifier: @samp{GNU-LGPL-2.1} +@item +URL: @url{http://www.gnu.org/licenses/lgpl-2.1.html} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt} +@end itemize + +@item +GNU Lesser General Public License, version 3 +@itemize @bullet +@item +Identifier: @samp{GNU-LGPL-3.0} +@item +URL: @url{http://www.gnu.org/licenses/lgpl-3.0.html} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:0ef1b8170b3b615170ff270def6427c317705f85&dn=lgpl-3.0.txt} +@end itemize + +@item +GNU Affero General Public License, version 3 +@itemize @bullet +@item +Identifier: @samp{GNU-AGPL-3.0} +@item +URL: @url{http://www.gnu.org/licenses/agpl-3.0.html} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt} +@end itemize + +@item +Boost Software License +@itemize @bullet +@item +URL: @url{http://www.boost.org/LICENSE_1_0.txt} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:89a97c535628232f2f3888c2b7b8ffd4c078cec0&dn=Boost-1.0.txt} +@end itemize + +@item +BSD 3-Clause License +@itemize @bullet +@item +URL: @url{http://opensource.org/licenses/BSD-3-Clause} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt} +@end itemize + +@item +Eclipse Public License 1.0 +@itemize @bullet +@item +Identifier: @samp{EPL-1.0} +@item +URL: @url{http://www.eclipse.org/legal/epl-v10.html} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:4c6a2ad0018cd461e9b0fc44e1b340d2c1828b22&dn=epl-1.0.txt} +@end itemize + +@item +Mozilla Public License 2.0 +@itemize @bullet +@item +Identifier: @samp{MPL-2.0} +@item +URL: @url{http://www.mozilla.org/MPL/2.0} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:3877d6d54b3accd4bc32f8a48bf32ebc0901502a&dn=mpl-2.0.txt} +@end itemize + +@item +Expat License (sometimes called the MIT license) +@itemize @bullet +@item +Identifier: @samp{Expat} +@item +URL: @url{http://www.jclark.com/xml/copying.txt} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt} +@end itemize + +@item +X11 License +@itemize @bullet +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:5305d91886084f776adcf57509a648432709a7c7&dn=x11.txt} +@end itemize + +@item +XFree86 License +@itemize @bullet +@item +Identifier: @samp{Modified-BSD} +@item +URLs: +@url{http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3} +@url{http://www.xfree86.org/current/LICENSE4.html} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:12f2ec9e8de2a3b0002a33d518d6010cc8ab2ae9&dn=xfree86.txt} +@end itemize + +@item +FreeBSD License +@itemize @bullet +@item +URL: @url{http://www.freebsd.org/copyright/freebsd-license.html} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:87f119ba0b429ba17a44b4bffcab33165ebdacc0&dn=freebsd.txt} +@end itemize + +@item +The ISC License +@itemize @bullet +@item +URL: @url{https://www.isc.org/downloads/software-support-policy/isc-license/} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:b8999bbaf509c08d127678643c515b9ab0836bae&dn=ISC.txt} +@end itemize + +@item +Artistic License 2.0 +@itemize @bullet +@item +URL: @url{http://www.perlfoundation.org/artistic_license_2_0} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:54fd2283f9dbdf29466d2df1a98bf8f65cafe314&dn=artistic-2.0.txt} +@end itemize + +@item +CPAL 1.0 +@itemize @bullet +@item +Identifier: @samp{CPAL-1.0} +@item +URL: @url{http://opensource.org/licenses/cpal_1.0} +@item +Magnet link: @indicateurl{magnet:?xt=urn:btih:84143bc45939fc8fa42921d619a95462c2031c5c&dn=cpal-1.0.txt} +@end itemize + +@end itemize + +@section Undetected Free Licenses +If you are using a free license that isn't detected by LibreJS and isn't +listed in the previous section, please send a message to +@email{bug-librejs@@gnu.org} regarding this license, where code released under +this license can be found, and where to find the license text and +information. + +Many free licenses are listed in this page: +@url{http://www.gnu.org/licenses/license-list.html} + + +@node Setting Your JavaScript Free +@chapter Setting Your JavaScript Free + +The first step is releasing your JavaScript under a free license. If +you are already using a free library, or you're not using any +third-party libraries, it might only take a few minutes. + +All JavaScript code on a web page (inline, on-page, and external) shares +a common scope. Thus, code is generally either rejected or accepted as a +whole by LibreJS. If some JavaScript code is found to be nontrivial and +nonfree, then most of the time, all the the rest is discarded as well. + +On your website, take a look at your HTML source. You can identify +distinct pieces of JavaScript that might be free and some other that are +nonfree. + +@emph{Tip}: By running LibreJS on your page, you will get a list of all the +JavaScript that was blocked. This gives you an overview of the +JavaScript in your page. + +Imagine a page that contains several pieces of JavaScript from various +sources: +@itemize @bullet +@item +On top, within the @code{<head>} tag, it includes jQuery + +@item +Then, some JavaScript code that you have written + +@item +At the bottom, a JavaScript-based Facebook widget + +@item +Also, there's some analytics tracking code +@end itemize + + +@table @dfn +@item JavaScript that is already free +First, you must ensure that the library is free. If the file contains +a copyright and a license notice, you won't need to look any further. +But if there's no mention of the license, or if it's too brief, you'll +have to look for a COPYING or LICENSE file within the original library's +source package, or on the library's official website. + +@item Your own JavaScript +The free license given to your code should be compatible with the rest +of the JavaScript on a page. A good way to check is to read up on +them: @url{http://www.gnu.org/licenses/license-list.html} + +@item Nonfree JavaScript +This might be the case with an analytics tracker, social media +widgets, and code that runs ads. Removing these pieces of code from your +site is required to have the rest accepted as free. There are +often alternatives to nonfree libraries or to third-party services: + +@itemize @bullet + +@item +If you have used nonfree third-party code as the base to write your own +code, try to find a free alternative. + +@item +If you're using a third-party service such as an analytics service, +replace it with a free alternative like Piwik. + +@item +If you can't find free JavaScript that has already been developed, +write it yourself! Who knows, your own solution might be the start of +a brilliant project! +@end itemize + +@end table + +@section JavaScript Web Labels +One way to make your website work with LibreJS is by defining a +JavaScript Web Labels table. + +A JavaScript Web Labels table is informative to both site visitors and +the LibreJS program. You make a Web Labels table on a new HTML page +that's linked to from your main page. The table lists each of your +site's JavaScript files, that file's corresponding human-readable source +file, and the canonical url of its free license. + +When using a JavaScript Web Labels table for your own files, it's +important to put a copying permission statement at the top of each source +file listed in right-most column of the Web Labels table. For info on how +properly release your code as free software, see +@url{https://www.gnu.org/licenses/gpl-howto.html}. Future versions of +LibreJS will require a copying permission statement or other license +notice for source files listed in a Web Labels table. + +More information on JavaScript Web Labels is detailed here: +@url{https://www.gnu.org/software/librejs/free-your-javascript.html#step3} +and here: +@url{https://www.gnu.org/licenses/javascript-labels.html}. + +@subsection Specifying multiple licenses for a single JavaScript file + +If you compile or concatenate your JavaScript into a single file, the +source files you're combining may be released under different licenses. +You can specify multiple licenses for the file in a JavaScript Web Labels +table, like this: + +@verbatim +<table id="jslicense-labels1"> + <tr> + <td><a href="all.min.js">all.min.js</a></td> + <td> + <a href="http://www.gnu.org/licenses/gpl-3.0.html" + >GNU-GPL-3.0-or-later</a> + <br /> + <a href="http://www.apache.org/licenses/LICENSE-2.0" + >Apache-2.0</a> + </td> + <td> + <a href="gpl-script.js">gpl-script.js</a> + <br /> + <a href="apache-script.js">apache-script.js</a> + </td> + </tr> +</table> +@end verbatim + +The @code{<br />} tags just make the table more understandable when +looking at the rendered version of it on the license page. They aren't +required by LibreJS. + +If all the licenses contained in the second column are recognized by +LibreJS to be free licenses, then LibreJS will allow the file in the +first column to be run. + +@section Adding a stylized comment in your JavaScript files and on your page +See a ``Convention for releasing free JavaScript programs'' in the +JavaScript Trap @url{http://www.gnu.org/philosophy/javascript-trap.html} + +Adding this notice will ensure LibreJS will find the JavaScript file to +be free. The @code{@@licstart} and @code{@@licend} lines at the +beginning and end of the stylized comment are necessary to make a clear +statement that the _entire code_ in the file is free. This means that +you must ensure that no nonfree code was carelessly appended at the end +of the file. + +In the main HTML page, the license notice covers JavaScript contained +in all @code{<script>} tags with on-page code and the inline +JavaScript (in event attributes such as onload, onclick, etc, @dots{}). +Since external files have their own stylized comment, they are +not covered by the notice in the main HTML page. Make sure to identify +all the licenses available. LibreJS will only ensure it matches a +notice of an allowed license once, so the order does not matter, but +the responsibility is on you to make sure all code is under the free +licenses mentioned between @code{@@licstart} and @code{@@licend}. + +You should make @emph{only} one @code{@@licstart} @code{@@licend} +comment in your page, since it pertains to the entire code on page +across all @code{<script>} tags and inline html attributes. + +@unnumbered +When you use the JavaScript Web Labels method, you should still include a +license notice at the top of each of your source files. This ensures that +if someone copies the file and uses it for something else, the license +remains intact. + +For more info on making your JavaScript LibreJS-compliant, see this web +page: @url{https://www.gnu.org/software/librejs/free-your-javascript.html} + +@node Installation Requirements +@appendix Installation Requirements + + +@appendixsec Mozilla Browser + +You will need one of the many flavors of the Mozilla browser to use +LibreJS. It can be installed on the following: + +GNU IceCat, Mozilla Firefox, Trisquel Abrowser, Debian Iceweasel. + +LibreJS works on these browsers starting from version 29. We +recommend that you use the latest version of your Mozilla browser. +LibreJS has been tested extensively on multiple GNU/Linux distributions, +but it is compatible any operating system as long as you're using a +compatible Mozilla browser. + +@appendixsec Mozilla's Add-on SDK +LibreJS uses the Mozilla Add-on SDK (Software Development Kit), a +set of APIs and tools to create add-ons for Mozilla browsers. + +You do not need the Add-on SDK to use LibreJS xpi file or to install it +using the packaged version, but it is required in order to package the +LibreJS source code into an xpi file using @code{make}. If you would like +to run the tests for LibreJS or make changes to the source files, you +will need the Add-on SDK as well. For the ``make'' command to work +properly, you must have the @code{cfx} command available on your system +from the command line. + +The latest tarball for the Add-on SDK is available at: + +@url{https://ftp.mozilla.org/pub/mozilla.org/labs/jetpack/jetpack-sdk-latest.tar.gz} + +Instructions on how to get it working are available here: + +@url{https://addons.mozilla.org/en-US/developers/docs/sdk/latest/dev-guide/tutorials/installation.html} + +In order to use @code{make} with LibreJS source, however, it is ideal to +have @code{cfx} available at all times and for all users. + +An easy way to do this is to extract the contents of the tarball and to +place the files inside @file{/usr/lib/addon-sdk} and then creating a +symbolic link in @file{/usr/bin}, as follows: + +@example +sudo ln -s /usr/lib/addon-sdk/bin/cfx /usr/bin/cfx +@end example + +The @code{cfx} command will then be available to all users. + +The Add-on SDK is released under the Mozilla Public License 2.0. + +@node LibreJS Internals +@appendix LibreJS Internals + +LibreJS intercepts HTTP responses and rewrites their contents after +analyzing JavaScript within them. It does not remove script nodes and +attributes from the page, but instead ``deactivates'' them by modifying +the @code{type} and @code{src} attributes on script elements and by +moving the contents of inline JavaScript attributes such as onClick +into harmless attributes. + +LibreJS detects the most common cases using the HTTP response method +described above, but in extremely rare cases, or when running code +locally, LibreJS cannot detect JavaScript during the response stage. + +To remedy this issue, and as a final safeguard, LibreJS takes a look +at the scripts that are about to be executed while the browser engine is +parsing the page. If the script is not found in a list of accepted +scripts populated earlier, the execution will be prevented. This is to +ensure content types that are not regular HTML (binhex with HTML in it, +@dots{}) and JavaScript do not fall through the cracks and get executed. + +@node Tests +@appendix Tests + + +In order to better understand how LibreJS works, you can try to visit +these pages with LibreJS installed and enabled and see how they are +being processed: + +@itemize @bullet + +@item +@url{http://lduros.net/assets/librejs/tests/trivial-inline-trivial-external/} +This page contains trivial on-page JavaScript code, and an external +script that contains trivial JavaScript code. Therefore, all JavaScript +is being executed. + + +@item +@url{http://lduros.net/assets/librejs/tests/trivial-inline-nontrivial-external/} +The on-page script here is trivial and uses a built-in method, but the +external script in this page is nontrivial (defines a function.) The +external script is blocked, the inline script is executed. + +@item +@url{http://lduros.net/assets/librejs/tests/nontrivial-inline-trivial-external/} +This page contains nontrivial code on page, and trivial code in its +external page. All JavaScript is @emph{removed} from the page, and the +external script is never analyzed, since the nontrivial conditions are +already met in the page. + +@item +@url{http://lduros.net/assets/librejs/tests/free-inline-free-external/} +This page contains free on-page (GPL 3) JavaScript, and free external +Javascript. Therefore all JavaScript is being executed. + +@item +@url{http://lduros.net/assets/librejs/tests/free-inline-nonfree-nontrivial-external/} +This page contains free on-page JavaScript. The external script contains +nonfree nontrivial JavaScript (AJAX request). The free code that is +inline is executed, but the external file is blocked. + +@item +@url{http://lduros.net/assets/librejs/tests/intrinsec-event/} This page +contains trivial on-page code, with an intrinsic event in an html +attribute (onload). All JavaScript is being executed. + +@item +@url{http://lduros.net/assets/librejs/tests/trivial-inline-free-external-defines-function/} +This page contains on-page trivial JavaScript (only makes a window alert +and loads an external script using the html <script> tag with the src +attribute. The external script is free (GPL v3), and since it is only +nontrivial because it defines a function, the on-page trivial code is +allowed to use it. All JavaScript is being executed. + +@item +@url{http://lduros.net/assets/librejs/tests/trivial-inline-free-external-writes-script/} +This page contains trivial on-page JavaScript code, and loads an +external script that is free. Since no function is defined, the external +script is being analyzed. The external script is free. Trivial here is +not allowed because the external script, although free, writes a +script. The inline trivial script should also have a free license notice +for it to be interpreted. + +@item +@url{http://lduros.net/assets/librejs/tests/shelltypist/demo/real-life-example-with-jquery-free.html} +This is a real-life example of a small jQuery plugin. The on-page +JavaScript code has a free license. The jQuery external file has a free +licensed. The shelltypist.js file has a free license as well. All +licenses are defined between @code{@@licstart} and @code{@@licend}. All +JavaScript is executed. + +@item +@url{http://lduros.net/assets/librejs/tests/shelltypist/demo/same-page-without-free-license.html} +This is the same page than the previous example, except it does not have +a free license for the main HTML page on-page script. While the actual +code there is trivial, since jQuery defines methods that make use of +AJAX, trivial code is not allowed, and no JavaScript is executed. + +@item +@url{http://lduros.net/assets/librejs/tests/test-labels/} This page +contains JavaScript (jQuery minified) that does not have proper license +information in the file, as it has no @code{@@licstart} @code{@@licend} +comment. It would be considered nonfree, however, the page itself uses +the JavaScript Web Labels method. On the page itself, you will find a +link labeled ``JavaScript License Information'', which leads to a page +that contains a properly formatted table with the required data on the +external JavaScript file. LibreJS visits this link and determines the +version of jQuery linked from the original page is the one listed there, +and flags it as free. All JavaScript is executed (and the title should +turn green.) + +@end itemize + + +@node GNU Free Documentation License +@appendix GNU Free Documentation License + +@include fdl.texi + + +@bye |