Firefox/Dev Cheatsheet

From MozillaWiki
Jump to: navigation, search

Firefox Developer Cheatsheet

Originally by Brian Bondy, posted here.

Repositories

   mozilla-central (Latest for Firefox):
   http://hg.mozilla.org/mozilla-central/
   Mozilla Aurora:
   http://hg.mozilla.org/releases/mozilla-aurora/
   Mozilla Beta:
   http://hg.mozilla.org/releases/mozilla-beta/
   Mozilla Release:
   http://hg.mozilla.org/releases/mozilla-release/
   comm-central (Latest for Thunderbird, SeaMonkey, Lightning/Sunbird):
   http://hg.mozilla.org/comm-central/
   Mozilla Inbound (Push changes here to get them on mozilla-central):
   http://hg.mozilla.org/integration/mozilla-inbound

Extensions

   Firebug
   Edit, debug, and monitor JavaScript, CSS, HTML, and external XUL
   Chromebug (Requires a matching Firebug version)
   Debug Firefox itself's XUL, XBL, Javascript, ... (debug chrome)
   Extension Developer
   Interactive JavaScript shell, live preview HTML and XUL editors, regular expression and XPath testers, and packaging tool

Plugins

   Copy to: <installDir>\Plugins
   Environment variable MOZ_DEBUG_CHILD_PROCESS=1 can be used to delay 30 seconds when loading plugin-container before the plugin is loaded.
   Plugin development

Debugging

   Use Firebug and Chromebug to debug XUL, XBL, JavaScript
   Debug C++ src in Windows: Open VS2010, select open project, select dist/bin/firefox.exe in your obj dir. Press F5. Change source, do an incremental build, open the source and set breakpoints in VS2010.

Command Line

   -purgecaches use when changing XUL, XBL, JSM, ...
   -no-remote allows you to run multiple instances of the program with different profiles
   -console starts the application with a debug console
   -ProfileManager starts the application with the profile manager
   -P "profilename" starts the application with the specified profile
   Other command line options

Crashes

   about:crashes gives you links to your crashes
   Online crash reports and stats

Getting help

   IRC:
   irc.mozilla.org
   Some channels: #developers, #introduction, #xul, #planning, #jsapi, #gfx
   More info on IRC
   NNTP Server
   Google group
   Mailing list

Useful links when getting started

   Ability to edit bugs on bugzilla (editbugs privs)
   Getting commit access
   Mozilla source code directory structure 

Useful links forever

   Bugzilla
   Mozilla central push log
   Mozilla central Nightly builds
   MXR (Browse source code online)
   DXR (Search source code online)
   Tinderbox (Tool to ensure compiles on various platforms and all automated)
   Modules and module owners (for code reviews and questions)
   Top crash reports
   License Boilerplate
   Tools 

Coding style

   line length: 80 chars or less
   indenting: 2 spaces (no tabs)
   Function definitions, braces on newlines
   Conditionals and loops:
   if (condition) {
   }
   Multiline, align with parentheses:
   if (argument1 == paramvalu1 && argument2 == paramvalue2 &&
       argument3 == paramvalue3 && argument4 == paramValue4) {
   }
   Comments, use space after comment indicator
   More info on coding style

Build commands

   Full build of Firefox: (~ 1h)
   make -f client.mk
   To rebuild Firefox without pulling the tree: (~25min)
   make -f client.mk build_all_depend
   To clean: (~2min)
   make -f client.mk distclean
   Incremental builds (~2min, see below section)
   Full build of Thunderbird or other comm-central
   python client.py checkout (which clones a copy of mozilla-central inside a subfolder called mozilla)
   make -f client.mk
   Make an objdir for partial tree
   cd $(objdir)
   ../build/autoconf/make-makefile component/path
   cd $(objdir)/component/path
   make

Example .mozconfig files (Gecko 2.0 and up)

   Firefox Debug .mozconfig contents: (Using mozilla-central)
   mk_add_options MOZ_OBJDIR=@TOPSRCDIR@objdir-ff-debug
   ac_add_options --enable-application=browser
   ac_add_options --enable-debug
   ac_add_options --disable-optimize
   ac_add_options --enable-tests
   Firefox Release .mozconfig contents: (Using mozilla-central)
   mk_add_options MOZ_OBJDIR=@TOPSRCDIR@objdir-ff-debug
   ac_add_options --enable-application=browser
   ac_add_options --enable-optimize
   ac_add_options --enable-debug-symbols
   xulrunner .mozconfig contents: (Using mozilla-central)
   mk_add_options MOZ_OBJDIR=@TOPSRCDIR@objdir-xulrunner-debug
   ac_add_options --enable-application=xulrunner
   ac_add_options --enable-debug
   ac_add_options --disable-optimize
   Thunderbird .mozconfig contents: (Using comm-central)
   mk_add_options MOZ_OBJDIR=@TOPSRCDIR@objdir-tb-debug
   ac_add_options --enable-application=mail
   ac_add_options --enable-debug
   ac_add_options --disable-optimize
   #If you also want Lightning
   ac_add_options --enable-calendar
   SeaMonkey .mozconifg contents: (Using comm-central)
   mk_add_options MOZ_OBJDIR=@TOPSRCDIR@objdir-seamonkey-debug
   ac_add_options --enable-application=suite
   ac_add_options --enable-debug
   ac_add_options --disable-optimize
   Sunbird .mozconifg contents: (Using comm-central)
   mk_add_options MOZ_OBJDIR=@TOPSRCDIR@objdir-sunbird-debug
   ac_add_options --enable-application=calendar
   ac_add_options --enable-debug
   ac_add_options --disable-optimize

Incremental builds

   Don't use make in subdirectories from within the source dirs, use the obj dir which is created when you first build (Example: obj-i686-pc-mingw32\widget)
   Example if you have changes to /widget:
   cd obj-i686-pc-mingw32
   make -C widget
   make -C toolkit/library

Logging

   Logging Javascript with Firebug/Chromebug:
   console.log("my output");
   console.log("%s is %d years old.", "Bob", 42).
   Netscape portable runtime logging (PR_LOG):
   Environment variables:
   NSPR_LOG_FILE = WinDebug and it will output to the debug output window or use NSPR_LOG_FILE=C:\nspr-log.txt to output to a file by that name
   NSPR_LOG_MODULES can specify which modules to log with the, example NSPR_LOG_MODULES = nsWindowsWidgets:5 (5 is the log level) You can use NSPR_LOG_MODULES=all:5 to enable all module logging

Finding source of regressions

   Do a binary search on the nightly builds until you narrow down a build that introduced the regression
   Use the push log to review changes in that time span
   Use mozregression

Submitting a patch for review

   You don't have commit access at first, instead create a patch.
   Setup your author information (your ~/.hgrc or ~/mercurial.ini on Windows):
   [ui]
   username = Your Name <your@email.com>
   Use the mq extension, add to your ~/.hgrc or ~/mercurial.ini on Windows
   [extensions]
   hgext.mq =
   When submitting do this

Creating a patch (and working with patches)

   To create a patch:
   hg qnew bugXXXXXX.patch
   On popup: Bug XXXXXX - Description of your fix
   To take a file out of a patch:
   hg qrefresh -X re:regexp_pattern_of_files_to_remove
   To refresh changes into your patch:
   hg qrefresh
   To see the status of changes: (after you take out files it should re-appear in the changes)
   hg status
   Undo application of a patch in your MQ patch queue: (Removes the patch from your commit tree and working directory)
   hg qpop (To unapply the last applied patch)
   hg qpop -a (To unapply all patches)
   hg qpop name.patch (To unapply all patches up to but not including the specified patch)
   Apply a patch which is in your MQ patch queue: (Re-adds the patch to your commit tree and working directory, you can apply more than one patch)
   hg qpush (To apply the next patch in the series)
   hg qpush -a (To apply all patches)
   hg qpush name.patch (To apply all patches in the series up to and including the named patch)
   List which patches are in your MQ patch queue:
   hg qseries
   List which patches in your MQ patch queue are applied (pushed):
   hg qapplied
   List which patches in your MQ patch queue are not yet applied (pushed):
   qunapplied
   To delete a patch from your MQ patch queue: (Patch must first be unapplied)
   hg qdelete
   To turn a patch into a permanent changeset: (Patch must first be applied)
   hg qfinish
   To turn a normal changeset into a patch: (Patch must first be unapplied)
   hg qimport -r tip
   Convert a patch to a finalized changeset: (Patch must first be applied)
   hg qfinish tip
   hg qfinish -a (for all of the patches
   To make a backup of your patches directory: (Saves the patches backup to .hg/patches.N)
   hg qsave
   To import someone else's patch into your MQ patch queue:
   hg qimport patchname.patch (You must later also apply it with qpush)
   To import someone else' patch with a different patch strip count:
   patch -pN (to apply the patch, where N is the strip count of the patch)
   qnew (to create a new patch)
   hg addremove (to pickup any files added/removed by the patch)
   qrefresh (to refresh the patch)
   To change the ordering of how patches are applied
   Manually edit your .hg/patches/series file, one patch name per line.
   To rollup several patches into one
   hg diff -r qparent > rollup.patch
   See last 50 pushed
   hg log -l 50
   Undoing a qfinish or remove last commit into a patch
   hg qimport -r tip (Make sure you have no other patches applied)
   To backout a revision
   hg backout revnumber
   Folding a patch in your queue onto another one
   hg qgoto base_patch.patch
   hg qfold patch_to_fold_in_base_patch.patch
   Renaming a patch
   hg qrename new_patch_name.patch

Documentation

   How to help with documentation

Testing and QA

   Automated testing link1 link2
   Litmus (Manual testing)
   Mochitest for testing via pages (HTML, XHTML, SVG, XUL, XBL) (mochitest-plain, mochitest-chrome, mochitest-browser-chrome, mochitest-a11y or mochitest-ipc)
   Browser chrome mochitest for testing via JS
   Reftests for testing if 2 pages that should render the same actually do
   Compiled code tests
   xpcshell for testing XPCOM components

Automated test run examples

   mochitest-plain:
   TEST_PATH=content/html/content/test make -C $(OBJDIR) mochitest-plain
   mochitest-chrome: (like a mochitest but with chrome privs)
   TEST_PATH=widget/tests/ make -C $(OBJDIR) mochitest-chrome
   mochitest-browser-chrome: (Chrome JS tests)
   TEST_PATH=widget/tests/ make -C $(OBJDIR) mochitest-browser-browser-chrome
   xpcshell:
   cd $(OBJDIR)
   make -C widget/tests/ xpcshell-tests
   reftests:
   TEST_PATH=modules/libpr0n/test/reftest/reftest.list make -C obj-i686-pc-mingw32 reftest

Troubleshooting build problems

   I built on windows, and had crashes on startup:
   The reason ended up being because I was using the same profile as my FF4 and some extensions were causing the crash (Firebug in particular). Simply disabling the extensions fixed the problem.
   If you are building on Windows with VC2010, and get the error, install the Win7.0 SDK instead. Alternatively if you really want to use 7.1 you may need to patch your guess-msvc.bat 

about:

   Blank page:
   about:blank
   Addons:
   about:addons
   To adjust settings:
   about:config
   To see how your Firefox was built:
   about:buildconfig
   To see all of your crash reports:
   about:crashes
   Other

Common about:config prefs

   Allow remote XUL from local computer:
   dom.allow_XUL_XBL_for_file: true;

XPCOM objects in JavaScript

   Creating an XPCOM component:
   var cid = "@brianbondy.com/componentname;1"
   var obj = Components.classes[cid].createInstance();
   obj = obj.QueryInterface(Components.interfaces.IMyInterface)
   Listing XPCOM components:
   for (var c in Components.classes) { print(c); }
   Listing XPCOM interfaces:
   for (var i in Components.interfaces) { print(i); }

How to push to try

   Need commit access level 1
   Try server info
   Try server command line generator
   In .hgrc (or mercurial.ini) add:
   [paths]
   try = ssh://hg.mozilla.org/try
   To push the applied hg queue patches to the try server:
   hg qrefresh --message "try: -b do -p all -u all -t all"
   hg push -f try

How to push a changeset from your MQ

   If you want your patch to land on Aurora, or Firefox Beta you need to request it in Bugzilla. only for severe security, stability, or regressions recently introduced. Provide risk/reward in ticket.
   Need commit access level 3
   In .hgrc (or mercurial.ini) add:
   [paths]
   mozilla-inbound = http://hg.mozilla.org/integration/mozilla-inbound/
   To push:
   Move your patch to the top of your queue
   hg pull
   hg update
   hg qpush
   hg qrefresh -m "Bug xxx - Blah. Blah. Blah. r=xyz"
   hg qfinish -a
   hg push mozilla-inbound

Bugzilla keywords

   addon-compat: If your change may affect addon compatibility
   dev-doc-needed: If your change may need documentation
   regression: If your bug is a regression
   checkin-needed: If a checkin is needed for a patch but the author can't do it themselves because of privs or some other reason
   Others

Firefox UI debugging

   Extesion Developer Extension
   Or in any build of Firefox:
       Type about:
       Open the web console
       Type in the following:
       Components.utils.import('resource://gre/modules/Services.jsm');
       this.__proto__ = Services.wm.getMostRecentWindow('navigator:browser');
       Now you can use anything you can in the extensions developer extension

Contributor info and Metrics

   Contributor Map / Contribution Trends
   Phonebook

Doing Code Reviews

   Code Review Guide
   Quick Points:
       MultiByte vs. Wide character set comm-central defaults to ASCII
       Check if platform API available pre Win2k
       Does it pass try?
       Formatting?
       Comments, typos, spelling
       Did you test in scenario X?
       New import libs in toolkit/library?
       Should it have tests?
       Interface change? Change IID, sr required, addon-compat keyword
       Documentation needed?
       Mark keywords for post-fix work: dev-doc-needed, privacy-review-needed, sec-review-needed, user-doc-needed, addon-compat, release tracking flags, in-testsuite flag

Themes

   More info on themes