Merge from cvs-trunk-mirror to mozilla-central.
authorjorendorff@mozilla.com
Mon, 28 Jan 2008 17:32:29 -0800
changeset 10836 d403bde8a07c
parent 10368 f12729556fbb (current diff)
parent 10835 55d574a32683 (diff)
child 10837 1b97a74034d1
push id1
push userbsmedberg@mozilla.com
push dateThu, 20 Mar 2008 16:49:24 +0000
treeherdermozilla-central@61007906a1f8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone1.9b3pre
Merge from cvs-trunk-mirror to mozilla-central.
browser/app/default.xpm
browser/branding/unofficial/default.xpm
client.mk
client.py
config/autoconf.mk.in
config/rules.mk
configure.in
extensions/inspector/resources/locale/sv-SE/search/findFiles.dtd
extensions/inspector/resources/locale/sv-SE/search/junkImgs.dtd
gfx/cairo/cairo/src/cairo-operator.c
intl/unicharutil/public/nsIOrderIdFormater.h
intl/unicharutil/src/nsCharsList.h
intl/unicharutil/src/nsCharsOrderIdFormater.cpp
intl/unicharutil/src/nsCharsOrderIdFormater.h
intl/unicharutil/src/nsRangeCharsList.cpp
intl/unicharutil/src/nsRangeCharsList.h
intl/unicharutil/src/nsStringCharsList.cpp
intl/unicharutil/src/nsStringCharsList.h
js/src/js.cpp
js/src/jsapi.cpp
js/src/jsarray.cpp
js/src/jsatom.cpp
js/src/jsbool.cpp
js/src/jsdbgapi.cpp
js/src/jsemit.cpp
js/src/jsfun.cpp
js/src/jsgc.cpp
js/src/jsinterp.cpp
js/src/jsiter.cpp
js/src/jslock.cpp
js/src/jsobj.cpp
js/src/jsopcode.cpp
js/src/jsparse.cpp
js/src/jsstr.cpp
js/src/jsxml.cpp
modules/libpr0n/test/unit/image2jpg16x16-win.png
modules/libpr0n/test/unit/image2jpg32x32-win.png
other-licenses/branding/firefox/default.xpm
toolkit/themes/winstripe/global/icons/autocomplete-dropmark-arrow.png
toolkit/themes/winstripe/global/icons/autocomplete-dropmark-bkgnd-mid-bottom.png
toolkit/themes/winstripe/global/icons/autocomplete-dropmark-bkgnd-mid-top.png
toolkit/themes/winstripe/global/icons/autocomplete-dropmark-bkgnd.png
widget/public/nsIMenu.h
widget/public/nsIMenuItem.h
widget/src/cocoa/nsIChangeManager.idl
widget/src/cocoa/nsIMenuCommandDispatcher.idl
widget/src/gtk2/nsIPrintJobGTK.h
widget/src/gtk2/nsPrintJobFactoryGTK.cpp
widget/src/gtk2/nsPrintJobFactoryGTK.h
widget/src/gtk2/nsPrintJobGTK.cpp
widget/src/gtk2/nsPrintJobGTK.h
xulrunner/app/default.xpm
--- a/README.txt
+++ b/README.txt
@@ -1,306 +1,20 @@
-==============================================================
-
-= = = = = = = = = =   Mozilla Read Me    = = = = = = = = = = =
-
-==============================================================
-
-Mozilla is subject to the terms detailed in the license
-agreement accompanying it.
-
-This Read Me file contains information about system
-requirements and installation instructions for the Windows,
-Mac OS, and Linux builds of Mozilla.
-
-For more info on Mozilla, see www.mozilla.org. To submit bugs
-or other feedback, see the Navigator QA menu and check out
-Bugzilla at http://bugzilla.mozilla.org for links to known
-bugs, bug-writing guidelines, and more. You can also get help
-with Bugzilla by pointing your IRC client to #mozillazine
-at irc.mozilla.org.
-
-
-==============================================================
-
-                      Getting Mozilla
-
-==============================================================
-
-You can download nightly builds of Mozilla from the
-Mozilla.org FTP site at
-
-  ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/nightly/
-
-For the very latest builds, see
-
-  ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/nightly/latest-trunk
+For information on how to build Mozilla from the source code, see:
 
-Keep in mind that nightly builds, which are used by
-Mozilla.org developers for testing, may be buggy. If you are
-looking for a more polished version of Mozilla, Mozilla.org
-releases Milestone builds of Mozilla every six weeks or so
-that you can download from
-
-  http://www.mozilla.org/releases
-
-Be sure to read the Mozilla release notes for information
-on known problems and installation issues with Mozilla.
-The release notes can be found at the preceding URL along
-with the milestone releases themselves.
-
-Note: Please use Talkback builds whenever possible. These
-builds allow transmission of crash data back to Mozilla
-developers, improved crash analysis, and posting of crash
-information to our crash-data newsgroup.
-
-
-==============================================================
-
-                    System Requirements
-
-==============================================================
-
-*All Platforms
-
-	To view and use the new streamlined "Modern" theme,
-	your display monitor should be set to display
-	thousands of colors. For users who cannot set their
-	displays to use	more than 256 colors, Mozilla.org
-	recommends using the "Classic" theme for Mozilla.
-
-	To select the Modern theme after you have installed
-	Mozilla, from the Navigator browser, open the View
-	menu, and then open then open the Apply Theme submenu
-	and choose Modern.
-
-*Mac OS
+    http://developer.mozilla.org/en/docs/Build_Documentation
 
-	-Mac OS X or later
-	-PowerPC processor (266 MHz or faster recommended)
-	-64 MB RAM
-	-36 MB of free hard disk space
-
-*Windows
-
-	-Windows 95, 98, Me, NT4, 2000 or XP
-	-Intel Pentium class processor (233 MHz or faster
-	 recommended)
-	-64 MB RAM
-	-26 MB free hard disk space
-
-*Linux
-
-	-The following library versions (or compatible) are
-	 required: glibc 2.1, XFree86 3.3.x, GTK 1.2.x, Glib
-	 1.2.x, Libstdc++ 2.9.0. Red Hat Linux 6.0,
-	 Debian 2.1, and SuSE 6.2 (or later) installations
-	 should work.
-	-Red Hat 6.x users who want to install the Mozilla
-	 RPM must have at least version 4.0.2 of rpm
-	 installed.
-	-Intel Pentium class processor (233 MHz or faster
-	 recommended)
-	-64MB RAM
-	-26MB free hard disk space
-
-
-==============================================================
-
-                 Installation Instructions
-
-==============================================================
+To have your bug fix / feature added to Mozilla, you should create a patch and
+submit it to Bugzilla (http://bugzilla.mozilla.org). Instructions are at:
 
-For Mac OS and Windows users, it is strongly recommended that
-you exit all programs before running the setup program. Also,
-you should temporarily disable virus-detection software.
-
-For Linux users, note that the installation instructions use
-the bash shell. If you're not using bash, adjust the commands
-accordingly.
-
-For all platforms, install into a clean (new) directory.
-Installing on top of previously released builds may cause
-problems.
-
-Note: These instructions do not tell you how to build Mozilla.
-For info on building the Mozilla source, see
-
-  http://www.mozilla.org/source.html
-
-
-Windows Installation Instructions
----------------------------------
-
-Note: For Windows NT/2000/XP systems, you need Administrator
-privileges to install Mozilla. If you see an "Error 5" message
-during installation, make sure you're running the installation
-with Administrator privileges.
-
-
-    To install Mozilla by downloading the Mozilla installer,
-    follow these steps:
-
-	1. Click the the mozilla-win32-installer.exe link on
-	the site you're downloading Mozilla from to download
-	the installer file to your machine.
-
-	2. Navigate to where you downloaded the file and
-	double-click the Mozilla program icon on your machine
-	to begin the Setup program.
-
-	3. Follow the on-screen instructions in the setup
-	program. The program starts automatically the first
-	time.
+    http://developer.mozilla.org/en/docs/Creating_a_patch
+    http://developer.mozilla.org/en/docs/Getting_your_patch_in_the_tree
 
-
-    To install Mozilla by downloading the .zip file and
-    installing manually, follow these steps:
-
-	1. Click the mozilla-win32-talkback.zip link or the
-	mozilla-win32.zip link on the site you're down-
-	loading Mozilla from to download the .zip file to
-	your machine.
-
-	2. Navigate to where you downloaded the file and
-	double-click the compressed file.
-
-	Note: This step assumes you already have a recent
-	version of WinZip installed, and that you know how to
-	use it. If not,	you can get WinZip and information
-	about the program at www.winzip.com.
-
-	3. Extract the .zip file to a directory such as
-	C:\Program Files\mozilla.org\Mozilla.
-
-	4. To start Mozilla, navigate to the directory you
-	extracted Mozilla to and double-click the Mozilla.exe
-	icon.
-
-
-Mac OS X Installation Instructions
-----------------------------------
-
-    To install Mozilla by downloading the Mozilla disk image,
-    follow these steps:
-
-	1. Click the mozilla-mac-MachO.dmg.gz link to download
-	it to your machine. By default, the download file is
-	downloaded to your desktop.
-
-	2. Once you have downloaded the .dmg.gz file, drag it
-	onto Stuffit Expander to decompress it. If the disk
-	image doesn't mount automatically, double-click on the
-	.dmg file to mount it. If that fails, and the file
-	does not look like a disk image file, do a "Show Info"
-	on the file, and, in the "Open with application"
-	category, choose Disk Copy. In Mac OS 10.2, you can
-	use "Open with" from the context menu.
-
-	3. Once the disk image mounts, open it, and drag the
-	Mozilla icon onto your hard disk.
-
-	4. We recommend that you copy it to the Applications
-	folder.
-
-	5. Now Eject the disk image.
-
-	6. If you like, you can drag Mozilla to your dock to
-	have it easily accessible at all times. You might also
-	wish to select Mozilla as your default browser in the
-	Internet system preferences pane (under the Web tab).
-
-
-Linux Installation Instructions
--------------------------------
-
-Note: If you install in the default directory (which is
-usually /usr/local/mozilla), or any other directory where
-only the root user normally has write-access, you must
-start Mozilla first as root before other users can start
-the program. Doing so generates a set of files required
-for later use by other users.
-
-
-    To install Mozilla by downloading the Mozilla installer,
-    follow these steps:
-
-	1. Create a directory named mozilla (mkdir mozilla)
-	and change to that directory (cd mozilla).
+If you have a question about developing Mozilla, and can't find the solution
+on http://developer.mozilla.org, you can try asking your question in a
+mozilla.* Usenet group, or on IRC at irc.mozilla.org. [The Mozilla news groups
+are accessible on Google Groups, or news.mozilla.org with a NNTP reader.]
 
-	2. Click the link on the site you're downloading
-	Mozilla from to download the installer file
-	(called mozilla-1686-pc-linux-gnu-installer.tar.gz)
-	to your machine.
-
-	3. Change to the mozilla directory (cd mozilla) and
-	decompress the archive with the following command:
-
-	  tar zxvf moz*.tar.gz
-
-	The installer is now located in a subdirectory of
-	Mozilla	named mozilla-installer.
-
-	4. Change to the mozilla-installer directory
-	(cd mozilla-installer) and run the installer with the
-	./mozilla-installer command.
-
- 	5. Follow the instructions in the install wizard for
-	installing Mozilla.
-
-	Note: If you have a slower machine, be aware that the
-	installation may take some time. In this case, the
-	installation progress may appear to hang indefinitely,
-	even though the installation is still in process.
-
-	6. To start Mozilla, change to the directory where you
-	installed it and run the ./mozilla command.
-
-
-    To install Mozilla by downloading the tar.gz file:
-
-	1. Create a directory named "mozilla" (mkdir mozilla)
-	and change to that directory (cd mozilla).
-
-	2. Click the link on the site you're downloading
-	Mozilla from to download the non-installer
-	(mozilla*.tar.gz) file into the mozilla directory.
+You can download nightly development builds from the the Mozilla FTP server.
+Keep in mind that nightly builds, which are used by Mozilla developers for
+testing, may be buggy. Firefox nightlies, for example, can be found at:
 
-	3. Change to the mozilla directory (cd mozilla) and
-	decompress the file with the following command:
-
-	  tar zxvf moz*.tar.gz
-
-	This creates a "mozilla" directory under your mozilla
-	directory.
-
-	4. Change to the mozilla directory (cd mozilla).
-
-	5. Run Mozilla with the following run script:
-
-	  ./mozilla
-
-
-    To hook up Mozilla complete with icon to the GNOME Panel,
-    follow these steps:
-
-	1. Click the GNOME Main Menu button, open the Panel menu,
-	and then open the Add to Panel submenu and choose Launcher.
-
-	2. Right-click the icon for Mozilla on the Panel and
-	enter the following command:
-	  directory_name./mozilla
-
-	where directory_name is the name of the directory
-	you downloaded mozilla to. For example, the default
-	directory that Mozilla suggests is /usr/local/mozilla.
-
-	3. Type in a name for the icon, and type in a comment
-	if you wish.
-
-	4. Click the icon button and type in the following as
-	the icon's location:
-
-	  directory_name/icons/mozicon50.xpm
-
-	where directory name is the directory where you
-	installed Mozilla. For example, the default directory
-	is /usr/local/mozilla/icons/mozicon50.xpm.
+    ftp://ftp.mozilla.org/pub/firefox/nightly/latest-trunk/
--- a/accessible/public/nsIAccessibleEvent.idl
+++ b/accessible/public/nsIAccessibleEvent.idl
@@ -564,8 +564,22 @@ interface nsIAccessibleTextChangeEvent :
 interface nsIAccessibleCaretMoveEvent: nsIAccessibleEvent
 {
   /**
    * Return caret offset.
    */
   readonly attribute long caretOffset;
 };
 
+[scriptable, uuid(a9485c7b-5861-4695-8441-fab0235b205d)]
+interface nsIAccessibleTableChangeEvent: nsIAccessibleEvent
+{
+  /**
+   * Return the row or column index.
+   */
+  readonly attribute long rowOrColIndex;
+
+  /**
+   * Return the number of rows or cols
+   */
+  readonly attribute long numRowsOrCols;
+};
+
--- a/accessible/public/nsIAccessibleProvider.idl
+++ b/accessible/public/nsIAccessibleProvider.idl
@@ -47,16 +47,22 @@
 
 [scriptable, uuid(3f7f9194-c625-4a85-8148-6d92d34897fa)]
 interface nsIAccessibleProvider : nsISupports
 {
   /**
    * Constants set of common use.
    */
 
+  /** Do not create an accessible for this object
+   * This is useful if an ancestor binding already implements nsIAccessibleProvider,
+   * but no accessible is desired for the inheriting binding
+   */
+  const long NoAccessible = 0;
+
   /** For elements that spawn a new document. For example now it is used by
     <xul:iframe>, <xul:browser> and <xul:editor>. */
   const long OuterDoc = 0x00000001;
 
   /**
    * Constants set is used by XUL controls.
    */
 
@@ -73,42 +79,43 @@ interface nsIAccessibleProvider : nsISup
   const long XULListbox = 0x0000100B;
   const long XULListitem = 0x0000100C;
   const long XULListHead = 0x00001024;
   const long XULListHeader = 0x00001025;
   const long XULMenubar = 0x0000100D;
   const long XULMenuitem = 0x0000100E;
   const long XULMenupopup = 0x0000100F;
   const long XULMenuSeparator = 0x00001010;
-  const long XULProgressMeter = 0x00001011;
-  const long XULScale = 0x00001012;
-  const long XULStatusBar = 0x00001013;
-  const long XULRadioButton = 0x00001014;
-  const long XULRadioGroup = 0x00001015;
+  const long XULPane    = 0x00001011;
+  const long XULProgressMeter = 0x00001012;
+  const long XULScale = 0x00001013;
+  const long XULStatusBar = 0x00001014;
+  const long XULRadioButton = 0x00001015;
+  const long XULRadioGroup = 0x00001016;
 
   /** The single tab in a dialog or tabbrowser/editor interface */
-  const long XULTab = 0x00001016;
+  const long XULTab = 0x00001017;
 
   /** A combination of a tabs object and a tabpanels object */
-  const long XULTabBox = 0x00001017;
+  const long XULTabBox = 0x00001018;
 
   /** The collection of tab objects, useable in the TabBox and independant of
    as well */
-  const long XULTabs = 0x00001018;
+  const long XULTabs = 0x00001019;
 
-  const long XULText             = 0x00001019;
-  const long XULTextBox          = 0x0000101A;
-  const long XULThumb            = 0x0000101B;
-  const long XULTree             = 0x0000101C;
-  const long XULTreeColumns      = 0x0000101D;
-  const long XULTreeColumnItem   = 0x0000101E;
-  const long XULToolbar          = 0x0000101F;
-  const long XULToolbarSeparator = 0x00001020;
-  const long XULTooltip          = 0x00001021;
-  const long XULToolbarButton    = 0x00001022;
+  const long XULText             = 0x0000101A;
+  const long XULTextBox          = 0x0000101B;
+  const long XULThumb            = 0x0000101C;
+  const long XULTree             = 0x0000101D;
+  const long XULTreeColumns      = 0x0000101E;
+  const long XULTreeColumnItem   = 0x0000101F;
+  const long XULToolbar          = 0x00001020;
+  const long XULToolbarSeparator = 0x00001021;
+  const long XULTooltip          = 0x00001022;
+  const long XULToolbarButton    = 0x00001023;
 
 
   /**
    * Constants set is used by XForms elements.
    */
 
   /** Used for xforms elements that provide accessible object for itself as
    * well for anonymous content. This property are used for upload,
--- a/accessible/public/nsIAccessibleRole.idl
+++ b/accessible/public/nsIAccessibleRole.idl
@@ -105,19 +105,19 @@ interface nsIAccessibleRole : nsISupport
   /**
    * Represents the window frame, which contains child objects such as
    * a title bar, client, and other objects contained in a window. The role
    * is supported automatically by MS Windows.
    */
   const unsigned long ROLE_WINDOW = 9;
 
   /**
-   * XXX: document this.
+   * A sub-document (<frame> or <iframe>)
    */
-  const unsigned long ROLE_CLIENT = 10;
+  const unsigned long ROLE_INTERNAL_FRAME = 10;
 
   /**
    * Represents a menu, which presents a list of options from which the user can
    * make a selection to perform an action. It is used for role="menu".
    */
   const unsigned long ROLE_MENUPOPUP = 11;
 
   /**
--- a/accessible/public/nsPIAccessible.idl
+++ b/accessible/public/nsPIAccessible.idl
@@ -40,17 +40,17 @@
 
 interface nsIAccessible;
 interface nsIAccessibleEvent;
 %{C++
    struct nsRoleMapEntry;
 %}
 [ptr] native nsRoleMapEntryPtr(nsRoleMapEntry);
 
-[uuid(2d552ed0-3f38-4c7f-94c1-419de4d693ed)]
+[uuid(893ee16d-c157-4d5f-b236-60b3b2bef6a5)]
 interface nsPIAccessible : nsISupports
 {
   /**
    * Set accessible parent.
    */
   void setParent(in nsIAccessible aAccParent);
 
   /**
@@ -78,22 +78,20 @@ interface nsPIAccessible : nsISupports
    */
   void invalidateChildren();
 
   /**
    * Fire accessible event.
    *
    * @param aEvent - DOM event
    * @param aTarget - target of DOM event
-   * @param aData - additional information for accessible event.
    *
    * XXX: eventually this method will be removed (see bug 377022)
    */
-  void fireToolkitEvent(in unsigned long aEvent, in nsIAccessible aTarget,
-                        in voidPtr aData);
+  void fireToolkitEvent(in unsigned long aEvent, in nsIAccessible aTarget);
 
   /**
    * Fire accessible event.
    */
   void fireAccessibleEvent(in nsIAccessibleEvent aAccEvent);
 
   /**
    * Return true if there are accessible children in anonymous content
--- a/accessible/src/atk/nsAccessibleWrap.cpp
+++ b/accessible/src/atk/nsAccessibleWrap.cpp
@@ -297,16 +297,17 @@ nsAccessibleWrap::nsAccessibleWrap(nsIDO
 #endif
     MAI_LOG_DEBUG(("==nsAccessibleWrap creating: this=%p,total=%d left=%d\n",
                    (void*)this, mAccWrapCreated,
                   (mAccWrapCreated-mAccWrapDeleted)));
 }
 
 nsAccessibleWrap::~nsAccessibleWrap()
 {
+    NS_ASSERTION(!mAtkObject, "ShutdownAtkObject() is not called");
 
 #ifdef MAI_LOGGING
     ++mAccWrapDeleted;
 #endif
     MAI_LOG_DEBUG(("==nsAccessibleWrap deleting: this=%p,total=%d left=%d\n",
                    (void*)this, mAccWrapDeleted,
                    (mAccWrapCreated-mAccWrapDeleted)));
 }
@@ -1109,19 +1110,16 @@ nsAccessibleWrap::FireAccessibleEvent(ns
     nsCOMPtr<nsIAccessible> accessible;
     aEvent->GetAccessible(getter_AddRefs(accessible));
     NS_ENSURE_TRUE(accessible, NS_ERROR_FAILURE);
 
     PRUint32 type = 0;
     rv = aEvent->GetEventType(&type);
     NS_ENSURE_SUCCESS(rv, rv);
 
-    nsAccEvent *event = reinterpret_cast<nsAccEvent*>(aEvent);
-    void *eventData = event->mEventData;
-
     AtkObject *atkObj = nsAccessibleWrap::GetAtkObject(accessible);
 
     // We don't create ATK objects for nsIAccessible plain text leaves,
     // just return NS_OK in such case
     if (!atkObj) {
         NS_ASSERTION(type == nsIAccessibleEvent::EVENT_ASYNCH_SHOW ||
                      type == nsIAccessibleEvent::EVENT_ASYNCH_HIDE ||
                      type == nsIAccessibleEvent::EVENT_DOM_CREATE ||
@@ -1130,29 +1128,24 @@ nsAccessibleWrap::FireAccessibleEvent(ns
         return NS_OK;
     }
 
     nsAccessibleWrap *accWrap = GetAccessibleWrap(atkObj);
     if (!accWrap) {
         return NS_OK; // Node is shut down
     }
 
-    AtkTableChange * pAtkTableChange = nsnull;
-
     switch (type) {
     case nsIAccessibleEvent::EVENT_STATE_CHANGE:
         return FireAtkStateChangeEvent(aEvent, atkObj);
 
     case nsIAccessibleEvent::EVENT_TEXT_REMOVED:
     case nsIAccessibleEvent::EVENT_TEXT_INSERTED:
         return FireAtkTextChangedEvent(aEvent, atkObj);
 
-    case nsIAccessibleEvent::EVENT_PROPERTY_CHANGED:
-        return FireAtkPropChangedEvent(aEvent, atkObj);
-
     case nsIAccessibleEvent::EVENT_FOCUS:
       {
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_FOCUS\n"));
         nsRefPtr<nsRootAccessible> rootAccWrap = accWrap->GetRootAccessible();
         if (rootAccWrap && rootAccWrap->mActivated) {
             atk_focus_tracker_notify(atkObj);
             // Fire state change event for focus
             nsCOMPtr<nsIAccessibleStateChangeEvent> stateChangeEvent =
@@ -1204,83 +1197,93 @@ nsAccessibleWrap::FireAccessibleEvent(ns
       } break;
 
     case nsIAccessibleEvent::EVENT_TABLE_MODEL_CHANGED:
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_MODEL_CHANGED\n"));
         g_signal_emit_by_name(atkObj, "model_changed");
         break;
 
     case nsIAccessibleEvent::EVENT_TABLE_ROW_INSERT:
+      {
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_ROW_INSERT\n"));
-        NS_ASSERTION(eventData, "Event needs event data");
-        if (!eventData)
-            break;
+        nsCOMPtr<nsIAccessibleTableChangeEvent> tableEvent = do_QueryInterface(aEvent);
+        NS_ENSURE_TRUE(tableEvent, NS_ERROR_FAILURE);
 
-        pAtkTableChange = reinterpret_cast<AtkTableChange *>(eventData);
+        PRInt32 rowIndex, numRows;
+        tableEvent->GetRowOrColIndex(&rowIndex);
+        tableEvent->GetNumRowsOrCols(&numRows);
 
         g_signal_emit_by_name(atkObj,
                               "row_inserted",
                               // After which the rows are inserted
-                              pAtkTableChange->index,
+                              rowIndex,
                               // The number of the inserted
-                              pAtkTableChange->count);
-        break;
+                              numRows);
+     } break;
 
    case nsIAccessibleEvent::EVENT_TABLE_ROW_DELETE:
+     {
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_ROW_DELETE\n"));
-        NS_ASSERTION(eventData, "Event needs event data");
-        if (!eventData)
-            break;
+        nsCOMPtr<nsIAccessibleTableChangeEvent> tableEvent = do_QueryInterface(aEvent);
+        NS_ENSURE_TRUE(tableEvent, NS_ERROR_FAILURE);
 
-        pAtkTableChange = reinterpret_cast<AtkTableChange *>(eventData);
+        PRInt32 rowIndex, numRows;
+        tableEvent->GetRowOrColIndex(&rowIndex);
+        tableEvent->GetNumRowsOrCols(&numRows);
 
         g_signal_emit_by_name(atkObj,
                               "row_deleted",
                               // After which the rows are deleted
-                              pAtkTableChange->index,
+                              rowIndex,
                               // The number of the deleted
-                              pAtkTableChange->count);
-        break;
+                              numRows);
+      } break;
 
     case nsIAccessibleEvent::EVENT_TABLE_ROW_REORDER:
+      {
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_ROW_REORDER\n"));
         g_signal_emit_by_name(atkObj, "row_reordered");
         break;
+      }
 
     case nsIAccessibleEvent::EVENT_TABLE_COLUMN_INSERT:
+      {
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_COLUMN_INSERT\n"));
-        NS_ASSERTION(eventData, "Event needs event data");
-        if (!eventData)
-            break;
+        nsCOMPtr<nsIAccessibleTableChangeEvent> tableEvent = do_QueryInterface(aEvent);
+        NS_ENSURE_TRUE(tableEvent, NS_ERROR_FAILURE);
 
-        pAtkTableChange = reinterpret_cast<AtkTableChange *>(eventData);
+        PRInt32 colIndex, numCols;
+        tableEvent->GetRowOrColIndex(&colIndex);
+        tableEvent->GetNumRowsOrCols(&numCols);
 
         g_signal_emit_by_name(atkObj,
                               "column_inserted",
                               // After which the columns are inserted
-                              pAtkTableChange->index,
+                              colIndex,
                               // The number of the inserted
-                              pAtkTableChange->count);
-        break;
+                              numCols);
+      } break;
 
     case nsIAccessibleEvent::EVENT_TABLE_COLUMN_DELETE:
+      {
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_COLUMN_DELETE\n"));
-        NS_ASSERTION(eventData, "Event needs event data");
-        if (!eventData)
-            break;
+        nsCOMPtr<nsIAccessibleTableChangeEvent> tableEvent = do_QueryInterface(aEvent);
+        NS_ENSURE_TRUE(tableEvent, NS_ERROR_FAILURE);
 
-        pAtkTableChange = reinterpret_cast<AtkTableChange *>(eventData);
+        PRInt32 colIndex, numCols;
+        tableEvent->GetRowOrColIndex(&colIndex);
+        tableEvent->GetNumRowsOrCols(&numCols);
 
         g_signal_emit_by_name(atkObj,
                               "column_deleted",
                               // After which the columns are deleted
-                              pAtkTableChange->index,
+                              colIndex,
                               // The number of the deleted
-                              pAtkTableChange->count);
-        break;
+                              numCols);
+      } break;
 
     case nsIAccessibleEvent::EVENT_TABLE_COLUMN_REORDER:
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_COLUMN_REORDER\n"));
         g_signal_emit_by_name(atkObj, "column_reordered");
         break;
 
     case nsIAccessibleEvent::EVENT_SECTION_CHANGED:
         MAI_LOG_DEBUG(("\n\nReceived: EVENT_SECTION_CHANGED\n"));
@@ -1432,86 +1435,16 @@ nsAccessibleWrap::FireAtkTextChangedEven
                                     isFromUserInput ? "" : kNonUserInputEvent, NULL);
     g_signal_emit_by_name(aObject, signal_name, start, length);
     g_free (signal_name);
 
     return NS_OK;
 }
 
 nsresult
-nsAccessibleWrap::FireAtkPropChangedEvent(nsIAccessibleEvent *aEvent,
-                                          AtkObject *aObject)
-{
-    MAI_LOG_DEBUG(("\n\nReceived: EVENT_PROPERTY_CHANGED\n"));
-
-    AtkPropertyChange *pAtkPropChange;
-    AtkPropertyValues values = { NULL };
-    nsAccessibleWrap *oldAccWrap = nsnull, *newAccWrap = nsnull;
-
-    nsAccEvent *event = reinterpret_cast<nsAccEvent*>(aEvent);
-
-    pAtkPropChange = reinterpret_cast<AtkPropertyChange *>(event->mEventData);
-    values.property_name = sAtkPropertyNameArray[pAtkPropChange->type];
-
-    NS_ASSERTION(pAtkPropChange, "Event needs event data");
-    if (!pAtkPropChange)
-        return NS_OK;
-
-    MAI_LOG_DEBUG(("\n\nthe type of EVENT_PROPERTY_CHANGED: %d\n\n",
-                   pAtkPropChange->type));
-
-    switch (pAtkPropChange->type) {
-    case PROP_TABLE_CAPTION:
-    case PROP_TABLE_SUMMARY:
-
-        if (pAtkPropChange->oldvalue)
-            oldAccWrap = reinterpret_cast<nsAccessibleWrap *>
-                                         (pAtkPropChange->oldvalue);
-
-        if (pAtkPropChange->newvalue)
-            newAccWrap = reinterpret_cast<nsAccessibleWrap *>
-                                         (pAtkPropChange->newvalue);
-
-        if (oldAccWrap && newAccWrap) {
-            g_value_init(&values.old_value, G_TYPE_POINTER);
-            g_value_set_pointer(&values.old_value,
-                                oldAccWrap->GetAtkObject());
-            g_value_init(&values.new_value, G_TYPE_POINTER);
-            g_value_set_pointer(&values.new_value,
-                                newAccWrap->GetAtkObject());
-        }
-        break;
-
-    case PROP_TABLE_COLUMN_DESCRIPTION:
-    case PROP_TABLE_COLUMN_HEADER:
-    case PROP_TABLE_ROW_HEADER:
-    case PROP_TABLE_ROW_DESCRIPTION:
-        g_value_init(&values.new_value, G_TYPE_INT);
-        g_value_set_int(&values.new_value,
-                        *reinterpret_cast<gint *>
-                                         (pAtkPropChange->newvalue));
-        break;
-
-        //Perhaps need more cases in the future
-    default:
-        g_value_init (&values.old_value, G_TYPE_POINTER);
-        g_value_set_pointer (&values.old_value, pAtkPropChange->oldvalue);
-        g_value_init (&values.new_value, G_TYPE_POINTER);
-        g_value_set_pointer (&values.new_value, pAtkPropChange->newvalue);
-    }
-
-    char *signal_name = g_strconcat("property_change::",
-                                    values.property_name, NULL);
-    g_signal_emit_by_name(aObject, signal_name, &values, NULL);
-    g_free (signal_name);
-
-    return NS_OK;
-}
-
-nsresult
 nsAccessibleWrap::FireAtkShowHideEvent(nsIAccessibleEvent *aEvent,
                                        AtkObject *aObject, PRBool aIsAdded)
 {
     if (aIsAdded)
         MAI_LOG_DEBUG(("\n\nReceived: Show event\n"));
     else
         MAI_LOG_DEBUG(("\n\nReceived: Hide event\n"));
 
--- a/accessible/src/atk/nsRoleMap.h
+++ b/accessible/src/atk/nsRoleMap.h
@@ -51,17 +51,17 @@ static const PRUint32 atkRoleMap[] = {
     ATK_ROLE_MENU_BAR,            // nsIAccessibleRole::ROLE_MENUBAR              2
     ATK_ROLE_SCROLL_BAR,          // nsIAccessibleRole::ROLE_SCROLLBAR            3
     ATK_ROLE_UNKNOWN,             // nsIAccessibleRole::ROLE_GRIP                 4
     ATK_ROLE_UNKNOWN,             // nsIAccessibleRole::ROLE_SOUND                5
     ATK_ROLE_UNKNOWN,             // nsIAccessibleRole::ROLE_CURSOR               6
     ATK_ROLE_UNKNOWN,             // nsIAccessibleRole::ROLE_CARET                7
     ATK_ROLE_ALERT,               // nsIAccessibleRole::ROLE_ALERT                8
     ATK_ROLE_WINDOW,              // nsIAccessibleRole::ROLE_WINDOW               9
-    ATK_ROLE_PANEL,               // nsIAccessibleRole::ROLE_CLIENT               10
+    ATK_ROLE_INTERNAL_FRAME,      // nsIAccessibleRole::ROLE_INTERNAL_FRAME       10
     ATK_ROLE_MENU,                // nsIAccessibleRole::ROLE_MENUPOPUP            11
     ATK_ROLE_MENU_ITEM,           // nsIAccessibleRole::ROLE_MENUITEM             12
     ATK_ROLE_TOOL_TIP,            // nsIAccessibleRole::ROLE_TOOLTIP              13
     ATK_ROLE_EMBEDDED,            // nsIAccessibleRole::ROLE_APPLICATION          14
     ATK_ROLE_DOCUMENT_FRAME,      // nsIAccessibleRole::ROLE_DOCUMENT             15
     ATK_ROLE_PANEL,               // nsIAccessibleRole::ROLE_PANE                 16
     ATK_ROLE_CHART,               // nsIAccessibleRole::ROLE_CHART                17
     ATK_ROLE_DIALOG,              // nsIAccessibleRole::ROLE_DIALOG               18
--- a/accessible/src/atk/nsRootAccessibleWrap.cpp
+++ b/accessible/src/atk/nsRootAccessibleWrap.cpp
@@ -41,10 +41,16 @@
 
 #include "nsMai.h"
 #include "nsRootAccessibleWrap.h"
 
 nsNativeRootAccessibleWrap::nsNativeRootAccessibleWrap(AtkObject *aAccessible):
     nsRootAccessible(nsnull, nsnull)
 {
     g_object_ref(aAccessible);
-    nsAccessibleWrap::mAtkObject = aAccessible;
+    mAtkObject = aAccessible;
 }
+
+nsNativeRootAccessibleWrap::~nsNativeRootAccessibleWrap()
+{
+    g_object_unref(mAtkObject);
+    mAtkObject = nsnull;
+}
--- a/accessible/src/atk/nsRootAccessibleWrap.h
+++ b/accessible/src/atk/nsRootAccessibleWrap.h
@@ -50,11 +50,12 @@ typedef nsRootAccessible nsRootAccessibl
  * The instance of nsNativeRootAccessibleWrap is a child of MaiAppRoot instance.
  * It is added into root when the toplevel window is created, and removed
  * from root when the toplevel window is destroyed.
  */
 class nsNativeRootAccessibleWrap: public nsRootAccessible
 {
 public:
     nsNativeRootAccessibleWrap(AtkObject *aAccessible);
+    ~nsNativeRootAccessibleWrap();
 };
 
 #endif   /* __NS_ROOT_ACCESSIBLE_WRAP_H__ */
--- a/accessible/src/base/nsAccessibilityAtomList.h
+++ b/accessible/src/base/nsAccessibilityAtomList.h
@@ -77,16 +77,18 @@ ACCESSIBILITY_ATOM(deckFrame, "DeckFrame
 ACCESSIBILITY_ATOM(inlineBlockFrame, "InlineBlockFrame")
 ACCESSIBILITY_ATOM(inlineFrame, "InlineFrame")
 ACCESSIBILITY_ATOM(objectFrame, "ObjectFrame")
 ACCESSIBILITY_ATOM(scrollFrame, "ScrollFrame")
 ACCESSIBILITY_ATOM(textFrame, "TextFrame")
 ACCESSIBILITY_ATOM(tableCaptionFrame, "TableCaptionFrame")
 ACCESSIBILITY_ATOM(tableCellFrame, "TableCellFrame")
 ACCESSIBILITY_ATOM(tableOuterFrame, "TableOuterFrame")
+ACCESSIBILITY_ATOM(tableRowGroupFrame, "TableRowGroupFrame")
+ACCESSIBILITY_ATOM(tableRowFrame, "TableRowFrame")
 
   // Alphabetical list of tag names
 ACCESSIBILITY_ATOM(a, "a")
 ACCESSIBILITY_ATOM(abbr, "abbr")
 ACCESSIBILITY_ATOM(acronym, "acronym")
 ACCESSIBILITY_ATOM(area, "area")
 ACCESSIBILITY_ATOM(autocomplete, "autocomplete")
 ACCESSIBILITY_ATOM(blockquote, "blockquote")
--- a/accessible/src/base/nsAccessibilityService.cpp
+++ b/accessible/src/base/nsAccessibilityService.cpp
@@ -1191,16 +1191,44 @@ nsresult nsAccessibilityService::InitAcc
     nsCOMPtr<nsPIAccessible> privateAccessible =
       do_QueryInterface(privateAccessNode);
     privateAccessible->SetRoleMapEntry(aRoleMapEntry);
     NS_ADDREF(*aAccessibleOut = aAccessibleIn);
   }
   return rv;
 }
 
+static PRBool HasRelatedContent(nsIContent *aContent)
+{
+  nsAutoString id;
+  if (!aContent || !nsAccUtils::GetID(aContent, id) || id.IsEmpty()) {
+    return PR_FALSE;
+  }
+
+  nsIAtom *relationAttrs[] = {nsAccessibilityAtoms::aria_labelledby,
+                              nsAccessibilityAtoms::aria_describedby,
+                              nsAccessibilityAtoms::aria_owns,
+                              nsAccessibilityAtoms::aria_controls,
+                              nsAccessibilityAtoms::aria_flowto};
+  if (nsAccUtils::FindNeighbourPointingToNode(aContent, relationAttrs, NS_ARRAY_LENGTH(relationAttrs))) {
+    return PR_TRUE;
+  }
+
+  nsIContent *ancestorContent = aContent;
+  nsAutoString activeID;
+  while ((ancestorContent = ancestorContent->GetParent()) != nsnull) {
+    if (ancestorContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::aria_activedescendant, activeID)) {
+        // ancestor has activedescendant property, this content could be active
+      return PR_TRUE;
+    }
+  }
+
+  return PR_FALSE;
+}
+
 NS_IMETHODIMP nsAccessibilityService::GetAccessible(nsIDOMNode *aNode,
                                                     nsIPresShell *aPresShell,
                                                     nsIWeakReference *aWeakShell,
                                                     nsIFrame **aFrameHint,
                                                     PRBool *aIsHidden,
                                                     nsIAccessible **aAccessible)
 {
   NS_ENSURE_ARG_POINTER(aAccessible);
@@ -1390,51 +1418,46 @@ NS_IMETHODIMP nsAccessibilityService::Ge
                                         nsIAccessibleRole::ROLE_EQUATION);
     }
   } else if (!newAcc) {  // HTML accessibles
     PRBool tryTagNameOrFrame = PR_TRUE;
 
     if (!content->IsFocusable()) {
       // If we're in unfocusable table-related subcontent, check for the
       // Presentation role on the containing table
-      nsIAtom *tag = content->Tag();
-      if (tag == nsAccessibilityAtoms::td ||
-          tag == nsAccessibilityAtoms::th ||
-          tag == nsAccessibilityAtoms::tr ||
-          tag == nsAccessibilityAtoms::tbody ||
-          tag == nsAccessibilityAtoms::tfoot ||
-          tag == nsAccessibilityAtoms::thead) {
+      if (frame->GetType() == nsAccessibilityAtoms::tableCaptionFrame ||
+          frame->GetType() == nsAccessibilityAtoms::tableCellFrame ||
+          frame->GetType() == nsAccessibilityAtoms::tableRowGroupFrame ||
+          frame->GetType() == nsAccessibilityAtoms::tableRowFrame) {
+
         nsIContent *tableContent = content;
-        nsAutoString tableRole;
         while ((tableContent = tableContent->GetParent()) != nsnull) {
-          if (tableContent->Tag() == nsAccessibilityAtoms::table) {
-            // Table that we're a descendant of is not styled as a table,
-            // and has no table accessible for an ancestor, or
-            // table that we're a descendant of is presentational
+          nsIFrame *tableFrame = aPresShell->GetPrimaryFrameFor(tableContent);
+          if (tableFrame &&
+              tableFrame->GetType() == nsAccessibilityAtoms::tableOuterFrame) {
 
             nsCOMPtr<nsIDOMNode> tableNode(do_QueryInterface(tableContent));
             if (tableNode) {
               nsRoleMapEntry *tableRoleMapEntry =
                 nsAccUtils::GetRoleMapEntry(tableNode);
               if (tableRoleMapEntry &&
-                  tableRoleMapEntry != &nsARIAMap::gLandmarkRoleMap) {
+                  tableRoleMapEntry != &nsARIAMap::gLandmarkRoleMap)
                 tryTagNameOrFrame = PR_FALSE;
-                break;
-              }
-            }
-
-            nsIFrame *tableFrame =
-              aPresShell->GetPrimaryFrameFor(tableContent);
-            if (!tableFrame ||
-                tableFrame->GetType() != nsAccessibilityAtoms::tableOuterFrame) {
-              tryTagNameOrFrame = PR_FALSE;
             }
             break;
           }
+
+          if (tableContent->Tag() == nsAccessibilityAtoms::table) {
+            tryTagNameOrFrame = PR_FALSE;
+            break;
+          }
         }
+
+        if (!tableContent)
+          tryTagNameOrFrame = PR_FALSE;
       }
     }
 
     if (tryTagNameOrFrame) {
       // Prefer to use markup (mostly tag name, perhaps attributes) to
       // decide if and what kind of accessible to create.
       // The method creates accessibles for table related content too therefore
       // we do not call it if accessibles for table related content are
@@ -1468,17 +1491,18 @@ NS_IMETHODIMP nsAccessibilityService::Ge
 
   // If no accessible, see if we need to create a generic accessible because
   // of some property that makes this object interesting
   // We don't do this for <body>, <html>, <window>, <dialog> etc. which 
   // correspond to the doc accessible and will be created in any case
   if (!newAcc && content->Tag() != nsAccessibilityAtoms::body && content->GetParent() && 
       (content->IsFocusable() ||
       (isHTML && nsAccUtils::HasListener(content, NS_LITERAL_STRING("click"))) ||
-       HasUniversalAriaProperty(content, aWeakShell) || roleMapEntry)) {
+       HasUniversalAriaProperty(content, aWeakShell) || roleMapEntry) ||
+       HasRelatedContent(content)) {
     // This content is focusable or has an interesting dynamic content accessibility property.
     // If it's interesting we need it in the accessibility hierarchy so that events or
     // other accessibles can point to it, or so that it can hold a state, etc.
     if (isHTML) {
       // Interesting HTML container which may have selectable text and/or embedded objects
       CreateHyperTextAccessible(frame, getter_AddRefs(newAcc));
     }
     else {  // XUL, SVG, MathML etc.
@@ -1601,16 +1625,18 @@ nsresult nsAccessibilityService::GetAcce
     return CreateOuterDocAccessible(aNode, aAccessible);
 
   nsCOMPtr<nsIWeakReference> weakShell;
   GetShellFromNode(aNode, getter_AddRefs(weakShell));
 
   switch (type)
   {
 #ifdef MOZ_XUL
+    case nsIAccessibleProvider::NoAccessible:
+      return NS_OK;
     // XUL controls
     case nsIAccessibleProvider::XULAlert:
       *aAccessible = new nsXULAlertAccessible(aNode, weakShell);
       break;
     case nsIAccessibleProvider::XULButton:
       *aAccessible = new nsXULButtonAccessible(aNode, weakShell);
       break;
     case nsIAccessibleProvider::XULCheckbox:
@@ -1685,16 +1711,19 @@ nsresult nsAccessibilityService::GetAcce
       }
 #endif
       *aAccessible = new nsXULMenupopupAccessible(aNode, weakShell);
       break;
     }
     case nsIAccessibleProvider::XULMenuSeparator:
       *aAccessible = new nsXULMenuSeparatorAccessible(aNode, weakShell);
       break;
+    case nsIAccessibleProvider::XULPane:
+      *aAccessible = new nsEnumRoleAccessible(aNode, weakShell, nsIAccessibleRole::ROLE_PANE);
+      break;
     case nsIAccessibleProvider::XULProgressMeter:
       *aAccessible = new nsXULProgressMeterAccessible(aNode, weakShell);
       break;
     case nsIAccessibleProvider::XULStatusBar:
       *aAccessible = new nsXULStatusBarAccessible(aNode, weakShell);
       break;
     case nsIAccessibleProvider::XULScale:
       *aAccessible = new nsXULSliderAccessible(aNode, weakShell);
--- a/accessible/src/base/nsAccessibilityService.h
+++ b/accessible/src/base/nsAccessibilityService.h
@@ -147,17 +147,17 @@ static const char kRoleNames[][20] = {
   "menubar",             //ROLE_MENUBAR
   "scrollbar",           //ROLE_SCROLLBAR 
   "grip",                //ROLE_GRIP
   "sound",               //ROLE_SOUND
   "cursor",              //ROLE_CURSOR
   "caret",               //ROLE_CARET
   "alert",               //ROLE_ALERT
   "window",              //ROLE_WINDOW
-  "client",              //ROLE_CLIENT
+  "internal frame",      //ROLE_INTERNAL_FRAME
   "menupopup",           //ROLE_MENUPOPUP
   "menuitem",            //ROLE_MENUITEM
   "tooltip",             //ROLE_TOOLTIP
   "application",         //ROLE_APPLICATION
   "document",            //ROLE_DOCUMENT
   "pane",                //ROLE_PANE
   "chart",               //ROLE_CHART
   "dialog",              //ROLE_DIALOG
--- a/accessible/src/base/nsAccessibilityUtils.cpp
+++ b/accessible/src/base/nsAccessibilityUtils.cpp
@@ -252,17 +252,17 @@ nsAccUtils::FireAccEvent(PRUint32 aEvent
                          PRBool aIsAsynch)
 {
   NS_ENSURE_ARG(aAccessible);
 
   nsCOMPtr<nsPIAccessible> pAccessible(do_QueryInterface(aAccessible));
   NS_ASSERTION(pAccessible, "Accessible doesn't implement nsPIAccessible");
 
   nsCOMPtr<nsIAccessibleEvent> event =
-    new nsAccEvent(aEventType, aAccessible, nsnull, aIsAsynch);
+    new nsAccEvent(aEventType, aAccessible, aIsAsynch);
   NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
 
   return pAccessible->FireAccessibleEvent(event);
 }
 
 PRBool
 nsAccUtils::IsAncestorOf(nsIDOMNode *aPossibleAncestorNode,
                          nsIDOMNode *aPossibleDescendantNode)
@@ -582,16 +582,26 @@ nsAccUtils::GetID(nsIContent *aContent, 
 }
 
 nsIContent*
 nsAccUtils::FindNeighbourPointingToNode(nsIContent *aForNode, 
                                         nsIAtom *aRelationAttr,
                                         nsIAtom *aTagName,
                                         PRUint32 aAncestorLevelsToSearch)
 {
+  return FindNeighbourPointingToNode(aForNode, &aRelationAttr, 1, aTagName, aAncestorLevelsToSearch);
+}
+
+nsIContent*
+nsAccUtils::FindNeighbourPointingToNode(nsIContent *aForNode, 
+                                        nsIAtom **aRelationAttrs,
+                                        PRUint32 aAttrNum,
+                                        nsIAtom *aTagName,
+                                        PRUint32 aAncestorLevelsToSearch)
+{
   nsCOMPtr<nsIContent> binding;
   nsAutoString controlID;
   if (!nsAccUtils::GetID(aForNode, controlID)) {
     binding = aForNode->GetBindingParent();
     if (binding == aForNode)
       return nsnull;
 
     aForNode->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::anonid, controlID);
@@ -633,68 +643,85 @@ nsAccUtils::FindNeighbourPointingToNode(
           return nsnull;
 
         nsCOMPtr<nsIContent> content = do_QueryInterface(node);
         if (!content)
           return nsnull;
 
         if (content != prevSearched) {
           labelContent = FindDescendantPointingToID(&controlID, content,
-                                                    aRelationAttr, nsnull, aTagName);
+                                                    aRelationAttrs, aAttrNum,
+                                                    nsnull, aTagName);
         }
       }
       break;
     }
 
     labelContent = FindDescendantPointingToID(&controlID, aForNode,
-                                              aRelationAttr, prevSearched, aTagName);
+                                              aRelationAttrs, aAttrNum,
+                                              prevSearched, aTagName);
     prevSearched = aForNode;
   }
 
   return labelContent;
 }
 
 // Pass in aAriaProperty = null and aRelationAttr == nsnull if any <label> will do
 nsIContent*
 nsAccUtils::FindDescendantPointingToID(const nsString *aId,
                                        nsIContent *aLookContent,
-                                       nsIAtom *aRelationAttr,
+                                       nsIAtom **aRelationAttrs,
+                                       PRUint32 aAttrNum,
                                        nsIContent *aExcludeContent,
                                        nsIAtom *aTagType)
 {
   // Surround id with spaces for search
   nsCAutoString idWithSpaces(' ');
   LossyAppendUTF16toASCII(*aId, idWithSpaces);
   idWithSpaces += ' ';
   return FindDescendantPointingToIDImpl(idWithSpaces, aLookContent,
-                                        aRelationAttr, aExcludeContent, aTagType);
+                                        aRelationAttrs, aAttrNum,
+                                        aExcludeContent, aTagType);
+}
+
+nsIContent*
+nsAccUtils::FindDescendantPointingToID(const nsString *aId,
+                                       nsIContent *aLookContent,
+                                       nsIAtom *aRelationAttr,
+                                       nsIContent *aExcludeContent,
+                                       nsIAtom *aTagType)
+{
+  return FindDescendantPointingToID(aId, aLookContent, &aRelationAttr, 1, aExcludeContent, aTagType);
 }
 
 nsIContent*
 nsAccUtils::FindDescendantPointingToIDImpl(nsCString& aIdWithSpaces,
                                            nsIContent *aLookContent,
-                                           nsIAtom *aRelationAttr,
+                                           nsIAtom **aRelationAttrs,
+                                           PRUint32 aAttrNum,
                                            nsIContent *aExcludeContent,
                                            nsIAtom *aTagType)
 {
   NS_ENSURE_TRUE(aLookContent, nsnull);
-  NS_ENSURE_TRUE(aRelationAttr, nsnull);
+  NS_ENSURE_TRUE(aRelationAttrs && *aRelationAttrs, nsnull);
 
   if (!aTagType || aLookContent->Tag() == aTagType) {
     // Tag matches
-    // Check for ID in the attribute aRelationAttr, which can be a list
-    nsAutoString idList;
-    if (aLookContent->GetAttr(kNameSpaceID_None, aRelationAttr, idList)) {
-      idList.Insert(' ', 0);  // Surround idlist with spaces for search
-      idList.Append(' ');
-      // idList is now a set of id's with spaces around each,
-      // and id also has spaces around it.
-      // If id is a substring of idList then we have a match
-      if (idList.Find(aIdWithSpaces) != -1) {
-        return aLookContent;
+    // Check for ID in the attributes aRelationAttrs, which can be a list
+    for (PRUint32 i = 0; i < aAttrNum; i++) {
+      nsAutoString idList;
+      if (aLookContent->GetAttr(kNameSpaceID_None, aRelationAttrs[i], idList)) {
+        idList.Insert(' ', 0);  // Surround idlist with spaces for search
+        idList.Append(' ');
+        // idList is now a set of id's with spaces around each,
+        // and id also has spaces around it.
+        // If id is a substring of idList then we have a match
+        if (idList.Find(aIdWithSpaces) != -1) {
+          return aLookContent;
+        }
       }
     }
     if (aTagType) {
       // Don't bother to search descendants of an element with matching tag.
       // That would be like looking for a nested <label> or <description>
       return nsnull;
     }
   }
@@ -702,17 +729,18 @@ nsAccUtils::FindDescendantPointingToIDIm
   // Recursively search descendants for match
   PRUint32 count  = 0;
   nsIContent *child;
   nsIContent *labelContent = nsnull;
 
   while ((child = aLookContent->GetChildAt(count++)) != nsnull) {
     if (child != aExcludeContent) {
       labelContent = FindDescendantPointingToIDImpl(aIdWithSpaces, child,
-                                                    aRelationAttr, aExcludeContent, aTagType);
+                                                    aRelationAttrs, aAttrNum,
+                                                    aExcludeContent, aTagType);
       if (labelContent) {
         return labelContent;
       }
     }
   }
   return nsnull;
 }
 
--- a/accessible/src/base/nsAccessibilityUtils.h
+++ b/accessible/src/base/nsAccessibilityUtils.h
@@ -272,49 +272,75 @@ public:
    */
    static nsRoleMapEntry* GetRoleMapEntry(nsIDOMNode *aNode);
 
   /**
    * Search element in neighborhood of the given element by tag name and
    * attribute value that equals to ID attribute of the given element.
    * ID attribute can be either 'id' attribute or 'anonid' if the element is
    * anonymous.
+   * The first matched content will be returned.
    *
    * @param aForNode - the given element the search is performed for
-   * @param aRelationAttr - attribute name of searched element, ignored if aAriaProperty passed in
+   * @param aRelationAttrs - an array of attributes, element is attribute name of searched element, ignored if aAriaProperty passed in
+   * @param aAttrNum - how many attributes in aRelationAttrs
    * @param aTagName - tag name of searched element, or nsnull for any -- ignored if aAriaProperty passed in
    * @param aAncestorLevelsToSearch - points how is the neighborhood of the
    *                                  given element big.
    */
   static nsIContent *FindNeighbourPointingToNode(nsIContent *aForNode,
-                                                 nsIAtom *aRelationAttr,
+                                                 nsIAtom **aRelationAttrs, 
+                                                 PRUint32 aAttrNum,
+                                                 nsIAtom *aTagName = nsnull,
+                                                 PRUint32 aAncestorLevelsToSearch = 5);
+
+  /**
+   * Overloaded version of FindNeighbourPointingToNode to accept only one
+   * relation attribute.
+   */
+  static nsIContent *FindNeighbourPointingToNode(nsIContent *aForNode,
+                                                 nsIAtom *aRelationAttr, 
                                                  nsIAtom *aTagName = nsnull,
                                                  PRUint32 aAncestorLevelsToSearch = 5);
 
   /**
    * Search for element that satisfies the requirements in subtree of the given
    * element. The requirements are tag name, attribute name and value of
    * attribute.
+   * The first matched content will be returned.
    *
    * @param aId - value of searched attribute
    * @param aLookContent - element that search is performed inside
-   * @param aRelationAttr - searched attribute
-   * @param                 if both aAriaProperty and aRelationAttr are null, then any element with aTagType will do
+   * @param aRelationAttrs - an array of searched attributes
+   * @param aAttrNum - how many attributes in aRelationAttrs
+   * @param                 if both aAriaProperty and aRelationAttrs are null, then any element with aTagType will do
    * @param aExcludeContent - element that is skiped for search
    * @param aTagType - tag name of searched element, by default it is 'label' --
    *                   ignored if aAriaProperty passed in
    */
   static nsIContent *FindDescendantPointingToID(const nsString *aId,
                                                 nsIContent *aLookContent,
+                                                nsIAtom **aRelationAttrs,
+                                                PRUint32 aAttrNum = 1,
+                                                nsIContent *aExcludeContent = nsnull,
+                                                nsIAtom *aTagType = nsAccessibilityAtoms::label);
+
+  /**
+   * Overloaded version of FindDescendantPointingToID to accept only one
+   * relation attribute.
+   */
+  static nsIContent *FindDescendantPointingToID(const nsString *aId,
+                                                nsIContent *aLookContent,
                                                 nsIAtom *aRelationAttr,
                                                 nsIContent *aExcludeContent = nsnull,
                                                 nsIAtom *aTagType = nsAccessibilityAtoms::label);
 
   // Helper for FindDescendantPointingToID(), same args
   static nsIContent *FindDescendantPointingToIDImpl(nsCString& aIdWithSpaces,
                                                     nsIContent *aLookContent,
-                                                    nsIAtom *aRelationAttrs,
+                                                    nsIAtom **aRelationAttrs,
+                                                    PRUint32 aAttrNum = 1,
                                                     nsIContent *aExcludeContent = nsnull,
                                                     nsIAtom *aTagType = nsAccessibilityAtoms::label);
 };
 
 #endif
 
--- a/accessible/src/base/nsAccessible.cpp
+++ b/accessible/src/base/nsAccessible.cpp
@@ -824,17 +824,17 @@ NS_IMETHODIMP nsAccessible::TestChildCac
 {
 #ifndef DEBUG_A11Y
   return NS_OK;
 #else
   // All cached accessible nodes should be in the parent
   // It will assert if not all the children were created
   // when they were first cached, and no invalidation
   // ever corrected parent accessible's child cache.
-  if (mAccChildCount == eChildCountUninitialized) {
+  if (mAccChildCount <= 0) {
     return NS_OK;
   }
   nsCOMPtr<nsIAccessible> sibling = mFirstChild;
 
   while (sibling != aCachedChild) {
     NS_ASSERTION(sibling, "[TestChildCache] Never ran into the same child that we started from");
     if (!sibling)
       return NS_ERROR_FAILURE;
@@ -1904,25 +1904,24 @@ PRBool nsAccessible::IsNodeRelevant(nsID
     do_GetService("@mozilla.org/accessibilityService;1");
   NS_ENSURE_TRUE(accService, PR_FALSE);
   nsCOMPtr<nsIDOMNode> relevantNode;
   accService->GetRelevantContentNodeFor(aNode, getter_AddRefs(relevantNode));
   return aNode == relevantNode;
 }
 
 NS_IMETHODIMP
-nsAccessible::FireToolkitEvent(PRUint32 aEvent, nsIAccessible *aTarget,
-                               void * aData)
+nsAccessible::FireToolkitEvent(PRUint32 aEvent, nsIAccessible *aTarget)
 {
   // Don't fire event for accessible that has been shut down.
   if (!mWeakShell)
     return NS_ERROR_FAILURE;
 
   nsCOMPtr<nsIAccessibleEvent> accEvent =
-    new nsAccEvent(aEvent, aTarget, aData);
+    new nsAccEvent(aEvent, aTarget);
   NS_ENSURE_TRUE(accEvent, NS_ERROR_OUT_OF_MEMORY);
 
   return FireAccessibleEvent(accEvent);
 }
 
 NS_IMETHODIMP
 nsAccessible::FireAccessibleEvent(nsIAccessibleEvent *aEvent)
 {
@@ -1959,17 +1958,17 @@ NS_IMETHODIMP nsAccessible::GetFinalRole
     else if (*aRole == nsIAccessibleRole::ROLE_PUSHBUTTON) {
       nsCOMPtr<nsIContent> content = do_QueryInterface(mDOMNode);
       if (content) {
         if (content->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::aria_pressed)) {
           // For aria-pressed="false" or aria-pressed="true"
           // For simplicity, any pressed attribute indicates it's a toggle button
           *aRole = nsIAccessibleRole::ROLE_TOGGLE_BUTTON;
         }
-        else if (content->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::aria_secret,
+        else if (content->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::aria_haspopup,
                                       nsAccessibilityAtoms::_true, eCaseMatters)) {
           // For button with aria-haspopup="true"
           *aRole = nsIAccessibleRole::ROLE_BUTTONMENU;
         }
       }
     }
     else if (*aRole == nsIAccessibleRole::ROLE_LISTBOX) {
       // A listbox inside of a combo box needs a special role because of ATK mapping to menu
--- a/accessible/src/base/nsAccessibleEventData.cpp
+++ b/accessible/src/base/nsAccessibleEventData.cpp
@@ -55,25 +55,25 @@
 #include "nsPresContext.h"
 
 PRBool nsAccEvent::gLastEventFromUserInput = PR_FALSE;
 nsIDOMNode* nsAccEvent::gLastEventNodeWeak = 0;
 
 NS_IMPL_ISUPPORTS1(nsAccEvent, nsIAccessibleEvent)
 
 nsAccEvent::nsAccEvent(PRUint32 aEventType, nsIAccessible *aAccessible,
-                       void *aEventData, PRBool aIsAsynch):
-  mEventType(aEventType), mAccessible(aAccessible), mEventData(aEventData)
+                       PRBool aIsAsynch):
+  mEventType(aEventType), mAccessible(aAccessible)
 {
   CaptureIsFromUserInput(aIsAsynch);
 }
 
 nsAccEvent::nsAccEvent(PRUint32 aEventType, nsIDOMNode *aDOMNode,
-                       void *aEventData, PRBool aIsAsynch):
-  mEventType(aEventType), mDOMNode(aDOMNode), mEventData(aEventData)
+                       PRBool aIsAsynch):
+  mEventType(aEventType), mDOMNode(aDOMNode)
 {
   CaptureIsFromUserInput(aIsAsynch);
 }
 
 void nsAccEvent::GetLastEventAttributes(nsIDOMNode *aNode,
                                         nsIPersistentProperties *aAttributes)
 {
   if (aNode == gLastEventNodeWeak) {
@@ -269,34 +269,34 @@ nsAccEvent::GetAccessibleByNode()
 // nsAccStateChangeEvent
 NS_IMPL_ISUPPORTS_INHERITED1(nsAccStateChangeEvent, nsAccEvent,
                              nsIAccessibleStateChangeEvent)
 
 nsAccStateChangeEvent::
   nsAccStateChangeEvent(nsIAccessible *aAccessible,
                         PRUint32 aState, PRBool aIsExtraState,
                         PRBool aIsEnabled):
-  nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aAccessible, nsnull),
+  nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aAccessible),
   mState(aState), mIsExtraState(aIsExtraState), mIsEnabled(aIsEnabled)
 {
 }
 
 nsAccStateChangeEvent::
   nsAccStateChangeEvent(nsIDOMNode *aNode,
                         PRUint32 aState, PRBool aIsExtraState,
                         PRBool aIsEnabled):
-  nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aNode, nsnull),
+  nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aNode),
   mState(aState), mIsExtraState(aIsExtraState), mIsEnabled(aIsEnabled)
 {
 }
 
 nsAccStateChangeEvent::
   nsAccStateChangeEvent(nsIDOMNode *aNode,
                         PRUint32 aState, PRBool aIsExtraState):
-  nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aNode, nsnull),
+  nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aNode),
   mState(aState), mIsExtraState(aIsExtraState)
 {
   // Use GetAccessibleByNode() because we do not want to store an accessible
   // since it leads to problems with delayed events in the case when
   // an accessible gets reorder event before delayed event is processed.
   nsCOMPtr<nsIAccessible> accessible(GetAccessibleByNode());
   if (accessible) {
     PRUint32 state = 0, extraState = 0;
@@ -332,17 +332,17 @@ nsAccStateChangeEvent::IsEnabled(PRBool 
 // nsAccTextChangeEvent
 NS_IMPL_ISUPPORTS_INHERITED1(nsAccTextChangeEvent, nsAccEvent,
                              nsIAccessibleTextChangeEvent)
 
 nsAccTextChangeEvent::
   nsAccTextChangeEvent(nsIAccessible *aAccessible,
                        PRInt32 aStart, PRUint32 aLength, PRBool aIsInserted, PRBool aIsAsynch):
   nsAccEvent(aIsInserted ? nsIAccessibleEvent::EVENT_TEXT_INSERTED : nsIAccessibleEvent::EVENT_TEXT_REMOVED,
-             aAccessible, nsnull, aIsAsynch),
+             aAccessible, aIsAsynch),
   mStart(aStart), mLength(aLength), mIsInserted(aIsInserted)
 {
   nsCOMPtr<nsIAccessibleText> textAccessible = do_QueryInterface(aAccessible);
   NS_ASSERTION(textAccessible, "Should not be firing test change event for non-text accessible!!!");
   if (textAccessible) {
     textAccessible->GetText(aStart, aStart + aLength, mModifiedText);
   }
 }
@@ -376,29 +376,59 @@ nsAccTextChangeEvent::GetModifiedText(ns
 }
 
 // nsAccCaretMoveEvent
 NS_IMPL_ISUPPORTS_INHERITED1(nsAccCaretMoveEvent, nsAccEvent,
                              nsIAccessibleCaretMoveEvent)
 
 nsAccCaretMoveEvent::
   nsAccCaretMoveEvent(nsIAccessible *aAccessible, PRInt32 aCaretOffset) :
-  nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aAccessible, nsnull, PR_TRUE), // Currently always asynch
+  nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aAccessible, PR_TRUE), // Currently always asynch
   mCaretOffset(aCaretOffset)
 {
 }
 
 nsAccCaretMoveEvent::
   nsAccCaretMoveEvent(nsIDOMNode *aNode) :
-  nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aNode, nsnull, PR_TRUE), // Currently always asynch
+  nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aNode, PR_TRUE), // Currently always asynch
   mCaretOffset(-1)
 {
 }
 
 NS_IMETHODIMP
 nsAccCaretMoveEvent::GetCaretOffset(PRInt32* aCaretOffset)
 {
   NS_ENSURE_ARG_POINTER(aCaretOffset);
 
   *aCaretOffset = mCaretOffset;
   return NS_OK;
 }
 
+// nsAccTableChangeEvent 
+NS_IMPL_ISUPPORTS_INHERITED1(nsAccTableChangeEvent, nsAccEvent,
+                             nsIAccessibleTableChangeEvent)
+
+nsAccTableChangeEvent::
+  nsAccTableChangeEvent(nsIAccessible *aAccessible, PRUint32 aEventType,
+                        PRInt32 aRowOrColIndex, PRInt32 aNumRowsOrCols, PRBool aIsAsynch):
+  nsAccEvent(aEventType, aAccessible, aIsAsynch), 
+  mRowOrColIndex(aRowOrColIndex), mNumRowsOrCols(aNumRowsOrCols)
+{
+}
+
+NS_IMETHODIMP
+nsAccTableChangeEvent::GetRowOrColIndex(PRInt32* aRowOrColIndex)
+{
+  NS_ENSURE_ARG_POINTER(aRowOrColIndex);
+
+  *aRowOrColIndex = mRowOrColIndex;
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+nsAccTableChangeEvent::GetNumRowsOrCols(PRInt32* aNumRowsOrCols)
+{
+  NS_ENSURE_ARG_POINTER(aNumRowsOrCols);
+
+  *aNumRowsOrCols = mNumRowsOrCols;
+  return NS_OK;
+}
+
--- a/accessible/src/base/nsAccessibleEventData.h
+++ b/accessible/src/base/nsAccessibleEventData.h
@@ -49,26 +49,26 @@
 #include "nsString.h"
 
 class nsIPresShell;
 
 class nsAccEvent: public nsIAccessibleEvent
 {
 public:
   // Initialize with an nsIAccessible
-  nsAccEvent(PRUint32 aEventType, nsIAccessible *aAccessible, void *aEventData, PRBool aIsAsynch = PR_FALSE);
+  nsAccEvent(PRUint32 aEventType, nsIAccessible *aAccessible, PRBool aIsAsynch = PR_FALSE);
   // Initialize with an nsIDOMNode
-  nsAccEvent(PRUint32 aEventType, nsIDOMNode *aDOMNode, void *aEventData, PRBool aIsAsynch = PR_FALSE);
+  nsAccEvent(PRUint32 aEventType, nsIDOMNode *aDOMNode, PRBool aIsAsynch = PR_FALSE);
   virtual ~nsAccEvent() {}
 
   NS_DECL_ISUPPORTS
   NS_DECL_NSIACCESSIBLEEVENT
 
   static void GetLastEventAttributes(nsIDOMNode *aNode,
-                                      nsIPersistentProperties *aAttributes);
+                                     nsIPersistentProperties *aAttributes);
 
 protected:
   already_AddRefed<nsIAccessible> GetAccessibleByNode();
 
   void CaptureIsFromUserInput(PRBool aIsAsynch);
   PRBool mIsFromUserInput;
 
 private:
@@ -91,18 +91,16 @@ public:
                               PRBool aForceIsFromUserInput = PR_FALSE);
 
   /**
    * The input state was previously stored with the nsIAccessibleEvent,
    * so use that state now -- call this when about to flush an event that 
    * was waiting in an event queue
    */
   static void PrepareForEvent(nsIAccessibleEvent *aEvent);
-
-  void *mEventData;
 };
 
 class nsAccStateChangeEvent: public nsAccEvent,
                              public nsIAccessibleStateChangeEvent
 {
 public:
   nsAccStateChangeEvent(nsIAccessible *aAccessible,
                         PRUint32 aState, PRBool aIsExtraState,
@@ -153,18 +151,26 @@ public:
   NS_DECL_ISUPPORTS_INHERITED
   NS_FORWARD_NSIACCESSIBLEEVENT(nsAccEvent::)
   NS_DECL_NSIACCESSIBLECARETMOVEEVENT
 
 private:
   PRInt32 mCaretOffset;
 };
 
-// XXX todo: We might want to use XPCOM interfaces instead of struct
-//     e.g., nsAccessibleTableChangeEvent: public nsIAccessibleTableChangeEvent
+class nsAccTableChangeEvent : public nsAccEvent,
+                              public nsIAccessibleTableChangeEvent {
+public:
+  nsAccTableChangeEvent(nsIAccessible *aAccessible, PRUint32 aEventType,
+                        PRInt32 aRowOrColIndex, PRInt32 aNumRowsOrCols,
+                        PRBool aIsAsynch);
 
-struct AtkTableChange {
-  PRUint32 index;   // the start row/column after which the rows are inserted/deleted.
-  PRUint32 count;   // the number of inserted/deleted rows/columns
+  NS_DECL_ISUPPORTS
+  NS_FORWARD_NSIACCESSIBLEEVENT(nsAccEvent::)
+  NS_DECL_NSIACCESSIBLETABLECHANGEEVENT
+
+private:
+  PRUint32 mRowOrColIndex;   // the start row/column after which the rows are inserted/deleted.
+  PRUint32 mNumRowsOrCols;   // the number of inserted/deleted rows/columns
 };
 
 #endif
 
--- a/accessible/src/base/nsBaseWidgetAccessible.cpp
+++ b/accessible/src/base/nsBaseWidgetAccessible.cpp
@@ -141,23 +141,28 @@ nsLinkableAccessible::GetState(PRUint32 
         *aState |= nsIAccessibleStates::STATE_TRAVERSED;
       }
     }
   }
 
   return NS_OK;
 }
 
-NS_IMETHODIMP nsLinkableAccessible::GetValue(nsAString& _retval)
+NS_IMETHODIMP nsLinkableAccessible::GetValue(nsAString& aValue)
 {
+  aValue.Truncate();
+  nsHyperTextAccessible::GetValue(aValue);
+  if (!aValue.IsEmpty())
+    return NS_OK;
+
   if (mIsLink) {
     nsCOMPtr<nsIDOMNode> linkNode(do_QueryInterface(mActionContent));
     nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mWeakShell));
     if (linkNode && presShell)
-      return presShell->GetLinkLocation(linkNode, _retval);
+      return presShell->GetLinkLocation(linkNode, aValue);
   }
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
 
 /* PRUint8 getAccNumActions (); */
 NS_IMETHODIMP nsLinkableAccessible::GetNumActions(PRUint8 *aNumActions)
 {
--- a/accessible/src/base/nsCaretAccessible.cpp
+++ b/accessible/src/base/nsCaretAccessible.cpp
@@ -83,16 +83,20 @@ nsresult nsCaretAccessible::ClearControl
 
   mCurrentControlSelection = nsnull;
   mCurrentControl = nsnull;
   return selPrivate->RemoveSelectionListener(this);
 }
 
 nsresult nsCaretAccessible::SetControlSelectionListener(nsIDOMNode *aCurrentNode)
 {
+  NS_ENSURE_TRUE(mRootAccessible, NS_ERROR_FAILURE);
+
+  ClearControlSelectionListener();
+
   mCurrentControl = aCurrentNode;
   mLastTextAccessible = nsnull;
 
   // When focus moves such that the caret is part of a new frame selection
   // this removes the old selection listener and attaches a new one for the current focus
   nsCOMPtr<nsIPresShell> presShell = 
     mRootAccessible->GetPresShellFor(aCurrentNode);
   if (!presShell)
@@ -116,26 +120,27 @@ nsresult nsCaretAccessible::SetControlSe
 
   nsCOMPtr<nsISelectionController> selCon;
   frame->GetSelectionController(presContext, getter_AddRefs(selCon));
   NS_ENSURE_TRUE(selCon, NS_ERROR_FAILURE);
   
   nsCOMPtr<nsISelection> domSel;
   selCon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSel));
 
-  ClearControlSelectionListener();
   nsCOMPtr<nsISelectionPrivate> selPrivate(do_QueryInterface(domSel));
   NS_ENSURE_TRUE(selPrivate, NS_ERROR_FAILURE);
 
   mCurrentControlSelection = do_GetWeakReference(domSel);
   return selPrivate->AddSelectionListener(this);
 }
 
 nsresult nsCaretAccessible::AddDocSelectionListener(nsIDOMDocument *aDoc)
 {
+  NS_ENSURE_TRUE(mRootAccessible, NS_ERROR_FAILURE);
+
   nsCOMPtr<nsIDocument> doc = do_QueryInterface(aDoc);
   NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
   nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(doc->GetPrimaryShell());
   NS_ENSURE_TRUE(selCon, NS_ERROR_FAILURE);
 
   nsCOMPtr<nsISelection> domSel;
   selCon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSel));
   nsCOMPtr<nsISelectionPrivate> selPrivate = do_QueryInterface(domSel);
@@ -166,17 +171,17 @@ NS_IMETHODIMP nsCaretAccessible::NotifyS
 
   mLastUsedSelection = do_GetWeakReference(aSel);
 
   nsCOMPtr<nsIDocument> doc = do_QueryInterface(aDoc);
   NS_ENSURE_TRUE(doc, NS_OK);
   nsIPresShell *presShell = doc->GetPrimaryShell();
   NS_ENSURE_TRUE(presShell, NS_OK);
 
-  // Get first nnsIAccessibleText in parent chain and fire caret-move, selection-change event for it
+  // Get first nsIAccessibleText in parent chain and fire caret-move, selection-change event for it
   nsCOMPtr<nsIAccessible> accessible;
   nsIAccessibilityService *accService = mRootAccessible->GetAccService();
   NS_ENSURE_TRUE(accService, NS_ERROR_FAILURE);
   // Get accessible from selection's focus node or its parent
   nsCOMPtr<nsIDOMNode> focusNode;
   aSel->GetFocusNode(getter_AddRefs(focusNode));
   if (!focusNode) {
     mLastTextAccessible = nsnull;
@@ -243,16 +248,17 @@ NS_IMETHODIMP nsCaretAccessible::NotifyS
 }
 
 nsRect
 nsCaretAccessible::GetCaretRect(nsIWidget **aOutWidget)
 {
   nsRect caretRect;
   NS_ENSURE_TRUE(aOutWidget, caretRect);
   *aOutWidget = nsnull;
+  NS_ENSURE_TRUE(mRootAccessible, caretRect);
 
   if (!mLastTextAccessible) {
     return caretRect;    // Return empty rect
   }
 
   nsCOMPtr<nsIAccessNode> lastAccessNode(do_QueryInterface(mLastTextAccessible));
   NS_ENSURE_TRUE(lastAccessNode, caretRect);
 
--- a/accessible/src/base/nsDocAccessible.cpp
+++ b/accessible/src/base/nsDocAccessible.cpp
@@ -686,16 +686,17 @@ nsresult nsDocAccessible::RemoveEventLis
   RemoveScrollListener();
 
   // Remove document observer
   mDocument->RemoveObserver(this);
 
   if (mScrollWatchTimer) {
     mScrollWatchTimer->Cancel();
     mScrollWatchTimer = nsnull;
+    NS_RELEASE_THIS(); // Kung fu death grip
   }
 
   nsRefPtr<nsRootAccessible> rootAccessible(GetRootAccessible());
   if (rootAccessible) {
     nsRefPtr<nsCaretAccessible> caretAccessible = rootAccessible->GetCaretAccessible();
     if (caretAccessible) {
       nsCOMPtr<nsIDOMDocument> domDoc = do_QueryInterface(mDocument);
       caretAccessible->RemoveDocSelectionListener(domDoc);
@@ -822,16 +823,17 @@ void nsDocAccessible::ScrollTimerCallbac
     // Therefore, we wait for no scroll events to occur between 2 ticks of this timer
     // That indicates a pause in scrolling, so we fire the accessibilty scroll event
     nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_SCROLLING_END, docAcc);
 
     docAcc->mScrollPositionChangedTicks = 0;
     if (docAcc->mScrollWatchTimer) {
       docAcc->mScrollWatchTimer->Cancel();
       docAcc->mScrollWatchTimer = nsnull;
+      NS_RELEASE(docAcc); // Release kung fu death grip
     }
   }
 }
 
 void nsDocAccessible::AddScrollListener()
 {
   nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mWeakShell));
 
@@ -874,16 +876,17 @@ NS_IMETHODIMP nsDocAccessible::ScrollPos
   // then the ::Notify() method will fire the accessibility event for scroll position changes
   const PRUint32 kScrollPosCheckWait = 50;
   if (mScrollWatchTimer) {
     mScrollWatchTimer->SetDelay(kScrollPosCheckWait);  // Create new timer, to avoid leaks
   }
   else {
     mScrollWatchTimer = do_CreateInstance("@mozilla.org/timer;1");
     if (mScrollWatchTimer) {
+      NS_ADDREF_THIS(); // Kung fu death grip
       mScrollWatchTimer->InitWithFuncCallback(ScrollTimerCallback, this,
                                               kScrollPosCheckWait,
                                               nsITimer::TYPE_REPEATING_SLACK);
     }
   }
   mScrollPositionChangedTicks = 1;
   return NS_OK;
 }
@@ -1025,29 +1028,29 @@ nsDocAccessible::AttributeChangedImpl(ns
       // Need to find the right event to use here, SELECTION_WITHIN would
       // seem right but we had started using it for something else
       nsCOMPtr<nsIAccessNode> multiSelectAccessNode =
         do_QueryInterface(multiSelect);
       nsCOMPtr<nsIDOMNode> multiSelectDOMNode;
       multiSelectAccessNode->GetDOMNode(getter_AddRefs(multiSelectDOMNode));
       NS_ASSERTION(multiSelectDOMNode, "A new accessible without a DOM node!");
       FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_SELECTION_WITHIN,
-                              multiSelectDOMNode, nsnull, eAllowDupes);
+                              multiSelectDOMNode, eAllowDupes);
 
       static nsIContent::AttrValuesArray strings[] =
         {&nsAccessibilityAtoms::_empty, &nsAccessibilityAtoms::_false, nsnull};
       if (aContent->FindAttrValueIn(kNameSpaceID_None, aAttribute,
                                     strings, eCaseMatters) >= 0) {
         FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_SELECTION_REMOVE,
-                                targetNode, nsnull);
+                                targetNode);
         return;
       }
 
       FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_SELECTION_ADD,
-                                                  targetNode, nsnull);
+                                                  targetNode);
     }
   }
 
   if (aAttribute == nsAccessibilityAtoms::contenteditable) {
     nsCOMPtr<nsIAccessibleStateChangeEvent> editableChangeEvent =
       new nsAccStateChangeEvent(targetNode,
                                 nsIAccessibleStates::EXT_STATE_EDITABLE,
                                 PR_TRUE);
@@ -1147,17 +1150,17 @@ nsDocAccessible::ARIAAttributeChanged(ns
                                 nsIAccessibleStates::STATE_READONLY,
                                 PR_FALSE);
     FireDelayedAccessibleEvent(event);
     return;
   }
 
   if (aAttribute == nsAccessibilityAtoms::aria_valuenow) {
     FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_VALUE_CHANGE,
-                            targetNode, nsnull);
+                            targetNode);
     return;
   }
 
   if (aAttribute == nsAccessibilityAtoms::aria_multiselectable &&
       aContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::role)) {
     // This affects whether the accessible supports nsIAccessibleSelectable.
     // COM says we cannot change what interfaces are supported on-the-fly,
     // so invalidate this object. A new one will be created on demand.
@@ -1376,22 +1379,21 @@ nsDocAccessible::CreateTextChangeEventFo
     new nsAccTextChangeEvent(aContainerAccessible, offset, length, aIsInserting, aIsAsynch);
   NS_IF_ADDREF(event);
 
   return event;
 }
   
 nsresult nsDocAccessible::FireDelayedToolkitEvent(PRUint32 aEvent,
                                                   nsIDOMNode *aDOMNode,
-                                                  void *aData,
                                                   EDupeEventRule aAllowDupes,
                                                   PRBool aIsAsynch)
 {
   nsCOMPtr<nsIAccessibleEvent> event =
-    new nsAccEvent(aEvent, aDOMNode, aData, PR_TRUE);
+    new nsAccEvent(aEvent, aDOMNode, PR_TRUE);
   NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
 
   return FireDelayedAccessibleEvent(event, aAllowDupes, aIsAsynch);
 }
 
 nsresult
 nsDocAccessible::FireDelayedAccessibleEvent(nsIAccessibleEvent *aEvent,
                                             EDupeEventRule aAllowDupes,
@@ -1617,88 +1619,103 @@ void nsDocAccessible::FlushEventsCallbac
     // A lot of crashes were happening here, so now we're reffing the doc
     // now until the events are flushed
     accessibleDoc->FlushPendingEvents();
   }
 }
 
 void nsDocAccessible::RefreshNodes(nsIDOMNode *aStartNode)
 {
+  if (mAccessNodeCache.Count() <= 1) {
+    return; // All we have is a doc accessible. There is nothing to invalidate, quit early
+  }
+
   nsCOMPtr<nsIAccessNode> accessNode;
   GetCachedAccessNode(aStartNode, getter_AddRefs(accessNode));
-  nsCOMPtr<nsIDOMNode> nextNode, iterNode;
 
   // Shut down accessible subtree, which may have been created for
   // anonymous content subtree
   nsCOMPtr<nsIAccessible> accessible(do_QueryInterface(accessNode));
   if (accessible) {
+    // Fire menupopup end if a menu goes away
+    PRUint32 role = Role(accessible);
+    if (role == nsIAccessibleRole::ROLE_MENUPOPUP) {
+      nsCOMPtr<nsIDOMNode> domNode;
+      accessNode->GetDOMNode(getter_AddRefs(domNode));
+      nsCOMPtr<nsIDOMXULPopupElement> popup(do_QueryInterface(domNode));
+      if (!popup) {
+        // Popup elements already fire these via DOMMenuInactive
+        // handling in nsRootAccessible::HandleEvent
+        nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_MENUPOPUP_END,
+                                 accessible);
+      }
+    }
     nsCOMPtr<nsPIAccessible> privateAccessible = do_QueryInterface(accessible);
     NS_ASSERTION(privateAccessible, "No nsPIAccessible for nsIAccessible");
 
     nsCOMPtr<nsIAccessible> childAccessible;
     // we only need to shutdown the accessibles here if one of them has been created
     privateAccessible->GetCachedFirstChild(getter_AddRefs(childAccessible));
     if (childAccessible) {
       nsCOMPtr<nsIArray> children;
       // use GetChildren() to fetch children at one time, instead of using
       // GetNextSibling(), because after we shutdown the first child,
       // mNextSibling will be set null.
       accessible->GetChildren(getter_AddRefs(children));
 
       PRUint32 childCount;
       children->GetLength(&childCount);
+      nsCOMPtr<nsIDOMNode> possibleAnonNode;
       for (PRUint32 index = 0; index < childCount; index++) {
         nsCOMPtr<nsIAccessNode> childAccessNode;
         children->QueryElementAt(index, NS_GET_IID(nsIAccessNode),
                                  getter_AddRefs(childAccessNode));
-        childAccessNode->GetDOMNode(getter_AddRefs(iterNode));
-        nsCOMPtr<nsIContent> iterContent = do_QueryInterface(iterNode);
+        childAccessNode->GetDOMNode(getter_AddRefs(possibleAnonNode));
+        nsCOMPtr<nsIContent> iterContent = do_QueryInterface(possibleAnonNode);
         if (iterContent && (iterContent->IsNativeAnonymous() ||
                             iterContent->GetBindingParent())) {
           // GetBindingParent() check is a perf win -- make sure we don't
           // shut down the same subtree twice since we'll reach non-anon content via
           // DOM traversal later in this method
-          RefreshNodes(iterNode);
+          RefreshNodes(possibleAnonNode);
         }
       }
     }
+  }
 
-    // Shutdown ordinary content subtree as well -- there may be
-    // access node children which are not full accessible objects
-    aStartNode->GetFirstChild(getter_AddRefs(nextNode));
-    while (nextNode) {
-      nextNode.swap(iterNode);
-      RefreshNodes(iterNode);
-      iterNode->GetNextSibling(getter_AddRefs(nextNode));
-    }
+  // Shutdown ordinary content subtree as well -- there may be
+  // access node children which are not full accessible objects
+  nsCOMPtr<nsIDOMNode> nextNode, iterNode;
+  aStartNode->GetFirstChild(getter_AddRefs(nextNode));
+  while (nextNode) {
+    nextNode.swap(iterNode);
+    RefreshNodes(iterNode);
+    iterNode->GetNextSibling(getter_AddRefs(nextNode));
+  }
+
+  if (!accessNode)
+    return;
 
-    // Don't shutdown our doc object!
-    if (accessNode && accessNode != static_cast<nsIAccessNode*>(this)) {
-      // Fire menupopup end if a menu goes away
-      PRUint32 role = Role(accessible);
-      if (role == nsIAccessibleRole::ROLE_MENUPOPUP) {
-        nsCOMPtr<nsIDOMNode> domNode;
-        accessNode->GetDOMNode(getter_AddRefs(domNode));
-        nsCOMPtr<nsIDOMXULPopupElement> popup(do_QueryInterface(domNode));
-        if (!popup) {
-          // Popup elements already fire these via DOMMenuInactive
-          // handling in nsRootAccessible::HandleEvent
-          nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_MENUPOPUP_END,
-                                   accessible);
-        }
-      }
-      // Shut down the actual accessible or access node
-      void *uniqueID;
-      accessNode->GetUniqueID(&uniqueID);
-      nsCOMPtr<nsPIAccessNode> privateAccessNode(do_QueryInterface(accessNode));
-      privateAccessNode->Shutdown();
-      // Remove from hash table as well
-      mAccessNodeCache.Remove(uniqueID);
-    }
+  if (accessNode == this) {
+    // Don't shutdown our doc object -- this may just be from the finished loading.
+    // We will completely shut it down when the pagehide event is received
+    // However, we must invalidate the doc accessible's children in order to be sure
+    // all pointers to them are correct
+    InvalidateChildren();
+    return;
   }
+
+  // Shut down the actual accessible or access node
+  void *uniqueID;
+  accessNode->GetUniqueID(&uniqueID);
+  nsCOMPtr<nsPIAccessNode> privateAccessNode(do_QueryInterface(accessNode));
+  privateAccessNode->Shutdown();
+
+  // Remove from hash table as well
+  mAccessNodeCache.Remove(uniqueID);
 }
 
 NS_IMETHODIMP nsDocAccessible::InvalidateCacheSubtree(nsIContent *aChild,
                                                       PRUint32 aChangeEventType)
 {
   PRBool isHiding = 
     aChangeEventType == nsIAccessibleEvent::EVENT_ASYNCH_HIDE ||
     aChangeEventType == nsIAccessibleEvent::EVENT_DOM_DESTROY;
@@ -1737,47 +1754,39 @@ NS_IMETHODIMP nsDocAccessible::Invalidat
       // doc accessible. In this case we optimize
       // by not firing SHOW/HIDE/REORDER events for every document mutation
       // caused by page load, since AT is not going to want to grab the
       // document and listen to these changes until after the page is first loaded
       // Leave early, and ensure mAccChildCount stays uninitialized instead of 0,
       // which it is if anyone asks for its children right now.
       return InvalidateChildren();
     }
-    if (aChangeEventType == nsIAccessibleEvent::EVENT_DOM_CREATE) {
-      nsIEventStateManager *esm = presShell->GetPresContext()->EventStateManager();
-      NS_ENSURE_TRUE(esm, NS_ERROR_FAILURE);
-      if (!esm->IsHandlingUserInputExternal()) {
-        // Adding content during page load, but not caused by user input
-        // Just invalidate accessible hierarchy and return,
-        // otherwise the page load time slows down way too much
-        nsCOMPtr<nsIAccessible> containerAccessible;
-        GetAccessibleInParentChain(childNode, PR_FALSE, getter_AddRefs(containerAccessible));
-        if (!containerAccessible) {
-          containerAccessible = this;
-        }
-        nsCOMPtr<nsPIAccessible> privateContainer = do_QueryInterface(containerAccessible);
-        return privateContainer->InvalidateChildren();
-      }     
-      // else: user input, so we must fall through and for full handling,
-      // e.g. fire the mutation events. Note: user input could cause DOM_CREATE
-      // during page load if user typed into an input field or contentEditable area
-    }
+    nsIEventStateManager *esm = presShell->GetPresContext()->EventStateManager();
+    NS_ENSURE_TRUE(esm, NS_ERROR_FAILURE);
+    if (!esm->IsHandlingUserInputExternal()) {
+      // Changes during page load, but not caused by user input
+      // Just invalidate accessible hierarchy and return,
+      // otherwise the page load time slows down way too much
+      nsCOMPtr<nsIAccessible> containerAccessible;
+      GetAccessibleInParentChain(childNode, PR_FALSE, getter_AddRefs(containerAccessible));
+      if (!containerAccessible) {
+        containerAccessible = this;
+      }
+      nsCOMPtr<nsPIAccessible> privateContainer = do_QueryInterface(containerAccessible);
+      return privateContainer->InvalidateChildren();
+    }     
+    // else: user input, so we must fall through and for full handling,
+    // e.g. fire the mutation events. Note: user input could cause DOM_CREATE
+    // during page load if user typed into an input field or contentEditable area
   }
 
   // Update last change state information
   nsCOMPtr<nsIAccessNode> childAccessNode;
   GetCachedAccessNode(childNode, getter_AddRefs(childAccessNode));
   nsCOMPtr<nsIAccessible> childAccessible = do_QueryInterface(childAccessNode);
-  if (!childAccessible && !isHiding) {
-    // If not about to hide it, make sure there's an accessible so we can fire an
-    // event for it
-    GetAccService()->GetAttachedAccessibleFor(childNode,
-                                              getter_AddRefs(childAccessible));
-  }
 
 #ifdef DEBUG_A11Y
   nsAutoString localName;
   childNode->GetLocalName(localName);
   const char *hasAccessible = childAccessible ? " (acc)" : "";
   if (aChangeEventType == nsIAccessibleEvent::EVENT_ASYNCH_HIDE) {
     printf("[Hide %s %s]\n", NS_ConvertUTF16toUTF8(localName).get(), hasAccessible);
   }
@@ -1865,32 +1874,32 @@ NS_IMETHODIMP nsDocAccessible::Invalidat
     }
     // Fire EVENT_SHOW, EVENT_MENUPOPUP_START for newly visible content.
     // Fire after a short timer, because we want to make sure the view has been
     // updated to make this accessible content visible. If we don't wait,
     // the assistive technology may receive the event and then retrieve
     // nsIAccessibleStates::STATE_INVISIBLE for the event's accessible object.
     PRUint32 additionEvent = isAsynch ? nsIAccessibleEvent::EVENT_ASYNCH_SHOW :
                                         nsIAccessibleEvent::EVENT_DOM_CREATE;
-    FireDelayedToolkitEvent(additionEvent, childNode, nsnull,
+    FireDelayedToolkitEvent(additionEvent, childNode,
                             eCoalesceFromSameSubtree, isAsynch);
 
     // Check to see change occured in an ARIA menu, and fire an EVENT_MENUPOPUP_START if it did
     nsRoleMapEntry *roleMapEntry = nsAccUtils::GetRoleMapEntry(childNode);
     if (roleMapEntry && roleMapEntry->role == nsIAccessibleRole::ROLE_MENUPOPUP) {
       FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_MENUPOPUP_START,
-                              childNode, nsnull, eAllowDupes, isAsynch);
+                              childNode, eAllowDupes, isAsynch);
     }
 
     // Check to see if change occured inside an alert, and fire an EVENT_ALERT if it did
     nsIContent *ancestor = aChild;
     while (PR_TRUE) {
       if (roleMapEntry && roleMapEntry->role == nsIAccessibleRole::ROLE_ALERT) {
         nsCOMPtr<nsIDOMNode> alertNode(do_QueryInterface(ancestor));
-        FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_ALERT, alertNode, nsnull,
+        FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_ALERT, alertNode,
                                 eRemoveDupes, isAsynch);
         break;
       }
       ancestor = ancestor->GetParent();
       nsCOMPtr<nsIDOMNode> ancestorNode = do_QueryInterface(ancestor);
       if (!ancestorNode) {
         break;
       }
@@ -1899,17 +1908,17 @@ NS_IMETHODIMP nsDocAccessible::Invalidat
   }
 
   if (!isShowing) {
     // Fire an event so the assistive technology knows the children have changed
     // This is only used by older MSAA clients. Newer ones should derive this
     // from SHOW and HIDE so that they don't fetch extra objects
     if (childAccessible) {
       nsCOMPtr<nsIAccessibleEvent> reorderEvent =
-        new nsAccEvent(nsIAccessibleEvent::EVENT_REORDER, containerAccessible, nsnull, PR_TRUE);
+        new nsAccEvent(nsIAccessibleEvent::EVENT_REORDER, containerAccessible, PR_TRUE);
       NS_ENSURE_TRUE(reorderEvent, NS_ERROR_OUT_OF_MEMORY);
       FireDelayedAccessibleEvent(reorderEvent, eCoalesceFromSameSubtree, isAsynch);
     }
   }
 
   return NS_OK;
 }
 
@@ -1975,17 +1984,17 @@ nsDocAccessible::FireShowHideEvents(nsID
 
   if (accessible) {
     // Found an accessible, so fire the show/hide on it and don't
     // look further into this subtree
     PRBool isAsynch = aEventType == nsIAccessibleEvent::EVENT_ASYNCH_HIDE ||
                       aEventType == nsIAccessibleEvent::EVENT_ASYNCH_SHOW;
 
     nsCOMPtr<nsIAccessibleEvent> event =
-      new nsAccEvent(aEventType, accessible, nsnull, isAsynch);
+      new nsAccEvent(aEventType, accessible, isAsynch);
     NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
     if (aForceIsFromUserInput) {
       nsAccEvent::PrepareForEvent(aDOMNode, aForceIsFromUserInput);
     }
     if (aDelay) {
       return FireDelayedAccessibleEvent(event, eCoalesceFromSameSubtree, isAsynch);
     }
     return FireAccessibleEvent(event);
--- a/accessible/src/base/nsDocAccessible.h
+++ b/accessible/src/base/nsDocAccessible.h
@@ -103,28 +103,27 @@ class nsDocAccessible : public nsHyperTe
 
     enum EDupeEventRule { eAllowDupes, eCoalesceFromSameSubtree, eRemoveDupes };
 
     /**
       * Non-virtual method to fire a delayed event after a 0 length timeout
       *
       * @param aEvent - the nsIAccessibleEvent event type
       * @param aDOMNode - DOM node the accesible event should be fired for
-      * @param aData - any additional data for the event
       * @param aAllowDupes - eAllowDupes: more than one event of the same type is allowed. 
       *                      eCoalesceFromSameSubtree: if two events are in the same subtree,
       *                                                only the event on ancestor is used
       *                      eRemoveDupes (default): events of the same type are discarded
       *                                              (the last one is used)
       *
       * @param aIsAsyn - set to PR_TRUE if this is not being called from code
       *                  synchronous with a DOM event
       */
     nsresult FireDelayedToolkitEvent(PRUint32 aEvent, nsIDOMNode *aDOMNode,
-                                     void *aData, EDupeEventRule aAllowDupes = eRemoveDupes,
+                                     EDupeEventRule aAllowDupes = eRemoveDupes,
                                      PRBool aIsAsynch = PR_FALSE);
 
     /**
      * Fire accessible event in timeout.
      *
      * @param aEvent - the event to fire
      * @param aAllowDupes - if false then delayed events of the same type and
      *                      for the same DOM node in the event queue won't
--- a/accessible/src/base/nsOuterDocAccessible.cpp
+++ b/accessible/src/base/nsOuterDocAccessible.cpp
@@ -69,17 +69,17 @@ NS_IMETHODIMP nsOuterDocAccessible::GetN
     }
   }
   return rv;
 }
 
 /* unsigned long getRole (); */
 NS_IMETHODIMP nsOuterDocAccessible::GetRole(PRUint32 *aRole)
 {
-  *aRole = nsIAccessibleRole::ROLE_CLIENT;
+  *aRole = nsIAccessibleRole::ROLE_INTERNAL_FRAME;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsOuterDocAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState)
 {
   nsAccessible::GetState(aState, aExtraState);
   *aState &= ~nsIAccessibleStates::STATE_FOCUSABLE;
@@ -111,17 +111,17 @@ void nsOuterDocAccessible::CacheChildren
   if (!mWeakShell) {
     mAccChildCount = eChildCountUninitialized;
     return;   // This outer doc node has been shut down
   }
   if (mAccChildCount != eChildCountUninitialized) {
     return;
   }
 
-  SetFirstChild(nsnull);
+  InvalidateChildren();
   mAccChildCount = 0;
 
   // In these variable names, "outer" relates to the nsOuterDocAccessible
   // as opposed to the nsDocAccessibleWrap which is "inner".
   // The outer node is a something like a <browser>, <frame>, <iframe>, <page> or
   // <editor> tag, whereas the inner node corresponds to the inner document root.
 
   nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
--- a/accessible/src/base/nsRootAccessible.cpp
+++ b/accessible/src/base/nsRootAccessible.cpp
@@ -425,17 +425,17 @@ void nsRootAccessible::TryFireEarlyLoadE
     if (state & nsIAccessibleStates::STATE_BUSY) {
       // Don't fire page load events on subdocuments for initial page load of entire page
       return;
     }
   }
 
   // No frames or iframes, so we can fire the doc load finished event early
   FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_INTERNAL_LOAD, aDocNode,
-                          nsnull, eRemoveDupes);
+                          eRemoveDupes);
 }
 
 PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
                                                   nsIDOMNode *aNode,
                                                   nsIDOMEvent *aFocusEvent,
                                                   PRBool aForceEvent,
                                                   PRBool aIsAsynch)
 {
@@ -514,17 +514,17 @@ PRBool nsRootAccessible::FireAccessibleF
             nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_MENU_START, menuBarAccessible);
           }
         }
       }
     }
   }
   else if (mCurrentARIAMenubar) {
     nsCOMPtr<nsIAccessibleEvent> menuEndEvent =
-      new nsAccEvent(nsIAccessibleEvent::EVENT_MENU_END, mCurrentARIAMenubar, nsnull, PR_FALSE);
+      new nsAccEvent(nsIAccessibleEvent::EVENT_MENU_END, mCurrentARIAMenubar, PR_FALSE);
     if (menuEndEvent) {
       FireDelayedAccessibleEvent(menuEndEvent, eAllowDupes, PR_FALSE);
     }
     mCurrentARIAMenubar = nsnull;
   }
 
   NS_IF_RELEASE(gLastFocusedNode);
   gLastFocusedNode = finalFocusNode;
@@ -538,17 +538,17 @@ PRBool nsRootAccessible::FireAccessibleF
       // Suppress document focus, because real DOM focus will be fired next,
       // and that's what we care about
       // Make sure we never fire focus for the nsRootAccessible (mDOMNode)
       return PR_FALSE;
     }
   }
 
   FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_FOCUS,
-                          finalFocusNode, nsnull, eRemoveDupes, aIsAsynch);
+                          finalFocusNode, eRemoveDupes, aIsAsynch);
 
   return PR_TRUE;
 }
 
 void nsRootAccessible::FireCurrentFocusEvent()
 {
   nsCOMPtr<nsIDOMNode> focusedNode = GetCurrentFocus();
   if (!focusedNode) {
@@ -592,16 +592,19 @@ NS_IMETHODIMP nsRootAccessible::HandleEv
 
 nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
                                                  nsIDOMNode* aTargetNode)
 {
   nsAutoString eventType;
   aEvent->GetType(eventType);
   nsAutoString localName;
   aTargetNode->GetLocalName(localName);
+#ifdef MOZ_XUL
+  PRBool isTree = localName.EqualsLiteral("tree");
+#endif
 #ifdef DEBUG_A11Y
   // Very useful for debugging, please leave this here.
   if (eventType.EqualsLiteral("AlertActive")) {
     printf("\ndebugging %s events for %s", NS_ConvertUTF16toUTF8(eventType).get(), NS_ConvertUTF16toUTF8(localName).get());
   }
   if (localName.LowerCaseEqualsLiteral("textbox")) {
     printf("\ndebugging %s events for %s", NS_ConvertUTF16toUTF8(eventType).get(), NS_ConvertUTF16toUTF8(localName).get());
   }
@@ -637,35 +640,75 @@ nsresult nsRootAccessible::HandleEventWi
   if (eventType.EqualsLiteral("DOMContentLoaded")) {
     // Don't create the doc accessible until load scripts have a chance to set
     // role attribute for <body> or <html> element, because the value of 
     // role attribute will be cached when the doc accessible is Init()'d
     TryFireEarlyLoadEvent(aTargetNode);
     return NS_OK;
   }
 
+#ifdef MOZ_XUL
   if (eventType.EqualsLiteral("TreeViewChanged")) { // Always asynch, always from user input
-    if (!localName.EqualsLiteral("tree"))
+    if (!isTree)
       return NS_OK;
 
     nsCOMPtr<nsIContent> treeContent = do_QueryInterface(aTargetNode);
     nsAccEvent::PrepareForEvent(aTargetNode, PR_TRUE);
     return accService->InvalidateSubtreeFor(eventShell, treeContent,
                                             nsIAccessibleEvent::EVENT_ASYNCH_SIGNIFICANT_CHANGE);
   }
+#endif
+
+  if (eventType.EqualsLiteral("popuphiding")) {
+    // If accessible focus was on or inside popup that closes,
+    // then restore it to true current focus.
+    // This is the case when we've been getting DOMMenuItemActive events
+    // inside of a combo box that closes. The real focus is on the combo box.
+    // It's also the case when a popup gets focus in ATK -- when it closes
+    // we need to fire an event to restore focus to where it was
+    if (!gLastFocusedNode) {
+      return NS_OK;
+    }
+    if (gLastFocusedNode != aTargetNode) {
+      // Was not focused on popup
+      nsCOMPtr<nsIDOMNode> parentOfFocus;
+      gLastFocusedNode->GetParentNode(getter_AddRefs(parentOfFocus));
+      if (parentOfFocus != aTargetNode) {
+        return NS_OK;  // And was not focused on an item inside the popup
+      }
+    }
+    // Focus was on or inside of a popup that's being hidden
+    FireCurrentFocusEvent();
+    return NS_OK;
+  }
+
+  if (aTargetNode == mDOMNode && mDOMNode != gLastFocusedNode && eventType.EqualsLiteral("focus")) {
+    // Got focus event for the window, we will make sure that an accessible
+    // focus event for initial focus is fired. We do this on a short timer
+    // because the initial focus may not have been set yet.
+    if (!mFireFocusTimer) {
+      mFireFocusTimer = do_CreateInstance("@mozilla.org/timer;1");
+    }
+    if (mFireFocusTimer) {
+      mFireFocusTimer->InitWithFuncCallback(FireFocusCallback, this,
+                                            0, nsITimer::TYPE_ONE_SHOT);
+    }
+    return NS_OK;
+  }
 
   nsCOMPtr<nsIAccessible> accessible;
   accService->GetAccessibleInShell(aTargetNode, eventShell,
                                    getter_AddRefs(accessible));
   nsCOMPtr<nsPIAccessible> privAcc(do_QueryInterface(accessible));
   if (!privAcc)
     return NS_OK;
 
+#ifdef MOZ_XUL
   if (eventType.EqualsLiteral("TreeRowCountChanged")) {
-    if (!localName.EqualsLiteral("tree"))
+    if (!isTree)
       return NS_OK;
 
     nsCOMPtr<nsIDOMDataContainerEvent> dataEvent(do_QueryInterface(aEvent));
     NS_ENSURE_STATE(dataEvent);
 
     nsCOMPtr<nsIVariant> indexVariant;
     dataEvent->GetData(NS_LITERAL_STRING("index"),
                        getter_AddRefs(indexVariant));
@@ -680,16 +723,17 @@ nsresult nsRootAccessible::HandleEventWi
     indexVariant->GetAsInt32(&index);
     countVariant->GetAsInt32(&count);
 
     nsCOMPtr<nsIAccessibleTreeCache> treeAccCache(do_QueryInterface(accessible));
     NS_ENSURE_STATE(treeAccCache);
 
     return treeAccCache->InvalidateCache(index, count);
   }
+#endif
 
   if (eventType.EqualsLiteral("RadioStateChange")) {
     PRUint32 state = State(accessible);
 
     // radiogroup in prefWindow is exposed as a list,
     // and panebutton is exposed as XULListitem in A11y.
     // nsXULListitemAccessible::GetState uses STATE_SELECTED in this case,
     // so we need to check nsIAccessibleStates::STATE_SELECTED also.
@@ -718,17 +762,17 @@ nsresult nsRootAccessible::HandleEventWi
                                 PR_FALSE, isEnabled);
 
     return privAcc->FireAccessibleEvent(accEvent);
   }
 
   nsCOMPtr<nsIAccessible> treeItemAccessible;
 #ifdef MOZ_XUL
   // If it's a tree element, need the currently selected item
-  if (localName.EqualsLiteral("tree")) {
+  if (isTree) {
     nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelect =
       do_QueryInterface(aTargetNode);
     if (multiSelect) {
       PRInt32 treeIndex = -1;
       multiSelect->GetCurrentIndex(&treeIndex);
       if (treeIndex >= 0) {
         nsCOMPtr<nsIAccessibleTreeCache> treeCache(do_QueryInterface(accessible));
         if (!treeCache ||
@@ -774,29 +818,16 @@ nsresult nsRootAccessible::HandleEventWi
 
       return nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_SELECTION,
                                       treeItemAccessible);
     }
   }
   else
 #endif
   if (eventType.EqualsLiteral("focus")) {
-    if (aTargetNode == mDOMNode && mDOMNode != gLastFocusedNode) {
-      // Got focus event for the window, we will make sure that an accessible
-      // focus event for initial focus is fired. We do this on a short timer
-      // because the initial focus may not have been set yet.
-      if (!mFireFocusTimer) {
-        mFireFocusTimer = do_CreateInstance("@mozilla.org/timer;1");
-      }
-      if (mFireFocusTimer) {
-        mFireFocusTimer->InitWithFuncCallback(FireFocusCallback, this,
-                                              0, nsITimer::TYPE_ONE_SHOT);
-      }
-    }
-
     // Keep a reference to the target node. We might want to change
     // it to the individual radio button or selected item, and send
     // the focus event to that.
     nsCOMPtr<nsIDOMNode> focusedItem(aTargetNode);
 
     if (!treeItemAccessible) {
       nsCOMPtr<nsIDOMXULSelectControlElement> selectControl =
         do_QueryInterface(aTargetNode);
@@ -842,46 +873,29 @@ nsresult nsRootAccessible::HandleEventWi
       // AT's expect to get an EVENT_SHOW for the tooltip. 
       // In event callback the tooltip's accessible will be ready.
       event = nsIAccessibleEvent::EVENT_ASYNCH_SHOW;
     }
     if (event) {
       nsAccUtils::FireAccEvent(event, accessible);
     }
   }
-
-  else if (eventType.EqualsLiteral("popuphiding")) {
-    // If accessible focus was on or inside popup that closes,
-    // then restore it to true current focus.
-    // This is the case when we've been getting DOMMenuItemActive events
-    // inside of a combo box that closes. The real focus is on the combo box.
-    // It's also the case when a popup gets focus in ATK -- when it closes
-    // we need to fire an event to restore focus to where it was
-    if (!gLastFocusedNode) {
-      return NS_OK;
-    }
-    if (gLastFocusedNode != aTargetNode) {
-      // Was not focused on popup
-      nsCOMPtr<nsIDOMNode> parentOfFocus;
-      gLastFocusedNode->GetParentNode(getter_AddRefs(parentOfFocus));
-      if (parentOfFocus != aTargetNode) {
-        return NS_OK;  // And was not focused on an item inside the popup
-      }
-    }
-    // Focus was on or inside of a popup that's being hidden
-    FireCurrentFocusEvent();
-  }
   else if (eventType.EqualsLiteral("DOMMenuInactive")) {
     if (Role(accessible) == nsIAccessibleRole::ROLE_MENUPOPUP) {
       nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_MENUPOPUP_END,
                                accessible);
     }
   }
   else if (eventType.EqualsLiteral("DOMMenuItemActive")) {
     if (!treeItemAccessible) {
+#ifdef MOZ_XUL
+      if (isTree) {
+        return NS_OK; // Tree with nothing selected
+      }
+#endif
       nsCOMPtr<nsPIAccessNode> menuAccessNode = do_QueryInterface(accessible);
       NS_ENSURE_TRUE(menuAccessNode, NS_ERROR_FAILURE);
       nsIFrame* menuFrame = menuAccessNode->GetFrame();
       NS_ENSURE_TRUE(menuFrame, NS_ERROR_FAILURE);
       nsIMenuFrame* imenuFrame;
       CallQueryInterface(menuFrame, &imenuFrame);
       // QI failed for nsIMenuFrame means it's not on menu bar
       if (imenuFrame && imenuFrame->IsOnMenuBar() &&
--- a/accessible/src/html/nsHTMLTableAccessible.cpp
+++ b/accessible/src/html/nsHTMLTableAccessible.cpp
@@ -852,39 +852,32 @@ nsHTMLTableAccessible::GetTableNode(nsID
     NS_IF_ADDREF(*_retval);
     return rv;
   }
 
   return NS_ERROR_FAILURE;
 }
 
 nsresult
-nsHTMLTableAccessible::GetTableLayout(nsITableLayout **aLayoutObject)
+nsHTMLTableAccessible::GetTableLayout(nsITableLayout **aTableLayout)
 {
-  *aLayoutObject = nsnull;
-
-  nsresult rv = NS_OK;
+  *aTableLayout = nsnull;
 
   nsCOMPtr<nsIDOMNode> tableNode;
-  rv = GetTableNode(getter_AddRefs(tableNode));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  nsCOMPtr<nsIContent> content(do_QueryInterface(tableNode));
-  NS_ENSURE_TRUE(content, NS_ERROR_FAILURE);
+  GetTableNode(getter_AddRefs(tableNode));
+  nsCOMPtr<nsIContent> tableContent(do_QueryInterface(tableNode));
+  if (!tableContent) {
+    return NS_ERROR_FAILURE; // Table shut down
+  }
 
-  nsIDocument *doc = content->GetDocument();
-  NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
-
-  nsIPresShell *presShell = doc->GetPrimaryShell();
+  nsCOMPtr<nsIPresShell> shell = GetPresShell();
+  NS_ENSURE_TRUE(shell, NS_ERROR_FAILURE);
 
-  nsCOMPtr<nsISupports> layoutObject;
-  rv = presShell->GetLayoutObjectFor(content, getter_AddRefs(layoutObject));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  return CallQueryInterface(layoutObject, aLayoutObject);
+  nsIFrame *frame = shell->GetPrimaryFrameFor(tableContent);
+  return frame ? CallQueryInterface(frame, aTableLayout) : NS_ERROR_FAILURE;
 }
 
 nsresult
 nsHTMLTableAccessible::GetCellAt(PRInt32        aRowIndex,
                                  PRInt32        aColIndex,
                                  nsIDOMElement* &aCell)
 {
   PRInt32 startRowIndex = 0, startColIndex = 0,
--- a/accessible/src/html/nsHyperTextAccessible.cpp
+++ b/accessible/src/html/nsHyperTextAccessible.cpp
@@ -91,17 +91,20 @@ nsresult nsHyperTextAccessible::QueryInt
     if (aIID.Equals(NS_GET_IID(nsHyperTextAccessible))) {
       *aInstancePtr = static_cast<nsHyperTextAccessible*>(this);
       NS_ADDREF_THIS();
       return NS_OK;
     }
 
     if (mRoleMapEntry &&
         (mRoleMapEntry->role == nsIAccessibleRole::ROLE_GRAPHIC ||
-         mRoleMapEntry->role == nsIAccessibleRole::ROLE_IMAGE_MAP)) {
+         mRoleMapEntry->role == nsIAccessibleRole::ROLE_IMAGE_MAP ||
+         mRoleMapEntry->role == nsIAccessibleRole::ROLE_SLIDER ||
+         mRoleMapEntry->role == nsIAccessibleRole::ROLE_PROGRESSBAR ||
+         mRoleMapEntry->role == nsIAccessibleRole::ROLE_SEPARATOR)) {
       // ARIA roles that these interfaces are not appropriate for
       return nsAccessible::QueryInterface(aIID, aInstancePtr);
     }
 
     if (aIID.Equals(NS_GET_IID(nsIAccessibleText))) {
       *aInstancePtr = static_cast<nsIAccessibleText*>(this);
       NS_ADDREF_THIS();
       return NS_OK;
@@ -560,17 +563,20 @@ nsresult nsHyperTextAccessible::DOMPoint
                                                           PRInt32* aHyperTextOffset,
                                                           nsIAccessible **aFinalAccessible,
                                                           PRBool aIsEndOffset)
 {
   // Turn a DOM Node and offset into an offset into this hypertext.
   // On failure, return null. On success, return the DOM node which contains the offset.
   NS_ENSURE_ARG_POINTER(aHyperTextOffset);
   *aHyperTextOffset = 0;
-  NS_ENSURE_ARG_POINTER(aNode);
+
+  if (!aNode) {
+    return NS_ERROR_FAILURE;
+  }
   if (aFinalAccessible) {
     *aFinalAccessible = nsnull;
   }
 
   PRUint32 addTextOffset = 0;
   nsCOMPtr<nsIDOMNode> findNode;
 
   unsigned short nodeType;
@@ -614,16 +620,27 @@ nsresult nsHyperTextAccessible::DOMPoint
       findNode = do_QueryInterface(parentContent); // Case #2: there are no children
     }
   }
 
   // Get accessible for this findNode, or if that node isn't accessible, use the
   // accessible for the next DOM node which has one (based on forward depth first search)
   nsCOMPtr<nsIAccessible> descendantAccessible;
   if (findNode) {
+    nsCOMPtr<nsIContent> findContent = do_QueryInterface(findNode);
+    if (findContent->IsNodeOfType(nsINode::eHTML) && 
+        findContent->NodeInfo()->Equals(nsAccessibilityAtoms::br)) {
+      nsIContent *parent = findContent->GetParent();
+      if (parent && parent->IsNativeAnonymous() && parent->GetChildCount() == 1) {
+        // This <br> is the only node in a text control, therefore it is the hacky
+        // "bogus node" used when there is no text in a control
+        *aHyperTextOffset = 0;
+        return NS_OK;
+      }
+    }
     descendantAccessible = GetFirstAvailableAccessible(findNode);
   }
   // From the descendant, go up and get the immediate child of this hypertext
   nsCOMPtr<nsIAccessible> childAccessible;
   while (descendantAccessible) {
     nsCOMPtr<nsIAccessible> parentAccessible;
     descendantAccessible->GetParent(getter_AddRefs(parentAccessible));
     if (this == parentAccessible) {
@@ -982,16 +999,23 @@ nsresult nsHyperTextAccessible::GetTextH
     // For BOUNDARY_LINE_END, make sure we start of this line
     startOffset = endOffset = finalStartOffset + (aBoundaryType == BOUNDARY_LINE_END);
     nsCOMPtr<nsIAccessible> endAcc;
     nsIFrame *endFrame = GetPosAndText(startOffset, endOffset, nsnull, nsnull,
                                        nsnull, getter_AddRefs(endAcc));
     if (!endFrame) {
       return NS_ERROR_FAILURE;
     }
+    if (endAcc && Role(endAcc) == nsIAccessibleRole::ROLE_STATICTEXT) {
+      // Static text like list bullets will ruin our forward calculation,
+      // since the caret cannot be in the static text. Start just after the static text.
+      startOffset = endOffset = finalStartOffset + (aBoundaryType == BOUNDARY_LINE_END) + TextLength(endAcc);
+      endFrame = GetPosAndText(startOffset, endOffset, nsnull, nsnull,
+                               nsnull, getter_AddRefs(endAcc));
+    }
     finalEndOffset = GetRelativeOffset(presShell, endFrame, endOffset, endAcc,
                                        amount, eDirNext, needsStart);
     NS_ENSURE_TRUE(endOffset >= 0, NS_ERROR_FAILURE);
     if (finalEndOffset == aOffset) {
       if (aType == eGetAt && amount == eSelectWord) { 
         // Fix word error for the first character in word: PeekOffset() will return the previous word when 
         // aOffset points to the first character of the word, but accessibility APIs want the current word 
         // that the first character is in
--- a/accessible/src/mac/nsRoleMap.h
+++ b/accessible/src/mac/nsRoleMap.h
@@ -47,17 +47,17 @@ static const NSString* AXRoles [] = {
   NSAccessibilityMenuBarRole,                   // ROLE_MENUBAR. (irrelevant on OS X; the menubar will always be native and on the top of the screen.)
   NSAccessibilityScrollBarRole,                 // ROLE_SCROLLBAR. we might need to make this its own mozAccessible, to support the children objects (valueindicator, down/up buttons).
   NSAccessibilitySplitterRole,                  // ROLE_GRIP
   NSAccessibilityUnknownRole,                   // ROLE_SOUND. unused on OS X
   NSAccessibilityUnknownRole,                   // ROLE_CURSOR. unused on OS X
   NSAccessibilityUnknownRole,                   // ROLE_CARET. unused on OS X
   NSAccessibilityWindowRole,                    // ROLE_ALERT
   NSAccessibilityWindowRole,                    // ROLE_WINDOW. irrelevant on OS X; all window a11y is handled by the system.
-  @"AXWebArea",                                 // ROLE_CLIENT
+  @"AXWebArea",                                 // ROLE_INTERNAL_FRAME
   NSAccessibilityMenuRole,                      // ROLE_MENUPOPUP. the parent of menuitems
   NSAccessibilityMenuItemRole,                  // ROLE_MENUITEM.
   @"AXHelpTag",                                 // ROLE_TOOLTIP. 10.4+ only, so we re-define the constant.
   NSAccessibilityGroupRole,                     // ROLE_APPLICATION. unused on OS X. the system will take care of this.
   NSAccessibilityGroupRole,                     // ROLE_DOCUMENT
   NSAccessibilityGroupRole,                     // ROLE_PANE
   NSAccessibilityUnknownRole,                   // ROLE_CHART
   NSAccessibilityWindowRole,                    // ROLE_DIALOG. there's a dialog subrole.
--- a/accessible/src/msaa/nsRoleMap.h
+++ b/accessible/src/msaa/nsRoleMap.h
@@ -90,18 +90,18 @@ static const WindowsRoleMapItem gWindows
   { ROLE_SYSTEM_CARET, ROLE_SYSTEM_CARET },
 
   // nsIAccessibleRole::ROLE_ALERT
   { ROLE_SYSTEM_ALERT, ROLE_SYSTEM_ALERT },
 
   // nsIAccessibleRole::ROLE_WINDOW
   { ROLE_SYSTEM_WINDOW, ROLE_SYSTEM_WINDOW },
 
-  // nsIAccessibleRole::ROLE_CLIENT
-  { USE_ROLE_STRING, IA2_ROLE_UNKNOWN},
+  // nsIAccessibleRole::ROLE_INTERNAL_FRAME
+  { USE_ROLE_STRING, IA2_ROLE_INTERNAL_FRAME},
 
   // nsIAccessibleRole::ROLE_MENUPOPUP
   { ROLE_SYSTEM_MENUPOPUP, ROLE_SYSTEM_MENUPOPUP },
 
   // nsIAccessibleRole::ROLE_MENUITEM
   { ROLE_SYSTEM_MENUITEM, ROLE_SYSTEM_MENUITEM },
 
   // nsIAccessibleRole::ROLE_TOOLTIP
@@ -424,17 +424,17 @@ static const WindowsRoleMapItem gWindows
 
   // nsIAccessibleRole::ROLE_IMAGE_MAP
   { ROLE_SYSTEM_GRAPHIC, ROLE_SYSTEM_GRAPHIC },
 
   // nsIAccessibleRole::ROLE_OPTION 
   { ROLE_SYSTEM_LISTITEM, ROLE_SYSTEM_LISTITEM },
   
   // nsIAccessibleRole::ROLE_RICH_OPTION
-  { ROLE_SYSTEM_LIST, ROLE_SYSTEM_LIST },
+  { ROLE_SYSTEM_LISTITEM, ROLE_SYSTEM_LISTITEM },
   
   // nsIAccessibleRole::ROLE_LISTBOX
   { ROLE_SYSTEM_LIST, ROLE_SYSTEM_LIST },
   
   // nsIAccessibleRole::ROLE_LAST_ENTRY
   { ROLE_WINDOWS_LAST_ENTRY, ROLE_WINDOWS_LAST_ENTRY }
 };
 
--- a/accessible/src/xforms/nsXFormsFormControlsAccessible.cpp
+++ b/accessible/src/xforms/nsXFormsFormControlsAccessible.cpp
@@ -46,17 +46,17 @@ nsXFormsLabelAccessible::
 {
 }
 
 NS_IMETHODIMP
 nsXFormsLabelAccessible::GetRole(PRUint32 *aRole)
 {
   NS_ENSURE_ARG_POINTER(aRole);
 
-  *aRole = nsIAccessibleRole::ROLE_STATICTEXT;
+  *aRole = nsIAccessibleRole::ROLE_LABEL;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsXFormsLabelAccessible::GetName(nsAString& aName)
 {
   nsAutoString name;
   nsresult rv = GetTextFromRelationID(nsAccessibilityAtoms::aria_labelledby, name);
--- a/accessible/src/xul/nsXULAlertAccessible.cpp
+++ b/accessible/src/xul/nsXULAlertAccessible.cpp
@@ -59,8 +59,16 @@ nsXULAlertAccessible::GetState(PRUint32 
   nsresult rv = nsAccessible::GetState(aState, aExtraState);
   NS_ENSURE_SUCCESS(rv, rv);
   if (mDOMNode) {
     *aState |= nsIAccessibleStates::STATE_ALERT_MEDIUM; // XUL has no markup for low, medium or high
   }
   return NS_OK;
 }
 
+NS_IMETHODIMP
+nsXULAlertAccessible::GetName(nsAString& aName)
+{
+  // Screen readers need to read contents of alert, not the accessible name.
+  // If we have both some screen readers will read the alert twice.
+  aName.Truncate();
+  return NS_OK;
+}
--- a/accessible/src/xul/nsXULAlertAccessible.h
+++ b/accessible/src/xul/nsXULAlertAccessible.h
@@ -45,11 +45,12 @@
 
 class nsXULAlertAccessible : public nsAccessibleWrap
 {
 public:
   nsXULAlertAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
   NS_DECL_ISUPPORTS_INHERITED
   NS_IMETHOD GetRole(PRUint32 *aRole);
   NS_IMETHOD GetState(PRUint32 *aState, PRUint32 *aExtraState);
+  NS_IMETHOD GetName(nsAString& aName);
 };
 
 #endif  
--- a/accessible/src/xul/nsXULMenuAccessible.cpp
+++ b/accessible/src/xul/nsXULMenuAccessible.cpp
@@ -481,17 +481,19 @@ nsXULMenuitemAccessible::GetDefaultKeyBi
 NS_IMETHODIMP nsXULMenuitemAccessible::GetRole(PRUint32 *aRole)
 {
   nsCOMPtr<nsIDOMXULContainerElement> xulContainer(do_QueryInterface(mDOMNode));
   if (xulContainer) {
     *aRole = nsIAccessibleRole::ROLE_PARENT_MENUITEM;
     return NS_OK;
   }
 
-  if (mParent && Role(mParent) == nsIAccessibleRole::ROLE_COMBOBOX_LIST) {
+  nsCOMPtr<nsIAccessible> parent;
+  GetParent(getter_AddRefs(parent));
+  if (parent && Role(parent) == nsIAccessibleRole::ROLE_COMBOBOX_LIST) {
     *aRole = nsIAccessibleRole::ROLE_COMBOBOX_OPTION;
     return NS_OK;
   }
 
   *aRole = nsIAccessibleRole::ROLE_MENUITEM;
   nsCOMPtr<nsIDOMElement> element(do_QueryInterface(mDOMNode));
   if (!element)
     return NS_ERROR_FAILURE;
@@ -711,24 +713,28 @@ nsXULMenupopupAccessible::GetName(nsAStr
 }
 
 NS_IMETHODIMP nsXULMenupopupAccessible::GetRole(PRUint32 *aRole)
 {
   nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
   if (!content) {
     return NS_ERROR_FAILURE;
   }
-  if ((mParent && Role(mParent) == nsIAccessibleRole::ROLE_COMBOBOX) ||
-      content->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type,
-                           nsAccessibilityAtoms::autocomplete, eIgnoreCase)) {
-    *aRole = nsIAccessibleRole::ROLE_COMBOBOX_LIST;
+  nsCOMPtr<nsIAccessible> parent;
+  GetParent(getter_AddRefs(parent));
+  if (parent) {
+    // Some widgets like the search bar have several popups, owned by buttons
+    PRUint32 role = Role(parent);
+    if (role == nsIAccessibleRole::ROLE_COMBOBOX ||
+        role == nsIAccessibleRole::ROLE_PUSHBUTTON) {
+      *aRole = nsIAccessibleRole::ROLE_COMBOBOX_LIST;
+      return NS_OK;
+    }
   }
-  else {
-    *aRole = nsIAccessibleRole::ROLE_MENUPOPUP;
-  }
+  *aRole = nsIAccessibleRole::ROLE_MENUPOPUP;
   return NS_OK;
 }
 
 // ------------------------ Menu Bar -----------------------------
 
 nsXULMenubarAccessible::nsXULMenubarAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell): 
   nsAccessibleWrap(aDOMNode, aShell)
 { 
--- a/accessible/src/xul/nsXULSelectAccessible.cpp
+++ b/accessible/src/xul/nsXULSelectAccessible.cpp
@@ -36,16 +36,17 @@
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "nsXULSelectAccessible.h"
 #include "nsAccessibilityService.h"
 #include "nsIContent.h"
 #include "nsIDOMXULMenuListElement.h"
+#include "nsIDOMXULPopupElement.h"
 #include "nsIDOMXULSelectCntrlItemEl.h"
 #include "nsIDOMXULSelectCntrlEl.h"
 #include "nsIDOMXULTextboxElement.h"
 #include "nsIPresShell.h"
 #include "nsIServiceManager.h"
 #include "nsCaseTreatment.h"
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -189,19 +190,30 @@ NS_IMETHODIMP nsXULListboxAccessible::Ge
     nsCOMPtr<nsIDOMXULSelectControlItemElement> selectedItem;
     select->GetSelectedItem(getter_AddRefs(selectedItem));
     if (selectedItem)
       return selectedItem->GetLabel(_retval);
   }
   return NS_ERROR_FAILURE;
 }
 
-NS_IMETHODIMP nsXULListboxAccessible::GetRole(PRUint32 *_retval)
+NS_IMETHODIMP nsXULListboxAccessible::GetRole(PRUint32 *aRole)
 {
-  *_retval = nsIAccessibleRole::ROLE_LIST;
+  nsCOMPtr<nsIContent> content = do_QueryInterface(mDOMNode);
+  if (content) {
+    // A richlistbox is used with the new autocomplete URL bar,
+    // and has a parent popup <panel>
+    nsCOMPtr<nsIDOMXULPopupElement> xulPopup =
+      do_QueryInterface(content->GetParent());
+    if (xulPopup) {
+      *aRole = nsIAccessibleRole::ROLE_COMBOBOX_LIST;
+      return NS_OK;
+    }
+  }
+  *aRole = nsIAccessibleRole::ROLE_LIST;
   return NS_OK;
 }
 
 /** ----- nsXULListitemAccessible ----- */
 
 /** Constructor */
 nsXULListitemAccessible::nsXULListitemAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell):
 nsXULMenuitemAccessible(aDOMNode, aShell)
@@ -245,16 +257,18 @@ NS_IMETHODIMP nsXULListitemAccessible::G
 
 /**
   *
   */
 NS_IMETHODIMP nsXULListitemAccessible::GetRole(PRUint32 *aRole)
 {
   if (mIsCheckbox)
     *aRole = nsIAccessibleRole::ROLE_CHECKBUTTON;
+  else if (mParent && Role(mParent) == nsIAccessibleRole::ROLE_COMBOBOX_LIST)
+    *aRole = nsIAccessibleRole::ROLE_COMBOBOX_OPTION;
   else
     *aRole = nsIAccessibleRole::ROLE_RICH_OPTION;
   return NS_OK;
 }
 
 /**
   *
   */
--- a/accessible/src/xul/nsXULTextAccessible.cpp
+++ b/accessible/src/xul/nsXULTextAccessible.cpp
@@ -56,23 +56,19 @@ nsHyperTextAccessibleWrap(aDomNode, aShe
 
 /* wstring getName (); */
 NS_IMETHODIMP nsXULTextAccessible::GetName(nsAString& aName)
 { 
   nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
   if (!content) {
     return NS_ERROR_FAILURE;  // Node shut down
   }
-  if (!content->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::value,
-                        aName)) {
-    // if the value doesn't exist, flatten the inner content as the name (for descriptions)
-    return AppendFlatStringFromSubtree(content, &aName);
-  }
-  // otherwise, use the value attribute as the name (for labels)
-  return NS_OK;
+  // if the value attr doesn't exist, the screen reader must get the accessible text
+  // from the accessible text interface or from the children
+  return content->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::value, aName);
 }
 
 NS_IMETHODIMP
 nsXULTextAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState)
 {
   nsresult rv = nsHyperTextAccessibleWrap::GetState(aState, aExtraState);
   NS_ENSURE_SUCCESS(rv, rv);
 
@@ -171,23 +167,19 @@ NS_IMETHODIMP nsXULLinkAccessible::GetNa
     return AppendFlatStringFromSubtree(content, &aName);
   }
   // otherwise, use the value attribute as the name (for labels)
   return NS_OK;
 }
 
 NS_IMETHODIMP nsXULLinkAccessible::GetRole(PRUint32 *aRole)
 {
-  if (mIsLink) {
-    *aRole = nsIAccessibleRole::ROLE_LINK;
-  } else {
-    // default to calling the link a button; might have javascript
-    *aRole = nsIAccessibleRole::ROLE_PUSHBUTTON;
-  }
-  // should there be a third case where it becomes just text?
+  // We used to say ROLE_BUTTON if there was no href, but then screen readers
+  // would tell users to hit the space bar for activation, which is wrong for a link
+  *aRole = nsIAccessibleRole::ROLE_LINK;
   return NS_OK;
 }
 
 void nsXULLinkAccessible::CacheActionContent()
 {
   // not a link if no content
   nsCOMPtr<nsIContent> mTempContent = do_QueryInterface(mDOMNode);
   if (!mTempContent) {
--- a/accessible/src/xul/nsXULTreeAccessible.cpp
+++ b/accessible/src/xul/nsXULTreeAccessible.cpp
@@ -558,19 +558,21 @@ nsXULTreeAccessible::GetCachedTreeitemAc
 //   invalidateCache(in PRInt32 aRow, in PRInt32 aCount)
 NS_IMETHODIMP
 nsXULTreeAccessible::InvalidateCache(PRInt32 aRow, PRInt32 aCount)
 {
   // Do not invalidate the cache if rows have been inserted.
   if (aCount > 0)
     return NS_OK;
 
+  NS_ENSURE_TRUE(mTree && mTreeView, NS_ERROR_FAILURE);
+
   nsCOMPtr<nsITreeColumns> cols;
   nsresult rv = mTree->GetColumns(getter_AddRefs(cols));
-  NS_ENSURE_SUCCESS(rv, rv);
+  NS_ENSURE_STATE(cols);
 
 #ifdef MOZ_ACCESSIBILITY_ATK
   PRInt32 colsCount = 0;
   rv = cols->GetCount(&colsCount);
   NS_ENSURE_SUCCESS(rv, rv);
 #else
   nsCOMPtr<nsITreeColumn> col;
   rv = cols->GetKeyColumn(getter_AddRefs(col));
@@ -592,17 +594,17 @@ nsXULTreeAccessible::InvalidateCache(PRI
 
       nsCOMPtr<nsIAccessNode> accessNode;
       GetCacheEntry(*mAccessNodeCache, key, getter_AddRefs(accessNode));
 
       if (accessNode) {
         nsCOMPtr<nsIAccessible> accessible(do_QueryInterface(accessNode));
         nsCOMPtr<nsIAccessibleEvent> event =
           new nsAccEvent(nsIAccessibleEvent::EVENT_DOM_DESTROY,
-                         accessible, nsnull, PR_FALSE);
+                         accessible, PR_FALSE);
         FireAccessibleEvent(event);
 
         mAccessNodeCache->Remove(key);
       }
     }
   }
 
   PRInt32 newRowCount = 0;
--- a/browser/app/Makefile.in
+++ b/browser/app/Makefile.in
@@ -313,20 +313,17 @@ libs:: $(ICON_FILES)
 	$(INSTALL) $^ $(DIST)/bin/icons
 
 install::
 	$(SYSINSTALL) $(IFLAGS1) $(ICON_FILES) $(DESTDIR)$(mozappdir)/icons
 endif
 
 ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
 libs::
-	$(INSTALL) $(DIST)/branding/default.xpm $(DIST)/bin/chrome/icons/default
-
-install::
-	$(SYSINSTALL) $(IFLAGS1) $(DIST)/branding/default.xpm $(DESTDIR)$(mozappdir)/chrome/icons/default
+	$(INSTALL) $(DIST)/branding/default16.png $(DIST)/bin/chrome/icons/default
 endif
 
 export::
 ifndef MOZ_BRANDING_DIRECTORY
 	$(NSINSTALL) -D $(DIST)/branding
 ifeq ($(OS_ARCH),WINNT)
 	cp $(srcdir)/firefox.ico   $(DIST)/branding/firefox.ico
 	cp $(srcdir)/firefox.ico   $(DIST)/branding/app.ico
@@ -342,17 +339,17 @@ ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_
 endif
 ifneq (,$(filter gtk2,$(MOZ_WIDGET_TOOLKIT)))
 	cp $(srcdir)/mozicon128.png $(DIST)/branding/mozicon128.png
 	cp $(srcdir)/mozicon16.xpm $(DIST)/branding/mozicon16.xpm
 	cp $(srcdir)/mozicon50.xpm $(DIST)/branding/mozicon50.xpm
 	cp $(srcdir)/document.png $(DIST)/branding/document.png
 endif
 ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
-	cp $(srcdir)/default.xpm   $(DIST)/branding/default.xpm	
+	cp $(srcdir)/default16.png   $(DIST)/branding/default16.png
 endif
 ifeq ($(OS_ARCH),OS2)
 	cp $(srcdir)/firefox-os2.ico   $(DIST)/branding/firefox.ico
 	cp $(srcdir)/firefox-os2.ico   $(DIST)/branding/app.ico
 	cp $(srcdir)/document-os2.ico  $(DIST)/branding/document.ico
 endif
 endif
 
@@ -375,16 +372,19 @@ clean clobber repackage::
 	rm -rf $(DIST)/$(APP_NAME).app
 
 ifdef LIBXUL_SDK
 APPFILES = Resources
 else
 APPFILES = MacOS
 endif
 
+libs:: $(srcdir)/profile/prefs.js
+	$(INSTALL) $^ $(DIST)/bin/defaults/profile
+
 libs repackage:: $(PROGRAM) application.ini
 	mkdir -p $(DIST)/$(APP_NAME).app/Contents/MacOS
 	rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents $(DIST)/$(APP_NAME).app --exclude English.lproj
 	mkdir -p $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj
 	rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj
 	sed -e "s/%APP_VERSION%/$(APP_VERSION)/" -e "s/%APP_NAME%/$(APP_NAME)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(DIST)/$(APP_NAME).app/Contents/Info.plist
 	sed -e "s/%APP_VERSION%/$(APP_VERSION)/" -e "s/%APP_NAME%/$(APP_NAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj/InfoPlist.strings
 	rsync -a $(DIST)/bin/ $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)
@@ -414,22 +414,16 @@ endif
 
 libs::
 ifeq ($(OS_ARCH),WINNT)
 	$(PERL) -pe 's/(?<!\r)\n/\r\n/g;' < $(topsrcdir)/LICENSE > $(DIST)/bin/LICENSE
 else
 	$(INSTALL) $(topsrcdir)/LICENSE	$(DIST)/bin
 endif
 
-libs:: $(srcdir)/profile/prefs.js
-	$(INSTALL) $^ $(DIST)/bin/defaults/profile
-
-install:: $(srcdir)/profile/prefs.js
-	$(SYSINSTALL) $(IFLAGS1) $^ $(DESTDIR)$(mozappdir)/defaults/profile
-
 ifdef LIBXUL_SDK
 ifndef SKIP_COPY_XULRUNNER
 libs::
 ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 	rsync -a --copy-unsafe-links $(LIBXUL_DIST)/XUL.framework $(DIST)/$(APP_NAME).app/Contents/Frameworks
 else
 	$(NSINSTALL) -D $(DIST)/bin/xulrunner
 	(cd $(LIBXUL_SDK)/bin && tar $(TAR_CREATE_FLAGS) - .) | (cd $(DIST)/bin/xulrunner && tar -xf -)
deleted file mode 100644
--- a/browser/app/default.xpm
+++ /dev/null
@@ -1,1144 +0,0 @@
-/* XPM */
-static char * mozicon50_xpm[] = {
-"48 48 1093 2",
-"  	c None",
-". 	c #2099CF",
-"+ 	c #2CA7D9",
-"@ 	c #33AEDD",
-"# 	c #34B2E1",
-"$ 	c #35B8E5",
-"% 	c #2FBAE8",
-"& 	c #26B5E4",
-"* 	c #199FD6",
-"= 	c #177DB8",
-"- 	c #2C8FC4",
-"; 	c #43A0CE",
-"> 	c #55ADD6",
-", 	c #5CB5DD",
-"' 	c #61C4E8",
-") 	c #63CBED",
-"! 	c #64CFF1",
-"~ 	c #63D1F2",
-"{ 	c #5ECCEF",
-"] 	c #57C3E9",
-"^ 	c #4EB8E1",
-"/ 	c #3CABD9",
-"( 	c #2A9ED1",
-"_ 	c #1991C9",
-": 	c #0F7CBA",
-"< 	c #166EAC",
-"[ 	c #3387BC",
-"} 	c #4797C6",
-"| 	c #51A0CC",
-"1 	c #56A7D2",
-"2 	c #5BAED7",
-"3 	c #60B6DD",
-"4 	c #67CDEE",
-"5 	c #69D3F2",
-"6 	c #6BD4F4",
-"7 	c #69D3F4",
-"8 	c #63CDEF",
-"9 	c #5AC0E6",
-"0 	c #51B6DF",
-"a 	c #49ACD8",
-"b 	c #42A2D1",
-"c 	c #3898CA",
-"d 	c #298CC2",
-"e 	c #167EB9",
-"f 	c #0B5A9C",
-"g 	c #2674AE",
-"h 	c #3D87BA",
-"i 	c #4590C0",
-"j 	c #4B97C6",
-"k 	c #519FCB",
-"l 	c #58A6D1",
-"m 	c #5DADD5",
-"n 	c #62B3DA",
-"o 	c #69C3E6",
-"p 	c #6ED4F2",
-"q 	c #6FD6F4",
-"r 	c #6ED5F4",
-"s 	c #6AD3F2",
-"t 	c #5FC3E7",
-"u 	c #53B2DC",
-"v 	c #4BA8D5",
-"w 	c #439FCE",
-"x 	c #3B95C7",
-"y 	c #338BC0",
-"z 	c #2B82B9",
-"A 	c #1D76B1",
-"B 	c #0C69A9",
-"C 	c #10599A",
-"D 	c #2D71AA",
-"E 	c #377CB2",
-"F 	c #3D84B8",
-"G 	c #458DBE",
-"H 	c #4B95C4",
-"I 	c #529CC9",
-"J 	c #59A4CF",
-"K 	c #5FABD4",
-"L 	c #65B1D8",
-"M 	c #6BC2E4",
-"N 	c #71D5F3",
-"O 	c #73D6F3",
-"P 	c #72D5F3",
-"Q 	c #6DD1F0",
-"R 	c #5FBBE2",
-"S 	c #54ADD8",
-"T 	c #4CA4D2",
-"U 	c #439ACB",
-"V 	c #3B91C4",
-"W 	c #3487BD",
-"X 	c #2D7EB7",
-"Y 	c #2675AF",
-"Z 	c #1E6CA9",
-"` 	c #0F5FA0",
-" .	c #055296",
-"..	c #115394",
-"+.	c #2767A2",
-"@.	c #2F70A9",
-"#.	c #3679AF",
-"$.	c #3C81B5",
-"%.	c #448ABC",
-"&.	c #4A92C2",
-"*.	c #519AC7",
-"=.	c #58A2CD",
-"-.	c #5FA9D2",
-";.	c #65B0D7",
-">.	c #6EC8E9",
-",.	c #74D4F2",
-"'.	c #76D6F3",
-").	c #75D6F3",
-"!.	c #71D3F1",
-"~.	c #62BCE1",
-"{.	c #54A9D5",
-"].	c #4C9FCE",
-"^.	c #4396C8",
-"/.	c #3B8CC1",
-"(.	c #3483BA",
-"_.	c #2C7AB3",
-":.	c #2670AC",
-"<.	c #1F68A6",
-"[.	c #195F9F",
-"}.	c #0D5497",
-"|.	c #04488D",
-"1.	c #0F4A8D",
-"2.	c #1F5A98",
-"3.	c #2663A0",
-"4.	c #2D6DA6",
-"5.	c #3475AD",
-"6.	c #3B7EB3",
-"7.	c #4287B9",
-"8.	c #4990C1",
-"9.	c #51A4CF",
-"0.	c #569FCA",
-"a.	c #5DA6CF",
-"b.	c #66B5DB",
-"c.	c #6FD1F0",
-"d.	c #75D4F1",
-"e.	c #79D5F2",
-"f.	c #75D3F1",
-"g.	c #63BBE0",
-"h.	c #54A4D1",
-"i.	c #4B9BCB",
-"j.	c #4391C4",
-"k.	c #3B88BD",
-"l.	c #337FB6",
-"m.	c #2C76B0",
-"n.	c #266CA9",
-"o.	c #1F64A3",
-"p.	c #1A5B9C",
-"q.	c #145396",
-"r.	c #0A498E",
-"s.	c #034C8F",
-"t.	c #085293",
-"u.	c #164D8E",
-"v.	c #1D5695",
-"w.	c #24609C",
-"x.	c #2A69A3",
-"y.	c #3271AA",
-"z.	c #387AAF",
-"A.	c #429FCC",
-"B.	c #4CBFE4",
-"C.	c #52C4E8",
-"D.	c #57AFD7",
-"E.	c #5DB3DA",
-"F.	c #65C5E7",
-"G.	c #6DD0EE",
-"H.	c #72D2EF",
-"I.	c #78D4F0",
-"J.	c #7BD5F1",
-"K.	c #76D2EF",
-"L.	c #6AC5E6",
-"M.	c #55A5D1",
-"N.	c #4A95C6",
-"O.	c #428CC0",
-"P.	c #3A83B9",
-"Q.	c #337AB3",
-"R.	c #2C71AD",
-"S.	c #2568A6",
-"T.	c #1F5F9F",
-"U.	c #1D65A3",
-"V.	c #269ACA",
-"W.	c #1C84BA",
-"X.	c #0D7DB5",
-"Y.	c #0298CC",
-"Z.	c #0296CA",
-"`.	c #0C5998",
-" +	c #14498A",
-".+	c #1B609C",
-"++	c #2498C8",
-"@+	c #2977AF",
-"#+	c #2F75AC",
-"$+	c #3575AC",
-"%+	c #40ABD5",
-"&+	c #49BFE4",
-"*+	c #50C3E7",
-"=+	c #56C5E8",
-"-+	c #5DC8EA",
-";+	c #63CBEB",
-">+	c #69CEED",
-",+	c #6ED0EE",
-"'+	c #73D2EF",
-")+	c #77D3EF",
-"!+	c #72CEEC",
-"~+	c #5AA7D1",
-"{+	c #4F99C9",
-"]+	c #4891C3",
-"^+	c #4087BC",
-"/+	c #387EB5",
-"(+	c #3277B1",
-"_+	c #2B70AB",
-":+	c #2463A2",
-"<+	c #1E5B9C",
-"[+	c #185395",
-"}+	c #165496",
-"|+	c #10498D",
-"1+	c #105F9E",
-"2+	c #0A9ECF",
-"3+	c #0088C0",
-"4+	c #038DC3",
-"5+	c #0A4A8C",
-"6+	c #114E8E",
-"7+	c #1989BD",
-"8+	c #22AAD7",
-"9+	c #28A2D0",
-"0+	c #2C71A9",
-"a+	c #3380B5",
-"b+	c #3EB9E1",
-"c+	c #45BDE3",
-"d+	c #4CC0E5",
-"e+	c #53C3E7",
-"f+	c #59C6E8",
-"g+	c #5EC9EA",
-"h+	c #64CBEB",
-"i+	c #69CDEC",
-"j+	c #6ECFED",
-"k+	c #70D0ED",
-"l+	c #64BDE1",
-"m+	c #55A6D1",
-"n+	c #3D82B8",
-"o+	c #3D8BBE",
-"p+	c #49AFD8",
-"q+	c #378DBF",
-"r+	c #225F9E",
-"s+	c #1D5698",
-"t+	c #174E92",
-"u+	c #12468B",
-"v+	c #0E3F85",
-"w+	c #115F9D",
-"x+	c #15A2D1",
-"y+	c #0395C9",
-"z+	c #0088C1",
-"A+	c #0190C6",
-"B+	c #079ACC",
-"C+	c #0FA0D0",
-"D+	c #169ECF",
-"E+	c #1D99CC",
-"F+	c #25AAD7",
-"G+	c #2BA0CE",
-"H+	c #32AED8",
-"I+	c #3AB7DF",
-"J+	c #41BBE1",
-"K+	c #47BEE3",
-"L+	c #4EC1E5",
-"M+	c #53C4E7",
-"N+	c #5FC8E9",
-"O+	c #63CAEA",
-"P+	c #67CBEB",
-"Q+	c #69CBEA",
-"R+	c #62BCE0",
-"S+	c #5AAFD7",
-"T+	c #478DBF",
-"U+	c #4084B9",
-"V+	c #3A7CB4",
-"W+	c #3E8CBF",
-"X+	c #4DBADF",
-"Y+	c #3383B8",
-"Z+	c #215B9B",
-"`+	c #1B5295",
-" @	c #164A8E",
-".@	c #114288",
-"+@	c #0D3A82",
-"@@	c #0E4C8E",
-"#@	c #1380B7",
-"$@	c #0D96C9",
-"%@	c #0089C1",
-"&@	c #007BB8",
-"*@	c #0085BE",
-"=@	c #008CC4",
-"-@	c #0496C9",
-";@	c #0B9DCF",
-">@	c #1168AB",
-",@	c #174F99",
-"'@	c #21AAD7",
-")@	c #28AED9",
-"!@	c #2FB1DB",
-"~@	c #36B5DE",
-"{@	c #3CB8E0",
-"]@	c #42BBE2",
-"^@	c #49BEE4",
-"/@	c #54C3E6",
-"(@	c #59C5E7",
-"_@	c #5DC7E8",
-":@	c #5FC5E7",
-"<@	c #53A9D3",
-"[@	c #4B96C6",
-"}@	c #478FC2",
-"|@	c #4186BB",
-"1@	c #3C7FB5",
-"2@	c #3676AF",
-"3@	c #306EA9",
-"4@	c #3889BD",
-"5@	c #44AFD8",
-"6@	c #2F84B9",
-"7@	c #194D91",
-"8@	c #15458A",
-"9@	c #144D90",
-"0@	c #0C367E",
-"a@	c #0C4086",
-"b@	c #1797C8",
-"c@	c #1295C8",
-"d@	c #0487C0",
-"e@	c #0079B6",
-"f@	c #0081BC",
-"g@	c #0E9ACC",
-"h@	c #1597CA",
-"i@	c #1CA7D5",
-"j@	c #23ABD8",
-"k@	c #2AAFDA",
-"l@	c #31B2DC",
-"m@	c #37B5DE",
-"n@	c #3DB8E0",
-"o@	c #43BBE2",
-"p@	c #49BEE3",
-"q@	c #4EC0E4",
-"r@	c #53C2E5",
-"s@	c #57C4E6",
-"t@	c #4EAAD4",
-"u@	c #4696C5",
-"v@	c #438FC0",
-"w@	c #4088BC",
-"x@	c #3C80B6",
-"y@	c #3778B1",
-"z@	c #3270AB",
-"A@	c #2C68A5",
-"B@	c #3D9AC8",
-"C@	c #46BADF",
-"D@	c #3DB0D8",
-"E@	c #287CB2",
-"F@	c #164D90",
-"G@	c #299ECC",
-"H@	c #1B79B0",
-"I@	c #1A8CBF",
-"J@	c #199BCC",
-"K@	c #1392C6",
-"L@	c #0A86BE",
-"M@	c #0079B7",
-"N@	c #006AAC",
-"O@	c #0074B3",
-"P@	c #007CB9",
-"Q@	c #0083BE",
-"R@	c #008BC2",
-"S@	c #0393C8",
-"T@	c #099CCD",
-"U@	c #10A1D1",
-"V@	c #17A4D3",
-"W@	c #1EA8D6",
-"X@	c #25ABD8",
-"Y@	c #2BAFDA",
-"Z@	c #37B5DD",
-"`@	c #3DB8DF",
-" #	c #42BAE1",
-".#	c #48BCE2",
-"+#	c #4CBEE3",
-"@#	c #50C0E4",
-"##	c #48A8D3",
-"$#	c #3F8EC0",
-"%#	c #3C87BC",
-"&#	c #3A81B7",
-"*#	c #3679B1",
-"=#	c #3171AC",
-"-#	c #2D6AA6",
-";#	c #2862A0",
-">#	c #40A5D1",
-",#	c #43B8DE",
-"'#	c #3DB5DC",
-")#	c #38B1DA",
-"!#	c #2D9ECC",
-"~#	c #2B9FCE",
-"{#	c #246AAA",
-"]#	c #1F96C7",
-"^#	c #1996C9",
-"/#	c #138DC3",
-"(#	c #0E84BC",
-"_#	c #0175B4",
-":#	c #0068AC",
-"<#	c #0070B1",
-"[#	c #0077B5",
-"}#	c #007FBA",
-"|#	c #0086BF",
-"1#	c #018DC4",
-"2#	c #0596C9",
-"3#	c #0B9DCE",
-"4#	c #12A1D1",
-"5#	c #1897C8",
-"6#	c #1E96C7",
-"7#	c #25A0CE",
-"8#	c #2B90C2",
-"9#	c #31A4D0",
-"0#	c #37B4DD",
-"a#	c #3CB7DF",
-"b#	c #41B9E0",
-"c#	c #45BBE0",
-"d#	c #49BCE1",
-"e#	c #4BBBE0",
-"f#	c #419FCC",
-"g#	c #3C91C2",
-"h#	c #337AB1",
-"i#	c #3072AC",
-"j#	c #2C6BA7",
-"k#	c #2864A1",
-"l#	c #255F9E",
-"m#	c #3FAAD4",
-"n#	c #40B6DC",
-"o#	c #3AB3DB",
-"p#	c #35B0D8",
-"q#	c #2F86BD",
-"r#	c #29599F",
-"s#	c #237DB7",
-"t#	c #1E99CA",
-"u#	c #1892C5",
-"v#	c #1389C0",
-"w#	c #0E7FBA",
-"x#	c #0473B2",
-"y#	c #0065AA",
-"z#	c #0064A9",
-"A#	c #006BAD",
-"B#	c #0072B2",
-"C#	c #0080BC",
-"D#	c #0082BC",
-"E#	c #028DC4",
-"F#	c #0796C9",
-"G#	c #0D88BD",
-"H#	c #1372AB",
-"I#	c #1982B8",
-"J#	c #1F79B0",
-"K#	c #247BB1",
-"L#	c #2A86B9",
-"M#	c #31B1DA",
-"N#	c #36B3DC",
-"O#	c #3AB5DD",
-"P#	c #3FB7DE",
-"Q#	c #42B9DF",
-"R#	c #45BAE0",
-"S#	c #48BBE0",
-"T#	c #47B6DD",
-"U#	c #3689BC",
-"V#	c #2D72AB",
-"W#	c #2C73AC",
-"X#	c #2F7DB3",
-"Y#	c #399BC9",
-"Z#	c #3FB4DB",
-"`#	c #3CB3DA",
-" $	c #37B0D9",
-".$	c #32AED7",
-"+$	c #2CA8D3",
-"@$	c #277EB8",
-"#$	c #229CCC",
-"$$	c #1D95C8",
-"%$	c #188DC2",
-"&$	c #1384BD",
-"*$	c #0D7AB6",
-"=$	c #066FB0",
-"-$	c #0057A0",
-";$	c #005FA5",
-">$	c #0066AA",
-",$	c #006DAF",
-"'$	c #006EAC",
-")$	c #004C8E",
-"!$	c #005595",
-"~$	c #025999",
-"{$	c #085D9B",
-"]$	c #0D64A0",
-"^$	c #1369A4",
-"/$	c #196EA7",
-"($	c #1E73AA",
-"_$	c #2376AD",
-":$	c #2AA0CE",
-"<$	c #2FAFD9",
-"[$	c #34B1DB",
-"}$	c #38B3DC",
-"|$	c #3BB5DC",
-"1$	c #3EB6DD",
-"2$	c #40B7DD",
-"3$	c #42B7DD",
-"4$	c #43B7DE",
-"5$	c #43B7DD",
-"6$	c #40B5DC",
-"7$	c #3DB4DB",
-"8$	c #3AB2DA",
-"9$	c #33AED6",
-"0$	c #2EABD5",
-"a$	c #29A5D2",
-"b$	c #259ECD",
-"c$	c #2094C6",
-"d$	c #1C8DC2",
-"e$	c #1787BE",
-"f$	c #127EB9",
-"g$	c #0D75B3",
-"h$	c #076AAC",
-"i$	c #005FA6",
-"j$	c #00539D",
-"k$	c #005AA2",
-"l$	c #0060A6",
-"m$	c #0068AB",
-"n$	c #0063A5",
-"o$	c #004487",
-"p$	c #004386",
-"q$	c #004789",
-"r$	c #004B8D",
-"s$	c #045192",
-"t$	c #095997",
-"u$	c #0E5F9C",
-"v$	c #1365A0",
-"w$	c #1869A4",
-"x$	c #1D6EA7",
-"y$	c #2274AB",
-"z$	c #28A6D2",
-"A$	c #2DAED8",
-"B$	c #31AFD9",
-"C$	c #34B1DA",
-"D$	c #37B2DB",
-"E$	c #39B3DB",
-"F$	c #3BB4DB",
-"G$	c #3CB4DB",
-"H$	c #3BB3DA",
-"I$	c #38B1D9",
-"J$	c #35AFD8",
-"K$	c #32ADD6",
-"L$	c #2EAAD4",
-"M$	c #2BA5D1",
-"N$	c #2795C5",
-"O$	c #2374AA",
-"P$	c #1E5691",
-"Q$	c #1A4C89",
-"R$	c #156AA5",
-"S$	c #1078B5",
-"T$	c #0B6FAF",
-"U$	c #0665A9",
-"V$	c #004A97",
-"W$	c #004D9A",
-"X$	c #00509A",
-"Y$	c #00579F",
-"Z$	c #0062A7",
-"`$	c #00468A",
-" %	c #00387C",
-".%	c #003C7F",
-"+%	c #004083",
-"@%	c #044D8E",
-"#%	c #095493",
-"$%	c #0E5A98",
-"%%	c #13609C",
-"&%	c #18659F",
-"*%	c #1C6BA4",
-"=%	c #219FCD",
-"-%	c #25AAD5",
-";%	c #29ABD6",
-">%	c #2DADD7",
-",%	c #30AED8",
-"'%	c #32AFD8",
-")%	c #34B0D8",
-"!%	c #34AED7",
-"~%	c #30ABD4",
-"{%	c #2DA8D2",
-"]%	c #2BA3CF",
-"^%	c #289DCC",
-"/%	c #2494C5",
-"(%	c #20659E",
-"_%	c #1C4684",
-":%	c #183D7C",
-"<%	c #133B7A",
-"[%	c #0F5695",
-"}%	c #0A5FA1",
-"|%	c #055FA5",
-"1%	c #00559F",
-"2%	c #004D99",
-"3%	c #004896",
-"4%	c #002E74",
-"5%	c #003C82",
-"6%	c #004E94",
-"7%	c #003377",
-"8%	c #003175",
-"9%	c #003578",
-"0%	c #003B7F",
-"a%	c #003F82",
-"b%	c #014285",
-"c%	c #044889",
-"d%	c #094E8E",
-"e%	c #0D5493",
-"f%	c #125997",
-"g%	c #167FB4",
-"h%	c #1A96C7",
-"i%	c #1EA5D2",
-"j%	c #22A7D3",
-"k%	c #25A9D4",
-"l%	c #28AAD5",
-"m%	c #2AAAD5",
-"n%	c #2CABD6",
-"o%	c #2DACD6",
-"p%	c #2EACD5",
-"q%	c #2DA9D3",
-"r%	c #2CA6D1",
-"s%	c #299FCD",
-"t%	c #279ACA",
-"u%	c #2495C7",
-"v%	c #218FC3",
-"w%	c #1D86BC",
-"x%	c #1A4683",
-"y%	c #163574",
-"z%	c #112C6C",
-"A%	c #0D2464",
-"B%	c #082D6F",
-"C%	c #044E94",
-"D%	c #004F9A",
-"E%	c #004292",
-"F%	c #00347D",
-"G%	c #002266",
-"H%	c #002669",
-"I%	c #00286C",
-"J%	c #002B6F",
-"K%	c #002E72",
-"L%	c #003478",
-"M%	c #00377B",
-"N%	c #003A7E",
-"O%	c #013D80",
-"P%	c #044285",
-"Q%	c #084889",
-"R%	c #0D4D8D",
-"S%	c #115492",
-"T%	c #15609B",
-"U%	c #189ACB",
-"V%	c #1CA0CF",
-"W%	c #1FA2CF",
-"X%	c #21A3D1",
-"Y%	c #24A4D1",
-"Z%	c #25A5D1",
-"`%	c #27A4D1",
-" &	c #28A4D1",
-".&	c #28A0CE",
-"+&	c #289ECC",
-"@&	c #2596C8",
-"#&	c #2392C5",
-"$&	c #208DC2",
-"%&	c #1D87BD",
-"&&	c #1A75AE",
-"*&	c #173978",
-"=&	c #132E6D",
-"-&	c #0F2565",
-";&	c #0B1D5D",
-">&	c #071555",
-",&	c #021151",
-"'&	c #001F61",
-")&	c #00276D",
-"!&	c #003D8E",
-"~&	c #003B89",
-"{&	c #001E62",
-"]&	c #002063",
-"^&	c #002569",
-"/&	c #002D72",
-"(&	c #003074",
-"_&	c #003579",
-":&	c #033C7F",
-"<&	c #074183",
-"[&	c #0B4787",
-"}&	c #0F5392",
-"|&	c #1391C5",
-"1&	c #1695C8",
-"2&	c #1998CA",
-"3&	c #1C99CA",
-"4&	c #1E9ACB",
-"5&	c #209BCB",
-"6&	c #219BCB",
-"7&	c #229ACA",
-"8&	c #2399C9",
-"9&	c #2397C8",
-"0&	c #2394C6",
-"a&	c #2291C4",
-"b&	c #1E89C0",
-"c&	c #1C84BC",
-"d&	c #1A5B97",
-"e&	c #174C89",
-"f&	c #142D6C",
-"g&	c #102665",
-"h&	c #0C1E5D",
-"i&	c #081756",
-"j&	c #040F4F",
-"k&	c #000847",
-"l&	c #000541",
-"m&	c #00033D",
-"n&	c #00368A",
-"o&	c #00256E",
-"p&	c #00185A",
-"q&	c #001A5D",
-"r&	c #001D60",
-"s&	c #001F63",
-"t&	c #002568",
-"u&	c #00276B",
-"v&	c #00296D",
-"w&	c #002B70",
-"x&	c #003276",
-"y&	c #023579",
-"z&	c #063A7D",
-"A&	c #0A5997",
-"B&	c #0D87BF",
-"C&	c #108AC1",
-"D&	c #138CC3",
-"E&	c #168EC4",
-"F&	c #188FC4",
-"G&	c #1A90C4",
-"H&	c #1C90C4",
-"I&	c #1D8FC4",
-"J&	c #1D8EC3",
-"K&	c #1D8CC2",
-"L&	c #1D8AC0",
-"M&	c #1C87BE",
-"N&	c #1B83BC",
-"O&	c #1A7FB9",
-"P&	c #1864A0",
-"Q&	c #164987",
-"R&	c #132C6A",
-"S&	c #102564",
-"T&	c #0D1E5D",
-"U&	c #091756",
-"V&	c #06104E",
-"W&	c #020947",
-"X&	c #000441",
-"Y&	c #00023C",
-"Z&	c #000038",
-"`&	c #003086",
-" *	c #001A5E",
-".*	c #001354",
-"+*	c #001658",
-"@*	c #001D5F",
-"#*	c #001F62",
-"$*	c #002164",
-"%*	c #002367",
-"&*	c #002D71",
-"**	c #014C8E",
-"=*	c #0474B2",
-"-*	c #077CB9",
-";*	c #0B80BA",
-">*	c #0E82BB",
-",*	c #1083BC",
-"'*	c #1285BD",
-")*	c #1485BE",
-"!*	c #1686BD",
-"~*	c #1785BD",
-"{*	c #1884BC",
-"]*	c #1882BB",
-"^*	c #1880B9",
-"/*	c #187DB7",
-"(*	c #177AB6",
-"_*	c #1571AF",
-":*	c #143676",
-"<*	c #122968",
-"[*	c #0F2362",
-"}*	c #0D1D5C",
-"|*	c #0A1755",
-"1*	c #030A47",
-"2*	c #000239",
-"3*	c #002A82",
-"4*	c #00175D",
-"5*	c #00104F",
-"6*	c #001252",
-"7*	c #001454",
-"8*	c #001657",
-"9*	c #00195C",
-"0*	c #001C5E",
-"a*	c #001D61",
-"b*	c #002165",
-"c*	c #002366",
-"d*	c #002468",
-"e*	c #006CAE",
-"f*	c #006FB0",
-"g*	c #0271B1",
-"h*	c #0574B3",
-"i*	c #0877B4",
-"j*	c #0B78B5",
-"k*	c #0F7AB6",
-"l*	c #107AB7",
-"m*	c #127AB6",
-"n*	c #1279B5",
-"o*	c #1377B4",
-"p*	c #1375B3",
-"q*	c #1372B1",
-"r*	c #126FAF",
-"s*	c #115797",
-"t*	c #0F2766",
-"u*	c #0D2160",
-"v*	c #0B1B5A",
-"w*	c #091554",
-"x*	c #06104D",
-"y*	c #030A46",
-"z*	c #000540",
-"A*	c #000036",
-"B*	c #00237E",
-"C*	c #002980",
-"D*	c #002372",
-"E*	c #001A60",
-"F*	c #001659",
-"G*	c #001358",
-"H*	c #001A5F",
-"I*	c #002064",
-"J*	c #001B5E",
-"K*	c #005397",
-"L*	c #0065A9",
-"M*	c #0067AB",
-"N*	c #0069AC",
-"O*	c #026AAD",
-"P*	c #046CAE",
-"Q*	c #0768AB",
-"R*	c #0965A9",
-"S*	c #0A6EAF",
-"T*	c #0C6EAE",
-"U*	c #0D6DAE",
-"V*	c #0D6CAD",
-"W*	c #0D6AAB",
-"X*	c #0D67AA",
-"Y*	c #0D64A7",
-"Z*	c #0C498C",
-"`*	c #0A1E5E",
-" =	c #091856",
-".=	c #071350",
-"+=	c #050D4B",
-"@=	c #020844",
-"#=	c #00043F",
-"$=	c #00023B",
-"%=	c #000037",
-"&=	c #000035",
-"*=	c #000034",
-"==	c #001A77",
-"-=	c #00237D",
-";=	c #002881",
-">=	c #002D84",
-",=	c #00287F",
-"'=	c #000B6C",
-")=	c #00388A",
-"!=	c #003785",
-"~=	c #001556",
-"{=	c #001759",
-"]=	c #00195B",
-"^=	c #001C5F",
-"/=	c #001C60",
-"(=	c #004B91",
-"_=	c #004287",
-":=	c #00569C",
-"<=	c #0061A7",
-"[=	c #023187",
-"}=	c #033388",
-"|=	c #0563A7",
-"1=	c #0662A7",
-"2=	c #0762A7",
-"3=	c #0860A6",
-"4=	c #085EA4",
-"5=	c #085CA3",
-"6=	c #084388",
-"7=	c #071B5B",
-"8=	c #061453",
-"9=	c #04104D",
-"0=	c #030B48",
-"a=	c #010742",
-"b=	c #00033E",
-"c=	c #00013A",
-"d=	c #000033",
-"e=	c #000032",
-"f=	c #001C79",
-"g=	c #00217C",
-"h=	c #002780",
-"i=	c #002B83",
-"j=	c #003589",
-"k=	c #001D63",
-"l=	c #000F4F",
-"m=	c #000F4E",
-"n=	c #001050",
-"o=	c #001152",
-"p=	c #001353",
-"q=	c #001455",
-"r=	c #002F74",
-"s=	c #00529A",
-"t=	c #0058A1",
-"u=	c #00529D",
-"v=	c #0156A0",
-"w=	c #02569F",
-"x=	c #02549E",
-"y=	c #03529D",
-"z=	c #034F9A",
-"A=	c #032062",
-"B=	c #020F4E",
-"C=	c #010C49",
-"D=	c #000845",
-"E=	c #00033C",
-"F=	c #000138",
-"G=	c #000135",
-"H=	c #001474",
-"I=	c #001F7B",
-"J=	c #00247E",
-"K=	c #002D83",
-"L=	c #001051",
-"M=	c #000A46",
-"N=	c #000B48",
-"O=	c #000C4A",
-"P=	c #000D4B",
-"Q=	c #000E4D",
-"R=	c #001151",
-"S=	c #001253",
-"T=	c #00377E",
-"U=	c #004E9A",
-"V=	c #004C98",
-"W=	c #00408C",
-"X=	c #000946",
-"Y=	c #00053F",
-"Z=	c #000137",
-"`=	c #000031",
-" -	c #000030",
-".-	c #001373",
-"+-	c #001876",
-"@-	c #001D79",
-"#-	c #00267F",
-"$-	c #000D4D",
-"%-	c #000741",
-"&-	c #000843",
-"*-	c #000945",
-"=-	c #000A47",
-"--	c #000B49",
-";-	c #000D4C",
-">-	c #002F77",
-",-	c #00327A",
-"'-	c #002267",
-")-	c #002166",
-"!-	c #00256A",
-"~-	c #003D89",
-"{-	c #004393",
-"]-	c #003F90",
-"^-	c #003C8D",
-"/-	c #003382",
-"(-	c #003587",
-"_-	c #002069",
-":-	c #00033A",
-"<-	c #000136",
-"[-	c #00002F",
-"}-	c #000C6E",
-"|-	c #001171",
-"1-	c #001574",
-"2-	c #001E7A",
-"3-	c #00196A",
-"4-	c #00053E",
-"5-	c #000640",
-"6-	c #000742",
-"7-	c #00185B",
-"8-	c #003787",
-"9-	c #00398C",
-"0-	c #00378B",
-"a-	c #003388",
-"b-	c #002779",
-"c-	c #00063F",
-"d-	c #00002D",
-"e-	c #00096C",
-"f-	c #000D6F",
-"g-	c #001271",
-"h-	c #001675",
-"i-	c #001872",
-"j-	c #000338",
-"k-	c #00043A",
-"l-	c #00043B",
-"m-	c #00053D",
-"n-	c #000844",
-"o-	c #000944",
-"p-	c #002573",
-"q-	c #002E85",
-"r-	c #002C83",
-"s-	c #001E71",
-"t-	c #00002E",
-"u-	c #00002C",
-"v-	c #000266",
-"w-	c #00066A",
-"x-	c #000A6D",
-"y-	c #000E70",
-"z-	c #000C58",
-"A-	c #000643",
-"B-	c #000337",
-"C-	c #000236",
-"D-	c #000339",
-"E-	c #00053C",
-"F-	c #00063E",
-"G-	c #00073F",
-"H-	c #00145A",
-"I-	c #001C78",
-"J-	c #000743",
-"K-	c #00002A",
-"L-	c #00005F",
-"M-	c #000267",
-"N-	c #000A6C",
-"O-	c #000952",
-"P-	c #000131",
-"Q-	c #000132",
-"R-	c #000133",
-"S-	c #000134",
-"T-	c #000235",
-"U-	c #00196E",
-"V-	c #001D7A",
-"W-	c #001B78",
-"X-	c #001977",
-"Y-	c #001775",
-"Z-	c #001473",
-"`-	c #000E66",
-" ;	c #00002B",
-".;	c #000029",
-"+;	c #000053",
-"@;	c #00005E",
-"#;	c #000265",
-"$;	c #000464",
-"%;	c #000130",
-"&;	c #001160",
-"*;	c #001164",
-"=;	c #001674",
-"-;	c #001272",
-";;	c #001071",
-">;	c #000E6F",
-",;	c #000B6E",
-"';	c #00086C",
-");	c #00045F",
-"!;	c #000152",
-"~;	c #000046",
-"{;	c #000051",
-"];	c #00005A",
-"^;	c #00012F",
-"/;	c #000542",
-"(;	c #00106E",
-"_;	c #001070",
-":;	c #000F70",
-"<;	c #00086B",
-"[;	c #000367",
-"};	c #000163",
-"|;	c #00005B",
-"1;	c #000052",
-"2;	c #000047",
-"3;	c #000041",
-"4;	c #000028",
-"5;	c #000021",
-"6;	c #000025",
-"7;	c #00003E",
-"8;	c #00003A",
-"9;	c #00075A",
-"0;	c #00076B",
-"a;	c #000569",
-"b;	c #000368",
-"c;	c #000162",
-"d;	c #00005C",
-"e;	c #000054",
-"f;	c #00004C",
-"g;	c #000042",
-"h;	c #000039",
-"i;	c #000026",
-"j;	c #000023",
-"k;	c #000017",
-"l;	c #00001C",
-"m;	c #00004D",
-"n;	c #000055",
-"o;	c #000027",
-"p;	c #00003D",
-"q;	c #000058",
-"r;	c #00004E",
-"s;	c #000048",
-"t;	c #000019",
-"u;	c #000012",
-"v;	c #00001D",
-"w;	c #00001F",
-"x;	c #000044",
-"y;	c #000008",
-"z;	c #000018",
-"A;	c #000024",
-"B;	c #000015",
-"C;	c #000022",
-"D;	c #00000F",
-"E;	c #000004",
-"F;	c #000007",
-"G;	c #000009",
-"H;	c #00000C",
-"I;	c #00000D",
-"J;	c #00000E",
-"K;	c #00000A",
-"L;	c #000003",
-"M;	c #000000",
-"N;	c #000001",
-"O;	c #000005",
-"P;	c #00000B",
-"                                                                                                ",
-"                                                                                                ",
-"                                        . + @ # $ % & *                                         ",
-"                                = - ; > , ' ) ! ~ { ] ^ / ( _ :                                 ",
-"                            < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e                               ",
-"                        f g h i j k l m n o p q r s t u v w x y z A B                           ",
-"                      C D E F G H I J K L M N O P Q R S T U V W X Y Z `  .                      ",
-"                    ..+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.                    ",
-"                  1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.                  ",
-"                t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.                ",
-"              Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+                ",
-"            3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+k+l+m+]+n+o+p+q+r+s+t+u+v+w+x+y+              ",
-"            z+A+B+C+D+E+F+G+H+I+J+K+L+M+f+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@            ",
-"          &@*@=@-@;@>@,@'@)@!@~@{@]@^@L+/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@            ",
-"          e@f@z+A+B+g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@          ",
-"        N@O@P@Q@R@S@T@U@V@W@X@Y@l@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#          ",
-"        :#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#        ",
-"        z#A#B#M@C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$z#        ",
-"      -$;$>$,$O@'$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$3$4$5$3$6$7$8$ $9$0$a$b$c$d$e$f$g$h$i$        ",
-"      j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$G$H$8$I$J$K$L$M$N$O$P$Q$R$S$T$U$k$V$      ",
-"      W$X$Y$Z$`$ %.%+%p$q$@%#%$%%%&%*%=%-%;%>%,%'%)%p#p#J$!%K$~%{%]%^%/%(%_%:%<%[%}%|%1%2%      ",
-"      3%4%5%6%7%8%9% %0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%0$q%r%]%s%t%u%v%w%x%y%z%A%B%C%D%3%      ",
-"      E%F%G%H%I%J%K%8%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &9+.&+&V.@&#&$&%&&&*&=&-&;&>&,&'&)&      ",
-"      !&~&{&]&G%^&I%J%/&(&7%_& %:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&$&b&c&d&e&f&g&h&i&j&k&l&m&      ",
-"      n&o&p&q&r&s&G%t&u&v&w&K%(&x&y&z&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&      ",
-"      `& *.*+*p&q&@*#*$*%*^&u&v&J%&***=*-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*V&1*l&Y&Z&2*      ",
-"      3*4*5*6*7*8*p&9*0*a*s&b*c*d*v&e*f*g*h*i*j**$k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*Y&Z&A*z*      ",
-"      B*C*D*E*F*G*H*I*+*p&9*J*r&{&x&K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*=        ",
-"      ==-=;=>=,='=)=!=J*.*~=+*{=]=^=/=(=_=:=l$<=[=}=|=1=2=3=4=5=6=7=8=9=0=a=b=c=%=&=d=e=        ",
-"        f=g=h=i=3*j=k=l=m=n=o=p=q=~=8*r=^=b*s=t=j$u=-$v=w=x=y=z=A=B=C=D=z*E=F=A*&=d=e=G=        ",
-"        H===I=J=;=K=L=M=N=O=P=Q=l=n=R=6*S=.*T=D%D%D%U=2%V=V$3%W=J*L=X=Y=$=Z=&=*=e=`= -          ",
-"          .-+-@-g=#-$-%-&-*-M==---O=P=;-Q=m=>-,-'-)-!-~-{-E%]-^-/-(-_-:-<-*=d=e=`=[-[-          ",
-"          }-|-1-==2-3-4-4-5-%-6-&-*-X==-=-N=q&;-O=O=O=7-8-9-0-j=a-`&b-c-d=e=`= -[-d-$=          ",
-"            e-f-g-h-i-4-j-k-l-m-4-c-5-%-6-6-&-&-n-o-o-*-M=p-q-r-3*h=s-X=`= -[-t-u-u-            ",
-"            v-w-x-y-g-z-A-B-C-j-D-:-l-l-E-m-4-F-F-c-c-c-G-H-#-J=g=I=I-J-t-t-d-u-K-              ",
-"              L-M-w-N-f-O-P-Q-R-S-T-C-C-B-j-D-D-:-k-l-k-D=U-V-W-X-Y-Z-`-[- ; ;.;u-              ",
-"                +;@;#;$; ;u-d-t-[- -%;P-Q-R-R-S-B-z*&;*;Y-=;H=-;;;>;,;';);!;%=d-                ",
-"                  ~;{;];u-.;K- ; ;u-d-d-d-t-t-^;/;(;_;;;:;f-}-x-<;w-[;};|;1;2;                  ",
-"                  A*%=3;4;5;6;u-7;8;u-K- ; ; ; ;^;9;<;0;w-a;b;v-c;d;e;f;g;h;                    ",
-"                      i;j;k;l;d=m;1;n;d= ;i;o;o;o;o;p;@;d;q;+;r;s;3;h;`=K-                      ",
-"                        t;u;k;o;e=Z&%=5;*=l;v;v;v;w; ;x;3;p;Z&d=d-i;w;                          ",
-"                            y;u;z;v;5;A;A;B;u;u;u;j; ;.;i;C;v;z;u;D;                            ",
-"                                E;E;F;G;H;I;I;I;H;D;J;H;K;F;E;K;                                ",
-"                                      y;L;M;M;N;N;M;N;O;P;                                      ",
-"                                                                                                ",
-"                                                                                                ",
-"                                                                                                ",
-"                                                                                                "};
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9f8274b1371921d92f2651cb9511d66b008b607a
GIT binary patch
literal 722
zc$@*!0xkWCP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkQgh@m}R5*>5lS@cc0Te*bn|br~sWW3^qZUS1B!n48&_}U?pu$`P
zwGgrhjB3}eMPNzLrWURWT13$zBElk~f~2U7(9%RiQZm2I|NESo_idA6X+>vs;c^d`
z`vJfN!35!FY~eo;<^!|q&~7v{i5v=$mIra#e8S031OF0;0Ol2MG5)HpRBmfRQ#7<W
z2YnAa&2|Qbc8tFY%yulSt@l%2-Jk{bc(C~N(ZNUJXn%Bb)2*h*j#I4_Zcni@J~JES
z&au#P9f-Ibeo~=sQHh***)wQ#T<TO+YuWyNr;i_W*VL}F`wH!oV=H6h{;n6Z?>=AV
z{e|IqfkkLX5t{DzkdxB{dp_K_dOq{Ir+;-kk*uxusx{>$1@20(Q(Pe!r9Owf#Zy(@
zP0P)l^8zb?d2N-8XmElz54tbvN7rO5_PtpQ%*JM<KmaYCB0M%rPL`45vSd_M)N8J~
zyNo@{iU7j7sVq!oq0P;ix&zkc1_}$Eq-;KBlNt1h5b;P7_ohlbo<cOMYkf|VjsVxi
zUna8ASIzhE27P9lm=%P84`o*kQb`fkIu}_4jC2}fViGdB#-#$)C}L>Xf|5p+iim_`
z<jYDa@O!Z7I(kB8?rk5rfg#W}&%zxn5c?KJ3godk9E5{txh#p#Uy+Nw*z6+a$S`Ve
zFRGjZQ=3^Th~N8yarPrc#oI}ZLNbCG4Wan_DBd!VbC6AdnFqwD3tL!(PF{+TwH!uI
zSW#n;PeURB85`saAeRCo{v3iGkXC;e0OKPVN(v*k18fe=3<w%1B4kFvNWOw-8%%{@
z(K9W@(*V|1(6@l;0%00>0*Tu|^v`w6m_RB8oXaJD0B=VW0A4+5-T(jq07*qoM6N<$
Ef*YVbfB*mh
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -63,16 +63,25 @@ pref("xpinstall.dialog.progress.type.chr
 // their extensions are being updated and thus reregistered every time the app is
 // started.
 pref("extensions.ignoreMTimeChanges", false);
 // Enables some extra Extension System Logging (can reduce performance)
 pref("extensions.logging.enabled", false);
 // Hides the install button in the add-ons mgr
 pref("extensions.hideInstallButton", true);
 
+// Preferences for the Get Add-ons pane
+pref("extensions.getAddons.showPane", true);
+pref("extensions.getAddons.browseAddons", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%");
+pref("extensions.getAddons.maxResults", 5);
+pref("extensions.getAddons.recommended.browseURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/recommended");
+pref("extensions.getAddons.recommended.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/list/featured/all/10");
+pref("extensions.getAddons.search.browseURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/search?q=%TERMS%");
+pref("extensions.getAddons.search.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/search/%TERMS%");
+
 // Blocklist preferences
 pref("extensions.blocklist.enabled", true);
 pref("extensions.blocklist.interval", 86400);
 pref("extensions.blocklist.url", "https://addons.mozilla.org/blocklist/1/%APP_ID%/%APP_VERSION%/");
 pref("extensions.blocklist.detailsURL", "http://%LOCALE%.www.mozilla.com/%LOCALE%/blocklist/");
 
 // Dictionary download preference
 pref("browser.dictionaries.download.url", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/firefox/%VERSION%/dictionaries/");
@@ -212,16 +221,17 @@ pref("browser.download.manager.showAlert
 pref("browser.download.manager.retention", 2);
 pref("browser.download.manager.showWhenStarting", true);
 pref("browser.download.manager.useWindow", true);
 pref("browser.download.manager.closeWhenDone", false);
 pref("browser.download.manager.openDelay", 0);
 pref("browser.download.manager.focusWhenStarting", false);
 pref("browser.download.manager.flashCount", 2);
 pref("browser.download.manager.addToRecentDocs", true);
+pref("browser.download.manager.quitBehavior", 0);
 
 // search engines URL
 pref("browser.search.searchEnginesURL",      "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/firefox/%VERSION%/search-engines/");
 
 // pointer to the default engine name
 pref("browser.search.defaultenginename",      "chrome://browser-region/locale/region.properties");
 
 // disable logging for the search service by default
@@ -330,24 +340,25 @@ pref("dom.disable_window_move_resize",  
 pref("dom.disable_window_flip",                   true);
 
 // popups.policy 1=allow,2=reject
 pref("privacy.popups.policy",               1);
 pref("privacy.popups.usecustom",            true);
 pref("privacy.popups.firstTime",            true);
 pref("privacy.popups.showBrowserMessage",   true);
  
-pref("privacy.item.history",    true);
-pref("privacy.item.formdata",   true);
-pref("privacy.item.passwords",  false);
-pref("privacy.item.downloads",  true);
-pref("privacy.item.cookies",    false);
-pref("privacy.item.cache",      true);
-pref("privacy.item.siteprefs",  false);
-pref("privacy.item.sessions",   true);
+pref("privacy.item.history",     true);
+pref("privacy.item.formdata",    true);
+pref("privacy.item.passwords",   false);
+pref("privacy.item.downloads",   true);
+pref("privacy.item.cookies",     false);
+pref("privacy.item.cache",       true);
+pref("privacy.item.siteprefs",   false);
+pref("privacy.item.sessions",    true);
+pref("privacy.item.offlineApps", false);
 
 pref("privacy.sanitize.sanitizeOnShutdown", false);
 pref("privacy.sanitize.promptOnSanitize", true);
 
 pref("network.proxy.share_proxy_settings",  false); // use the same proxy settings for all protocols
 
 pref("network.cookie.cookieBehavior",       1); // 0-Accept, 1-dontAcceptForeign, 2-dontUse
 
@@ -594,17 +605,55 @@ pref("browser.places.importBookmarksHTML
 // if false, will add the "Smart Bookmarks" folder to the personal toolbar
 pref("browser.places.createdSmartBookmarks", false);
 
 // If true, will migrate uri post-data annotations to
 // bookmark post-data annotations (bug 398914)
 // XXX to be removed after beta 2 (bug 391419)
 pref("browser.places.migratePostDataAnnotations", true);
 
+// the (maximum) number of the recent visits to sample
+// when calculating frecency
+pref("places.frecency.numVisits", 10);
+
+// Perform frecency recalculation after this amount of idle, repeating.
+// A value of zero disables updating of frecency on idle.
+// Default is 1 minute (60000ms).
+pref("places.frecency.updateIdleTime", 60000);
+
+// buckets (in days) for frecency calculation
+pref("places.frecency.firstBucketCutoff", 4);
+pref("places.frecency.secondBucketCutoff", 14);
+pref("places.frecency.thirdBucketCutoff", 31);
+pref("places.frecency.fourthBucketCutoff", 90);
+
+// weights for buckets for frecency calculations
+pref("places.frecency.firstBucketWeight", 100);
+pref("places.frecency.secondBucketWeight", 70);
+pref("places.frecency.thirdBucketWeight", 50);
+pref("places.frecency.fourthBucketWeight", 30);
+pref("places.frecency.defaultBucketWeight", 10);
+
+// bonus (in percent) for visit transition types for frecency calculations
+pref("places.frecency.embedVisitBonus", 0);
+pref("places.frecency.linkVisitBonus", 120);
+pref("places.frecency.typedVisitBonus", 200);
+pref("places.frecency.bookmarkVisitBonus", 140);
+pref("places.frecency.downloadVisitBonus", 0);
+pref("places.frecency.permRedirectVisitBonus", 0);
+pref("places.frecency.tempRedirectVisitBonus", 0);
+pref("places.frecency.defaultVisitBonus", 0);
+
+// bonus (in percent) for place types for frecency calculations
+pref("places.frecency.unvisitedBookmarkBonus", 140);
+pref("places.frecency.unvisitedTypedBonus", 200);
+
 // Controls behavior of the "Add Exception" dialog launched from SSL error pages
 // 0 - don't pre-populate anything
 // 1 - pre-populate site URL, but don't fetch certificate
 // 2 - pre-populate site URL and pre-fetch certificate
 pref("browser.ssl_override_behavior", 1);
 
 // replace newlines with spaces when pasting into <input type="text"> fields
 pref("editor.singleLine.pasteNewlines", 2);
 
+// The breakpad report server to link to in about:crashes
+pref("breakpad.reportURL", "http://crash-stats.mozilla.com/report/index/");
--- a/browser/app/splash.rc
+++ b/browser/app/splash.rc
@@ -63,21 +63,23 @@ END
 #define IDC_CELL                        4103
 #define IDC_COPY                        4104
 #define IDC_ALIAS                       4105
 #define IDC_ZOOMIN                      4106
 #define IDC_ZOOMOUT                     4107
 #define IDC_COLRESIZE                   4108
 #define IDC_ROWRESIZE                   4109
 #define IDC_VERTICALTEXT                4110
+#define IDC_NONE                        4112
 
 IDC_GRAB                CURSOR  DISCARDABLE     "../../widget/src/build/res/grab.cur"
 IDC_GRABBING            CURSOR  DISCARDABLE     "../../widget/src/build/res/grabbing.cur"
 IDC_CELL                CURSOR  DISCARDABLE     "../../widget/src/build/res/cell.cur"
 IDC_COPY                CURSOR  DISCARDABLE     "../../widget/src/build/res/copy.cur"
 IDC_ALIAS               CURSOR  DISCARDABLE     "../../widget/src/build/res/aliasb.cur"
 IDC_ZOOMIN              CURSOR  DISCARDABLE     "../../widget/src/build/res/zoom_in.cur"
 IDC_ZOOMOUT             CURSOR  DISCARDABLE     "../../widget/src/build/res/zoom_out.cur"
 IDC_COLRESIZE           CURSOR  DISCARDABLE     "../../widget/src/build/res/col_resize.cur"
 IDC_ROWRESIZE           CURSOR  DISCARDABLE     "../../widget/src/build/res/row_resize.cur"
 IDC_VERTICALTEXT        CURSOR  DISCARDABLE     "../../widget/src/build/res/vertical_text.cur"
+IDC_NONE                CURSOR  DISCARDABLE     "../../widget/src/build/res/none.cur"
 
 #endif
--- a/browser/app/splashos2.rc
+++ b/browser/app/splashos2.rc
@@ -66,12 +66,13 @@ POINTER IDC_CELL           "..\\..\\widg
 POINTER IDC_COPY           "..\\..\\widget\\src\\os2\\res\\copy.ptr"
 POINTER IDC_ALIAS          "..\\..\\widget\\src\\os2\\res\\aliasb.ptr"
 POINTER IDC_ZOOMIN         "..\\..\\widget\\src\\os2\\res\\zoom_in.ptr"
 POINTER IDC_ZOOMOUT        "..\\..\\widget\\src\\os2\\res\\zoom_out.ptr"
 
 POINTER IDC_ARROWWAIT      "..\\..\\widget\\src\\os2\\res\\arrow_wait.ptr"
 POINTER IDC_CROSS          "..\\..\\widget\\src\\os2\\res\\crosshair.ptr"
 POINTER IDC_HELP           "..\\..\\widget\\src\\os2\\res\\help.ptr"
+POINTER IDC_NONE           "..\\..\\widget\\src\\os2\\res\\none.ptr"
 
 ICON    IDC_DNDURL         "..\\..\\widget\\src\\os2\\res\\dndurl.ico"
 ICON    IDC_DNDTEXT        "..\\..\\widget\\src\\os2\\res\\dndtext.ico"
 #endif
--- a/browser/base/content/aboutDialog.css
+++ b/browser/base/content/aboutDialog.css
@@ -74,17 +74,17 @@
   margin-top: 0;
   -moz-margin-end: 0;
   margin-bottom: 10px;
   -moz-margin-start: 17px;
 }
 
 #copyright {
   margin-top: 0;
-  -moz-margin-end: 0;
+  -moz-margin-end: 16px;
   margin-bottom: 3px;
   -moz-margin-start: 16px;
 }
 
 button[dlgtype="extra2"] {
   -moz-margin-start: 13px;
 }
 
--- a/browser/base/content/aboutDialog.xul
+++ b/browser/base/content/aboutDialog.xul
@@ -70,17 +70,17 @@
     
   <script type="application/x-javascript" src="chrome://browser/content/aboutDialog.js"/>
 
   <deck id="modes" flex="1">
     <vbox flex="1" id="clientBox">
 #expand <label id="version" value="&aboutVersion; __MOZ_APP_VERSION__"/>
       <label id="distribution"/>
       <label id="distributionId"/>
-      <description id="copyright">&copyrightText;</description>
+      <description id="copyright">&copyrightInfo;</description>
       <textbox id="userAgent" multiline="true" readonly="true"/>
     </vbox>
     <vbox flex="1" id="creditsBox">
       <iframe id="creditsIframe" flex="1"/>
     </vbox>    
   </deck>
   <separator class="groove" id="groove"/>
 
new file mode 100644
--- /dev/null
+++ b/browser/base/content/bindings.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+
+# -*- Mode: HTML -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org browser.
+#
+# The Initial Developer of the Original Code is
+# Simon Bünzli <zeniko@gmail.com>
+# Portions created by the Initial Developer are Copyright (C) 2007 - 2008
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+<!DOCTYPE bindings SYSTEM "chrome://global/locale/global.dtd">
+
+<bindings xmlns="http://www.mozilla.org/xbl"
+  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+  xmlns:xbl="http://www.mozilla.org/xbl"
+>
+  <binding id="unified-back-forward-button-wrapper" display="xul:menu"
+           extends="chrome://global/content/bindings/toolbarbutton.xml#menu">
+    <content>
+      <children includes="toolbarbutton|observes|template|menupopup|tooltip"/>
+      <xul:dropmarker type="menu-button"
+        class="toolbarbutton-menubutton-dropmarker"
+        chromedir="&locale.dir;"
+        xbl:inherits="align,dir,pack,orient,disabled,toolbarmode,buttonstyle"
+      />
+    </content>
+
+    <implementation>
+      <constructor><![CDATA[
+        this._updateUnifiedState();
+      ]]></constructor>
+
+      <method name="_updateUnifiedState">
+        <body><![CDATA[
+          var canGoBack = !document.getElementById("Browser:Back").hasAttribute("disabled");
+          var canGoForward = !document.getElementById("Browser:Forward").hasAttribute("disabled");
+          
+          if (canGoBack || canGoForward)
+            this.removeAttribute("disabled");
+          else
+            this.setAttribute("disabled", "true");
+        ]]></body>
+      </method>
+    </implementation>
+
+    <handlers>
+      <!-- observing state changes of the child buttons -->
+      <handler event="broadcast" action="this._updateUnifiedState();"/>
+    </handlers>
+  </binding>
+</bindings>
--- a/browser/base/content/browser-context.inc
+++ b/browser/base/content/browser-context.inc
@@ -49,18 +49,18 @@
                 accesskey="&openLinkCmd.accesskey;"
                 oncommand="gContextMenu.openLink();"/>
       <menuitem id="context-openlinkintab"
                 label="&openLinkCmdInTab.label;"
                 accesskey="&openLinkCmdInTab.accesskey;"
                 oncommand="gContextMenu.openLinkInTab();"/>
       <menuseparator id="context-sep-open"/>
       <menuitem id="context-bookmarklink"
-                label="&bookmarkLinkCmd.label;"
-                accesskey="&bookmarkLinkCmd.accesskey;"
+                label="&bookmarkThisLinkCmd.label;"
+                accesskey="&bookmarkThisLinkCmd.accesskey;"
                 oncommand="gContextMenu.bookmarkLink();"/>
       <menuitem id="context-savelink"
                 label="&saveLinkCmd.label;"
                 accesskey="&saveLinkCmd.accesskey;"
                 oncommand="gContextMenu.saveLink();"/>
       <menuitem id="context-sendlink"
                 label="&sendLinkCmd.label;"
                 accesskey="&sendLinkCmd.accesskey;"
@@ -121,18 +121,18 @@
                 accesskey="&reloadCmd.accesskey;"
                 command="Browser:Reload"/>
       <menuitem id="context-stop"
                 label="&stopCmd.label;"
                 accesskey="&stopCmd.accesskey;"
                 command="Browser:Stop"/>
       <menuseparator id="context-sep-stop"/>
       <menuitem id="context-bookmarkpage"
-                label="&bookmarkPageCmd.label;"
-                accesskey="&bookmarkPageCmd.accesskey;"
+                label="&bookmarkPageCmd2.label;"
+                accesskey="&bookmarkPageCmd2.accesskey;"
                 oncommand="gContextMenu.bookmarkThisPage();"/>
       <menuitem id="context-savepage"
                 label="&savePageCmd.label;"
                 accesskey="&savePageCmd.accesskey2;"
                 oncommand="gContextMenu.savePageAs();"/>
       <menuitem id="context-sendpage"  
                 label="&sendPageCmd.label;" 
                 accesskey="&sendPageCmd.accesskey;" 
@@ -189,18 +189,18 @@
           <menuitem label="&openFrameCmdInTab.label;"
                     accesskey="&openFrameCmdInTab.accesskey;"
                     oncommand="gContextMenu.openFrameInTab();"/>
           <menuseparator/>
           <menuitem label="&reloadFrameCmd.label;"
                     accesskey="&reloadFrameCmd.accesskey;"
                     oncommand="gContextMenu.reloadFrame();"/>
           <menuseparator/>
-          <menuitem label="&bookmarkFrameCmd.label;"
-                    accesskey="&bookmarkFrameCmd.accesskey;"
+          <menuitem label="&bookmarkThisFrameCmd.label;"
+                    accesskey="&bookmarkThisFrameCmd.accesskey;"
                     oncommand="gContextMenu.addBookmarkForFrame();"/>
           <menuitem label="&saveFrameCmd.label;"
                     accesskey="&saveFrameCmd.accesskey;"
                     oncommand="saveDocument(gContextMenu.target.ownerDocument);"/>
           <menuseparator/>
           <menuitem label="&printFrameCmd.label;"
                     accesskey="&printFrameCmd.accesskey;"
                     oncommand="gContextMenu.printFrame();"/>
@@ -235,19 +235,19 @@
                 accesskey="&viewPageInfoCmd.accesskey;"
                 oncommand="gContextMenu.viewInfo();"/>
       <menuitem id="context-metadata"
                 label="&metadataCmd.label;"
                 accesskey="&metadataCmd.accesskey;"
                 oncommand="gContextMenu.showMetadata();"/>
       <menuseparator id="spell-separator"/>
       <menuitem id="spell-check-enabled"
-                label="&spellEnable.label;"
+                label="&spellCheckEnable.label;"
                 type="checkbox"
-                accesskey="&spellEnable.accesskey;"
+                accesskey="&spellCheckEnable.accesskey;"
                 oncommand="InlineSpellCheckerUI.toggleEnabled();"/>
 #ifndef MOZ_WIDGET_COCOA
       <menuitem id="spell-add-dictionaries-main"
                 label="&spellAddDictionaries.label;"
                 accesskey="&spellAddDictionaries.accesskey;"
                 oncommand="gContextMenu.addDictionaries();"/>
 #endif
       <menu id="spell-dictionaries"
--- a/browser/base/content/browser-menubar.inc
+++ b/browser/base/content/browser-menubar.inc
@@ -83,17 +83,19 @@
 #endif
 #endif
         oncommand="goQuitApplication();"/>
               </menupopup>
             </menu>
   
             <menu id="edit-menu" label="&editMenu.label;"
                   accesskey="&editMenu.accesskey;">
-              <menupopup id="menu_EditPopup">
+              <menupopup id="menu_EditPopup"
+                         onpopupshowing="updateEditUIVisibility()"
+                         onpopuphidden="updateEditUIVisibility()">
                 <menuitem label="&undoCmd.label;"
                           key="key_undo"
                           accesskey="&undoCmd.accesskey;"
                           command="cmd_undo"/>
                 <menuitem label="&redoCmd.label;"
                           key="key_redo"
                           accesskey="&redoCmd.accesskey;"
                           command="cmd_redo"/>
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -92,21 +92,18 @@ var PlacesCommandHook = {
       case "popuphidden":
         if (aEvent.originalTarget == this.panel) {
           gEditItemOverlay.uninitPanel(true);
           this._restoreCommandsState();
         }
         break;
       case "keypress":
         if (aEvent.keyCode == KeyEvent.DOM_VK_ESCAPE ||
-            aEvent.keyCode == KeyEvent.DOM_VK_RETURN) {
-          // focus the content area and hide the panel
-          window.content.focus();
-          this.panel.hidePopup();
-        }
+            aEvent.keyCode == KeyEvent.DOM_VK_RETURN)
+          this.panel.hidePopup(); // hide the panel
         break;
     }
   },
 
   _overlayLoaded: false,
   _overlayLoading: false,
   showEditBookmarkPopup:
   function PCH_showEditBookmarkPopup(aItemId, aAnchorElement, aPosition) {
@@ -203,17 +200,17 @@ var PlacesCommandHook = {
     }
 
     if (aShowEditUI) {
       // dock the panel to the star icon when possible, otherwise dock
       // it to the content area
       if (aBrowser.contentWindow == window.content) {
         var starIcon = aBrowser.ownerDocument.getElementById("star-button");
         if (starIcon && isElementVisible(starIcon)) {
-          this.showEditBookmarkPopup(itemId, starIcon, "after_start");
+          this.showEditBookmarkPopup(itemId, starIcon, "after_end");
           return;
         }
       }
       this.showEditBookmarkPopup(itemId, aBrowser, "overlap");
     }
   },
 
   /**
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -102,19 +102,17 @@
     <command id="Browser:Reload"  oncommand="if (event.shiftKey) BrowserReloadSkipCache(); else BrowserReload()" disabled="true"/>
     <command id="Browser:ReloadSkipCache"  oncommand="BrowserReloadSkipCache()" disabled="true"/>
     <command id="cmd_fullZoomReduce"  oncommand="FullZoom.reduce()"/>
     <command id="cmd_fullZoomEnlarge" oncommand="FullZoom.enlarge()"/>
     <command id="cmd_fullZoomReset"   oncommand="FullZoom.reset()"/>
     <command id="Browser:OpenLocation" oncommand="openLocation();"/>
 
     <command id="Tools:Search" oncommand="BrowserSearch.webSearch();"/>    
-    <command id="Tools:Downloads" oncommand="toOpenWindowByType('Download:Manager', 
-                                                                'chrome://mozapps/content/downloads/downloads.xul',
-                                                                'chrome,dialog=no,resizable');"/>
+    <command id="Tools:Downloads" oncommand="BrowserDownloadsUI();"/>
     <command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
     <command id="Tools:Sanitize"
      oncommand="Cc[GLUE_CID].getService(Ci.nsIBrowserGlue).sanitize(window || null);"/>
     <command id="History:UndoCloseTab" oncommand="undoCloseTab();"/>
   </commandset>
 
   <commandset id="placesCommands">
     <command id="Browser:ShowAllBookmarks"
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -18,16 +18,27 @@ toolbar[printpreview="true"] {
 #PopupAutoComplete {
   -moz-binding: url("chrome://browser/content/urlbarBindings.xml#browser-autocomplete-result-popup");
 }
 
 #PopupAutoCompleteRichResult {
   -moz-binding: url("chrome://browser/content/urlbarBindings.xml#urlbar-rich-result-popup");
 }
 
+/* ::::: Unified Back-/Forward Button ::::: */
+#unified-back-forward-button {
+  -moz-binding: url("chrome://browser/content/bindings.xml#unified-back-forward-button-wrapper");
+}
+#unified-back-forward-button > toolbarbutton > dropmarker {
+  display: none; /* we provide our own */
+}
+.unified-nav-current {
+  font-weight: bold;
+}
+
 menuitem.spell-suggestion {
   font-weight: bold;
 }
 
 #sidebar-box toolbarbutton.tabs-closebutton {
   -moz-user-focus: normal;
 }
 
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -53,16 +53,22 @@
 # use your version of this file under the terms of the MPL, indicate your
 # decision by deleting the provisions above and replace them with the notice
 # and other provisions required by the GPL or the LGPL. If you do not delete
 # the provisions above, a recipient may use your version of this file under
 # the terms of any one of the MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK *****
 
+let Ci = Components.interfaces;
+let Cu = Components.utils;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/DownloadUtils.jsm");
+Cu.import("resource://gre/modules/PluralForm.jsm");
+
 const kXULNS =
     "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
 
 const nsIWebNavigation = Components.interfaces.nsIWebNavigation;
 
 const MAX_HISTORY_MENU_ITEMS = 15;
 
 // bookmark dialog features
@@ -94,31 +100,36 @@ var gMustLoadSidebar = false;
 var gProgressMeterPanel = null;
 var gProgressCollapseTimer = null;
 var gPrefService = null;
 var appCore = null;
 var gBrowser = null;
 var gNavToolbox = null;
 var gSidebarCommand = "";
 var gInPrintPreviewMode = false;
+let gDownloadMgr = null;
 
 // Global variable that holds the nsContextMenu instance.
 var gContextMenu = null;
 
 var gChromeState = null; // chrome state before we went into print preview
 
 var gSanitizeListener = null;
 
 var gAutoHideTabbarPrefListener = null;
 var gBookmarkAllTabsHandler = null;
 
 #ifdef XP_MACOSX
 var gClickAndHoldTimer = null;
 #endif
 
+#ifndef XP_MACOSX
+var gEditUIVisible = true;
+#endif
+
 /**
 * We can avoid adding multiple load event listeners and save some time by adding
 * one listener that calls all real handlers.
 */
 
 function pageShowEventHandlers(event)
 {
   // Filter out events that are not about the document load we are interested in
@@ -165,16 +176,55 @@ function UpdateBackForwardCommands(aWebN
   if (forwardDisabled == aWebNavigation.canGoForward) {
     if (forwardDisabled)
       forwardBroadcaster.removeAttribute("disabled");
     else
       forwardBroadcaster.setAttribute("disabled", true);
   }
 }
 
+var UnifiedBackForwardButton = {
+  unify: function() {
+    var backButton = document.getElementById("back-button");
+    if (!backButton || !backButton.nextSibling || backButton.nextSibling.id != "forward-button")
+      return; // back and forward buttons aren't adjacent
+
+    var wrapper = document.createElement("toolbaritem");
+    wrapper.id = "unified-back-forward-button";
+    wrapper.className = "chromeclass-toolbar-additional";
+    wrapper.setAttribute("context", "backMenu");
+    
+    var toolbar = backButton.parentNode;
+    toolbar.insertBefore(wrapper, backButton);
+    
+    var forwardButton = backButton.nextSibling;
+    wrapper.appendChild(backButton);
+    wrapper.appendChild(forwardButton);
+    
+    var popup = backButton.getElementsByTagName("menupopup")[0].cloneNode(true);
+    wrapper.appendChild(popup);
+    
+    this._unified = true;
+  },
+
+  separate: function() {
+    if (!this._unified)
+      return;
+    
+    var wrapper = document.getElementById("unified-back-forward-button");
+    var toolbar = wrapper.parentNode;
+    
+    toolbar.insertBefore(wrapper.firstChild, wrapper); // Back button
+    toolbar.insertBefore(wrapper.firstChild, wrapper); // Forward button
+    toolbar.removeChild(wrapper);
+    
+    this._unified = false;
+  }
+};
+
 #ifdef XP_MACOSX
 /**
  * Click-and-Hold implementation for the Back and Forward buttons
  * XXXmano: should this live in toolbarbutton.xml?
  */
 function ClickAndHoldMouseDownCallback(aButton)
 {
   aButton.open = true;
@@ -884,17 +934,18 @@ function delayedStartup()
   var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
   os.addObserver(gSessionHistoryObserver, "browser:purge-session-history", false);
   os.addObserver(gXPInstallObserver, "xpinstall-install-blocked", false);
 
   if (!gPrefService)
     gPrefService = Components.classes["@mozilla.org/preferences-service;1"]
                              .getService(Components.interfaces.nsIPrefBranch2);
   BrowserOffline.init();
-  
+  OfflineApps.init();
+
   if (gURLBar && document.documentElement.getAttribute("chromehidden").indexOf("toolbar") != -1) {
     gURLBar.setAttribute("readonly", "true");
     gURLBar.setAttribute("enablehistory", "false");
   }
 
   gBrowser.addEventListener("pageshow", function(evt) { setTimeout(pageShowEventHandlers, 0, evt); }, true);
 
   window.addEventListener("keypress", ctrlNumberTabSelection, false);
@@ -903,16 +954,17 @@ function delayedStartup()
   Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
 
   if (gMustLoadSidebar) {
     var sidebar = document.getElementById("sidebar");
     var sidebarBox = document.getElementById("sidebar-box");
     sidebar.setAttribute("src", sidebarBox.getAttribute("src"));
   }
 
+  UnifiedBackForwardButton.unify();
   UpdateUrlbarSearchSplitterState();
   
   try {
     placesMigrationTasks();
   } catch(ex) {}
   initBookmarksToolbar();
   PlacesStarButton.init();
 
@@ -1044,23 +1096,43 @@ function delayedStartup()
   gBookmarkAllTabsHandler = new BookmarkAllTabsHandler();
 
   // Attach a listener to watch for "command" events bubbling up from error
   // pages.  This lets us fix bugs like 401575 which require error page UI to
   // do privileged things, without letting error pages have any privilege
   // themselves.
   gBrowser.addEventListener("command", BrowserOnCommand, false);
 
+  // Delayed initialization of the livemarks update timer.
+  // Livemark updates don't need to start until after bookmark UI 
+  // such as the toolbar has initialized. Starting 5 seconds after
+  // delayedStartup in order to stagger this before the download
+  // manager starts (see below).
+  setTimeout(function() PlacesUtils.livemarks.start(), 5000);
+
   // Initialize the download manager some time after the app starts so that
   // auto-resume downloads begin (such as after crashing or quitting with
   // active downloads) and speeds up the first-load of the download manager UI.
   // If the user manually opens the download manager before the timeout, the
   // downloads will start right away, and getting the service again won't hurt.
-  setTimeout(function() Cc["@mozilla.org/download-manager;1"].
-                        getService(Ci.nsIDownloadManager), 10000);
+  setTimeout(function() {
+    gDownloadMgr = Cc["@mozilla.org/download-manager;1"].
+                   getService(Ci.nsIDownloadManager);
+
+    // Initialize the downloads monitor panel listener
+    gDownloadMgr.addListener(DownloadMonitorPanel);
+    DownloadMonitorPanel.init();
+  }, 10000);
+
+#ifndef XP_MACOSX
+  updateEditUIVisibility();
+  let placesContext = document.getElementById("placesContext");
+  placesContext.addEventListener("popupshowing", updateEditUIVisibility, false);
+  placesContext.addEventListener("popuphiding", updateEditUIVisibility, false);
+#endif
 }
 
 function BrowserShutdown()
 {
   try {
     FullZoom.destroy();
   }
   catch(ex) {
@@ -1086,16 +1158,17 @@ function BrowserShutdown()
   } catch (ex) {
     Components.utils.reportError(ex);
   }
 
   if (gSanitizeListener)
     gSanitizeListener.shutdown();
 
   BrowserOffline.uninit();
+  OfflineApps.uninit();
 
   var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
   var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
   var enumerator = windowManagerInterface.getEnumerator(null);
   enumerator.getNext();
   if (!enumerator.hasMoreElements()) {
     document.persist("sidebar-box", "sidebarcommand");
     document.persist("sidebar-box", "width");
@@ -1264,23 +1337,25 @@ function ctrlNumberTabSelection(event)
     if (!(document.commandDispatcher.focusedElement instanceof HTMLAnchorElement)) {
       // Don't let winxp beep on ALT+ENTER, since the URL bar uses it.
       event.preventDefault();
       return;
     }
   }
 
 #ifdef XP_MACOSX
-  if (!event.metaKey)
+  // Mac: Cmd+number
+  if (!event.metaKey || event.ctrlKey || event.altKey || event.shiftKey)
 #else
 #ifdef XP_UNIX
-  // don't let tab selection clash with numeric accesskeys (bug 366084)
-  if (!event.altKey || event.shiftKey)
+  // Linux: Alt+number
+  if (!event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
 #else
-  if (!event.ctrlKey)
+  // Windows: Ctrl+number
+  if (!event.ctrlKey || event.metaKey || event.altKey || event.shiftKey)
 #endif
 #endif
     return;
 
   // \d in a RegExp will find any Unicode character with the "decimal digit"
   // property (Nd)
   var regExp = /\d/;
   if (!regExp.test(String.fromCharCode(event.charCode)))
@@ -1404,22 +1479,24 @@ function BrowserHandleShiftBackspace()
   case 1:
     goDoCommand("cmd_scrollPageDown");
     break;
   }
 }
 
 function BrowserBackMenu(event)
 {
-  return FillHistoryMenu(event.target, "back");
+  var menuType = UnifiedBackForwardButton._unified ? "unified" : "back";
+  return FillHistoryMenu(event.target, menuType);
 }
 
 function BrowserForwardMenu(event)
 {
-  return FillHistoryMenu(event.target, "forward");
+  var menuType = UnifiedBackForwardButton._unified ? "unified" : "forward";
+  return FillHistoryMenu(event.target, menuType);
 }
 
 function BrowserStop()
 {
   try {
     const stopFlags = nsIWebNavigation.STOP_ALL;
     getWebNavigation().stop(stopFlags);
   }
@@ -1491,23 +1568,30 @@ function loadOneOrMoreURIs(aURIString)
   // so that we don't disrupt startup
   try {
     gBrowser.loadTabs(aURIString.split("|"), false, true);
   } 
   catch (e) {
   }
 }
 
-function openLocation()
+function focusAndSelectUrlBar()
 {
   if (gURLBar && isElementVisible(gURLBar) && !gURLBar.readOnly) {
     gURLBar.focus();
     gURLBar.select();
+    return true;
+  }
+  return false;
+}
+
+function openLocation()
+{
+  if (focusAndSelectUrlBar())
     return;
-  }
 #ifdef XP_MACOSX
   if (window.location.href != getBrowserURL()) {
     var win = getTopWin();
     if (win) {
       // If there's an open browser window, it should handle this command
       win.focus()
       win.openLocation();
     }
@@ -1899,20 +1983,35 @@ function URLBarSetURI(aURI) {
 
     value = aURI.spec;
     if (value == "about:blank") {
       // Replace "about:blank" with an empty string
       // only if there's no opener (bug 370555).
       if (!content.opener)
         value = "";
     } else {
-      // try to decode as UTF-8
-      try {
-        value = decodeURI(value).replace(/%/g, "%25");
-      } catch(e) {}
+      // Try to decode as UTF-8 if there's no encoding sequence that we would break.
+      if (!/%25(?:3B|2F|3F|3A|40|26|3D|2B|24|2C|23)/i.test(value))
+        try {
+          value = decodeURI(value)
+                    // 1. decodeURI decodes %25 to %, which creates unintended
+                    //    encoding sequences. Re-encode it, unless it's part of
+                    //    a sequence that survived decodeURI, i.e. one for:
+                    //    ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '#'
+                    //    (RFC 3987 section 3.2)
+                    // 2. Re-encode whitespace so that it doesn't get eaten away
+                    //    by the location bar (bug 410726).
+                    .replace(/%(?!3B|2F|3F|3A|40|26|3D|2B|24|2C|23)|[\r\n\t]/ig,
+                             encodeURIComponent);
+        } catch (e) {}
+
+      // Encode bidirectional formatting characters.
+      // (RFC 3987 sections 3.2 and 4.1 paragraph 6)
+      value = value.replace(/[\u200e\u200f\u202a\u202b\u202c\u202d\u202e]/g,
+                            encodeURIComponent);
 
       state = "valid";
     }
   }
 
   gURLBar.value = value;
   SetPageProxyState(state);
 }
@@ -2872,45 +2971,77 @@ const BrowserSearch = {
 
 function FillHistoryMenu(aParent, aMenu)
   {
     // Remove old entries if any
     deleteHistoryItems(aParent);
 
     var webNav = getWebNavigation();
     var sessionHistory = webNav.sessionHistory;
+    var bundle_browser = document.getElementById("bundle_browser");
 
     var count = sessionHistory.count;
     var index = sessionHistory.index;
     var end;
     var j;
     var entry;
 
     switch (aMenu)
       {
         case "back":
           end = (index > MAX_HISTORY_MENU_ITEMS) ? index - MAX_HISTORY_MENU_ITEMS : 0;
           if ((index - 1) < end) return false;
           for (j = index - 1; j >= end; j--)
             {
               entry = sessionHistory.getEntryAtIndex(j, false);
               if (entry)
-                createMenuItem(aParent, j, entry.title);
+                createMenuItem(aParent, j, entry.title || entry.URI.spec,
+                               bundle_browser.getString("tabHistory.goBack"));
             }
           break;
         case "forward":
           end  = ((count-index) > MAX_HISTORY_MENU_ITEMS) ? index + MAX_HISTORY_MENU_ITEMS : count - 1;
           if ((index + 1) > end) return false;
           for (j = index + 1; j <= end; j++)
             {
               entry = sessionHistory.getEntryAtIndex(j, false);
               if (entry)
-                createMenuItem(aParent, j, entry.title);
+                createMenuItem(aParent, j, entry.title || entry.URI.spec,
+                               bundle_browser.getString("tabHistory.goForward"));
             }
           break;
+        case "unified":
+          if (count <= 1) // don't display the popup for a single item
+            return false;
+          
+          var half_length = Math.floor(MAX_HISTORY_MENU_ITEMS / 2);
+          var start = Math.max(index - half_length, 0);
+          end = Math.min(start == 0 ? MAX_HISTORY_MENU_ITEMS : index + half_length + 1, count);
+          if (end == count)
+            start = Math.max(count - MAX_HISTORY_MENU_ITEMS, 0);
+          
+          var tooltips = [
+            bundle_browser.getString("tabHistory.goBack"),
+            bundle_browser.getString("tabHistory.current"),
+            bundle_browser.getString("tabHistory.goForward")
+          ];
+          var classNames = ["unified-nav-back", "unified-nav-current", "unified-nav-forward"];
+          
+          for (var j = end - 1; j >= start; j--) {
+            entry = sessionHistory.getEntryAtIndex(j, false);
+            var tooltip = tooltips[j < index ? 0 : j == index ? 1 : 2];
+            var className = classNames[j < index ? 0 : j == index ? 1 : 2];
+            var item = createMenuItem(aParent, j, entry.title || entry.URI.spec, tooltip, className);
+            
+            if (j == index) { // mark the current history item
+              item.setAttribute("type", "radio");
+              item.setAttribute("checked", "true");
+            }
+          }
+          break;
       }
 
     return true;
   }
 
 function addToUrlbarHistory(aUrlToAdd)
 {
   if (!aUrlToAdd)
@@ -2922,22 +3053,26 @@ function addToUrlbarHistory(aUrlToAdd)
      if (aUrlToAdd.indexOf(" ") == -1) {
        PlacesUtils.markPageAsTyped(aUrlToAdd);
      }
    }
    catch(ex) {
    }
 }
 
-function createMenuItem( aParent, aIndex, aLabel)
+function createMenuItem(aParent, aIndex, aLabel, aTooltipText, aClassName)
   {
     var menuitem = document.createElement( "menuitem" );
     menuitem.setAttribute( "label", aLabel );
     menuitem.setAttribute( "index", aIndex );
-    aParent.appendChild( menuitem );
+    if (aTooltipText)
+      menuitem.setAttribute("tooltiptext", aTooltipText);
+    if (aClassName)
+      menuitem.className = aClassName;
+    return aParent.appendChild(menuitem);
   }
 
 function deleteHistoryItems(aParent)
 {
   var children = aParent.childNodes;
   for (var i = children.length - 1; i >= 0; --i)
     {
       var index = children[i].getAttribute("index");
@@ -2946,16 +3081,22 @@ function deleteHistoryItems(aParent)
     }
 }
 
 function toJavaScriptConsole()
 {
   toOpenWindowByType("global:console", "chrome://global/content/console.xul");
 }
 
+function BrowserDownloadsUI()
+{
+  Cc["@mozilla.org/download-manager-ui;1"].
+  getService(Ci.nsIDownloadManagerUI).show();
+}
+
 function toOpenWindowByType(inType, uri, features)
 {
   var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
   var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
   var topWindow = windowManagerInterface.getMostRecentWindow(inType);
 
   if (topWindow)
     topWindow.focus();
@@ -3020,16 +3161,18 @@ function BrowserCustomizeToolbar()
   // Disable the toolbar context menu items
   var menubar = document.getElementById("main-menubar");
   for (var i = 0; i < menubar.childNodes.length; ++i)
     menubar.childNodes[i].setAttribute("disabled", true);
 
   var cmd = document.getElementById("cmd_CustomizeToolbars");
   cmd.setAttribute("disabled", "true");
 
+  UnifiedBackForwardButton.separate();
+
   var splitter = document.getElementById("urlbar-search-splitter");
   if (splitter)
     splitter.parentNode.removeChild(splitter);
 
 #ifdef TOOLBAR_CUSTOMIZATION_SHEET
   var sheetFrame = document.getElementById("customizeToolbarSheetIFrame");
   sheetFrame.hidden = false;
   // XXXmano: there's apparently no better way to get this when the iframe is
@@ -3056,18 +3199,23 @@ function BrowserToolboxCustomizeDone(aTo
   if (aToolboxChanged) {
     gURLBar = document.getElementById("urlbar");
     gProxyButton = document.getElementById("page-proxy-button");
     gProxyFavIcon = document.getElementById("page-proxy-favicon");
     gProxyDeck = document.getElementById("page-proxy-deck");
     gHomeButton.updateTooltip();
     gIdentityHandler._cacheElements();
     window.XULBrowserWindow.init();
+
+#ifndef XP_MACOSX
+  updateEditUIVisibility();
+#endif
   }
 
+  UnifiedBackForwardButton.unify();
   UpdateUrlbarSearchSplitterState();
 
   // Update the urlbar
   if (gURLBar) {
     URLBarSetURI();
     XULBrowserWindow.asyncUpdateUI();
     PlacesStarButton.updateState();
   }
@@ -3096,16 +3244,77 @@ function BrowserToolboxCustomizeDone(aTo
   initBookmarksToolbar();
 
 #ifndef TOOLBAR_CUSTOMIZATION_SHEET
   // XXX Shouldn't have to do this, but I do
   window.focus();
 #endif
 }
 
+/**
+ * Update the global flag that tracks whether or not any edit UI (the Edit menu,
+ * edit-related items in the context menu, and edit-related toolbar buttons
+ * is visible, then update the edit commands' enabled state accordingly.  We use
+ * this flag to skip updating the edit commands on focus or selection changes
+ * when no UI is visible to improve performance (including pageload performance,
+ * since focus changes when you load a new page).
+ *
+ * If UI is visible, we use goUpdateGlobalEditMenuItems to set the commands'
+ * enabled state so the UI will reflect it appropriately.
+ * 
+ * If the UI isn't visible, we enable all edit commands so keyboard shortcuts
+ * still work and just lazily disable them as needed when the user presses a
+ * shortcut.
+ *
+ * This doesn't work on Mac, since Mac menus flash when users press their
+ * keyboard shortcuts, so edit UI is essentially always visible on the Mac,
+ * and we need to always update the edit commands.  Thus on Mac this function
+ * is a no op.
+ */
+function updateEditUIVisibility()
+{
+#ifndef XP_MACOSX
+  let editMenuPopupState = document.getElementById("menu_EditPopup").state;
+  let contextMenuPopupState = document.getElementById("contentAreaContextMenu").state;
+  let placesContextMenuPopupState = document.getElementById("placesContext").state;
+
+  // The UI is visible if the Edit menu is opening or open, if the context menu
+  // is open, or if the toolbar has been customized to include the Cut, Copy,
+  // or Paste toolbar buttons.
+  gEditUIVisible = editMenuPopupState == "showing" ||
+                   editMenuPopupState == "open" ||
+                   contextMenuPopupState == "showing" ||
+                   contextMenuPopupState == "open" ||
+                   placesContextMenuPopupState == "showing" ||
+                   placesContextMenuPopupState == "open" ||
+                   document.getElementById("cut-button") ||
+                   document.getElementById("copy-button") ||
+                   document.getElementById("paste-button") ? true : false;
+
+  // If UI is visible, update the edit commands' enabled state to reflect
+  // whether or not they are actually enabled for the current focus/selection.
+  if (gEditUIVisible)
+    goUpdateGlobalEditMenuItems();
+
+  // Otherwise, enable all commands, so that keyboard shortcuts still work,
+  // then lazily determine their actual enabled state when the user presses
+  // a keyboard shortcut.
+  else {
+    goSetCommandEnabled("cmd_undo", true);
+    goSetCommandEnabled("cmd_redo", true);
+    goSetCommandEnabled("cmd_cut", true);
+    goSetCommandEnabled("cmd_copy", true);
+    goSetCommandEnabled("cmd_paste", true);
+    goSetCommandEnabled("cmd_selectAll", true);
+    goSetCommandEnabled("cmd_delete", true);
+    goSetCommandEnabled("cmd_switchTextDirection", true);
+  }
+#endif
+}
+
 var FullScreen =
 {
   toggle: function()
   {
     // show/hide all menubars, toolbars, and statusbars (except the full screen toolbar)
     this.showXULChrome("toolbar", window.fullScreen);
     this.showXULChrome("statusbar", window.fullScreen);
     document.getElementById("fullScreenItem").setAttribute("checked", !window.fullScreen);
@@ -3274,17 +3483,20 @@ nsBrowserStatusHandler.prototype =
   setDefaultStatus : function(status)
   {
     this.defaultStatus = status;
     this.updateStatusField();
   },
 
   setOverLink : function(link, b)
   {
-    this.overLink = link;
+    // Encode bidirectional formatting characters.
+    // (RFC 3987 sections 3.2 and 4.1 paragraph 6)
+    this.overLink = link.replace(/[\u200e\u200f\u202a\u202b\u202c\u202d\u202e]/g,
+                                 encodeURIComponent);
     this.updateStatusField();
   },
 
   updateStatusField : function()
   {
     var text = this.overLink || this.status || this.jsStatus || this.jsDefaultStatus || this.defaultStatus;
 
     // check the current value so we don't trigger an attribute change
@@ -3358,16 +3570,21 @@ nsBrowserStatusHandler.prototype =
     else if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
       if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
         if (aWebProgress.DOMWindow == content) {
           if (aRequest)
             this.endDocumentLoad(aRequest, aStatus);
           var browser = gBrowser.mCurrentBrowser;
           if (!gBrowser.mTabbedMode && !browser.mIconURL)
             gBrowser.useDefaultIcon(gBrowser.mCurrentTab);
+
+          if (Components.isSuccessCode(aStatus) &&
+              content.document.documentElement.getAttribute("manifest")) {
+            OfflineApps.offlineAppRequested(content);
+          }
         }
       }
 
       // This (thanks to the filter) is a network stop or the last
       // request stop outside of loading the document, stop throbbers
       // and progress bars and such
       if (aRequest) {
         var msg = "";
@@ -4816,16 +5033,127 @@ var BrowserOffline = {
     var offlineLocked = gPrefService.prefIsLocked("network.online");
     if (offlineLocked)
       this._uiElement.setAttribute("disabled", "true");
 
     this._uiElement.setAttribute("checked", aOffline);
   }
 };
 
+var OfflineApps = {
+  /////////////////////////////////////////////////////////////////////////////
+  // OfflineApps Public Methods
+  init: function ()
+  {
+    // XXX: empty init left as a placeholder for patch in bug 397417
+  },
+
+  uninit: function ()
+  {
+    // XXX: empty uninit left as a placeholder for patch in bug 397417
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // OfflineApps Implementation Methods
+
+  // XXX: _getBrowserWindowForContentWindow and _getBrowserForContentWindow
+  // were taken from browser/components/feeds/src/WebContentConverter.
+  _getBrowserWindowForContentWindow: function(aContentWindow) {
+    return aContentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+                         .getInterface(Ci.nsIWebNavigation)
+                         .QueryInterface(Ci.nsIDocShellTreeItem)
+                         .rootTreeItem
+                         .QueryInterface(Ci.nsIInterfaceRequestor)
+                         .getInterface(Ci.nsIDOMWindow)
+                         .wrappedJSObject;
+  },
+
+  _getBrowserForContentWindow: function(aBrowserWindow, aContentWindow) {
+    // This depends on pseudo APIs of browser.js and tabbrowser.xml
+    aContentWindow = aContentWindow.top;
+    var browsers = aBrowserWindow.getBrowser().browsers;
+    for (var i = 0; i < browsers.length; ++i) {
+      if (browsers[i].contentWindow == aContentWindow)
+        return browsers[i];
+    }
+  },
+
+  offlineAppRequested: function(aContentWindow) {
+    var browserWindow = this._getBrowserWindowForContentWindow(aContentWindow);
+    var browser = this._getBrowserForContentWindow(browserWindow,
+                                                   aContentWindow);
+
+    var currentURI = browser.webNavigation.currentURI;
+    var pm = Cc["@mozilla.org/permissionmanager;1"].
+             getService(Ci.nsIPermissionManager);
+
+    // don't bother showing UI if the user has already made a decision
+    if (pm.testExactPermission(currentURI, "offline-app") !=
+        Ci.nsIPermissionManager.UNKNOWN_ACTION)
+      return;
+
+    try {
+      if (gPrefService.getBoolPref("offline-apps.allow_by_default")) {
+        // all pages can use offline capabilities, no need to ask the user
+        return;
+      }
+    } catch(e) {
+      // this pref isn't set by default, ignore failures
+    }
+
+    var notificationBox = gBrowser.getNotificationBox(browser);
+    var notification = notificationBox.getNotificationWithValue("offline-app-requested");
+    if (!notification) {
+      var bundle_browser = document.getElementById("bundle_browser");
+
+      var buttons = [{
+        label: bundle_browser.getString("offlineApps.allow"),
+        accessKey: bundle_browser.getString("offlineApps.allowAccessKey"),
+        callback: function() { OfflineApps.allowSite(); }
+      }];
+
+      const priority = notificationBox.PRIORITY_INFO_LOW;
+      var message = bundle_browser.getFormattedString("offlineApps.available",
+                                                      [ currentURI.host ]);
+      notificationBox.appendNotification(message, "offline-app-requested",
+                                         "chrome://browser/skin/Info.png",
+                                         priority, buttons);
+    }
+  },
+
+  allowSite: function() {
+    var currentURI = gBrowser.selectedBrowser.webNavigation.currentURI;
+    var pm = Cc["@mozilla.org/permissionmanager;1"].
+             getService(Ci.nsIPermissionManager);
+    pm.add(currentURI, "offline-app", Ci.nsIPermissionManager.ALLOW_ACTION);
+
+    // When a site is enabled while loading, <link rel="offline-resource">
+    // resources will start fetching immediately.  This one time we need to
+    // do it ourselves.
+    this._startFetching();
+  },
+
+  _startFetching: function() {
+    var manifest = content.document.documentElement.getAttribute("manifest");
+    if (!manifest)
+      return;
+
+    var ios = Cc["@mozilla.org/network/io-service;1"].
+              getService(Ci.nsIIOService);
+
+    var contentURI = ios.newURI(content.location.href, null, null);
+    var manifestURI = ios.newURI(manifest, content.document.characterSet,
+                                 contentURI);
+
+    var updateService = Cc["@mozilla.org/offlinecacheupdate-service;1"].
+                        getService(Ci.nsIOfflineCacheUpdateService);
+    updateService.scheduleUpdate(manifestURI, contentURI);
+  }
+};
+
 function WindowIsClosing()
 {
   var browser = getBrowser();
   var cn = browser.tabContainer.childNodes;
   var numtabs = cn.length;
   var reallyClose = true;
 
   for (var i = 0; reallyClose && i < numtabs; ++i) {
@@ -5738,26 +6066,33 @@ IdentityHandler.prototype = {
       body = this._stringBundle.getString("identity.unknown.body");
     }
     
     // Push the appropriate strings out to the UI
     this._identityPopupContent.textContent = body;
     this._identityPopupContentSupp.textContent = supplemental;
     this._identityPopupContentVerif.textContent = verifier;
   },
-  
+
+  hideIdentityPopup : function() {
+    this._identityPopup.hidePopup();
+  },
+
   /**
    * Click handler for the identity-box element in primary chrome.  
    */
-  handleIdentityClick : function(event) {
+  handleIdentityButtonEvent : function(event) {
+  
     event.stopPropagation();
-
-    if (event.button != 0)
-      return; // We only want left-clicks
-        
+ 
+    if ((event.type == "click" && event.button != 0) ||
+        (event.type == "keypress" && event.charCode != KeyEvent.DOM_VK_SPACE &&
+         event.keyCode != KeyEvent.DOM_VK_RETURN))
+      return; // Left click, space or enter only
+
     // Make sure that the display:none style we set in xul is removed now that
     // the popup is actually needed
     this._identityPopup.hidden = false;
     
     // Tell the popup to consume dismiss clicks, to avoid bug 395314
     this._identityPopup.popupBoxObject
         .setConsumeRollupEvent(Ci.nsIPopupBoxObject.ROLLUP_CONSUME);
     
@@ -5775,8 +6110,115 @@ var gIdentityHandler;
  * Returns the singleton instance of the identity handler class.  Should always be
  * used instead of referencing the global variable directly or creating new instances
  */
 function getIdentityHandler() {
   if (!gIdentityHandler)
     gIdentityHandler = new IdentityHandler();
   return gIdentityHandler;    
 }
+
+let DownloadMonitorPanel = {
+  //////////////////////////////////////////////////////////////////////////////
+  //// DownloadMonitorPanel Member Variables
+
+  _panel: null,
+  _activeStr: null,
+  _pausedStr: null,
+  _lastTime: Infinity,
+
+  //////////////////////////////////////////////////////////////////////////////
+  //// DownloadMonitorPanel Public Methods
+
+  /**
+   * Initialize the status panel and member variables
+   */
+  init: function DMP_init() {
+    // Initialize "private" member variables
+    this._panel = document.getElementById("download-monitor");
+
+    // Cache the status strings
+    let (bundle = document.getElementById("bundle_browser")) {
+      this._activeStr = bundle.getString("activeDownloads");
+      this._pausedStr = bundle.getString("pausedDownloads");
+    }
+
+    this.updateStatus();
+  },
+
+  /**
+   * Update status based on the number of active and paused downloads
+   */
+  updateStatus: function DMP_updateStatus() {
+    let numActive = gDownloadMgr.activeDownloadCount;
+
+    // Hide the panel and reset the "last time" if there's no downloads
+    if (numActive == 0) {
+      this._panel.hidden = true;
+      this._lastTime = Infinity;
+
+      return;
+    }
+  
+    // Find the download with the longest remaining time
+    let numPaused = 0;
+    let maxTime = -Infinity;
+    let dls = gDownloadMgr.activeDownloads;
+    while (dls.hasMoreElements()) {
+      let dl = dls.getNext().QueryInterface(Ci.nsIDownload);
+      if (dl.state == gDownloadMgr.DOWNLOAD_DOWNLOADING) {
+        // Figure out if this download takes longer
+        if (dl.speed > 0 && dl.size > 0)
+          maxTime = Math.max(maxTime, (dl.size - dl.amountTransferred) / dl.speed);
+        else
+          maxTime = -1;
+      }
+      else if (dl.state == gDownloadMgr.DOWNLOAD_PAUSED)
+        numPaused++;
+    }
+
+    // Get the remaining time string and last sec for time estimation
+    let timeLeft;
+    [timeLeft, this._lastSec] = DownloadUtils.getTimeLeft(maxTime, this._lastSec);
+
+    // Figure out how many downloads are currently downloading
+    let numDls = numActive - numPaused;
+    let status = this._activeStr;
+
+    // If all downloads are paused, show the paused message instead
+    if (numDls == 0) {
+      numDls = numPaused;
+      status = this._pausedStr;
+    }
+
+    // Get the correct plural form and insert the number of downloads and time
+    // left message if necessary
+    status = PluralForm.get(numDls, status);
+    status = status.replace("#1", numDls);
+    status = status.replace("#2", timeLeft);
+
+    // Update the panel and show it
+    this._panel.label = status;
+    this._panel.hidden = false;
+  },
+
+  //////////////////////////////////////////////////////////////////////////////
+  //// nsIDownloadProgressListener
+
+  /**
+   * Update status for download progress changes
+   */
+  onProgressChange: function() {
+    this.updateStatus();
+  },
+
+  /**
+   * Update status for download state changes
+   */
+  onDownloadStateChange: function() {
+    this.updateStatus();
+  },
+
+  //////////////////////////////////////////////////////////////////////////////
+  //// nsISupports
+
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIDownloadProgressListener]),
+};
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -101,17 +101,18 @@
 
     <!-- for search and content formfill/pw manager -->
     <panel type="autocomplete" chromedir="&locale.dir;" id="PopupAutoComplete" noautofocus="true" hidden="true"/>
 
     <!-- for url bar autocomplete -->
     <panel type="autocomplete-richlistbox" chromedir="&locale.dir;" id="PopupAutoCompleteRichResult" noautofocus="true" hidden="true"/>
 
     <panel id="editBookmarkPanel" orient="vertical" hidden="true"
-           onpopupshown="PlacesCommandHook.editBookmarkPanelShown();">
+           onpopupshown="PlacesCommandHook.editBookmarkPanelShown();"
+           label="&bookmarkPageCmd2.label;">
       <vbox id="editBookmarkPanelContent" flex="1"/>
       <hbox flex="1">
         <spacer flex="1"/>
         <button id="editBookmarkPanelDeleteButton"
                 label="&editBookmark.delete.label;"
                 oncommand="PlacesCommandHook.deleteButtonOnCommand();"/>
         <button id="editBookmarkPanelDoneButton"
                 label="&editBookmark.done.label;"
@@ -132,46 +133,49 @@
            onpopupshowing="gPopupBlockerObserver.fillPopupList(event);">
       <menuitem observes="blockedPopupAllowSite"/>
       <menuitem observes="blockedPopupEditSettings"/>
       <menuitem observes="blockedPopupDontShowMessage"/>
       <menuseparator observes="blockedPopupsSeparator"/>
     </popup>
 
     <popup id="contentAreaContextMenu"
-           onpopupshowing="if (event.target != this) return true; gContextMenu = new nsContextMenu(this, window.getBrowser()); return gContextMenu.shouldDisplay;"
-           onpopuphiding="if (event.target == this) { gContextMenu = null; }">
+           onpopupshowing="if (event.target != this) return true; updateEditUIVisibility(); gContextMenu = new nsContextMenu(this, window.getBrowser()); return gContextMenu.shouldDisplay;"
+           onpopuphiding="if (event.target == this) { gContextMenu = null; updateEditUIVisibility(); }">
 #include browser-context.inc
     </popup>
 
     <popup id="placesContext"/>
 
     <!-- Popup for site identity information -->
-    <panel id="identity-popup" position="after_start" hidden="true" noautofocus="true">
+    <panel id="identity-popup" position="after_start" hidden="true" noautofocus="true"
+           onpopupshown="document.getElementById('identity-popup-more-info-link').focus();"
+           onpopuphidden="focusAndSelectUrlBar();" norestorefocus="true">
       <hbox id="identity-popup-container" align="top">
         <image id="identity-popup-icon"/>
         <vbox id="identity-popup-content-box">
           <!-- Title Bar -->
-          <label id="identity-popup-title"/>
+          <label id="identity-popup-title" control="identity-popup"/>
           <!-- Content area -->
           <description id="identity-popup-content"/>
           <description id="identity-popup-content-supplemental"/>
           <description id="identity-popup-content-verifier"/>
           <hbox id="identity-popup-encryption" flex="1">
             <vbox>
               <image id="identity-popup-encryption-icon"/>
               <spacer flex="1"/>
             </vbox>
             <description id="identity-popup-encryption-label" flex="1"/>
           </hbox>
           <spacer flex="1"/>
           <!-- Footer link to page info -->
           <label id="identity-popup-more-info-link"
                  class="text-link plain"
                  value="&identity.moreInfoLinkText;"
+                 onblur="getIdentityHandler().hideIdentityPopup();"
                  onclick="getIdentityHandler().handleMoreInfoClick(event);"/>
         </vbox>
       </hbox>
     </panel>
 
     <tooltip id="urlTooltip">
       <label crop="center" flex="1"/>
     </tooltip>
@@ -264,18 +268,19 @@
                  maxrows="10"
                  newlines="stripsurroundingwhitespace"
                  oninput="URLBarOnInput(event);"
                  ontextentered="return handleURLBarCommand(param);"
                  ontextreverted="return handleURLBarRevert();"
                  pageproxystate="invalid">
           <!-- Use onclick instead of normal popup= syntax since the popup
                code fires onmousedown, and hence eats our favicon drag events -->
-          <box id="identity-box"
-               onclick="getIdentityHandler().handleIdentityClick(event);">
+          <box id="identity-box" role="button"
+               onclick="getIdentityHandler().handleIdentityButtonEvent(event);"
+               onkeypress="getIdentityHandler().handleIdentityButtonEvent(event);">
             <hbox align="center">
               <deck id="page-proxy-deck" onclick="PageProxyClickHandler(event);">
                 <image id="page-proxy-button"
                        ondraggesture="PageProxyDragGesture(event);"
                        tooltiptext="&proxyIcon.tooltip;"/>
                 <image id="page-proxy-favicon" validate="never"
                        ondraggesture="PageProxyDragGesture(event);"
                        onload="this.parentNode.selectedIndex = 1;
@@ -460,16 +465,19 @@
   </panel>
 #endif
 
   <findbar browserid="content" id="FindToolbar"/>
 
   <statusbar class="chromeclass-status" id="status-bar"
              ondragdrop="nsDragAndDrop.drop(event, contentAreaDNDObserver);">
     <statusbarpanel id="statusbar-display" label="" flex="1"/>
+    <statusbarpanel id="download-monitor" class="statusbarpanel-iconic-text"
+                    tooltiptext="&downloadMonitor.tooltip;" hidden="true"
+                    ondblclick="doCommand();" command="Tools:Downloads"/>
     <statusbarpanel class="statusbarpanel-progress" collapsed="true" id="statusbar-progresspanel">
       <progressmeter class="progressmeter-statusbar" id="statusbar-icon" mode="normal" value="0"/>
     </statusbarpanel>
     <statusbarpanel id="security-button" class="statusbarpanel-iconic-text"
                     ondblclick="if (event.button == 0) displaySecurityInfo();"/>
     <statusbarpanel id="page-report-button" type="menu"
                     class="statusbarpanel-menu-iconic"
                     tooltiptext="&pageReportIcon.tooltip;">
--- a/browser/base/content/credits.xhtml
+++ b/browser/base/content/credits.xhtml
@@ -459,17 +459,17 @@
             <li>Radiant Core</li>
             <li>silverorange</li>
             <li>Revver</li>
             <li></li>
             <li>MozillaZine Community</li>
           </ul>
         </div>
 
-        <p id="gecko" class="center">&credit.poweredByGecko;&reg;</p>
+        <p id="gecko" class="center">&credit.poweredByGeckoReg;</p>
 
         <p class="footnote">
           &brandFullName;&trade; &license.part0; &copy;1998-2008 &license.part1;
           <a href="" link="about:credits" onclick="visitLink(event);">&license.contrib;</a>,
           &license.part2;
           <a href="" link="about:license" onclick="visitLink(event);">about:license</a>
           &license.part3;</p>
 
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -78,16 +78,21 @@ function nsContextMenu(aXulMenu, aBrowse
   this.inFrame           = false;
   this.hasBGImage        = false;
   this.isTextSelected    = false;
   this.isContentSelected = false;
   this.inDirList         = false;
   this.shouldDisplay     = true;
   this.isDesignMode      = false;
   this.possibleSpellChecking = false;
+  this.ellipsis = "\u2026";
+  try {
+    this.ellipsis = gPrefService.getComplexValue("intl.ellipsis",
+                                                 Ci.nsIPrefLocalizedString).data;
+  } catch (e) { }
 
   // Initialize new menu.
   this.initMenu(aXulMenu, aBrowser);
 }
 
 // Prototype for nsContextMenu "class."
 nsContextMenu.prototype = {
   // onDestroy is a no-op at this point.
@@ -244,17 +249,17 @@ nsContextMenu.prototype = {
       var hostLabel = "";
       try {
         hostLabel = uri.host;
       } catch (ex) { }
 
       if (hostLabel) {
         var shortenedUriHost = hostLabel.replace(/^www\./i,"");
         if (shortenedUriHost.length > 15)
-          shortenedUriHost = shortenedUriHost.substr(0,15) + "...";
+          shortenedUriHost = shortenedUriHost.substr(0,15) + this.ellipsis;
         blockImage.label = gNavigatorBundle.getFormattedString("blockImages", [shortenedUriHost]);
 
         if (this.isImageBlocked())
           blockImage.setAttribute("checked", "true");
         else
           blockImage.removeAttribute("checked");
       }
     }
@@ -834,19 +839,20 @@ nsContextMenu.prototype = {
   },
 
   toggleImageBlocking: function(aBlock) {
     var permissionmanager = Cc["@mozilla.org/permissionmanager;1"].
                             getService(Ci.nsIPermissionManager);
 
     var uri = this.target.QueryInterface(Ci.nsIImageLoadingContent).currentURI;
 
-    permissionmanager.add(uri, "image",
-                          aBlock ? Ci.nsIPermissionManager.DENY_ACTION :
-                                   Ci.nsIPermissionManager.ALLOW_ACTION);
+    if (aBlock)
+      permissionmanager.add(uri, "image", Ci.nsIPermissionManager.DENY_ACTION);
+    else
+      permissionmanager.remove(uri.host, "image");
 
     var brandBundle = document.getElementById("bundle_brand");
     var app = brandBundle.getString("brandShortName");
     var bundle_browser = document.getElementById("bundle_browser");
     var message = bundle_browser.getFormattedString(aBlock ?
      "imageBlockedWarning" : "imageAllowedWarning", [app, uri.host]);
 
     var notificationBox = this.browser.getNotificationBox();
@@ -1030,17 +1036,17 @@ nsContextMenu.prototype = {
     // Get 16 characters, so that we can trim the selection if it's greater
     // than 15 chars
     var selectedText = getBrowserSelection(16);
 
     if (!selectedText)
       return false;
 
     if (selectedText.length > 15)
-      selectedText = selectedText.substr(0,15) + "...";
+      selectedText = selectedText.substr(0,15) + this.ellipsis;
 
     // Use the current engine if the search bar is visible, the default
     // engine otherwise.
     var engineName = "";
     var ss = Cc["@mozilla.org/browser/search-service;1"].
              getService(Ci.nsIBrowserSearchService);
     if (isElementVisible(BrowserSearch.searchBar))
       engineName = ss.currentEngine.name;
--- a/browser/base/content/pageinfo/pageInfo.js
+++ b/browser/base/content/pageinfo/pageInfo.js
@@ -818,107 +818,97 @@ function onImageSelect()
     makePreview(tree.view.selection.currentIndex);
   }
 }
 
 function makePreview(row)
 {
   var imageTree = document.getElementById("imagetree");
   var item = getSelectedImage(imageTree);
-  var col = imageTree.columns["image-address"];
-  var url = gImageView.getCellText(row, col);
-  // image-bg
+  var url = gImageView.data[row][COL_IMAGE_ADDRESS];
   var isBG = gImageView.data[row][COL_IMAGE_BG];
 
   setItemValue("imageurltext", url);
 
-  if (item.hasAttribute("title"))
-    setItemValue("imagetitletext", item.title);
-  else
-    setItemValue("imagetitletext", null);
-
-  if (item.hasAttribute("longDesc"))
-    setItemValue("imagelongdesctext", item.longDesc);
-  else
-    setItemValue("imagelongdesctext", null);
+  var imageText;
+  if (!isBG &&
+#ifdef MOZ_SVG
+      !(item instanceof SVGImageElement) &&
+#endif
+      !(gDocument instanceof ImageDocument)) {
+    imageText = item.title || item.alt;
 
-  if (item.hasAttribute("alt"))
-    setItemValue("imagealttext", item.alt);
-  else if (item instanceof HTMLImageElement || isBG)
-    setItemValue("imagealttext", null);
-  else
-    setItemValue("imagealttext", getValueText(item));
+    if (!imageText && !(item instanceof HTMLImageElement))
+      imageText = getValueText(item);
+  }
+  setItemValue("imagetext", imageText);
 
-#ifdef MOZ_SVG
-  if (item instanceof SVGImageElement) {
-    setItemValue("imagetitletext", null);
-    setItemValue("imagelongdesctext", null);
-    setItemValue("imagealttext", null);
-  }
-#endif
+  setItemValue("imagelongdesctext", item.longDesc);
 
   // get cache info
-  var sourceText = gBundle.getString("generalNotCached");
   var cacheKey = url.replace(/#.*$/, "");
   try {
     // open for READ, in non-blocking mode
     var cacheEntryDescriptor = httpCacheSession.openCacheEntry(cacheKey, ACCESS_READ, false);
-    if (cacheEntryDescriptor)
-      switch (cacheEntryDescriptor.deviceID) {
-        case "disk":
-          sourceText = gBundle.getString("generalDiskCache");
-          break;
-        case "memory":
-          sourceText = gBundle.getString("generalMemoryCache");
-          break;
-        default:
-          sourceText = cacheEntryDescriptor.deviceID;
-          break;
-      }
   }
   catch(ex) {
     try {
       // open for READ, in non-blocking mode
       cacheEntryDescriptor = ftpCacheSession.openCacheEntry(cacheKey, ACCESS_READ, false);
-      if (cacheEntryDescriptor)
-        switch (cacheEntryDescriptor.deviceID) {
-          case "disk":
-            sourceText = gBundle.getString("generalDiskCache");
-            break;
-          case "memory":
-            sourceText = gBundle.getString("generalMemoryCache");
-            break;
-          default:
-            sourceText = cacheEntryDescriptor.deviceID;
-            break;
-        }
     }
     catch(ex2) { }
   }
-  setItemValue("imagesourcetext", sourceText);
 
   // find out the file size
   var sizeText;
   if (cacheEntryDescriptor) {
-    var pageSize = cacheEntryDescriptor.dataSize;
-    var kbSize = Math.round(pageSize / 1024 * 100) / 100;
+    var imageSize = cacheEntryDescriptor.dataSize;
+    var kbSize = Math.round(imageSize / 1024 * 100) / 100;
     sizeText = gBundle.getFormattedString("generalSize",
-                                          [formatNumber(kbSize), formatNumber(pageSize)]);
+                                          [formatNumber(kbSize), formatNumber(imageSize)]);
   }
+  else
+    sizeText = gBundle.getString("mediaUnknownNotCached");
   setItemValue("imagesizetext", sizeText);
 
   var mimeType;
+  var numFrames = 1;
   if (item instanceof HTMLObjectElement ||
       item instanceof HTMLEmbedElement ||
       item instanceof HTMLLinkElement)
     mimeType = item.type;
+
+  if (!mimeType && item instanceof nsIImageLoadingContent) {
+    var imageRequest = item.getRequest(nsIImageLoadingContent.CURRENT_REQUEST);
+    if (imageRequest) {
+      mimeType = imageRequest.mimeType;
+      var image = imageRequest.image;
+      if (image)
+        numFrames = image.numFrames;
+    }
+  }
   if (!mimeType)
-    mimeType = getContentTypeFromImgRequest(item) ||
-               getContentTypeFromHeaders(cacheEntryDescriptor);
+    mimeType = getContentTypeFromHeaders(cacheEntryDescriptor);
 
+  if (mimeType) {
+    // We found the type, try to display it nicely
+    var imageMimeType = /^image\/(.*)/.exec(mimeType);
+    if (imageMimeType) {
+      mimeType = imageMimeType[1].toUpperCase();
+      if (numFrames > 1)
+        mimeType = gBundle.getFormattedString("mediaAnimatedImageType",
+                                              [mimeType, numFrames]);
+      else
+        mimeType = gBundle.getFormattedString("mediaImageType", [mimeType]);
+    }
+  }
+  else {
+    // We couldn't find the type, fall back to the value in the treeview
+    mimeType = gImageView.data[row][COL_IMAGE_TYPE];
+  }
   setItemValue("imagetypetext", mimeType);
 
   var imageContainer = document.getElementById("theimagecontainer");
   var oldImage = document.getElementById("thepreviewimage");
 
   const regex = /^(https?|ftp|file|gopher|about|chrome|resource):/;
   var isProtocolAllowed = regex.test(url);
   if (/^data:/.test(url) && /^image\//.test(mimeType))
@@ -969,28 +959,31 @@ function makePreview(row)
   else {
     // fallback image for protocols not allowed (e.g., data: or javascript:)
     // or elements not [yet] handled (e.g., object, embed).
     document.getElementById("brokenimagecontainer").collapsed = false;
     document.getElementById("theimagecontainer").collapsed = true;
   }
 
   var imageSize = "";
-  if (url)
-    imageSize = gBundle.getFormattedString("mediaSize",
-                                           [formatNumber(width),
-                                           formatNumber(height)]);
-  setItemValue("imageSize", imageSize);
-
-  var physSize = "";
-  if (width != physWidth || height != physHeight)
-    physSize = gBundle.getFormattedString("mediaSize",
-                                          [formatNumber(physWidth),
-                                           formatNumber(physHeight)]);
-  setItemValue("physSize", physSize);
+  if (url) {
+    if (width != physWidth || height != physHeight) {
+      imageSize = gBundle.getFormattedString("mediaDimensionsScaled",
+                                             [formatNumber(physWidth),
+                                              formatNumber(physHeight),
+                                              formatNumber(width),
+                                              formatNumber(height)]);
+    }
+    else {
+      imageSize = gBundle.getFormattedString("mediaDimensions",
+                                             [formatNumber(width),
+                                              formatNumber(height)]);
+    }
+  }
+  setItemValue("imagedimensiontext", imageSize);
 
   makeBlockImage(url);
 
   imageContainer.removeChild(oldImage);
   imageContainer.appendChild(newImage);
 }
 
 function makeBlockImage(url)
@@ -1042,31 +1035,16 @@ function getContentTypeFromHeaders(cache
 {
   if (!cacheEntryDescriptor)
     return null;
 
   return (/^Content-Type:\s*(.*?)\s*(?:\;|$)/mi
           .exec(cacheEntryDescriptor.getMetaDataElement("response-head")))[1];
 }
 
-function getContentTypeFromImgRequest(item)
-{
-  var httpRequest;
-
-  try {
-    var imageItem = item.QueryInterface(nsIImageLoadingContent);
-    var imageRequest = imageItem.getRequest(nsIImageLoadingContent.CURRENT_REQUEST);
-    if (imageRequest)
-      httpRequest = imageRequest.mimeType;
-  }
-  catch (ex) { } // This never happened.  ;)
-
-  return httpRequest;
-}
-
 //******** Other Misc Stuff
 // Modified from the Links Panel v2.3, http://segment7.net/mozilla/links/links.html
 // parse a node to extract the contents of the node
 function getValueText(node)
 {
   var valueText = "";
 
   // form input elements don't generally contain information that is useful to our callers, so return nothing
--- a/browser/base/content/pageinfo/pageInfo.xul
+++ b/browser/base/content/pageinfo/pageInfo.xul
@@ -227,67 +227,52 @@
           <splitter class="tree-splitter"/>
           <treecol sortSeparators="true" hidden="true" persist="hidden width" flex="1"
                         width="1"  id="image-count"    label="&mediaCount;"/>
         </treecols>
         <treechildren flex="1"/>
       </tree>
       <splitter orient="vertical" id="mediaSplitter"/>
       <vbox flex="1" id="mediaPreviewBox" collapsed="true">
-        <grid>
+        <grid id="mediaGrid">
           <columns>
-            <column/>
+            <column id="mediaLabelColumn"/>
             <column class="gridSeparator"/>
             <column flex="1"/>
           </columns>
           <rows>
             <row>
-              <label control="imageurltext" value="&mediaURL;"/>
+              <label control="imageurltext" value="&mediaLocation;"/>
               <separator/>
               <textbox readonly="true" id="imageurltext"/>
             </row>
             <row>
-              <label control="imagetitletext" value="&mediaTitle;"/>
-              <separator/>
-              <textbox readonly="true" id="imagetitletext"/>
-            </row>
-            <row>
-              <label control="imagealttext" value="&mediaAlt;"/>
-              <separator/>
-              <textbox readonly="true" id="imagealttext"/>
-            </row>
-            <row>
-              <label control="imagelongdesctext" value="&mediaLongdesc;"/>
-              <separator/>
-              <textbox readonly="true" id="imagelongdesctext"/>
-            </row>
-            <row>
               <label control="imagetypetext" value="&generalType;"/>
               <separator/>
               <textbox readonly="true" id="imagetypetext"/>
             </row>
             <row>
-              <label control="imagesourcetext" value="&generalSource;"/>
-              <separator/>
-              <textbox readonly="true" id="imagesourcetext"/>
-            </row>
-            <row>
               <label control="imagesizetext" value="&generalSize;"/>
               <separator/>
               <textbox readonly="true" id="imagesizetext"/>
             </row>
             <row>
-              <label control="imageSize" value="&mediaDimensions;"/>
+              <label control="imagedimensiontext" value="&mediaDimension;"/>
               <separator/>
-              <textbox readonly="true" id="imageSize"/>
+              <textbox readonly="true" id="imagedimensiontext"/>
             </row>
             <row>
-              <label control="physSize" value="&mediaPhysDimensions;"/>
+              <label control="imagetext" value="&mediaText;"/>
               <separator/>
-              <textbox readonly="true" id="physSize"/>
+              <textbox readonly="true" id="imagetext"/>
+            </row>
+            <row>
+              <label control="imagelongdesctext" value="&mediaLongdesc;"/>
+              <separator/>
+              <textbox readonly="true" id="imagelongdesctext"/>
             </row>
           </rows>
         </grid>
         <hbox align="end">
           <vbox>
             <checkbox id="blockImage" hidden="true" oncommand="onBlockImage()"
                       accesskey="&mediaBlockImage.accesskey;"/>
             <label control="thepreviewimage" value="&mediaPreview;" class="header"/>
--- a/browser/base/content/sanitize.js
+++ b/browser/base/content/sanitize.js
@@ -118,16 +118,38 @@ Sanitizer.prototype = {
       },
       
       get canClear()
       {
         return true;
       }
     },
     
+    offlineApps: {
+      clear: function ()
+      {
+        const Cc = Components.classes;
+        const Ci = Components.interfaces;
+        var cacheService = Cc["@mozilla.org/network/cache-service;1"].
+                           getService(Ci.nsICacheService);
+        try {
+          cacheService.evictEntries(Ci.nsICache.STORE_OFFLINE);
+        } catch(er) {}
+
+        var storageManagerService = Cc["@mozilla.org/dom/storagemanager;1"].
+                                    getService(Ci.nsIDOMStorageManager);
+        storageManagerService.clearOfflineApps();
+      },
+
+      get canClear()
+      {
+          return true;
+      }
+    },
+
     history: {
       clear: function ()
       {
         var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
                                       .getService(Components.interfaces.nsIBrowserHistory);
         globalHistory.removeAllPages();
         
         try {
--- a/browser/base/content/sanitize.xul
+++ b/browser/base/content/sanitize.xul
@@ -119,16 +119,17 @@
 
     <preferences id="sanitizePreferences">
       <preference id="privacy.item.history"               name="privacy.item.history"               type="bool" readonly="true"/>
       <preference id="privacy.item.formdata"              name="privacy.item.formdata"              type="bool" readonly="true"/>
       <preference id="privacy.item.passwords"             name="privacy.item.passwords"             type="bool" readonly="true"/>
       <preference id="privacy.item.downloads"             name="privacy.item.downloads"             type="bool" readonly="true"/>
       <preference id="privacy.item.cookies"               name="privacy.item.cookies"               type="bool" readonly="true"/>
       <preference id="privacy.item.cache"                 name="privacy.item.cache"                 type="bool" readonly="true"/>
+      <preference id="privacy.item.offlineApps"           name="privacy.item.offlineApps"           type="bool"/>
       <preference id="privacy.item.sessions"              name="privacy.item.sessions"              type="bool" readonly="true"/>
     </preferences>
 
     <description>&sanitizeItems.label;</description>
 
     <checkbox label="&itemHistory.label;"
               accesskey="&itemHistory.accesskey;"
               preference="privacy.item.history"
@@ -144,16 +145,20 @@
     <checkbox label="&itemCache.label;"
               accesskey="&itemCache.accesskey;"
               preference="privacy.item.cache"
               onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
     <checkbox label="&itemCookies.label;"
               accesskey="&itemCookies.accesskey;"
               preference="privacy.item.cookies"
               onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
+    <checkbox label="&itemOfflineApps.label;"
+              accesskey="&itemOfflineApps.accesskey;"
+              preference="privacy.item.offlineApps"
+              onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
     <checkbox label="&itemPasswords.label;"
               accesskey="&itemPasswords.accesskey;"
               preference="privacy.item.passwords"
               onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
     <checkbox label="&itemSessions.label;"
               accesskey="&itemSessions.accesskey;"
               preference="privacy.item.sessions"
               onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -87,18 +87,18 @@
                           tbattr="tabbrowser-multiple"
                           oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
                                      tabbrowser.reloadAllTabs(tabbrowser.mContextTab);"/>
             <xul:menuitem label="&closeOtherTabs.label;" accesskey="&closeOtherTabs.accesskey;"
                           tbattr="tabbrowser-multiple"
                           oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
                                      tabbrowser.removeAllTabsBut(tabbrowser.mContextTab);"/>
             <xul:menuseparator/>
-            <xul:menuitem label="&bookmarkCurTab.label;"
-                          accesskey="&bookmarkCurTab.accesskey;"
+            <xul:menuitem label="&bookmarkThisTab.label;"
+                          accesskey="&bookmarkThisTab.accesskey;"
                           oncommand="BookmarkThisTab();"/>
             <xul:menuitem label="&bookmarkAllTabs.label;"
                           accesskey="&bookmarkAllTabs.accesskey;"
                           command="Browser:BookmarkAllTabs"/>
             <xul:menuitem label="&undoCloseTab.label;"
                           accesskey="&undoCloseTab.accesskey;"
                           command="History:UndoCloseTab"
                           anonid="undoCloseTabMenuItem"/>
@@ -2123,19 +2123,20 @@
       </method>
 
       <!-- throws exception for unknown schemes -->
       <method name="loadURIWithFlags">
         <parameter name="aURI"/>
         <parameter name="aFlags"/>
         <parameter name="aReferrerURI"/>
         <parameter name="aCharset"/>
+        <parameter name="aPostData"/>
         <body>
           <![CDATA[
-            return this.mCurrentBrowser.loadURIWithFlags(aURI, aFlags, aReferrerURI, aCharset);
+            return this.mCurrentBrowser.loadURIWithFlags(aURI, aFlags, aReferrerURI, aCharset, aPostData);
           ]]>
         </body>
       </method>
 
       <method name="goHome">
         <body>
           <![CDATA[
             return this.mCurrentBrowser.goHome();
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -8,16 +8,17 @@ browser.jar:
 #endif
 %  overlay chrome://global/content/viewSource.xul chrome://browser/content/viewSourceOverlay.xul
 %  overlay chrome://global/content/viewPartialSource.xul chrome://browser/content/viewSourceOverlay.xul
 %  style chrome://global/content/customizeToolbar.xul chrome://browser/content/browser.css
 %  style chrome://global/content/customizeToolbar.xul chrome://browser/skin/
 *       content/browser/aboutDialog.xul               (content/aboutDialog.xul)
 *       content/browser/aboutDialog.js                (content/aboutDialog.js)
         content/browser/aboutDialog.css               (content/aboutDialog.css)
+*       content/browser/bindings.xml                  (content/bindings.xml)
 *       content/browser/browser.css                   (content/browser.css)
 *       content/browser/browser.js                    (content/browser.js)
 *       content/browser/browser.xul                   (content/browser.xul)
 *       content/browser/credits.xhtml                 (content/credits.xhtml)
 *       content/browser/EULA.js                       (content/EULA.js)
 *       content/browser/EULA.xhtml                    (content/EULA.xhtml)
 *       content/browser/EULA.xul                      (content/EULA.xul)
 *       content/browser/metaData.js                   (content/metaData.js)
--- a/browser/branding/unofficial/Makefile.in
+++ b/browser/branding/unofficial/Makefile.in
@@ -15,17 +15,17 @@ DIRS = \
 	locales \
 	$(NULL)
 
 PREF_JS_EXPORTS = $(srcdir)/pref/firefox-branding.js
 
 include $(topsrcdir)/config/rules.mk
 
 BROWSER_APP_FILES = \
-	default.xpm \
+	default16.png \
 	mozicon128.png \
 	mozicon16.xpm \
 	mozicon50.xpm \
 	firefox.ico \
 	document.ico \
 	$(NULL)
 
 export::
deleted file mode 100644
--- a/browser/branding/unofficial/default.xpm
+++ /dev/null
@@ -1,1144 +0,0 @@
-/* XPM */
-static char * mozicon50_xpm[] = {
-"48 48 1093 2",
-"  	c None",
-". 	c #2099CF",
-"+ 	c #2CA7D9",
-"@ 	c #33AEDD",
-"# 	c #34B2E1",
-"$ 	c #35B8E5",
-"% 	c #2FBAE8",
-"& 	c #26B5E4",
-"* 	c #199FD6",
-"= 	c #177DB8",
-"- 	c #2C8FC4",
-"; 	c #43A0CE",
-"> 	c #55ADD6",
-", 	c #5CB5DD",
-"' 	c #61C4E8",
-") 	c #63CBED",
-"! 	c #64CFF1",
-"~ 	c #63D1F2",
-"{ 	c #5ECCEF",
-"] 	c #57C3E9",
-"^ 	c #4EB8E1",
-"/ 	c #3CABD9",
-"( 	c #2A9ED1",
-"_ 	c #1991C9",
-": 	c #0F7CBA",
-"< 	c #166EAC",
-"[ 	c #3387BC",
-"} 	c #4797C6",
-"| 	c #51A0CC",
-"1 	c #56A7D2",
-"2 	c #5BAED7",
-"3 	c #60B6DD",
-"4 	c #67CDEE",
-"5 	c #69D3F2",
-"6 	c #6BD4F4",
-"7 	c #69D3F4",
-"8 	c #63CDEF",
-"9 	c #5AC0E6",
-"0 	c #51B6DF",
-"a 	c #49ACD8",
-"b 	c #42A2D1",
-"c 	c #3898CA",
-"d 	c #298CC2",
-"e 	c #167EB9",
-"f 	c #0B5A9C",
-"g 	c #2674AE",
-"h 	c #3D87BA",
-"i 	c #4590C0",
-"j 	c #4B97C6",
-"k 	c #519FCB",
-"l 	c #58A6D1",
-"m 	c #5DADD5",
-"n 	c #62B3DA",
-"o 	c #69C3E6",
-"p 	c #6ED4F2",
-"q 	c #6FD6F4",
-"r 	c #6ED5F4",
-"s 	c #6AD3F2",
-"t 	c #5FC3E7",
-"u 	c #53B2DC",
-"v 	c #4BA8D5",
-"w 	c #439FCE",
-"x 	c #3B95C7",
-"y 	c #338BC0",
-"z 	c #2B82B9",
-"A 	c #1D76B1",
-"B 	c #0C69A9",
-"C 	c #10599A",
-"D 	c #2D71AA",
-"E 	c #377CB2",
-"F 	c #3D84B8",
-"G 	c #458DBE",
-"H 	c #4B95C4",
-"I 	c #529CC9",
-"J 	c #59A4CF",
-"K 	c #5FABD4",
-"L 	c #65B1D8",
-"M 	c #6BC2E4",
-"N 	c #71D5F3",
-"O 	c #73D6F3",
-"P 	c #72D5F3",
-"Q 	c #6DD1F0",
-"R 	c #5FBBE2",
-"S 	c #54ADD8",
-"T 	c #4CA4D2",
-"U 	c #439ACB",
-"V 	c #3B91C4",
-"W 	c #3487BD",
-"X 	c #2D7EB7",
-"Y 	c #2675AF",
-"Z 	c #1E6CA9",
-"` 	c #0F5FA0",
-" .	c #055296",
-"..	c #115394",
-"+.	c #2767A2",
-"@.	c #2F70A9",
-"#.	c #3679AF",
-"$.	c #3C81B5",
-"%.	c #448ABC",
-"&.	c #4A92C2",
-"*.	c #519AC7",
-"=.	c #58A2CD",
-"-.	c #5FA9D2",
-";.	c #65B0D7",
-">.	c #6EC8E9",
-",.	c #74D4F2",
-"'.	c #76D6F3",
-").	c #75D6F3",
-"!.	c #71D3F1",
-"~.	c #62BCE1",
-"{.	c #54A9D5",
-"].	c #4C9FCE",
-"^.	c #4396C8",
-"/.	c #3B8CC1",
-"(.	c #3483BA",
-"_.	c #2C7AB3",
-":.	c #2670AC",
-"<.	c #1F68A6",
-"[.	c #195F9F",
-"}.	c #0D5497",
-"|.	c #04488D",
-"1.	c #0F4A8D",
-"2.	c #1F5A98",
-"3.	c #2663A0",
-"4.	c #2D6DA6",
-"5.	c #3475AD",
-"6.	c #3B7EB3",
-"7.	c #4287B9",
-"8.	c #4990C1",
-"9.	c #51A4CF",
-"0.	c #569FCA",
-"a.	c #5DA6CF",
-"b.	c #66B5DB",
-"c.	c #6FD1F0",
-"d.	c #75D4F1",
-"e.	c #79D5F2",
-"f.	c #75D3F1",
-"g.	c #63BBE0",
-"h.	c #54A4D1",
-"i.	c #4B9BCB",
-"j.	c #4391C4",
-"k.	c #3B88BD",
-"l.	c #337FB6",
-"m.	c #2C76B0",
-"n.	c #266CA9",
-"o.	c #1F64A3",
-"p.	c #1A5B9C",
-"q.	c #145396",
-"r.	c #0A498E",
-"s.	c #034C8F",
-"t.	c #085293",
-"u.	c #164D8E",
-"v.	c #1D5695",
-"w.	c #24609C",
-"x.	c #2A69A3",
-"y.	c #3271AA",
-"z.	c #387AAF",
-"A.	c #429FCC",
-"B.	c #4CBFE4",
-"C.	c #52C4E8",
-"D.	c #57AFD7",
-"E.	c #5DB3DA",
-"F.	c #65C5E7",
-"G.	c #6DD0EE",
-"H.	c #72D2EF",
-"I.	c #78D4F0",
-"J.	c #7BD5F1",
-"K.	c #76D2EF",
-"L.	c #6AC5E6",
-"M.	c #55A5D1",
-"N.	c #4A95C6",
-"O.	c #428CC0",
-"P.	c #3A83B9",
-"Q.	c #337AB3",
-"R.	c #2C71AD",
-"S.	c #2568A6",
-"T.	c #1F5F9F",
-"U.	c #1D65A3",
-"V.	c #269ACA",
-"W.	c #1C84BA",
-"X.	c #0D7DB5",
-"Y.	c #0298CC",
-"Z.	c #0296CA",
-"`.	c #0C5998",
-" +	c #14498A",
-".+	c #1B609C",
-"++	c #2498C8",
-"@+	c #2977AF",
-"#+	c #2F75AC",
-"$+	c #3575AC",
-"%+	c #40ABD5",
-"&+	c #49BFE4",
-"*+	c #50C3E7",
-"=+	c #56C5E8",
-"-+	c #5DC8EA",
-";+	c #63CBEB",
-">+	c #69CEED",
-",+	c #6ED0EE",
-"'+	c #73D2EF",
-")+	c #77D3EF",
-"!+	c #72CEEC",
-"~+	c #5AA7D1",
-"{+	c #4F99C9",
-"]+	c #4891C3",
-"^+	c #4087BC",
-"/+	c #387EB5",
-"(+	c #3277B1",
-"_+	c #2B70AB",
-":+	c #2463A2",
-"<+	c #1E5B9C",
-"[+	c #185395",
-"}+	c #165496",
-"|+	c #10498D",
-"1+	c #105F9E",
-"2+	c #0A9ECF",
-"3+	c #0088C0",
-"4+	c #038DC3",
-"5+	c #0A4A8C",
-"6+	c #114E8E",
-"7+	c #1989BD",
-"8+	c #22AAD7",
-"9+	c #28A2D0",
-"0+	c #2C71A9",
-"a+	c #3380B5",
-"b+	c #3EB9E1",
-"c+	c #45BDE3",
-"d+	c #4CC0E5",
-"e+	c #53C3E7",
-"f+	c #59C6E8",
-"g+	c #5EC9EA",
-"h+	c #64CBEB",
-"i+	c #69CDEC",
-"j+	c #6ECFED",
-"k+	c #70D0ED",
-"l+	c #64BDE1",
-"m+	c #55A6D1",
-"n+	c #3D82B8",
-"o+	c #3D8BBE",
-"p+	c #49AFD8",
-"q+	c #378DBF",
-"r+	c #225F9E",
-"s+	c #1D5698",
-"t+	c #174E92",
-"u+	c #12468B",
-"v+	c #0E3F85",
-"w+	c #115F9D",
-"x+	c #15A2D1",
-"y+	c #0395C9",
-"z+	c #0088C1",
-"A+	c #0190C6",
-"B+	c #079ACC",
-"C+	c #0FA0D0",
-"D+	c #169ECF",
-"E+	c #1D99CC",
-"F+	c #25AAD7",
-"G+	c #2BA0CE",
-"H+	c #32AED8",
-"I+	c #3AB7DF",
-"J+	c #41BBE1",
-"K+	c #47BEE3",
-"L+	c #4EC1E5",
-"M+	c #53C4E7",
-"N+	c #5FC8E9",
-"O+	c #63CAEA",
-"P+	c #67CBEB",
-"Q+	c #69CBEA",
-"R+	c #62BCE0",
-"S+	c #5AAFD7",
-"T+	c #478DBF",
-"U+	c #4084B9",
-"V+	c #3A7CB4",
-"W+	c #3E8CBF",
-"X+	c #4DBADF",
-"Y+	c #3383B8",
-"Z+	c #215B9B",
-"`+	c #1B5295",
-" @	c #164A8E",
-".@	c #114288",
-"+@	c #0D3A82",
-"@@	c #0E4C8E",
-"#@	c #1380B7",
-"$@	c #0D96C9",
-"%@	c #0089C1",
-"&@	c #007BB8",
-"*@	c #0085BE",
-"=@	c #008CC4",
-"-@	c #0496C9",
-";@	c #0B9DCF",
-">@	c #1168AB",
-",@	c #174F99",
-"'@	c #21AAD7",
-")@	c #28AED9",
-"!@	c #2FB1DB",
-"~@	c #36B5DE",
-"{@	c #3CB8E0",
-"]@	c #42BBE2",
-"^@	c #49BEE4",
-"/@	c #54C3E6",
-"(@	c #59C5E7",
-"_@	c #5DC7E8",
-":@	c #5FC5E7",
-"<@	c #53A9D3",
-"[@	c #4B96C6",
-"}@	c #478FC2",
-"|@	c #4186BB",
-"1@	c #3C7FB5",
-"2@	c #3676AF",
-"3@	c #306EA9",
-"4@	c #3889BD",
-"5@	c #44AFD8",
-"6@	c #2F84B9",
-"7@	c #194D91",
-"8@	c #15458A",
-"9@	c #144D90",
-"0@	c #0C367E",
-"a@	c #0C4086",
-"b@	c #1797C8",
-"c@	c #1295C8",
-"d@	c #0487C0",
-"e@	c #0079B6",
-"f@	c #0081BC",
-"g@	c #0E9ACC",
-"h@	c #1597CA",
-"i@	c #1CA7D5",
-"j@	c #23ABD8",
-"k@	c #2AAFDA",
-"l@	c #31B2DC",
-"m@	c #37B5DE",
-"n@	c #3DB8E0",
-"o@	c #43BBE2",
-"p@	c #49BEE3",
-"q@	c #4EC0E4",
-"r@	c #53C2E5",
-"s@	c #57C4E6",
-"t@	c #4EAAD4",
-"u@	c #4696C5",
-"v@	c #438FC0",
-"w@	c #4088BC",
-"x@	c #3C80B6",
-"y@	c #3778B1",
-"z@	c #3270AB",
-"A@	c #2C68A5",
-"B@	c #3D9AC8",
-"C@	c #46BADF",
-"D@	c #3DB0D8",
-"E@	c #287CB2",
-"F@	c #164D90",
-"G@	c #299ECC",
-"H@	c #1B79B0",
-"I@	c #1A8CBF",
-"J@	c #199BCC",
-"K@	c #1392C6",
-"L@	c #0A86BE",
-"M@	c #0079B7",
-"N@	c #006AAC",
-"O@	c #0074B3",
-"P@	c #007CB9",
-"Q@	c #0083BE",
-"R@	c #008BC2",
-"S@	c #0393C8",
-"T@	c #099CCD",
-"U@	c #10A1D1",
-"V@	c #17A4D3",
-"W@	c #1EA8D6",
-"X@	c #25ABD8",
-"Y@	c #2BAFDA",
-"Z@	c #37B5DD",
-"`@	c #3DB8DF",
-" #	c #42BAE1",
-".#	c #48BCE2",
-"+#	c #4CBEE3",
-"@#	c #50C0E4",
-"##	c #48A8D3",
-"$#	c #3F8EC0",
-"%#	c #3C87BC",
-"&#	c #3A81B7",
-"*#	c #3679B1",
-"=#	c #3171AC",
-"-#	c #2D6AA6",
-";#	c #2862A0",
-">#	c #40A5D1",
-",#	c #43B8DE",
-"'#	c #3DB5DC",
-")#	c #38B1DA",
-"!#	c #2D9ECC",
-"~#	c #2B9FCE",
-"{#	c #246AAA",
-"]#	c #1F96C7",
-"^#	c #1996C9",
-"/#	c #138DC3",
-"(#	c #0E84BC",
-"_#	c #0175B4",
-":#	c #0068AC",
-"<#	c #0070B1",
-"[#	c #0077B5",
-"}#	c #007FBA",
-"|#	c #0086BF",
-"1#	c #018DC4",
-"2#	c #0596C9",
-"3#	c #0B9DCE",
-"4#	c #12A1D1",
-"5#	c #1897C8",
-"6#	c #1E96C7",
-"7#	c #25A0CE",
-"8#	c #2B90C2",
-"9#	c #31A4D0",
-"0#	c #37B4DD",
-"a#	c #3CB7DF",
-"b#	c #41B9E0",
-"c#	c #45BBE0",
-"d#	c #49BCE1",
-"e#	c #4BBBE0",
-"f#	c #419FCC",
-"g#	c #3C91C2",
-"h#	c #337AB1",
-"i#	c #3072AC",
-"j#	c #2C6BA7",
-"k#	c #2864A1",
-"l#	c #255F9E",
-"m#	c #3FAAD4",
-"n#	c #40B6DC",
-"o#	c #3AB3DB",
-"p#	c #35B0D8",
-"q#	c #2F86BD",
-"r#	c #29599F",
-"s#	c #237DB7",
-"t#	c #1E99CA",
-"u#	c #1892C5",
-"v#	c #1389C0",
-"w#	c #0E7FBA",
-"x#	c #0473B2",
-"y#	c #0065AA",
-"z#	c #0064A9",
-"A#	c #006BAD",
-"B#	c #0072B2",
-"C#	c #0080BC",
-"D#	c #0082BC",
-"E#	c #028DC4",
-"F#	c #0796C9",
-"G#	c #0D88BD",
-"H#	c #1372AB",
-"I#	c #1982B8",
-"J#	c #1F79B0",
-"K#	c #247BB1",
-"L#	c #2A86B9",
-"M#	c #31B1DA",
-"N#	c #36B3DC",
-"O#	c #3AB5DD",
-"P#	c #3FB7DE",
-"Q#	c #42B9DF",
-"R#	c #45BAE0",
-"S#	c #48BBE0",
-"T#	c #47B6DD",
-"U#	c #3689BC",
-"V#	c #2D72AB",
-"W#	c #2C73AC",
-"X#	c #2F7DB3",
-"Y#	c #399BC9",
-"Z#	c #3FB4DB",
-"`#	c #3CB3DA",
-" $	c #37B0D9",
-".$	c #32AED7",
-"+$	c #2CA8D3",
-"@$	c #277EB8",
-"#$	c #229CCC",
-"$$	c #1D95C8",
-"%$	c #188DC2",
-"&$	c #1384BD",
-"*$	c #0D7AB6",
-"=$	c #066FB0",
-"-$	c #0057A0",
-";$	c #005FA5",
-">$	c #0066AA",
-",$	c #006DAF",
-"'$	c #006EAC",
-")$	c #004C8E",
-"!$	c #005595",
-"~$	c #025999",
-"{$	c #085D9B",
-"]$	c #0D64A0",
-"^$	c #1369A4",
-"/$	c #196EA7",
-"($	c #1E73AA",
-"_$	c #2376AD",
-":$	c #2AA0CE",
-"<$	c #2FAFD9",
-"[$	c #34B1DB",
-"}$	c #38B3DC",
-"|$	c #3BB5DC",
-"1$	c #3EB6DD",
-"2$	c #40B7DD",
-"3$	c #42B7DD",
-"4$	c #43B7DE",
-"5$	c #43B7DD",
-"6$	c #40B5DC",
-"7$	c #3DB4DB",
-"8$	c #3AB2DA",
-"9$	c #33AED6",
-"0$	c #2EABD5",
-"a$	c #29A5D2",
-"b$	c #259ECD",
-"c$	c #2094C6",
-"d$	c #1C8DC2",
-"e$	c #1787BE",
-"f$	c #127EB9",
-"g$	c #0D75B3",
-"h$	c #076AAC",
-"i$	c #005FA6",
-"j$	c #00539D",
-"k$	c #005AA2",
-"l$	c #0060A6",
-"m$	c #0068AB",
-"n$	c #0063A5",
-"o$	c #004487",
-"p$	c #004386",
-"q$	c #004789",
-"r$	c #004B8D",
-"s$	c #045192",
-"t$	c #095997",
-"u$	c #0E5F9C",
-"v$	c #1365A0",
-"w$	c #1869A4",
-"x$	c #1D6EA7",
-"y$	c #2274AB",
-"z$	c #28A6D2",
-"A$	c #2DAED8",
-"B$	c #31AFD9",
-"C$	c #34B1DA",
-"D$	c #37B2DB",
-"E$	c #39B3DB",
-"F$	c #3BB4DB",
-"G$	c #3CB4DB",
-"H$	c #3BB3DA",
-"I$	c #38B1D9",
-"J$	c #35AFD8",
-"K$	c #32ADD6",
-"L$	c #2EAAD4",
-"M$	c #2BA5D1",
-"N$	c #2795C5",
-"O$	c #2374AA",
-"P$	c #1E5691",
-"Q$	c #1A4C89",
-"R$	c #156AA5",
-"S$	c #1078B5",
-"T$	c #0B6FAF",
-"U$	c #0665A9",
-"V$	c #004A97",
-"W$	c #004D9A",
-"X$	c #00509A",
-"Y$	c #00579F",
-"Z$	c #0062A7",
-"`$	c #00468A",
-" %	c #00387C",
-".%	c #003C7F",
-"+%	c #004083",
-"@%	c #044D8E",
-"#%	c #095493",
-"$%	c #0E5A98",
-"%%	c #13609C",
-"&%	c #18659F",
-"*%	c #1C6BA4",
-"=%	c #219FCD",
-"-%	c #25AAD5",
-";%	c #29ABD6",
-">%	c #2DADD7",
-",%	c #30AED8",
-"'%	c #32AFD8",
-")%	c #34B0D8",
-"!%	c #34AED7",
-"~%	c #30ABD4",
-"{%	c #2DA8D2",
-"]%	c #2BA3CF",
-"^%	c #289DCC",
-"/%	c #2494C5",
-"(%	c #20659E",
-"_%	c #1C4684",
-":%	c #183D7C",
-"<%	c #133B7A",
-"[%	c #0F5695",
-"}%	c #0A5FA1",
-"|%	c #055FA5",
-"1%	c #00559F",
-"2%	c #004D99",
-"3%	c #004896",
-"4%	c #002E74",
-"5%	c #003C82",
-"6%	c #004E94",
-"7%	c #003377",
-"8%	c #003175",
-"9%	c #003578",
-"0%	c #003B7F",
-"a%	c #003F82",
-"b%	c #014285",
-"c%	c #044889",
-"d%	c #094E8E",
-"e%	c #0D5493",
-"f%	c #125997",
-"g%	c #167FB4",
-"h%	c #1A96C7",
-"i%	c #1EA5D2",
-"j%	c #22A7D3",
-"k%	c #25A9D4",
-"l%	c #28AAD5",
-"m%	c #2AAAD5",
-"n%	c #2CABD6",
-"o%	c #2DACD6",
-"p%	c #2EACD5",
-"q%	c #2DA9D3",
-"r%	c #2CA6D1",
-"s%	c #299FCD",
-"t%	c #279ACA",
-"u%	c #2495C7",
-"v%	c #218FC3",
-"w%	c #1D86BC",
-"x%	c #1A4683",
-"y%	c #163574",
-"z%	c #112C6C",
-"A%	c #0D2464",
-"B%	c #082D6F",
-"C%	c #044E94",
-"D%	c #004F9A",
-"E%	c #004292",
-"F%	c #00347D",
-"G%	c #002266",
-"H%	c #002669",
-"I%	c #00286C",
-"J%	c #002B6F",
-"K%	c #002E72",
-"L%	c #003478",
-"M%	c #00377B",
-"N%	c #003A7E",
-"O%	c #013D80",
-"P%	c #044285",
-"Q%	c #084889",
-"R%	c #0D4D8D",
-"S%	c #115492",
-"T%	c #15609B",
-"U%	c #189ACB",
-"V%	c #1CA0CF",
-"W%	c #1FA2CF",
-"X%	c #21A3D1",
-"Y%	c #24A4D1",
-"Z%	c #25A5D1",
-"`%	c #27A4D1",
-" &	c #28A4D1",
-".&	c #28A0CE",
-"+&	c #289ECC",
-"@&	c #2596C8",
-"#&	c #2392C5",
-"$&	c #208DC2",
-"%&	c #1D87BD",
-"&&	c #1A75AE",
-"*&	c #173978",
-"=&	c #132E6D",
-"-&	c #0F2565",
-";&	c #0B1D5D",
-">&	c #071555",
-",&	c #021151",
-"'&	c #001F61",
-")&	c #00276D",
-"!&	c #003D8E",
-"~&	c #003B89",
-"{&	c #001E62",
-"]&	c #002063",
-"^&	c #002569",
-"/&	c #002D72",
-"(&	c #003074",
-"_&	c #003579",
-":&	c #033C7F",
-"<&	c #074183",
-"[&	c #0B4787",
-"}&	c #0F5392",
-"|&	c #1391C5",
-"1&	c #1695C8",
-"2&	c #1998CA",
-"3&	c #1C99CA",
-"4&	c #1E9ACB",
-"5&	c #209BCB",
-"6&	c #219BCB",
-"7&	c #229ACA",
-"8&	c #2399C9",
-"9&	c #2397C8",
-"0&	c #2394C6",
-"a&	c #2291C4",
-"b&	c #1E89C0",
-"c&	c #1C84BC",
-"d&	c #1A5B97",
-"e&	c #174C89",
-"f&	c #142D6C",
-"g&	c #102665",
-"h&	c #0C1E5D",
-"i&	c #081756",
-"j&	c #040F4F",
-"k&	c #000847",
-"l&	c #000541",
-"m&	c #00033D",
-"n&	c #00368A",
-"o&	c #00256E",
-"p&	c #00185A",
-"q&	c #001A5D",
-"r&	c #001D60",
-"s&	c #001F63",
-"t&	c #002568",
-"u&	c #00276B",
-"v&	c #00296D",
-"w&	c #002B70",
-"x&	c #003276",
-"y&	c #023579",
-"z&	c #063A7D",
-"A&	c #0A5997",
-"B&	c #0D87BF",
-"C&	c #108AC1",
-"D&	c #138CC3",
-"E&	c #168EC4",
-"F&	c #188FC4",
-"G&	c #1A90C4",
-"H&	c #1C90C4",
-"I&	c #1D8FC4",
-"J&	c #1D8EC3",
-"K&	c #1D8CC2",
-"L&	c #1D8AC0",
-"M&	c #1C87BE",
-"N&	c #1B83BC",
-"O&	c #1A7FB9",
-"P&	c #1864A0",
-"Q&	c #164987",
-"R&	c #132C6A",
-"S&	c #102564",
-"T&	c #0D1E5D",
-"U&	c #091756",
-"V&	c #06104E",
-"W&	c #020947",
-"X&	c #000441",
-"Y&	c #00023C",
-"Z&	c #000038",
-"`&	c #003086",
-" *	c #001A5E",
-".*	c #001354",
-"+*	c #001658",
-"@*	c #001D5F",
-"#*	c #001F62",
-"$*	c #002164",
-"%*	c #002367",
-"&*	c #002D71",
-"**	c #014C8E",
-"=*	c #0474B2",
-"-*	c #077CB9",
-";*	c #0B80BA",
-">*	c #0E82BB",
-",*	c #1083BC",
-"'*	c #1285BD",
-")*	c #1485BE",
-"!*	c #1686BD",
-"~*	c #1785BD",
-"{*	c #1884BC",
-"]*	c #1882BB",
-"^*	c #1880B9",
-"/*	c #187DB7",
-"(*	c #177AB6",
-"_*	c #1571AF",
-":*	c #143676",
-"<*	c #122968",
-"[*	c #0F2362",
-"}*	c #0D1D5C",
-"|*	c #0A1755",
-"1*	c #030A47",
-"2*	c #000239",
-"3*	c #002A82",
-"4*	c #00175D",
-"5*	c #00104F",
-"6*	c #001252",
-"7*	c #001454",
-"8*	c #001657",
-"9*	c #00195C",
-"0*	c #001C5E",
-"a*	c #001D61",
-"b*	c #002165",
-"c*	c #002366",
-"d*	c #002468",
-"e*	c #006CAE",
-"f*	c #006FB0",
-"g*	c #0271B1",
-"h*	c #0574B3",
-"i*	c #0877B4",
-"j*	c #0B78B5",
-"k*	c #0F7AB6",
-"l*	c #107AB7",
-"m*	c #127AB6",
-"n*	c #1279B5",
-"o*	c #1377B4",
-"p*	c #1375B3",
-"q*	c #1372B1",
-"r*	c #126FAF",
-"s*	c #115797",
-"t*	c #0F2766",
-"u*	c #0D2160",
-"v*	c #0B1B5A",
-"w*	c #091554",
-"x*	c #06104D",
-"y*	c #030A46",
-"z*	c #000540",
-"A*	c #000036",
-"B*	c #00237E",
-"C*	c #002980",
-"D*	c #002372",
-"E*	c #001A60",
-"F*	c #001659",
-"G*	c #001358",
-"H*	c #001A5F",
-"I*	c #002064",
-"J*	c #001B5E",
-"K*	c #005397",
-"L*	c #0065A9",
-"M*	c #0067AB",
-"N*	c #0069AC",
-"O*	c #026AAD",
-"P*	c #046CAE",
-"Q*	c #0768AB",
-"R*	c #0965A9",
-"S*	c #0A6EAF",
-"T*	c #0C6EAE",
-"U*	c #0D6DAE",
-"V*	c #0D6CAD",
-"W*	c #0D6AAB",
-"X*	c #0D67AA",
-"Y*	c #0D64A7",
-"Z*	c #0C498C",
-"`*	c #0A1E5E",
-" =	c #091856",
-".=	c #071350",
-"+=	c #050D4B",
-"@=	c #020844",
-"#=	c #00043F",
-"$=	c #00023B",
-"%=	c #000037",
-"&=	c #000035",
-"*=	c #000034",
-"==	c #001A77",
-"-=	c #00237D",
-";=	c #002881",
-">=	c #002D84",
-",=	c #00287F",
-"'=	c #000B6C",
-")=	c #00388A",
-"!=	c #003785",
-"~=	c #001556",
-"{=	c #001759",
-"]=	c #00195B",
-"^=	c #001C5F",
-"/=	c #001C60",
-"(=	c #004B91",
-"_=	c #004287",
-":=	c #00569C",
-"<=	c #0061A7",
-"[=	c #023187",
-"}=	c #033388",
-"|=	c #0563A7",
-"1=	c #0662A7",
-"2=	c #0762A7",
-"3=	c #0860A6",
-"4=	c #085EA4",
-"5=	c #085CA3",
-"6=	c #084388",
-"7=	c #071B5B",
-"8=	c #061453",
-"9=	c #04104D",
-"0=	c #030B48",
-"a=	c #010742",
-"b=	c #00033E",
-"c=	c #00013A",
-"d=	c #000033",
-"e=	c #000032",
-"f=	c #001C79",
-"g=	c #00217C",
-"h=	c #002780",
-"i=	c #002B83",
-"j=	c #003589",
-"k=	c #001D63",
-"l=	c #000F4F",
-"m=	c #000F4E",
-"n=	c #001050",
-"o=	c #001152",
-"p=	c #001353",
-"q=	c #001455",
-"r=	c #002F74",
-"s=	c #00529A",
-"t=	c #0058A1",
-"u=	c #00529D",
-"v=	c #0156A0",
-"w=	c #02569F",
-"x=	c #02549E",
-"y=	c #03529D",
-"z=	c #034F9A",
-"A=	c #032062",
-"B=	c #020F4E",
-"C=	c #010C49",
-"D=	c #000845",
-"E=	c #00033C",
-"F=	c #000138",
-"G=	c #000135",
-"H=	c #001474",
-"I=	c #001F7B",
-"J=	c #00247E",
-"K=	c #002D83",
-"L=	c #001051",
-"M=	c #000A46",
-"N=	c #000B48",
-"O=	c #000C4A",
-"P=	c #000D4B",
-"Q=	c #000E4D",
-"R=	c #001151",
-"S=	c #001253",
-"T=	c #00377E",
-"U=	c #004E9A",
-"V=	c #004C98",
-"W=	c #00408C",
-"X=	c #000946",
-"Y=	c #00053F",
-"Z=	c #000137",
-"`=	c #000031",
-" -	c #000030",
-".-	c #001373",
-"+-	c #001876",
-"@-	c #001D79",
-"#-	c #00267F",
-"$-	c #000D4D",
-"%-	c #000741",
-"&-	c #000843",
-"*-	c #000945",
-"=-	c #000A47",
-"--	c #000B49",
-";-	c #000D4C",
-">-	c #002F77",
-",-	c #00327A",
-"'-	c #002267",
-")-	c #002166",
-"!-	c #00256A",
-"~-	c #003D89",
-"{-	c #004393",
-"]-	c #003F90",
-"^-	c #003C8D",
-"/-	c #003382",
-"(-	c #003587",
-"_-	c #002069",
-":-	c #00033A",
-"<-	c #000136",
-"[-	c #00002F",
-"}-	c #000C6E",
-"|-	c #001171",
-"1-	c #001574",
-"2-	c #001E7A",
-"3-	c #00196A",
-"4-	c #00053E",
-"5-	c #000640",
-"6-	c #000742",
-"7-	c #00185B",
-"8-	c #003787",
-"9-	c #00398C",
-"0-	c #00378B",
-"a-	c #003388",
-"b-	c #002779",
-"c-	c #00063F",
-"d-	c #00002D",
-"e-	c #00096C",
-"f-	c #000D6F",
-"g-	c #001271",
-"h-	c #001675",
-"i-	c #001872",
-"j-	c #000338",
-"k-	c #00043A",
-"l-	c #00043B",
-"m-	c #00053D",
-"n-	c #000844",
-"o-	c #000944",
-"p-	c #002573",
-"q-	c #002E85",
-"r-	c #002C83",
-"s-	c #001E71",
-"t-	c #00002E",
-"u-	c #00002C",
-"v-	c #000266",
-"w-	c #00066A",
-"x-	c #000A6D",
-"y-	c #000E70",
-"z-	c #000C58",
-"A-	c #000643",
-"B-	c #000337",
-"C-	c #000236",
-"D-	c #000339",
-"E-	c #00053C",
-"F-	c #00063E",
-"G-	c #00073F",
-"H-	c #00145A",
-"I-	c #001C78",
-"J-	c #000743",
-"K-	c #00002A",
-"L-	c #00005F",
-"M-	c #000267",
-"N-	c #000A6C",
-"O-	c #000952",
-"P-	c #000131",
-"Q-	c #000132",
-"R-	c #000133",
-"S-	c #000134",
-"T-	c #000235",
-"U-	c #00196E",
-"V-	c #001D7A",
-"W-	c #001B78",
-"X-	c #001977",
-"Y-	c #001775",
-"Z-	c #001473",
-"`-	c #000E66",
-" ;	c #00002B",
-".;	c #000029",
-"+;	c #000053",
-"@;	c #00005E",
-"#;	c #000265",
-"$;	c #000464",
-"%;	c #000130",
-"&;	c #001160",
-"*;	c #001164",
-"=;	c #001674",
-"-;	c #001272",
-";;	c #001071",
-">;	c #000E6F",
-",;	c #000B6E",
-"';	c #00086C",
-");	c #00045F",
-"!;	c #000152",
-"~;	c #000046",
-"{;	c #000051",
-"];	c #00005A",
-"^;	c #00012F",
-"/;	c #000542",
-"(;	c #00106E",
-"_;	c #001070",
-":;	c #000F70",
-"<;	c #00086B",
-"[;	c #000367",
-"};	c #000163",
-"|;	c #00005B",
-"1;	c #000052",
-"2;	c #000047",
-"3;	c #000041",
-"4;	c #000028",
-"5;	c #000021",
-"6;	c #000025",
-"7;	c #00003E",
-"8;	c #00003A",
-"9;	c #00075A",
-"0;	c #00076B",
-"a;	c #000569",
-"b;	c #000368",
-"c;	c #000162",
-"d;	c #00005C",
-"e;	c #000054",
-"f;	c #00004C",
-"g;	c #000042",
-"h;	c #000039",
-"i;	c #000026",
-"j;	c #000023",
-"k;	c #000017",
-"l;	c #00001C",
-"m;	c #00004D",
-"n;	c #000055",
-"o;	c #000027",
-"p;	c #00003D",
-"q;	c #000058",
-"r;	c #00004E",
-"s;	c #000048",
-"t;	c #000019",
-"u;	c #000012",
-"v;	c #00001D",
-"w;	c #00001F",
-"x;	c #000044",
-"y;	c #000008",
-"z;	c #000018",
-"A;	c #000024",
-"B;	c #000015",
-"C;	c #000022",
-"D;	c #00000F",
-"E;	c #000004",
-"F;	c #000007",
-"G;	c #000009",
-"H;	c #00000C",
-"I;	c #00000D",
-"J;	c #00000E",
-"K;	c #00000A",
-"L;	c #000003",
-"M;	c #000000",
-"N;	c #000001",
-"O;	c #000005",
-"P;	c #00000B",
-"                                                                                                ",
-"                                                                                                ",
-"                                        . + @ # $ % & *                                         ",
-"                                = - ; > , ' ) ! ~ { ] ^ / ( _ :                                 ",
-"                            < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e                               ",
-"                        f g h i j k l m n o p q r s t u v w x y z A B                           ",
-"                      C D E F G H I J K L M N O P Q R S T U V W X Y Z `  .                      ",
-"                    ..+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.                    ",
-"                  1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.                  ",
-"                t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.                ",
-"              Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+                ",
-"            3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+k+l+m+]+n+o+p+q+r+s+t+u+v+w+x+y+              ",
-"            z+A+B+C+D+E+F+G+H+I+J+K+L+M+f+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@            ",
-"          &@*@=@-@;@>@,@'@)@!@~@{@]@^@L+/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@            ",
-"          e@f@z+A+B+g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@          ",
-"        N@O@P@Q@R@S@T@U@V@W@X@Y@l@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#          ",
-"        :#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#        ",
-"        z#A#B#M@C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$z#        ",
-"      -$;$>$,$O@'$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$3$4$5$3$6$7$8$ $9$0$a$b$c$d$e$f$g$h$i$        ",
-"      j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$G$H$8$I$J$K$L$M$N$O$P$Q$R$S$T$U$k$V$      ",
-"      W$X$Y$Z$`$ %.%+%p$q$@%#%$%%%&%*%=%-%;%>%,%'%)%p#p#J$!%K$~%{%]%^%/%(%_%:%<%[%}%|%1%2%      ",
-"      3%4%5%6%7%8%9% %0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%0$q%r%]%s%t%u%v%w%x%y%z%A%B%C%D%3%      ",
-"      E%F%G%H%I%J%K%8%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &9+.&+&V.@&#&$&%&&&*&=&-&;&>&,&'&)&      ",
-"      !&~&{&]&G%^&I%J%/&(&7%_& %:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&$&b&c&d&e&f&g&h&i&j&k&l&m&      ",
-"      n&o&p&q&r&s&G%t&u&v&w&K%(&x&y&z&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&      ",
-"      `& *.*+*p&q&@*#*$*%*^&u&v&J%&***=*-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*V&1*l&Y&Z&2*      ",
-"      3*4*5*6*7*8*p&9*0*a*s&b*c*d*v&e*f*g*h*i*j**$k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*Y&Z&A*z*      ",
-"      B*C*D*E*F*G*H*I*+*p&9*J*r&{&x&K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*=        ",
-"      ==-=;=>=,='=)=!=J*.*~=+*{=]=^=/=(=_=:=l$<=[=}=|=1=2=3=4=5=6=7=8=9=0=a=b=c=%=&=d=e=        ",
-"        f=g=h=i=3*j=k=l=m=n=o=p=q=~=8*r=^=b*s=t=j$u=-$v=w=x=y=z=A=B=C=D=z*E=F=A*&=d=e=G=        ",
-"        H===I=J=;=K=L=M=N=O=P=Q=l=n=R=6*S=.*T=D%D%D%U=2%V=V$3%W=J*L=X=Y=$=Z=&=*=e=`= -          ",
-"          .-+-@-g=#-$-%-&-*-M==---O=P=;-Q=m=>-,-'-)-!-~-{-E%]-^-/-(-_-:-<-*=d=e=`=[-[-          ",
-"          }-|-1-==2-3-4-4-5-%-6-&-*-X==-=-N=q&;-O=O=O=7-8-9-0-j=a-`&b-c-d=e=`= -[-d-$=          ",
-"            e-f-g-h-i-4-j-k-l-m-4-c-5-%-6-6-&-&-n-o-o-*-M=p-q-r-3*h=s-X=`= -[-t-u-u-            ",
-"            v-w-x-y-g-z-A-B-C-j-D-:-l-l-E-m-4-F-F-c-c-c-G-H-#-J=g=I=I-J-t-t-d-u-K-              ",
-"              L-M-w-N-f-O-P-Q-R-S-T-C-C-B-j-D-D-:-k-l-k-D=U-V-W-X-Y-Z-`-[- ; ;.;u-              ",
-"                +;@;#;$; ;u-d-t-[- -%;P-Q-R-R-S-B-z*&;*;Y-=;H=-;;;>;,;';);!;%=d-                ",
-"                  ~;{;];u-.;K- ; ;u-d-d-d-t-t-^;/;(;_;;;:;f-}-x-<;w-[;};|;1;2;                  ",
-"                  A*%=3;4;5;6;u-7;8;u-K- ; ; ; ;^;9;<;0;w-a;b;v-c;d;e;f;g;h;                    ",
-"                      i;j;k;l;d=m;1;n;d= ;i;o;o;o;o;p;@;d;q;+;r;s;3;h;`=K-                      ",
-"                        t;u;k;o;e=Z&%=5;*=l;v;v;v;w; ;x;3;p;Z&d=d-i;w;                          ",
-"                            y;u;z;v;5;A;A;B;u;u;u;j; ;.;i;C;v;z;u;D;                            ",
-"                                E;E;F;G;H;I;I;I;H;D;J;H;K;F;E;K;                                ",
-"                                      y;L;M;M;N;N;M;N;O;P;                                      ",
-"                                                                                                ",
-"                                                                                                ",
-"                                                                                                ",
-"                                                                                                "};
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e74f5cf2e442458ea5c621e654f853a65031d1b5
GIT binary patch
literal 744
zc$@*~0vG*>P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XT
z000XT0n*)m`~Uy~nn^@KR5*==lgn?6VHC!H-*vvZwQ8oV>GVQLHEyY3gAn5KA6SrB
zSXi>LCy`)b!@^2p!_uO55@|(<jl{LY0%bZ=I-U9EKJ#7P_qA}V`&pfwJkOKo<eW$2
zZ#8}{#kSGDNFpk|hmSw;<V@vHFzwfYbKv5xp-p2a2F3=q_l)$V0^Lya?~4m_ujZ!Q
zr*AI>cTPNBiZ_;u#de-OJ-lw!)irCg8wS&fWOik*(G@jKQEhgsP)_)Pccc^F?5f=K
zqi-brJN@XjQ?b#(GfpC6g$bK*SsaDL2z-QFL#wz%MVN?Bj9=m8&BH%C*l}S!o7Y}9
zNBZr^V46rKg%yjSLO~_BNcqD8`tl@|cLij`(q#Yg?V_>z28FwgFAjQ_9YeR{Ez6{;
z6z<0|rFw^jdYeMNM72~$Pj}I~e=EtcAuPkmup)g3zywVEa5wWs!WSQ@IyQPThS)Mj
zXCRF|njw}=<68#47a(SHC_M?%*b7`XVPBkua+<;i5FuV7h8vF&Ms3=TgQIKcN+K#P
zynKnygGU6_CMY8V=qAhy%5FgO6Id3sns{~uksY8jTf)&Kh636?!M*#mb2)<YA_(6H
zlnFB}T6^A*T)hTagGwGui*V)@je3W+9mj}TX!#uC`7=bbiV{BP`fDW01SIa<B(m!u
zri8{K=r+uhppZv6QABDGqy?G@VHL0xQoHrzjG{J6JGq}QkwFw8D1!{3S%Inx%@9O4
zw0-c3fVd6C^H2-Feqz0aYP}@z_8}L$Q3fbLHNeV%?1xGbI(5LGf!uK@6#fv6o}I8_
z8iqp{RnV&-t6*HgDi4Myp=aYi!vv(D>i}rGKpO&0fp`mQ3hL89?SBGGa}xR5clff@
aZ}l0cBPG#LK)$~K0000<MNUMnLSTXkrBPl0
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -504,17 +504,17 @@ BrowserGlue.prototype = {
       // See XXX note above
       // bmsvc.runInBatchMode(callback, null);
     }
     catch(ex) {
       Components.utils.reportError(ex);
     }
     finally {
       prefBranch.setBoolPref("browser.places.createdSmartBookmarks", true);
-      prefBranch.savePrefFile(null);
+      prefBranch.QueryInterface(Ci.nsIPrefService).savePrefFile(null);
     }
   },
 
   // for XPCOM
   classDescription: "Firefox Browser Glue Service",
   classID:          Components.ID("{eab9012e-5f74-4cbc-b2b5-a590235513cc}"),
   contractID:       "@mozilla.org/browser/browserglue;1",
 
--- a/browser/components/places/content/controller.js
+++ b/browser/components/places/content/controller.js
@@ -420,16 +420,17 @@ PlacesController.prototype = {
       switch(nodeType) {
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY:
           nodeData["query"] = true;
           break;
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_DYNAMIC_CONTAINER:
           nodeData["dynamiccontainer"] = true;
           break;
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER:
+        case Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT:
           nodeData["folder"] = true;
           break;
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_HOST:
           nodeData["host"] = true;
           break;
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR:
           nodeData["separator"] = true;
           break;
--- a/browser/components/places/content/editBookmarkOverlay.js
+++ b/browser/components/places/content/editBookmarkOverlay.js
@@ -433,24 +433,24 @@ var gEditItemOverlay = {
   },
 
   _updateTags: function EIO__updateTags() {
     var currentTags = PlacesUtils.tagging.getTagsForURI(this._uri, { });
     var tags = this._getTagsArrayFromTagField();
     if (tags.length > 0 || currentTags.length > 0) {
       var tagsToRemove = [];
       var tagsToAdd = [];
-      var t;
-      for each (t in currentTags) {
-        if (tags.indexOf(t) == -1)
-          tagsToRemove.push(t);
+      var i;
+      for (i = 0; i < currentTags.length; i++) {
+        if (tags.indexOf(currentTags[i]) == -1)
+          tagsToRemove.push(currentTags[i]);
       }
-      for each (t in tags) {
-        if (currentTags.indexOf(t) == -1)
-          tagsToAdd.push(t);
+      for (i = 0; i < tags.length; i++) {
+        if (currentTags.indexOf(tags[i]) == -1)
+          tagsToAdd.push(tags[i]);
       }
 
       if (tagsToAdd.length > 0)
         PlacesUtils.tagging.tagURI(this._uri, tagsToAdd);
       if (tagsToRemove.length > 0)
         PlacesUtils.tagging.untagURI(this._uri, tagsToRemove);
     }
   },
@@ -638,27 +638,28 @@ var gEditItemOverlay = {
           container != PlacesUtils.toolbarFolderId &&
           container != PlacesUtils.bookmarksMenuFolderId)
         this._markFolderAsRecentlyUsed(container);
     }
 
     // Update folder-tree selection
     if (!this._folderTree.collapsed) {
       var selectedNode = this._folderTree.selectedNode;
-      if (!selectedNode || selectedNode.itemId != container)
+      if (!selectedNode ||
+          PlacesUtils.getConcreteItemId(selectedNode) != container)
         this._folderTree.selectItems([container]);
     }
   },
 
   onFolderTreeSelect: function EIO_onFolderTreeSelect() {
     var selectedNode = this._folderTree.selectedNode;
     if (!selectedNode)
       return;
 
-    var folderId = selectedNode.itemId;
+    var folderId = PlacesUtils.getConcreteItemId(selectedNode);
     if (this._getFolderIdFromMenuList() == folderId)
       return;
 
     var folderItem = this._getFolderMenuItem(folderId);
     this._folderMenuList.selectedItem = folderItem;
     folderItem.doCommand();
   },
 
@@ -677,17 +678,18 @@ var gEditItemOverlay = {
     if (tagsSelector.collapsed)
       return;
 
     while (tagsSelector.hasChildNodes())
       tagsSelector.removeChild(tagsSelector.lastChild);
 
     var tagsInField = this._getTagsArrayFromTagField();
     var allTags = PlacesUtils.tagging.allTags;
-    for each (var tag in allTags) {
+    for (var i = 0; i < allTags.length; i++) {
+      var tag = allTags[i];
       var elt = document.createElement("listitem");
       elt.setAttribute("type", "checkbox");
       elt.setAttribute("label", tag);
       if (tagsInField.indexOf(tag) != -1)
         elt.setAttribute("checked", "true");
 
       tagsSelector.appendChild(elt);
     }
--- a/browser/components/places/content/menu.xml
+++ b/browser/components/places/content/menu.xml
@@ -506,27 +506,27 @@
         <getter><![CDATA[
           if (this._cachedInsertionPoint !== undefined)
             return this._cachedInsertionPoint;
 
           // By default, the insertion point is at the top level, at the end.
           var index = -1;
           var folderId = 0;
           if (PlacesUtils.nodeIsFolder(this._resultNode))
-            folderId = this._resultNode.itemId;
+            folderId = PlacesUtils.getConcreteItemId(this._resultNode);
 
           if (this.hasSelection) {
             if (PlacesUtils.nodeIsFolder(this.selectedNode)) {
               // If there is a folder selected, the insertion point is the
               // end of the folder.
-              folderId = this.selectedNode.itemId;
+              folderId = PlacesUtils.getConcreteItemId(this.selectedNode);
             } else {
               // If there is another type of node selected, the insertion point
               // is after that node.
-              folderId = this.selectedNode.parent.itemId;
+              folderId = PlacesUtils.getConcreteItemId(this.selectedNode.parent);
               index = PlacesUtils.getIndexOfNode(this.selectedNode)
             }
           }
           this._cachedInsertionPoint = new InsertionPoint(folderId, index);
           return this._cachedInsertionPoint;
         ]]></getter>
       </property>
 
--- a/browser/components/places/content/toolbar.xml
+++ b/browser/components/places/content/toolbar.xml
@@ -390,27 +390,27 @@
       <!-- nsIPlacesView -->
       <property name="insertionPoint">
         <getter><![CDATA[
           if (this._cachedInsertionPoint !== undefined)
             return this._cachedInsertionPoint;
 
           // By default, the insertion point is at the top level, at the end. 
           var index = -1;
-          var folderId = this._result.root.itemId;
+          var folderId = PlacesUtils.getConcreteItemId(this._result.root);
 
           if (this.hasSelection) {
             if (PlacesUtils.nodeIsFolder(this.selectedNode)) {
               // If there is a folder selected, the insertion point is the
               // end of the folder.
-              folderId = this.selectedNode.itemId;
+              folderId = PlacesUtils.getConcreteItemId(this.selectedNode);
             } else {
               // If there is another type of node selected, the insertion point
               // is after that node.
-              index = PlacesUtils.getIndexOfNode(this.selectedNode)
+              index = PlacesUtils.getIndexOfNode(this.selectedNode);
             }
           }
           this._cachedInsertionPoint = new InsertionPoint(folderId, index, 1);
           return this._cachedInsertionPoint;
         ]]></getter>
       </property>
 
       <!-- nsIPlacesView -->
@@ -751,40 +751,48 @@
             if (PlacesUtils.nodeIsFolder(xulNode.node) &&
                 !PlacesUtils.nodeIsReadOnly(xulNode.node)) {
               NS_ASSERT(xulNode.getAttribute("type") == "menu");
               // This is a folder. If the mouse is in the left 25% of the
               // node, drop to the left of the folder.  If it's in the middle
               // 50%, drop into the folder.  If it's past that, drop to the right.
               if (event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width * 0.25)) {
                 // Drop to the left of this folder.
-                dropPoint.ip = new InsertionPoint(result.root.itemId, i, -1);
+                dropPoint.ip =
+	        new InsertionPoint(PlacesUtils.getConcreteItemId(result.root),
+	                           i, -1);
                 dropPoint.beforeIndex = i;
                 return dropPoint;
               }
               else if (event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width * 0.75)) {
                 // Drop inside this folder.
-                dropPoint.ip = new InsertionPoint(xulNode.node.itemId, -1, 1);
+                dropPoint.ip =
+	        new InsertionPoint(PlacesUtils.getConcreteItemId(xulNode.node),
+	                           -1, 1);
                 dropPoint.beforeIndex = i;
                 dropPoint.folderNode = xulNode;
                 return dropPoint;
               }
             } else{
               // This is a non-folder node. If the mouse is left of the middle,
               // drop to the left of the folder.  If it's right, drop to the right.
               if (event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width / 2)) {
                 // Drop to the left of this bookmark.
-                dropPoint.ip = new InsertionPoint(result.root.itemId, i, -1);
+                dropPoint.ip =
+	        new InsertionPoint(PlacesUtils.getConcreteItemId(result.root),
+	                           i, -1);
                 dropPoint.beforeIndex = i;
                 return dropPoint;
               }
             }
           }
           // Should drop to the right of the last node.
-          dropPoint.ip = new InsertionPoint(result.root.itemId, -1, 1);
+          dropPoint.ip =
+	  new InsertionPoint(PlacesUtils.getConcreteItemId(result.root),
+	                     -1, 1);
           dropPoint.beforeIndex = -1;
           return dropPoint;
         },
         
         onDragStart: function TBV_DO_onDragStart(event, xferData, dragAction) {
           if (event.target.localName == "toolbarbutton" &&
               event.target.getAttribute("type") == "menu") {
 #ifdef XP_WIN
--- a/browser/components/places/content/tree.xml
+++ b/browser/components/places/content/tree.xml
@@ -507,36 +507,35 @@
           
           // If the sole selection is an open container, insert into it rather 
           // than adjacent to it. Note that this only applies to _single_ 
           // selections - if the last element within a multi-selection is an
           // open folder, insert _adajacent_ to the selection.
           //
           // If the sole selection is the bookmarks toolbar folder, we insert
           // into it even if it is not opened
+          var itemId =
+            PlacesUtils.getConcreteItemId(resultView.nodeForTreeIndex(max.value));
           if (this.hasSingleSelection && resultView.isContainer(max.value) &&
               (resultView.isContainerOpen(max.value) ||
-               resultView.nodeForTreeIndex(max.value)
-                         .itemId == PlacesUtils.bookmarksMenuFolderId))
+               itemId == PlacesUtils.bookmarksMenuFolderId))
             orientation = NHRVO.DROP_ON;
 
           this._cachedInsertionPoint =
             this._getInsertionPoint(max.value, orientation);
           return this._cachedInsertionPoint;
         ]]></getter>
       </property>
       
       <method name="_disallowInsertion">
         <parameter name="aContainer"/>
         <body><![CDATA[
           // Disallow insertion of items under readonly folders
-          // Disallow insertion of items under the places root
           return (!PlacesUtils.nodeIsFolder(aContainer) ||
-                   PlacesUtils.nodeIsReadOnly(aContainer) ||
-                   aContainer.itemId == PlacesUtils.placesRootId);
+                   PlacesUtils.nodeIsReadOnly(aContainer));
         ]]></body>
       </method>
 
       <method name="_getInsertionPoint">
         <parameter name="index"/>
         <parameter name="orientation"/>
         <body><![CDATA[ 
           var result = this.getResult();
@@ -576,17 +575,18 @@
               var lsi = PlacesUtils.getIndexOfNode(lastSelected);
               index = orientation == NHRVO.DROP_BEFORE ? lsi : lsi + 1;
             }
           }
 
           if (this._disallowInsertion(container))
             return null;
 
-          return new InsertionPoint(container.itemId, index, orientation);
+          return new InsertionPoint(PlacesUtils.getConcreteItemId(container),
+                                    index, orientation);
         ]]></body>
       </method>
 
       <!-- nsIPlacesView -->
       <field name="peerDropTypes">PlacesUtils.GENERIC_VIEW_DROP_TYPES</field>
       
       <!-- nsIPlacesView -->
       <field name="childDropTypes">PlacesUtils.GENERIC_VIEW_DROP_TYPES</field>
@@ -622,17 +622,23 @@
            * from the IDs array, and add the found node to the nodes dictionary.
            *
            * NOTE: This method will leave open any node that had matching items
            * in its subtree.
            */
           function findNodes(node) {
             var foundOne = false;
             // See if node matches an ID we wanted; add to results.
+            // For simple folder queries, check both itemId and the concrete
+            // item id.
             var index = ids.indexOf(node.itemId);
+            if (index == -1 &&
+                node.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT)
+              index = ids.indexOf(asQuery(node).folderItemId);
+
             if (index != -1) {
               nodes.push(node);
               foundOne = true;
               ids.splice(index, 1);
             }
 
             if (ids.length == 0 || !PlacesUtils.nodeIsContainer(node) ||
                 nodesURIChecked.indexOf(node.uri) != -1)
--- a/browser/components/places/content/treeView.js
+++ b/browser/components/places/content/treeView.js
@@ -370,26 +370,27 @@ PlacesTreeView.prototype = {
       if (!parent)
         item.containerOpen = !item.containerOpen;
     }
 
     this._tree.endUpdateBatch();
 
     // restore selection
     if (previouslySelectedNodes.length > 0) {
-      for each (var nodeInfo in previouslySelectedNodes) {
+      for (var i = 0; i < previouslySelectedNodes.length; i++) {
+        var nodeInfo = previouslySelectedNodes[i];
         var index = nodeInfo.node.viewIndex;
 
         // if the same node was used (happens on sorting-changes),
         // just use viewIndex
         if (index == -1) { // otherwise, try to find an equal node
-          var itemId = nodeInfo.node.itemId;
+          var itemId = PlacesUtils.getConcreteItemId(nodeInfo.node);
           if (itemId != 1) { // bookmark-nodes in queries case
             for (i=0; i < newElements.length && index == -1; i++) {
-              if (newElements[i].itemId == itemId)
+              if (PlacesUtils.getConcreteItemId(newElements[i]) == itemId)
                 index = newElements[i].viewIndex;
             }
           }
           else { // history nodes
             var uri = nodeInfo.node.uri;
             if (uri) {
               for (i=0; i < newElements.length && index == -1; i++) {
                 if (newElements[i].uri == uri)
@@ -587,20 +588,23 @@ PlacesTreeView.prototype = {
           newViewIndex = viewIndex;
           break;
         }
       }
       if (newViewIndex < 0) {
         // At the end of the child list without finding a visible sibling: This
         // is a little harder because we don't know how many rows the last item
         // in our list takes up (it could be a container with many children).
-        var lastRowCount =
-          this._countVisibleRowsForItem(aParent.getChild(aNewIndex - 1));
-        newViewIndex =
-          aParent.getChild(aNewIndex - 1).viewIndex + lastRowCount;
+        var prevChild = aParent.getChild(aNewIndex - 1);
+        newViewIndex = prevChild.viewIndex + this._countVisibleRowsForItem(prevChild);
+        // If we were in the same parent and we are swapping the order, we need to adjust
+        if (prevChild.parent == aItem.parent && 
+            aItem.viewIndex != -1 && // view index may not be set
+            prevChild.viewIndex > aItem.viewIndex)
+          newViewIndex--;
       }
     }
 
     // Try collapsing with the previous node. Note that we do not have to try
     // to redraw the surrounding rows (which we normally would because session
     // boundaries may have changed) because when an item is merged, it will
     // always be in the same session.
     var showThis =  { value: true };
@@ -680,17 +684,18 @@ PlacesTreeView.prototype = {
 
     // if the item was exclusively selected, the node next to it will be
     // selected
     var selectNext = false;
     var selection = this.selection;
     if (selection.getRangeCount() == 1) {
       var min = { }, max = { };
       selection.getRangeAt(0, min, max);
-      if (min.value == max.value)
+      if (min.value == max.value &&
+          this.nodeForTreeIndex(min.value) == aItem)
         selectNext = true;
     }
 
     // this may have been a container, in which case it has a lot of rows
     var count = this._countVisibleRowsForItem(aItem);
 
     // We really want tail recursion here, since we sometimes do another
     // remove after this when duplicates are being collapsed. This loop
@@ -774,17 +779,18 @@ PlacesTreeView.prototype = {
 
     // remove the nodes, let itemInserted restore all of its contents
     this._visibleElements.splice(oldViewIndex, count);
     this._tree.rowCountChanged(oldViewIndex, -count);
     this.itemInserted(aNewParent, aItem, aNewIndex);
 
     // restore selection
     if (nodesToSelect.length > 0) {
-      for each (var node in nodesToSelect) {
+      for (var i = 0; i < nodesToSelect.length; i++) {
+        var node = nodesToSelect[i];
         var index = node.viewIndex;
         selection.rangedSelect(index, index, true);
       }
       selection.selectEventsSuppressed = false;
     }
   },
 
   /**
@@ -1004,35 +1010,37 @@ PlacesTreeView.prototype = {
     else
       var columnType = aColumn.id;
 
     if (columnType != "title")
       return;
 
     var node = this._visibleElements[aRow];
 
-    // To disable the tree gestures for containers (e.g. double-click to open)
-    // we don't mark container nodes as such in flat list mode. The container
-    // appearance is desired though, so we add the container atom manually.
-    if (this._flatList && PlacesUtils.nodeIsContainer(node))
-      aProperties.AppendElement(this._getAtomFor("container"));
-
-    if (PlacesUtils.nodeIsSeparator(node))
-      aProperties.AppendElement(this._getAtomFor("separator"));
-    else if (node.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY)
-      aProperties.AppendElement(this._getAtomFor("query"));
-    else if (node.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER) {
-      if (PlacesUtils.annotations.itemHasAnnotation(node.itemId,
-                                                    LMANNO_FEEDURI))
-        aProperties.AppendElement(this._getAtomFor("livemark"));
-      else if (PlacesUtils.bookmarks.getFolderIdForItem(node.itemId) ==
-               PlacesUtils.tagsFolderId) {
-        aProperties.AppendElement(this._getAtomFor("tagContainer"));
+    var nodeType = node.type;
+    if (PlacesUtils.containerTypes.indexOf(nodeType) != -1) {
+      // To disable the tree gestures for containers (e.g. double-click to open)
+      // we don't mark container nodes as such in flat list mode. The container
+      // appearance is desired though, so we add the container atom manually.
+      if (this._flatList)
+        aProperties.AppendElement(this._getAtomFor("container"));
+      if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY)
+        aProperties.AppendElement(this._getAtomFor("query"));
+      else if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER ||
+               nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT) {
+        if (PlacesUtils.annotations.itemHasAnnotation(node.itemId,
+                                                      LMANNO_FEEDURI))
+          aProperties.AppendElement(this._getAtomFor("livemark"));
+        else if (PlacesUtils.bookmarks.getFolderIdForItem(node.itemId) ==
+                 PlacesUtils.tagsFolderId)
+          aProperties.AppendElement(this._getAtomFor("tagContainer"));
       }
     }
+    else if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR)
+      aProperties.AppendElement(this._getAtomFor("separator"));
   },
 
   getColumnProperties: function(aColumn, aProperties) { },
 
   isContainer: function PTV_isContainer(aRow) {
     this._ensureValidRow(aRow);
     if (this._flatList)
       return false; // but see getCellProperties
--- a/browser/components/places/content/utils.js
+++ b/browser/components/places/content/utils.js
@@ -248,17 +248,18 @@ var PlacesUtils = {
   /**
    * Determines whether or not a ResultNode is a Bookmark folder or not.
    * @param   aNode
    *          A result node
    * @returns true if the node is a Bookmark folder, false otherwise
    */
   nodeIsFolder: function PU_nodeIsFolder(aNode) {
     NS_ASSERT(aNode, "null node");
-    return (aNode.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER);
+    return (aNode.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER ||
+            aNode.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT);
   },
 
   /**
    * Determines whether or not a ResultNode represents a bookmarked URI.
    * @param   aNode
    *          A result node
    * @returns true if the node represents a bookmarked URI, false otherwise
    */
@@ -326,17 +327,17 @@ var PlacesUtils = {
    * @param   aNode
    *          A result node
    * @returns true if the node is readonly, false otherwise
    */
   nodeIsReadOnly: function PU_nodeIsReadOnly(aNode) {
     NS_ASSERT(aNode, "null node");
 
     if (this.nodeIsFolder(aNode))
-      return this.bookmarks.getFolderReadonly(aNode.itemId);
+      return this.bookmarks.getFolderReadonly(asQuery(aNode).folderItemId);
     if (this.nodeIsQuery(aNode))
       return asQuery(aNode).childrenReadOnly;
     return false;
   },
 
   /**
    * Determines whether or not a ResultNode is a host folder or not
    * @param   aNode
@@ -350,16 +351,17 @@ var PlacesUtils = {
 
   /**
    * Determines whether or not a ResultNode is a container item or not
    * @param   aNode
    *          A result node
    * @returns true if the node is a container item, false otherwise
    */
   containerTypes: [Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER,
+                   Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT,
                    Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY,
                    Ci.nsINavHistoryResultNode.RESULT_TYPE_HOST,
                    Ci.nsINavHistoryResultNode.RESULT_TYPE_DAY,
                    Ci.nsINavHistoryResultNode.RESULT_TYPE_DYNAMIC_CONTAINER],
   nodeIsContainer: function PU_nodeIsContainer(aNode) {
     NS_ASSERT(aNode, "null node");
     return this.containerTypes.indexOf(aNode.type) != -1;
   },
@@ -409,17 +411,27 @@ var PlacesUtils = {
    * @param   aNode
    *          The node to test.
    * @returns true if the node is a readonly folder.
   */
   isReadonlyFolder: function(aNode) {
     NS_ASSERT(aNode, "null node");
 
     return this.nodeIsFolder(aNode) &&
-           this.bookmarks.getFolderReadonly(aNode.itemId);
+           this.bookmarks.getFolderReadonly(asQuery(aNode).folderItemId);
+  },
+
+  /**
+   * Gets the concrete item-id for the given node. Generally, this is just
+   * node.itemId, but for folder-shortcuts that's node.folderItemId.
+   */
+  getConcreteItemId: function PU_getConcreteItemId(aNode) {
+    if (aNode.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT)
+      return asQuery(aNode).folderItemId;
+    return aNode.itemId;
   },
 
   /**
    * Gets the index of a node within its parent container
    * @param   aNode
    *          The node to look up
    * @returns The index of the node within its parent container, or -1 if the
    *          node was not found or the node specified has no parent.
@@ -1561,18 +1573,19 @@ var PlacesUtils = {
 
   /**
    * Get the most recently added/modified bookmark for a URL, excluding items
    * under tag or livemark containers. -1 is returned if no item is found.
    */
   getMostRecentBookmarkForURI:
   function PU_getMostRecentBookmarkForURI(aURI) {
     var bmkIds = this.bookmarks.getBookmarkIdsForURI(aURI, {});
-    for each (var bk in bmkIds) {
+    for (var i = 0; i < bmkIds.length; i++) {
       // Find the first folder which isn't a tag container
+      var bk = bmkIds[i];
       var parent = this.bookmarks.getFolderIdForItem(bk);
       if (parent == this.unfiledBookmarksFolderId)
         return bk;
 
       var grandparent = this.bookmarks.getFolderIdForItem(parent);
       if (grandparent != this.tagsFolderId &&
           !this.annotations.itemHasAnnotation(parent, LMANNO_FEEDURI))
         return bk;
@@ -1683,17 +1696,18 @@ var PlacesUtils = {
     return reallyOpen;
   },
 
   /** aItemsToOpen needs to be an array of objects of the form:
     * {uri: string, isBookmark: boolean}
     */
   _openTabset: function PU__openTabset(aItemsToOpen, aEvent) {
     var urls = [];
-    for each (var item in aItemsToOpen) {
+    for (var i = 0; i < aItemsToOpen.length; i++) {
+      var item = aItemsToOpen[i];
       if (item.isBookmark)
         this.markPageAsFollowedBookmark(item.uri);
       else
         this.markPageAsTyped(item.uri);
 
       urls.push(item.uri);
     }
 
--- a/browser/components/preferences/advanced.js
+++ b/browser/components/preferences/advanced.js
@@ -50,16 +50,17 @@ var gAdvancedPane = {
     var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex");
     if (preference.value === null)
       return;
     advancedPrefs.selectedIndex = preference.value;
     
     this.updateAppUpdateItems();
     this.updateAutoItems();
     this.updateModeItems();
+    this.updateOfflineApps();
   },
 
   /**
    * Stores the identity of the current tab in preferences so that the selected
    * tab can be persisted between openings of the preferences window.
    */
   tabSelectionChanged: function ()
   {
@@ -174,16 +175,104 @@ var gAdvancedPane = {
   {
     var cacheService = Components.classes["@mozilla.org/network/cache-service;1"]
                          	       .getService(Components.interfaces.nsICacheService);
     try {
       cacheService.evictEntries(Components.interfaces.nsICache.STORE_ANYWHERE);
     } catch(ex) {}
   },
 
+  /**
+   * Updates the list of offline applications
+   */
+  updateOfflineApps: function ()
+  {
+    var pm = Components.classes["@mozilla.org/permissionmanager;1"]
+                       .getService(Components.interfaces.nsIPermissionManager);
+
+    var list = document.getElementById("offlineAppsList");
+    while (list.firstChild) {
+      list.removeChild(list.firstChild);
+    }
+
+    var enumerator = pm.enumerator;
+    while (enumerator.hasMoreElements()) {
+      var perm = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission);
+      if (perm.type == "offline-app" &&
+          perm.capability != Components.interfaces.nsIPermissionManager.DEFAULT_ACTION &&
+          perm.capability != Components.interfaces.nsIPermissionManager.DENY_ACTION) {
+        var row = document.createElementNS(kXULNS, "listitem");
+        row.id = "";
+        row.className = "listitem";
+        row.setAttribute("label", perm.host);
+
+        list.appendChild(row);
+      }
+    }
+  },
+
+  offlineAppSelected: function()
+  {
+    var removeButton = document.getElementById("offlineAppsListRemove");
+    var list = document.getElementById("offlineAppsList");
+    if (list.selectedItem) {
+      removeButton.setAttribute("disabled", "false");
+    } else {
+      removeButton.setAttribute("disabled", "true");
+    }
+  },
+
+  removeOfflineApp: function()
+  {
+    var list = document.getElementById("offlineAppsList");
+    var item = list.selectedItem;
+    var host = item.getAttribute("label");
+
+    var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
+                            .getService(Components.interfaces.nsIPromptService);
+    var flags = prompts.BUTTON_TITLE_IS_STRING * prompts.BUTTON_POS_0 +
+                prompts.BUTTON_TITLE_CANCEL * prompts.BUTTON_POS_1;
+
+    var bundle = document.getElementById("bundlePreferences");
+    var title = bundle.getString("offlineAppRemoveTitle");
+    var prompt = bundle.getFormattedString("offlineAppRemovePrompt", [host]);
+    var confirm = bundle.getString("offlineAppRemoveConfirm");
+    var result = prompts.confirmEx(window, title, prompt, flags, confirm,
+                                   null, null, null, {});
+    if (result != 0)
+      return;
+
+    // clear offline cache entries
+    var cacheService = Components.classes["@mozilla.org/network/cache-service;1"]
+                       .getService(Components.interfaces.nsICacheService);
+    var cacheSession = cacheService.createSession("HTTP-offline",
+                                                  Components.interfaces.nsICache.STORE_OFFLINE,
+                                                  true)
+                       .QueryInterface(Components.interfaces.nsIOfflineCacheSession);
+    cacheSession.clearKeysOwnedByDomain(host);
+    cacheSession.evictUnownedEntries();
+
+    // send out an offline-app-removed signal.  The nsDOMStorage
+    // service will clear DOM storage for this host.
+    var obs = Components.classes["@mozilla.org/observer-service;1"]
+                        .getService(Components.interfaces.nsIObserverService);
+    obs.notifyObservers(null, "offline-app-removed", host);
+
+    // remove the permission
+    var pm = Components.classes["@mozilla.org/permissionmanager;1"]
+                       .getService(Components.interfaces.nsIPermissionManager);
+    pm.remove(host, "offline-app",
+              Components.interfaces.nsIPermissionManager.ALLOW_ACTION);
+    pm.remove(host, "offline-app",
+              Components.interfaces.nsIOfflineCacheUpdateService.ALLOW_NO_WARN);
+
+    list.removeChild(item);
+    gAdvancedPane.offlineAppSelected();
+  },
+
   // UPDATE TAB
 
   /*
    * Preferences:
    *
    * app.update.enabled
    * - true if updates to the application are enabled, false otherwise
    * extensions.update.enabled
--- a/browser/components/preferences/advanced.xul
+++ b/browser/components/preferences/advanced.xul
@@ -19,16 +19,17 @@
 # The Initial Developer of the Original Code is
 # Ben Goodger.
 # Portions created by the Initial Developer are Copyright (C) 2005
 # the Initial Developer. All Rights Reserved.
 #
 # Contributor(s):
 #   Ben Goodger <ben@mozilla.org>
 #   Jeff Walden <jwalden+code@mit.edu>
+#   Ehsan Akhgari <ehsan.akhgari@gmail.com>
 #
 # Alternatively, the contents of this file may be used under the terms of
 # either the GNU General Public License Version 2 or later (the "GPL"), or
 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 # in which case the provisions of the GPL or the LGPL are applicable instead
 # of those above. If you wish to allow use of your version of this file only
 # under the terms of either the GPL or the LGPL, and not to allow others to
 # use your version of this file under the terms of the MPL, indicate your
@@ -209,34 +210,53 @@
              <hbox align="center">
                <description flex="1" control="connectionSettings">&connectionDesc.label;</description>
                <button id="connectionSettings" icon="network" label="&connectionSettings.label;"
                        accesskey="&connectionSettings.accesskey;"
                        oncommand="gAdvancedPane.showConnections();"/>
              </hbox>
            </groupbox>
 
-           <!-- Cache -->
-           <groupbox id="cacheGroup">
-             <caption label="&cache.label;"/>
+           <!-- Cache/Offline apps -->
+           <groupbox id="offlineGroup">
+             <caption label="&offlineStorage.label;"/>
 
              <hbox align="center">
                <label id="useCacheBefore"
                       accesskey="&useCacheBefore.accesskey;">&useCacheBefore.label;</label>
                <textbox id="cacheSize" type="number" size="2"
                         preference="browser.cache.disk.capacity"
                         onsyncfrompreference="return gAdvancedPane.readCacheSize();"
                         onsynctopreference="return gAdvancedPane.writeCacheSize();"
                         aria-labelledby="useCacheBefore cacheSize useCacheAfter"/>
                <label id="useCacheAfter" flex="1">&useCacheAfter.label;</label>
                <button id="clearCacheButton" icon="clear"
                        label="&clearCacheNow.label;" accesskey="&clearCacheNow.accesskey;"
                        oncommand="gAdvancedPane.clearCache();"/>
              </hbox>
-           </groupbox>
+	     <hbox>
+	       <vbox flex="1">
+
+		 <label id="offlineAppsListLabel">&offlineAppsList.label;</label>
+		 <listbox id="offlineAppsList"
+			  style="height: &offlineAppsList.height;;"
+			  flex="1"
+			  aria-labelledby="offlineAppsListLabel"
+			  onselect="gAdvancedPane.offlineAppSelected(event);">
+		 </listbox>
+	       </vbox>
+	       <vbox pack="end">
+		 <button id="offlineAppsListRemove"
+			 disabled="true"
+			 label="&offlineAppsListRemove.label;"
+			 accesskey="&offlineAppsListRemove.accesskey;" 
+			 oncommand="gAdvancedPane.removeOfflineApp();"/>
+	       </vbox>
+	     </hbox>
+	   </groupbox>
         </tabpanel>
 
         <!-- Update -->
         <tabpanel id="updatePanel" orient="vertical" align="start">
           <label control="autoUpdateGroup">&autoCheck.label;</label>
           <vbox class="indent" id="autoUpdateGroup" role="group">
             <checkbox id="enableAppUpdate"
                       label="&enableAppUpdate.label;"
@@ -310,17 +330,17 @@
               </rows>
             </grid>
           </groupbox>
 
           <!-- Certificates -->
           <groupbox id="certificatesGroup">
             <caption id="CertGroupCaption" label="&certificates.label;"/>
 
-            <description id="CertSelectionDesc" control="certSelection">&certselect.description;</description>
+            <description id="CertSelectionDesc" control="certSelection">&certSelection.description;</description>
 
             <!--
               The values on these radio buttons may look like l12y issues, but
               they're not - this preference uses *those strings* as its values.
               I KID YOU NOT.
             -->
             <radiogroup id="certSelection" orient="horizontal" preftype="string" 
 	                      preference="security.default_personal_cert" aria-abelledby="CertGroupCaption CertSelectionDesc">
--- a/browser/components/preferences/applications.js
+++ b/browser/components/preferences/applications.js
@@ -845,20 +845,26 @@ var gApplicationsPane = {
     this._prefSvc.addObserver(PREF_FEED_SELECTED_READER, this, false);
 
     // Listen for window unload so we can remove our preference observers.
     window.addEventListener("unload", this, false);
 
     // Figure out how we should be sorting the list.  We persist sort settings
     // across sessions, so we can't assume the default sort column/direction.
     // XXX should we be using the XUL sort service instead?
-    if (document.getElementById("typeColumn").hasAttribute("sortDirection"))
+    if (document.getElementById("actionColumn").hasAttribute("sortDirection")) {
+      this._sortColumn = document.getElementById("actionColumn");
+      // The typeColumn element always has a sortDirection attribute,
+      // either because it was persisted or because the default value
+      // from the xul file was used.  If we are sorting on the other
+      // column, we should remove it.
+      document.getElementById("typeColumn").removeAttribute("sortDirection");
+    }
+    else 
       this._sortColumn = document.getElementById("typeColumn");
-    else if (document.getElementById("actionColumn").hasAttribute("sortDirection"))
-      this._sortColumn = document.getElementById("actionColumn");
 
     // Load the data and build the list of handlers.
     // By doing this in a timeout, we let the preferences dialog resize itself
     // to an appropriate size before we add a bunch of items to the list.
     // Otherwise, if there are many items, and the Applications prefpane
     // is the one that gets displayed when the user first opens the dialog,
     // the dialog might stretch too much in an attempt to fit them all in.
     // XXX Shouldn't we perhaps just set a max-height on the richlistbox?
@@ -1011,29 +1017,30 @@ var gApplicationsPane = {
 
   _rebuildVisibleTypes: function() {
     // Reset the list of visible types and the visible type description counts.
     this._visibleTypes = [];
     this._visibleTypeDescriptionCount = {};
 
     // Get the preferences that help determine what types to show.
     var showPlugins = this._prefSvc.getBoolPref(PREF_SHOW_PLUGINS_IN_LIST);
-    var hideTypesWithoutExtensions =
+    var hidePluginsWithoutExtensions =
       this._prefSvc.getBoolPref(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS);
 
     for (let type in this._handledTypes) {
       let handlerInfo = this._handledTypes[type];
 
-      // Hide types without extensions if so prefed so we don't show a whole
-      // bunch of obscure types handled by plugins on Mac.
+      // Hide plugins without associated extensions if so prefed so we don't
+      // show a whole bunch of obscure types handled by plugins on Mac.
       // Note: though protocol types don't have extensions, we still show them;
-      // the pref is only meant to be applied to MIME types.
-      // FIXME: if the type has a plugin, should we also check the "suffixes"
-      // property of the plugin?  Filed as bug 395135.
-      if (hideTypesWithoutExtensions &&
+      // the pref is only meant to be applied to MIME types, since plugins are
+      // only associated with MIME types.
+      // FIXME: should we also check the "suffixes" property of the plugin?
+      // Filed as bug 395135.
+      if (hidePluginsWithoutExtensions && handlerInfo.handledOnlyByPlugin &&
           handlerInfo.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo &&
           !handlerInfo.primaryExtension)
         continue;
 
       // Hide types handled only by plugins if so prefed.
       if (handlerInfo.handledOnlyByPlugin && !showPlugins)
         continue;
 
--- a/browser/components/preferences/cookies.js
+++ b/browser/components/preferences/cookies.js
@@ -265,16 +265,28 @@ var gCookiesWindow = {
       }
       return null;
     },
 
     _removeItemAtIndex: function (aIndex, aCount)
     {
       var removeCount = aCount === undefined ? 1 : aCount;
       if (this._filtered) {
+        // remove the cookies from the unfiltered set so that they
+        // don't reappear when the filter is changed. See bug 410863.
+        for (var i = aIndex; i < aIndex + removeCount; ++i) {
+          var item = this._filterSet[i];
+          var parent = gCookiesWindow._hosts[item.rawHost];
+          for (var j = 0; j < parent.cookies.length; ++j) {
+            if (item == parent.cookies[j]) {
+              parent.cookies.splice(j, 1);
+              break;
+            }
+          }
+        }
         this._filterSet.splice(aIndex, removeCount);
         return;
       }
       
       var item = this._getItemAtIndex(aIndex);
       if (!item) return;
       this._invalidateCache(aIndex - 1);
       if (item.container)
--- a/browser/components/preferences/sanitize.xul
+++ b/browser/components/preferences/sanitize.xul
@@ -57,16 +57,17 @@
 
     <preferences>
       <preference id="privacy.item.history"               name="privacy.item.history"               type="bool"/>
       <preference id="privacy.item.formdata"              name="privacy.item.formdata"              type="bool"/>
       <preference id="privacy.item.passwords"             name="privacy.item.passwords"             type="bool"/>
       <preference id="privacy.item.downloads"             name="privacy.item.downloads"             type="bool"/>
       <preference id="privacy.item.cookies"               name="privacy.item.cookies"               type="bool"/>
       <preference id="privacy.item.cache"                 name="privacy.item.cache"                 type="bool"/>
+      <preference id="privacy.item.offlineApps"           name="privacy.item.offlineApps"           type="bool"/>
       <preference id="privacy.item.sessions"              name="privacy.item.sessions"              type="bool"/>
     </preferences>
 
     <description>&clearDataSettings.label;</description>
 
     <checkbox label="&itemHistory.label;"
               accesskey="&itemHistory.accesskey;"
               preference="privacy.item.history"/>
@@ -77,16 +78,19 @@
               accesskey="&itemFormSearchHistory.accesskey;"
               preference="privacy.item.formdata"/>
     <checkbox label="&itemCache.label;"
               accesskey="&itemCache.accesskey;"
               preference="privacy.item.cache"/>
     <checkbox label="&itemCookies.label;"
               accesskey="&itemCookies.accesskey;"
               preference="privacy.item.cookies"/>
+    <checkbox label="&itemOfflineApps.label;"
+	      accesskey="&itemOfflineApps.accesskey;"
+	      preference="privacy.item.offlineApps"/>
     <checkbox label="&itemPasswords.label;"
               accesskey="&itemPasswords.accesskey;"
               preference="privacy.item.passwords"/>
     <checkbox label="&itemSessions.label;"
               accesskey="&itemSessions.accesskey;"
               preference="privacy.item.sessions"/>
 
   </prefpane>
--- a/browser/components/safebrowsing/content/malware-warden.js
+++ b/browser/components/safebrowsing/content/malware-warden.js
@@ -85,22 +85,26 @@ function PROT_MalwareWarden() {
     },
 
     updateUrlRequested: function(url) { },
     streamCompleted: function() { },
     updateError: function(errorCode) { },
     updateSuccess: function(requestedTimeout) { }
   };
 
-  dbService_.beginUpdate(listener);
-  dbService_.beginStream();
-  dbService_.updateStream(testUpdate);
-  dbService_.finishStream();
-  dbService_.finishUpdate();
-
+  try {
+    dbService_.beginUpdate(listener);
+    dbService_.beginStream();
+    dbService_.updateStream(testUpdate);
+    dbService_.finishStream();
+    dbService_.finishUpdate();
+  } catch(ex) {
+    // beginUpdate will throw harmlessly if there's an existing update
+    // in progress, ignore failures.
+  }
   G_Debug(this, "malwareWarden initialized");
 }
 
 PROT_MalwareWarden.inherits(PROT_ListWarden);
 
 /**
  * Cleanup on shutdown.
  */
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -21,16 +21,17 @@
 # the Initial Developer. All Rights Reserved.
 #
 # Contributor(s):
 #   Pierre Chanial (v2) <p_ch@verizon.net>
 #   Gavin Sharp (v3) <gavin@gavinsharp.com>
 #   Ben Goodger <beng@google.com>
 #   Pamela Greene <pamg.bugs@gmail.com>
 #   Michael Ventnor <m.ventnor@gmail.com>
+#   Ehsan Akhgari <ehsan.akhgari@gmail.com>
 #
 # Alternatively, the contents of this file may be used under the terms of
 # either the GNU General Public License Version 2 or later (the "GPL"), or
 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 # in which case the provisions of the GPL or the LGPL are applicable instead
 # of those above. If you wish to allow use of your version of this file only
 # under the terms of either the GPL or the LGPL, and not to allow others to
 # use your version of this file under the terms of the MPL, indicate your
@@ -86,18 +87,17 @@
           <xul:image class="searchbar-dropmarker-image"/>
           <xul:menupopup class="searchbar-popup"
                          anonid="searchbar-popup"
                          position="after_start">
             <xul:menuseparator/>
             <xul:menuitem class="open-engine-manager"
                           anonid="open-engine-manager"
                           label="&cmd_engineManager.label;"
-                          oncommand="openManager(event);"
-                          accesskey="&cmd_engineManager.accesskey;"/>
+                          oncommand="openManager(event);"/>
           </xul:menupopup>
         </xul:button>
         <xul:hbox class="search-go-container">
           <xul:image class="search-go-button"
                      anonid="search-go-button"
                      chromedir="&locale.dir;"
                      onclick="handleSearchCommand(event);"
                      tooltiptext="&searchEndCap.label;" />
@@ -547,17 +547,21 @@
         this.focus();
         this.select();
       ]]></handler>
 
       <handler event="popupshowing" action="this.rebuildPopupDynamic();"/>
 
       <handler event="DOMMouseScroll"
                phase="capturing"
-               action="this.selectEngine(event, (event.detail > 0));"/>
+#ifdef XP_MACOSX
+               action="if (event.metaKey) this.selectEngine(event, (event.detail > 0));"/>
+#else
+               action="if (event.ctrlKey) this.selectEngine(event, (event.detail > 0));"/>
+#endif
     </handlers>
   </binding>
 
   <binding id="searchbar-textbox"
       extends="chrome://global/content/bindings/autocomplete.xml#autocomplete">
     <implementation implements="nsIObserver nsIDOMXULLabeledControlElement">
       <constructor><![CDATA[
         if (document.getBindingParent(this).parentNode.parentNode.localName ==
--- a/browser/components/search/nsSearchSuggestions.js
+++ b/browser/components/search/nsSearchSuggestions.js
@@ -422,17 +422,17 @@ SuggestAutoComplete.prototype = {
   _startHistorySearch: function SAC_SHSearch(searchString, searchParam, previousResult) {
     var formHistory =
       Cc["@mozilla.org/autocomplete/search;1?name=form-history"].
       createInstance(Ci.nsIAutoCompleteSearch);
     formHistory.startSearch(searchString, searchParam, previousResult, this);
   },
 
   /**
-   * Makes a note of the fact that we've recieved a backoff-triggering
+   * Makes a note of the fact that we've received a backoff-triggering
    * response, so that we can adjust the backoff behavior appropriately.
    */
   _noteServerError: function SAC__noteServeError() {
     var currentTime = Date.now();
 
     this._serverErrorLog.push(currentTime);
     if (this._serverErrorLog.length > this._maxErrorsBeforeBackoff)
       this._serverErrorLog.shift();
--- a/browser/components/sessionstore/src/nsSessionStore.js
+++ b/browser/components/sessionstore/src/nsSessionStore.js
@@ -860,18 +860,16 @@ SessionStoreService.prototype = {
 
       browser.parentNode.__SS_data = tabData;
     }
     else {
       tabData.entries[0] = { url: browser.currentURI.spec };
       tabData.index = 1;
     }
     
-    tabData.zoom = browser.markupDocumentViewer.textZoom;
-    
     var disallow = [];
     for (var i = 0; i < CAPABILITIES.length; i++)
       if (!browser.docShell["allow" + CAPABILITIES[i]])
         disallow.push(CAPABILITIES[i]);
     if (disallow.length > 0)
       tabData.disallow = disallow.join(",");
     else if (tabData.disallow)
       delete tabData.disallow;
@@ -1497,18 +1495,16 @@ SessionStoreService.prototype = {
     
     if (!tabData.entries) {
       tabData.entries = [];
     }
     if (tabData.extData) {
       tab.__SS_extdata = tabData.extData;
     }
     
-    browser.markupDocumentViewer.textZoom = parseFloat(tabData.zoom || 1);
-    
     for (var i = 0; i < tabData.entries.length; i++) {
       history.addEntry(this._deserializeHistoryEntry(tabData.entries[i], aIdMap), true);
     }
     
     // make sure to reset the capabilities and attributes, in case this tab gets reused
     var disallow = (tabData.disallow)?tabData.disallow.split(","):[];
     CAPABILITIES.forEach(function(aCapability) {
       browser.docShell["allow" + aCapability] = disallow.indexOf(aCapability) == -1;
--- a/browser/fuel/src/fuelApplication.js
+++ b/browser/fuel/src/fuelApplication.js
@@ -1152,18 +1152,16 @@ function Application() {
   this._info = Components.classes["@mozilla.org/xre/app-info;1"]
                      .getService(Ci.nsIXULAppInfo);
 
   var os = Components.classes["@mozilla.org/observer-service;1"]
                      .getService(Ci.nsIObserverService);
 
   os.addObserver(this, "final-ui-startup", false);
   os.addObserver(this, "quit-application-requested", false);
-  os.addObserver(this, "quit-application-granted", false);
-  os.addObserver(this, "quit-application", false);
   os.addObserver(this, "xpcom-shutdown", false);
 }
 
 //=================================================
 // Application implementation
 Application.prototype = {
   // for nsIClassInfo + XPCOMUtils
   classDescription: "Application",
@@ -1216,21 +1214,17 @@ Application.prototype = {
         gShutdown.shift()();
       }
 
       // release our observers
       var os = Components.classes["@mozilla.org/observer-service;1"]
                          .getService(Ci.nsIObserverService);
 
       os.removeObserver(this, "final-ui-startup");
-
       os.removeObserver(this, "quit-application-requested");
-      os.removeObserver(this, "quit-application-granted");
-      os.removeObserver(this, "quit-application");
-
       os.removeObserver(this, "xpcom-shutdown");
 
       this._info = null;
       this._console = null;
       this._prefs = null;
       this._storage = null;
       this._events = null;
       this._extensions = null;
--- a/browser/installer/removed-files.in
+++ b/browser/installer/removed-files.in
@@ -34,16 +34,17 @@ searchplugins/eBay.src
 searchplugins/eBay.gif
 searchplugins/google.src
 searchplugins/google.gif
 searchplugins/yahoo.src
 searchplugins/yahoo.gif
 searchplugins/
 #ifdef MOZ_ENABLE_LIBXUL
 @DLL_PREFIX@xpcom_core@DLL_SUFFIX@
+@DLL_PREFIX@xpistub@DLL_SUFFIX@
 components/@DLL_PREFIX@jar50@DLL_SUFFIX@
 #ifdef XP_WIN
 components/jsd3250.dll
 components/xpinstal.dll
 #else
 components/@DLL_PREFIX@jsd@DLL_SUFFIX@
 components/@DLL_PREFIX@xpinstall@DLL_SUFFIX@
 #endif
@@ -54,17 +55,16 @@ XUL
 #else
 @DLL_PREFIX@xul@DLL_SUFFIX@
 #endif
 #endif
 component.reg
 components/compreg.dat
 components/@DLL_PREFIX@myspell@DLL_SUFFIX@
 components/@DLL_PREFIX@spellchecker@DLL_SUFFIX@
-components/spellchecker.xpt
 components/@DLL_PREFIX@spellchk@DLL_SUFFIX@
 components/xpti.dat
 components/xptitemp.dat
 components/nsBackgroundUpdateService.js
 components/nsCloseAllWindows.js
 #ifndef XP_MACOSX
 components/autocomplete.xpt
 #endif
@@ -85,16 +85,17 @@ components/talkback/talkback
 components/talkback/talkback.so
 components/talkback/XTalkback.ad
 extensions/reporter@mozilla.org/install.rdf
 extensions/reporter@mozilla.org/chrome.manifest
 extensions/reporter@mozilla.org/chrome/reporter.jar
 extensions/reporter@mozilla.org/defaults/preferences/reporter.js
 extensions/inspector@mozilla.org/components/inspector.xpt
 extensions/inspector@mozilla.org/components/@DLL_PREFIX@inspector@DLL_SUFFIX@
+extensions/inspector@mozilla.org/chrome/icons/default/winInspectorMain.ico
 uninstall/UninstallFirefox.exe
 uninstall/UninstallDeerPark.exe
 uninstall/uninst.exe
 uninstall/uninstall.exe
 components/myspell/en-US.dic
 components/myspell/en-US.aff
 searchplugins/DRAE.src
 searchplugins/DRAE.png
@@ -517,18 +518,18 @@ extensions/talkback@mozilla.org/componen
 extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/KeyInfoSections.plist
 extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/send.tiff
 extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/sort_ascending.tiff
 extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/sort_descending.tiff
 extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/Talkback.icns
 #else
 extensions/talkback@mozilla.org/components/talkback/talkback
 extensions/talkback@mozilla.org/components/talkback/XTalkback.ad
-extensions/talkback@mozilla.org/components/master.ini
-extensions/talkback@mozilla.org/components/talkback.so
+extensions/talkback@mozilla.org/components/talkback/master.ini
+extensions/talkback@mozilla.org/components/talkback/talkback.so
 #endif
 #endif
 components/airbag.xpt
 components/nsUrlClassifierTable.js
 res/html/gopher-audio.gif
 res/html/gopher-binary.gif
 res/html/gopher-find.gif
 res/html/gopher-image.gif
@@ -541,9 +542,40 @@ res/html/gopher-unknown.gif
 res/fonts/mathfontCMEX10.properties
 res/fonts/mathfontCMSY10.properties
 res/fonts/mathfontMath1.properties
 res/fonts/mathfontMath2.properties
 res/fonts/mathfontMath4.properties
 res/fonts/mathfontMTExtra.properties
 res/fonts/mathfontPUA.properties
 res/fonts/mathfontSymbol.properties
-
+res/fonts/fontEncoding.properties
+res/fonts/pangoFontEncoding.properties
+res/fonts/fontNameMap.properties
+@DLL_PREFIX@xpcom_compat@DLL_SUFFIX@
+components/nsDictionary.js
+components/nsXmlRpcClient.js
+components/nsInterfaceInfoToIDL.js
+chrome/chromelist.txt
+#ifdef XP_MACOSX
+LICENSE
+extensions/inspector@mozilla.org/chrome/chromelist.txt
+components/accessibility.xpt
+components/gksvgrenderer.xpt
+components/jsconsole.xpt
+components/necko_data.xpt
+components/nsKillAll.js
+components/passwordmgr.xpt
+components/progressDlg.xpt
+components/search.xpt
+components/websrvcs.xpt
+components/widget_mac.xpt
+components/xml-rpc.xpt
+components/xpcom_obsolete.xpt
+init.d/README
+redo-prebinding.sh
+res/viewer.properties
+#endif
+#ifdef XP_UNIX
+readme.txt
+#endif
+dictionaries/PL.dic
+dictionaries/PL.aff
--- a/browser/installer/unix/config.it
+++ b/browser/installer/unix/config.it
@@ -755,16 +755,23 @@ Do Not Uninstall=FALSE
 
 [Copy File8]
 Timing=post smartupdate
 Source=[$GRE_INSTALL_DIR]\freebl3.chk
 Destination=[SETUP PATH]
 Fail If Exists=FALSE
 Do Not Uninstall=FALSE
 
+[Copy File9]
+Timing=post smartupdate
+Source=[$GRE_INSTALL_DIR]\nssutil3.dll
+Destination=[SETUP PATH]
+Fail If Exists=FALSE
+Do Not Uninstall=FALSE
+
 [Path Lookup $GRE_INSTALL_DIR]
 Path Reg Key Root=HKEY_LOCAL_MACHINE
 Path Reg Key=Software\mozilla.org\GRE\$GreUniqueID$\Main
 Path Reg Name=Install Directory
 Strip Filename=FALSE
 
 
 ;Copy File SequentialX sections
--- a/browser/installer/unix/packages-static
+++ b/browser/installer/unix/packages-static
@@ -49,16 +49,17 @@ bin/application.ini
 bin/platform.ini
 bin/mozilla-xremote-client
 bin/run-mozilla.sh
 bin/plugins/libnullplugin.so
 bin/res/cmessage.txt
 bin/res/effective_tld_names.dat
 bin/xpicleanup
 bin/libsqlite3.so
+bin/README.txt
 
 ; [Components]
 bin/components/alerts.xpt
 bin/components/accessibility.xpt
 bin/components/appshell.xpt
 bin/components/appstartup.xpt
 bin/components/autocomplete.xpt
 bin/components/autoconfig.xpt
@@ -156,16 +157,17 @@ bin/components/pref.xpt
 bin/components/progressDlg.xpt
 bin/components/proxyObjInst.xpt
 bin/components/toolkitremote.xpt
 bin/components/rdf.xpt
 bin/components/satchel.xpt
 bin/components/saxparser.xpt
 bin/components/search.xpt
 bin/components/shistory.xpt
+bin/components/spellchecker.xpt
 bin/components/storage.xpt
 bin/components/profile.xpt
 bin/components/toolkitprofile.xpt
 bin/components/txtsvc.xpt
 bin/components/txmgr.xpt
 bin/components/uconv.xpt
 bin/components/unicharutil.xpt
 bin/components/uriloader.xpt
@@ -266,17 +268,17 @@ bin/chrome/browser.jar
 bin/chrome/browser.manifest
 bin/chrome/classic.jar
 bin/chrome/classic.manifest
 bin/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf
 bin/chrome/comm.jar
 bin/chrome/comm.manifest
 bin/chrome/toolkit.jar
 bin/chrome/toolkit.manifest
-bin/chrome/icons/default/default.xpm
+bin/chrome/icons/default/default16.png
 bin/chrome/reporter.manifest
 bin/chrome/reporter.jar
 bin/@PREF_DIR@/reporter.js
 
 ; shell icons
 bin/icons/*.xpm
 bin/icons/*.png
 
@@ -343,16 +345,17 @@ bin/components/dom_svg.xpt
 
 ; [Personal Security Manager]
 ;
 bin/libnssckbi.so
 bin/components/pipboot.xpt
 bin/components/pipnss.xpt
 bin/components/pippki.xpt
 bin/libnss3.so
+bin/libnssutil3.so
 bin/libsmime3.so
 bin/libsoftokn3.chk
 bin/libsoftokn3.so
 bin/libfreebl3.chk
 bin/libfreebl3.so
 bin/libssl3.so
 bin/libnssdbm3.so
 bin/chrome/pipnss.jar
@@ -370,16 +373,18 @@ bin/libfreebl_32int64_3.so
 ; [Updater]
 ;
 bin/updater
 
 ; [Crash Reporter]
 ;
 bin/crashreporter
 bin/crashreporter.ini
+bin/crashreporter-override.ini
+bin/Throbber-small.gif
 
 ; [Extensions]
 ;
 bin/components/libnkgnomevfs.so
 bin/components/libauth.so
 
 ; [Additional Developer Tools]
 [adt]
--- a/browser/installer/windows/packages-static
+++ b/browser/installer/windows/packages-static
@@ -177,16 +177,17 @@ bin\components\unicharutil.xpt
 bin\components\uriloader.xpt
 bin\components\webBrowser_core.xpt
 bin\components\webbrowserpersist.xpt
 bin\components\webshell_idls.xpt
 bin\components\widget.xpt
 bin\components\windowds.xpt
 bin\components\windowwatcher.xpt
 bin\components\shellservice.xpt
+bin\components\spellchecker.xpt
 bin\components\xpcom_base.xpt
 bin\components\xpcom_system.xpt
 bin\components\xpcom_components.xpt
 bin\components\xpcom_ds.xpt
 bin\components\xpcom_io.xpt
 bin\components\xpcom_thread.xpt
 bin\components\xpcom_xpti.xpt
 bin\components\xpconnect.xpt
@@ -326,16 +327,17 @@ bin\res\svg.css
 bin\components\dom_svg.xpt
 
 ; [Personal Security Manager]
 ;
 bin\nssckbi.dll
 bin\components\pipboot.xpt
 bin\components\pipnss.xpt
 bin\components\pippki.xpt
+bin\nssutil3.dll
 bin\nss3.dll
 bin\smime3.dll
 bin\softokn3.chk
 bin\softokn3.dll
 bin\freebl3.chk
 bin\freebl3.dll
 bin\ssl3.dll
 bin\nssdbm3.dll
@@ -344,16 +346,17 @@ bin\chrome\pippki.manifest
 
 ; [Updater]
 ;
 bin\updater.exe
 
 ; [Crash Reporter]
 bin\crashreporter.exe
 bin\crashreporter.ini
+bin\crashreporter-override.ini
 
 ; [Additional Developer Tools]
 [adt]
 bin\extensions\inspector@mozilla.org\install.rdf
 bin\extensions\inspector@mozilla.org\components\inspector-cmdline.js
 bin\extensions\inspector@mozilla.org\chrome.manifest
 bin\extensions\inspector@mozilla.org\chrome\inspector.jar
 bin\extensions\inspector@mozilla.org\defaults\preferences\inspector.js
--- a/browser/locales/Makefile.in
+++ b/browser/locales/Makefile.in
@@ -310,8 +310,13 @@ ifeq ($(OS_ARCH),WINNT)
 else
 ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
 	$(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/updater.app/Contents/MacOS
 else
 	$(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)
 endif
 endif
 endif
+
+ifdef MOZ_CRASHREPORTER
+libs:: $(addprefix $(LOCALE_SRCDIR)/,crashreporter/crashreporter-override.ini)
+	$(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)
+endif
--- a/browser/locales/en-US/chrome/browser/aboutDialog.dtd
+++ b/browser/locales/en-US/chrome/browser/aboutDialog.dtd
@@ -1,10 +1,9 @@
 <!ENTITY aboutDialog.title      "About &brandFullName;">
 <!ENTITY copyright              "Credits">
 <!ENTITY copyright.accesskey    "C">
 <!ENTITY aboutLink              "&lt; About &brandFullName;">
 <!ENTITY aboutLink.accesskey    "A">
 <!ENTITY aboutVersion           "version">
-<!ENTITY copyrightText          "&#169;1998-2008 Contributors. All Rights Reserved. Firefox and the 
+<!ENTITY copyrightInfo          "&#169;1998-2008 Contributors. All Rights Reserved. Firefox and the 
                                  Firefox logos are trademarks of the Mozilla Foundation.  All rights 
-                                 reserved. Some trademark rights used under license from The 
-                                 Charlton Company.">
+                                 reserved.">
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -44,16 +44,20 @@
 <!ENTITY pageInfoCmd.accesskey "I">
 <!ENTITY pageInfoCmd.commandkey "i">
 <!ENTITY fullScreenCmd.label "Full Screen">
 <!ENTITY fullScreenCmd.accesskey "F">
 
 <!ENTITY fullScreenMinimize.tooltip "Minimize">
 <!ENTITY fullScreenRestore.tooltip "Restore">
 <!ENTITY fullScreenClose.tooltip "Close">
+<!ENTITY fullScreenAutohide.label "Hide Toolbars">
+<!ENTITY fullScreenAutohide.accesskey "H">
+<!ENTITY fullScreenExit.label "Exit Full Screen Mode">
+<!ENTITY fullScreenExit.accesskey "F">
 
 <!ENTITY closeWindow.label "Close Window">
 <!ENTITY closeWindow.accesskey "d">
 
 <!ENTITY bookmarksMenu.label "Bookmarks">
 <!ENTITY bookmarksMenu.accesskey "B">
 <!ENTITY bookmarkThisPageCmd.label "Bookmark This Page">
 <!ENTITY bookmarkThisPageCmd.commandkey "d">
@@ -222,28 +226,30 @@
 <!ENTITY viewPageSourceCmd.label      "View Page Source">
 <!ENTITY viewPageSourceCmd.accesskey  "V">
 <!ENTITY viewFrameSourceCmd.label     "View Frame Source">
 <!ENTITY viewFrameSourceCmd.accesskey "V">
 <!ENTITY viewPageInfoCmd.label        "View Page Info">
 <!ENTITY viewPageInfoCmd.accesskey    "I">
 <!ENTITY viewFrameInfoCmd.label       "View Frame Info">
 <!ENTITY viewFrameInfoCmd.accesskey   "I">
+<!ENTITY showImageCmd.label           "Show Image">
+<!ENTITY showImageCmd.accesskey       "S">
 <!ENTITY viewImageCmd.label           "View Image">
 <!ENTITY viewImageCmd.accesskey       "I">
 <!ENTITY viewBGImageCmd.label         "View Background Image">
 <!ENTITY viewBGImageCmd.accesskey     "w">
 <!ENTITY setDesktopBackgroundCmd.label      "Set As Desktop Background…">
 <!ENTITY setDesktopBackgroundCmd.accesskey  "S">
-<!ENTITY bookmarkPageCmd.label        "Bookmark This Page…">
-<!ENTITY bookmarkPageCmd.accesskey    "m">
-<!ENTITY bookmarkLinkCmd.label        "Bookmark This Link…">
-<!ENTITY bookmarkLinkCmd.accesskey    "L">
-<!ENTITY bookmarkFrameCmd.label       "Bookmark This Frame…">
-<!ENTITY bookmarkFrameCmd.accesskey   "m">
+<!ENTITY bookmarkPageCmd2.label       "Bookmark This Page">
+<!ENTITY bookmarkPageCmd2.accesskey   "m">
+<!ENTITY bookmarkThisLinkCmd.label      "Bookmark This Link">
+<!ENTITY bookmarkThisLinkCmd.accesskey  "L">
+<!ENTITY bookmarkThisFrameCmd.label      "Bookmark This Frame">
+<!ENTITY bookmarkThisFrameCmd.accesskey  "m">
 <!ENTITY sendPageCmd.label            "Send Link…">
 <!ENTITY sendPageCmd.accesskey        "e">
 <!ENTITY savePageCmd.label            "Save Page As…">
 <!ENTITY savePageCmd.accesskey        "A">
 <!-- alternate for content area context menu -->
 <!ENTITY savePageCmd.accesskey2       "P">
 <!ENTITY savePageCmd.commandkey       "s">
 <!ENTITY saveFrameCmd.label           "Save Frame As…">
@@ -255,16 +261,18 @@
 <!ENTITY sendLinkCmd.label            "Send Link…"> 
 <!ENTITY sendLinkCmd.accesskey        "d">
 <!ENTITY saveImageCmd.label           "Save Image As…">
 <!ENTITY saveImageCmd.accesskey       "v">
 <!ENTITY sendImageCmd.label           "Send Image…">
 <!ENTITY sendImageCmd.accesskey       "n">
 <!ENTITY copyLinkCmd.label            "Copy Link Location">
 <!ENTITY copyLinkCmd.accesskey        "a">
+<!ENTITY copyLinkTextCmd.label        "Copy Link Text">
+<!ENTITY copyLinkTextCmd.accesskey    "x">
 <!ENTITY copyImageCmd.label           "Copy Image Location">
 <!ENTITY copyImageCmd.accesskey       "o">
 <!ENTITY copyImageContentsCmd.label   "Copy Image">
 <!ENTITY copyImageContentsCmd.accesskey  "y"> 
 <!ENTITY blockImageCmd.accesskey       "B">
 <!ENTITY metadataCmd.label            "Properties">
 <!ENTITY metadataCmd.accesskey        "P">
 <!ENTITY copyEmailCmd.label           "Copy Email Address">
@@ -278,16 +286,18 @@
 <!ENTITY fullZoomEnlargeCmd.commandkey2 "="> <!-- + is above this key on many keyboards -->
 
 <!ENTITY fullZoomReduceCmd.label        "Zoom Out">
 <!ENTITY fullZoomReduceCmd.accesskey    "O">
 <!ENTITY fullZoomReduceCmd.commandkey   "-">
 <!ENTITY fullZoomResetCmd.commandkey    "0">
 <!ENTITY fullZoomResetCmd.label         "Reset">
 <!ENTITY fullZoomResetCmd.accesskey     "R">
+<!ENTITY fullZoomToggleCmd.label        "Zoom Text Only">
+<!ENTITY fullZoomToggleCmd.accesskey    "T">
 <!ENTITY fullZoom.label                 "Zoom">
 <!ENTITY fullZoom.accesskey             "Z">
 
 <!ENTITY newTabButton.tooltip           "Open a new tab">
 <!ENTITY newWindowButton.tooltip        "Open a new window">
 <!ENTITY sidebarCloseButton.tooltip     "Close sidebar">
 
 <!ENTITY cutButton.tooltip              "Cut">
@@ -334,15 +344,17 @@
 <!ENTITY findOnCmd.label     "Find in This Page…">
 <!ENTITY findOnCmd.accesskey "F">
 <!ENTITY findOnCmd.commandkey "f">
 <!ENTITY findAgainCmd.label  "Find Again">
 <!ENTITY findAgainCmd.accesskey "g">
 <!ENTITY findAgainCmd.commandkey "g">
 <!ENTITY findAgainCmd.commandkey2 "VK_F3">
 
-<!ENTITY spellAddDictionaries.label "Add dictionaries…">
+<!ENTITY spellAddDictionaries.label "Add Dictionaries…">
 <!ENTITY spellAddDictionaries.accesskey "A">
 
 <!ENTITY editBookmark.done.label                      "Done">
 <!ENTITY editBookmark.delete.label                    "Delete">
 
 <!ENTITY identity.moreInfoLinkText "Tell me more about this web site…">
+
+<!ENTITY downloadMonitor.tooltip "Double-click to open downloads window">
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -76,34 +76,52 @@ updatesItem_pendingFallback=Apply Downloaded Update Now…
 feedNoFeeds=Page has no feeds
 feedShowFeedNew=Subscribe to '%S'…
 feedHasFeedsNew=Subscribe to this page…
 
 # History menu
 menuOpenAllInTabs.label=Open All in Tabs
 menuOpenAllInTabs.accesskey=o
 
+# Unified Back-/Forward Popup
+tabHistory.current=Stay on this page
+tabHistory.goBack=Go back to this page
+tabHistory.goForward=Go forward to this page
+
 # Block autorefresh
 refreshBlocked.goButton=Allow
 refreshBlocked.goButton.accesskey=A
 refreshBlocked.refreshLabel=%S prevented this page from automatically reloading.
 refreshBlocked.redirectLabel=%S prevented this page from automatically redirecting to another page.
 
 # Star button
 starButtonOn.tooltip=Edit this bookmark
 starButtonOff.tooltip=Bookmark this page
 
+# Offline web applications
+offlineApps.available=This website (%S) is offering to store data on your computer for offline use.
+offlineApps.allow=Allow
+offlineApps.allowAccessKey=A
+
 # Identity information
 identity.domainverified.title=Location Verified
 identity.domainverified.body=You are currently visiting:
 identity.domainverified.supplemental=Information identifying the owner of this web site may not have been validated.
 
 identity.identified.title=Identity Verified
 identity.identified.body=This web site is owned by:
 identity.identified.verifier=Verified by: %S
 identity.identified.state_and_country=%S, %S
 identity.identified.title_with_country=%S (%S)
 
 identity.unknown.title=Identity Unknown
 identity.unknown.body=This web site does not supply identity information.
 
 identity.encrypted=Your connection to this web site is encrypted to prevent eavesdropping.
 identity.unencrypted=Your connection to this web site is not encrypted.
+
+# Downloads Monitor Panel
+# LOCALIZATION NOTE (activeDownloads, pausedDownloads): Semi-colon list of plural
+# forms. See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 number of downloads; #2 time left
+# examples: One active download (2 minutes remaining); 11 paused downloads
+activeDownloads=One active download (#2);#1 active downloads (#2)
+pausedDownloads=One paused download;#1 paused downloads
--- a/browser/locales/en-US/chrome/browser/credits.dtd
+++ b/browser/locales/en-US/chrome/browser/credits.dtd
@@ -11,9 +11,9 @@
 <!-- localization credits look like this: -->
 <!--
 <!ENTITY credit.translation
   "<h3>Translators</h3><ul><li>Name Here</li></ul>">
 -->
 <!ENTITY credit.translation "">
 
 <!ENTITY credit.memory      "In Fond Memory Of">
-<!ENTITY credit.poweredByGecko "Powered by Gecko&trade;">
+<!ENTITY credit.poweredByGeckoReg "Powered by Gecko&reg;">
--- a/browser/locales/en-US/chrome/browser/feeds/subscribe.properties
+++ b/browser/locales/en-US/chrome/browser/feeds/subscribe.properties
@@ -3,15 +3,46 @@ addHandler=Add "%S" (%S) as a Feed Reade
 addHandlerAddButton=Add Feed Reader
 addHandlerAddButtonAccesskey=A
 handlerRegistered="%S" is already registered as a Feed Reader
 liveBookmarks=Live Bookmarks
 subscribeNow=Subscribe Now
 chooseApplicationMenuItem=Choose Application…
 chooseApplicationDialogTitle=Choose Application
 alwaysUse=Always use %S to subscribe to feeds
+mediaLabel=Media files
+
+# LOCALIZATION NOTE: The next string is for the size of the enclosed media.
+#   e.g. enclosureSizeText : "50.23 MB"
+#   %1$S = size (in bytes or megabytes, ...)
+#   %2$S = unit of measure (bytes, KB, MB, ...)
+enclosureSizeText=%1$S %2$S
+
+bytes=bytes
+kilobyte=KB
+megabyte=MB
+gigabyte=GB
+
+# LOCALIZATION NOTE: The next three strings explains to the user what they're 
+# doing.
+#   e.g. alwaysUseForVideoPodcasts : "Always use Miro to subscribe to video podcasts."
+#   %S = application to use (Miro, iTunes, ...)
+alwaysUseForFeeds=Always use %S to subscribe to feeds.
+alwaysUseForPodcasts=Always use %S to subscribe to podcasts.
+alwaysUseForVideoPodcasts=Always use %S to subscribe to video podcasts.
+
+subscribeFeedUsing=Subscribe to this feed using 
+subscribePodcastUsing=Subscribe to this podcast using 
+subscribeVideoPodcastUsing=Subscribe to this video podcast using 
+
+# "This is a "xyz" of frequently changing content on this site."
+feedsubscription1=This is a "%S" of frequently changing content on this site.
+feedsubscription2=You can subscribe to this %S to receive updates when this content changes.
+webFeed=feed
+videoPodcastFeed=video podcast
+audioPodcastFeed=podcast
 
 # Protocol Handling
 # "Add %appName (%appDomain) as an application for %protocolType links?"
 addProtocolHandler=Add %S (%S) as an application for %S links?
 addProtocolHandlerAddButton=Add Application
 # "%appName has already been added as an application for %protocolType links."
 protocolHandlerRegistered=%S has already been added as an application for %S links.
--- a/browser/locales/en-US/chrome/browser/pageInfo.dtd
+++ b/browser/locales/en-US/chrome/browser/pageInfo.dtd
@@ -60,26 +60,24 @@
 <!ENTITY  generalEncoding       "Encoding:">
 <!ENTITY  generalMetaName       "Name">
 <!ENTITY  generalMetaContent    "Content">
 <!ENTITY  generalSecurityMore   "More">
 <!ENTITY  generalSecurityMore.accesskey "o">
 
 <!ENTITY  mediaTab              "Media">
 <!ENTITY  mediaTab.accesskey    "M">
-<!ENTITY  mediaURL              "Address:">
-<!ENTITY  mediaAlt              "Alternate Text:">
+<!ENTITY  mediaLocation         "Location:">
+<!ENTITY  mediaText             "Associated Text:">
 <!ENTITY  mediaAltHeader        "Alternate Text">
 <!ENTITY  mediaAddress          "Address">
 <!ENTITY  mediaType             "Type">
 <!ENTITY  mediaSize             "Size">
 <!ENTITY  mediaCount            "Count">
-<!ENTITY  mediaDimensions       "Specified Dimensions:">
-<!ENTITY  mediaPhysDimensions   "Actual Dimensions:">
-<!ENTITY  mediaTitle            "Title:">
+<!ENTITY  mediaDimension        "Dimensions:">
 <!ENTITY  mediaLongdesc         "Long Description:">
 <!ENTITY  mediaBlockImage.accesskey "B">
 <!ENTITY  mediaSaveAs           "Save As…">
 <!ENTITY  mediaSaveAs.accesskey "A">
 <!ENTITY  mediaSaveAs2.accesskey "e">
 <!ENTITY  mediaPreview          "Media Preview:">
 
 <!ENTITY  feedTab               "Feeds">
--- a/browser/locales/en-US/chrome/browser/pageInfo.properties
+++ b/browser/locales/en-US/chrome/browser/pageInfo.properties
@@ -52,16 +52,21 @@ mediaBGImg=Background
 mediaObject=Object
 mediaEmbed=Embed
 mediaLink=Icon
 mediaInput=Input
 mediaFileSize=%S KB
 mediaSize=%Spx \u00D7 %Spx
 mediaSelectFolder=Select a Folder to Save the Images
 mediaBlockImage=Block Images from %S
+mediaUnknownNotCached=Unknown (not cached)
+mediaImageType=%S Image
+mediaAnimatedImageType=%S Image (animated, %S frames)
+mediaDimensions=%Spx \u00D7 %Spx
+mediaDimensionsScaled=%Spx \u00D7 %Spx (scaled to %Spx \u00D7 %Spx)
 
 generalQuirksMode=Quirks mode
 generalStrictMode=Standards compliance mode
 generalNotCached=Not cached
 generalDiskCache=Disk cache
 generalMemoryCache=Memory cache
 generalSize=%S KB (%S bytes)
 generalMetaTag=Meta (1 tag)
--- a/browser/locales/en-US/chrome/browser/places/places.properties
+++ b/browser/locales/en-US/chrome/browser/places/places.properties
@@ -65,17 +65,17 @@ view.sortBy.date.label=Sort by Visit Dat
 view.sortBy.date.accesskey=V
 view.sortBy.visitCount.label=Sort by Visit Count
 view.sortBy.visitCount.accesskey=C
 view.sortBy.keyword.label=Sort by Keyword
 view.sortBy.keyword.accesskey=K
 view.sortBy.description.label=Sort by Description
 view.sortBy.description.accesskey=D
 view.sortBy.dateAdded.label=Sort by Added
-view.sortBy.dateAdded.accesskey=A
+view.sortBy.dateAdded.accesskey=e
 view.sortBy.lastModified.label=Sort by Last Modified
 view.sortBy.lastModified.accesskey=M
 view.sortBy.tags.label=Sort by Tags
 view.sortBy.tags.accesskey=T
 
 searchByDefault=Search in Bookmarks
 searchCurrentDefault=Search in '%S'
 findInPrefix=Find in '%S'…
--- a/browser/locales/en-US/chrome/browser/preferences/advanced.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences/advanced.dtd
@@ -29,17 +29,17 @@
 <!ENTITY networkTab.label                "Network">
 
 <!ENTITY connection.label                "Connection">
 
 <!ENTITY connectionDesc.label            "Configure how &brandShortName; connects to the Internet">
 <!ENTITY connectionSettings.label        "Settings…">
 <!ENTITY connectionSettings.accesskey    "e">
 
-<!ENTITY cache.label "Cache">
+<!ENTITY offlineStorage.label            "Offline Storage">
 
 <!-- LOCALIZATION NOTE:
   The entities useCacheBefore.label and useCacheAfter.label appear on a single
   line in preferences as follows:
 
   &useCacheBefore.label  [ textbox for cache size in MB ]   &useCacheAfter.label;
 -->
 <!ENTITY useCacheBefore.label            "Use up to">
@@ -62,26 +62,31 @@
 <!ENTITY askMe.accesskey                 "k">
 <!ENTITY modeAutomatic.label             "Automatically download and install the update">
 <!ENTITY modeAutomatic.accesskey         "d">
 <!ENTITY modeAutoAddonWarn.label         "Warn me if this will disable any of my add-ons">
 <!ENTITY modeAutoAddonWarn.accesskey     "W">
 <!ENTITY updateHistory.label             "Show Update History">
 <!ENTITY updateHistory.accesskey         "p">
 
+<!ENTITY offlineAppsList.label           "The following websites have data installed for offline use:">
+<!ENTITY offlineAppsList.height          "7em">
+<!ENTITY offlineAppsListRemove.label     "Remove…">
+<!ENTITY offlineAppsListRemove.accesskey "R">
+<!ENTITY offlineAppRemove.confirm        "Remove offline data">
 
 <!ENTITY encryptionTab.label             "Encryption">
 
 <!ENTITY protocols.label                 "Protocols">
 <!ENTITY useSSL3.label                   "Use SSL 3.0">
 <!ENTITY useSSL3.accesskey               "3">
 <!ENTITY useTLS1.label                   "Use TLS 1.0">
 <!ENTITY useTLS1.accesskey               "1">
 <!ENTITY certificates.label              "Certificates">
-<!ENTITY certselect.description          "When a web site requires a certificate:">
+<!ENTITY certSelection.description       "When a server requests my personal certificate:">
 <!ENTITY certs.auto                      "Select one automatically">
 <!ENTITY certs.auto.accesskey            "l">
 <!ENTITY certs.ask                       "Ask me every time">
 <!ENTITY certs.ask.accesskey             "i">
 <!ENTITY viewCerts.label                 "View Certificates">
 <!ENTITY viewCerts.accesskey             "s">
 <!ENTITY viewCRLs.label                  "Revocation Lists">
 <!ENTITY viewCRLs.accesskey              "R">
--- a/browser/locales/en-US/chrome/browser/preferences/connection.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences/connection.dtd
@@ -1,16 +1,18 @@
 
 <!ENTITY  connectionsDialog.title       "Connection Settings">
 <!ENTITY  window.width                  "37em">
 <!ENTITY  window.macWidth               "39em">
 
 <!ENTITY  proxyTitle.label              "Configure Proxies to Access the Internet">
 <!ENTITY  directTypeRadio.label         "Direct connection to the Internet">
 <!ENTITY  directTypeRadio.accesskey     "d">
+<!ENTITY  systemTypeRadio.label         "Use system proxy settings">
+<!ENTITY  systemTypeRadio.accesskey     "y">
 <!ENTITY  WPADTypeRadio.label           "Auto-detect proxy settings for this network">
 <!ENTITY  WPADTypeRadio.accesskey       "w">
 <!ENTITY  manualTypeRadio.label         "Manual proxy configuration:">
 <!ENTITY  manualTypeRadio.accesskey     "m">
 <!ENTITY  autoTypeRadio.label           "Automatic proxy configuration URL:">
 <!ENTITY  autoTypeRadio.accesskey       "A">
 <!ENTITY  reload.label                  "Reload">
 <!ENTITY  reload.accesskey              "e">
--- a/browser/locales/en-US/chrome/browser/preferences/preferences.properties
+++ b/browser/locales/en-US/chrome/browser/preferences/preferences.properties
@@ -45,16 +45,18 @@ chooseDownloadFolderTitle=Choose Downloa
 
 #### Applications
 
 fileEnding=%S file
 saveFile=Save File
 chooseApp=Choose application…
 fpTitleChooseApp=Select Helper Application
 webFeed=Web Feed
+videoPodcastFeed=Video Podcast
+audioPodcastFeed=Podcast
 alwaysAsk=Always ask
 
 # LOCALIZATION NOTE (pluginName):
 # %1$S = plugin name (for example "QuickTime Plugin-in 7.2")
 # %2$S = brandShortName from brand.properties (for example "Minefield")
 pluginName=%S (in %S)
 
 # LOCALIZATION NOTE (previewInApp, liveBookmarksInApp): %S = brandShortName
@@ -77,8 +79,13 @@ AtEndOfSession = at end of session
 can=Allow
 canSession=Allow for Session
 cannot=Block
 noCookieSelected=<no cookie selected>
 cookiesAll=The following cookies are stored on your computer:
 cookiesFiltered=The following cookies match your search:
 removeCookies=Remove Cookies
 removeCookie=Remove Cookie
+
+#### Offline apps
+offlineAppRemoveTitle=Remove offline website data
+offlineAppRemovePrompt=After removing this data, %S will not be available offline.  Are you sure you want to remove this offline website?
+offlineAppRemoveConfirm=Remove offline data
--- a/browser/locales/en-US/chrome/browser/sanitize.dtd
+++ b/browser/locales/en-US/chrome/browser/sanitize.dtd
@@ -10,13 +10,15 @@
 <!ENTITY itemFormSearchHistory.label  "Saved Form and Search History">
 <!ENTITY itemFormSearchHistory.accesskey "F">
 <!ENTITY itemPasswords.label          "Saved Passwords">
 <!ENTITY itemPasswords.accesskey      "P">
 <!ENTITY itemCookies.label            "Cookies">
 <!ENTITY itemCookies.accesskey        "C">
 <!ENTITY itemCache.label              "Cache">
 <!ENTITY itemCache.accesskey          "a">
+<!ENTITY itemOfflineApps.label        "Offline Website Data">
+<!ENTITY itemOfflineApps.accesskey    "O">
 <!ENTITY itemDownloads.label          "Download History">
 <!ENTITY itemDownloads.accesskey      "D">
 <!ENTITY itemSessions.label           "Authenticated Sessions">
 <!ENTITY itemSessions.accesskey       "S">
 <!ENTITY window.width                 "30em">
--- a/browser/locales/en-US/chrome/browser/searchbar.dtd
+++ b/browser/locales/en-US/chrome/browser/searchbar.dtd
@@ -1,3 +1,2 @@
 <!ENTITY cmd_engineManager.label        "Manage Search Engines…">
-<!ENTITY cmd_engineManager.accesskey    "M">
 <!ENTITY searchEndCap.label             "Search">
--- a/browser/locales/en-US/chrome/browser/tabbrowser.dtd
+++ b/browser/locales/en-US/chrome/browser/tabbrowser.dtd
@@ -7,12 +7,12 @@
 <!ENTITY  closeOtherTabs.label   "Close Other Tabs">
 <!ENTITY  reloadAllTabs.label    "Reload All Tabs">
 <!ENTITY  reloadAllTabs.accesskey         "A">
 <!ENTITY  reloadTab.label        "Reload Tab">
 <!ENTITY  reloadTab.accesskey         "r">
 <!ENTITY  listAllTabs.label      "List all tabs">
 <!ENTITY  bookmarkAllTabs.label       "Bookmark All Tabs…">
 <!ENTITY  bookmarkAllTabs.accesskey   "T">
-<!ENTITY  bookmarkCurTab.label        "Bookmark This Tab…">
-<!ENTITY  bookmarkCurTab.accesskey    "B">
+<!ENTITY  bookmarkThisTab.label       "Bookmark This Tab">
+<!ENTITY  bookmarkThisTab.accesskey   "B">
 <!ENTITY  undoCloseTab.label          "Undo Close Tab">
 <!ENTITY  undoCloseTab.accesskey      "U">
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/crashreporter/crashreporter-override.ini
@@ -0,0 +1,5 @@
+# This file is in the UTF-8 encoding
+[Strings]
+# LOCALIZATION NOTE (CrashReporterProductErrorText2): The %s is replaced with a string containing detailed information.
+CrashReporterProductErrorText2=Firefox had a problem and crashed. We'll try to restore your tabs and windows when it restarts.\n\nUnfortunately the crash reporter is unable to submit a crash report.\n\nDetails: %s
+CrashReporterDescriptionText2=Firefox had a problem and crashed. We'll try to restore your tabs and windows when it restarts.\n\nTo help us diagnose and fix the problem, you can send us a crash report.
--- a/browser/locales/en-US/searchplugins/list.txt
+++ b/browser/locales/en-US/searchplugins/list.txt
@@ -1,6 +1,7 @@
 amazondotcom
 answers
 creativecommons
 eBay
 google
+wikipedia
 yahoo
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/searchplugins/wikipedia.xml
@@ -0,0 +1,15 @@
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+<ShortName>Wikipedia (English)</ShortName>
+<Description>Wikipedia, the free encyclopedia</Description>
+<InputEncoding>UTF-8</InputEncoding>
+<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAEAgQAhIOEAMjHyABIR0gA6ejpAGlqaQCpqKkAKCgoAPz9%2FAAZGBkAmJiYANjZ2ABXWFcAent6ALm6uQA8OjwAiIiIiIiIiIiIiI4oiL6IiIiIgzuIV4iIiIhndo53KIiIiB%2FWvXoYiIiIfEZfWBSIiIEGi%2FfoqoiIgzuL84i9iIjpGIoMiEHoiMkos3FojmiLlUipYliEWIF%2BiDe0GoRa7D6GPbjcu1yIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</Image>
+<Url type="application/x-suggestions+json" method="GET" template="http://en.wikipedia.org/w/api.php">
+  <Param name="action" value="opensearch"/>
+  <Param name="search" value="{searchTerms}"/>
+</Url>
+<Url type="text/html" method="GET" template="http://en.wikipedia.org/wiki/Special:Search">
+  <Param name="search" value="{searchTerms}"/>
+  <Param name="sourceid" value="Mozilla-search"/>
+</Url>
+<SearchForm>http://en.wikipedia.org/wiki/Special:Search</SearchForm>
+</SearchPlugin>
index 63868c24ae64d68997644557079d371f9f088892..152e0475a8bde938586cc882d83a75283c4f1935
GIT binary patch
literal 570
zc$@(`0>%A_P)<h;3K|Lk000e1NJLTq000dD000dL1^@s6a_i)L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10k=s+K~yM_g_6H(6LA=apZn&nN$+y;^4n0sW{nOBL4=APIHlq&
z=-xlTF_V*?3K`Ww5S;uMTr*e@(LpH@HCjRZkv7`on%p;cxtxopmR5b|=i&YEeqN>3
zYVogWn@t6{0^9;#*{-uH{v(_RI_2{6gVjc331|SQe}PW`cMAFZ>1wr>SWGN}0zh;?
zYMadxa64%jm+JNU!jV)ODLs0<9=UvG&Z)oPB+%4U?P{%7jTZ|?MG#Es_xnic;rl)*
z%h;3JX7e&|uTrV#<>O^7iXw)CA)fS*a>B%)5ClHbm;2(~KeMu8q^&GJcD~c?cJbtx
zFbtUyqN*yY8Y3&seeu?wtgqiK6mz<jF&FfdhMa;Bpv5#qOhE{RX&B5UVY|*F;8^e5
z_RY7iH^;-lZctjvQ7mOK%mfKNPC}0pF`LH|0JiIlY}dIKMbUD9Yv<vcjZHb)m0>1p
zVWmy<WE@1ax9QK5+pe>9Zg^uY3}+|5e%gNAdHKQf#*@fQ8N^iOcUK(x5w`1e&kn9%
z4E(A6@!gl_8!z6E-N6V2<zTso$j^XNZL@iy+xhH>nDP|hCm`ml=&;Px?f?J)07*qo
IM6N<$f_D1|4*&oF
index 4fe4569107b86bf197287b624a5feb196ee1af9b..259c8a4f01cd6a929a3440a5b579fef5275ce0ae
GIT binary patch
literal 573
zc$@(}0>b@?P)<h;3K|Lk000e1NJLTq000dD000dL1^@s6a_i)L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10lG;<K~yM_eUi^=6Hyq&e>3-H@^=t15S7+$TnK_9t^}Les1d7q
z3s<gOD9pn3P-tGDh|;ZZPzu64fl3vTLZ=!dwMlBiZ6-6B%v=|mQib%a&*A(&zGJjn
zEqvR33tR@C0dE}TX-<*p+io7HuRK^;Tw1!c0c`uWTR$}fXn>rsxN+@fzH#^7)oS(J
zrf<7jzU^L_7y3uVLYdpQ>V^99@|{wt^xn7KSHA7mPI`>yx|IW>=EFzk=qN;MzyQn2
zA*7(wX{XyCKgDU9t^uo#@<OAzZb=}%-)NY<?jaftTB9`xDX3IR7$yWkFbRUMBjB<8
zdy^4O#vF|lQ8XqThs5!OD2hmugoVWmoWEGJFtioyetRiroKZZYKkO365unM?6w4M1
z)fz$wzI@(^h66P|*+e)|NDD-+fN7ePD@CNpaj@T?9Cn9^)_N6KbCfqe#>0eCr9eJ!
zA*H1EbCB+Lz9%}<ueH`M9Od<ARL6Kiz?riZe)W`Y@3x~X%Qmw#d+I1}@Bg<*M|s+}
zUDP0?y>}2!lk`J6O`kZ*dpB<p@=uGo5$yc9o=&spj`FtVnP>V9B1pwCXWB}@00000
LNkvXXu0mjf?Z5s_
index 2eb45dea23148624db2dabd2cbaa515865427269..01fb204fd6be02c981df6565e5fc0ef91ffe747c
GIT binary patch
literal 840
zc$@)91GoH%P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4^
z4<{)JUk?@l00PKKL_t(I%av2zOH*MSe%^E5bI#VBb7!W`k7Q~e&_y4tyyydyOsCQ}
zA`wIoT@`dQ7Q65&1QDydA{B}XL@Y>+a_K)%f}w>&D{5}FRx{6LbLZ^ryj_%n;)Ole
zzvqMJ;YS!_SPvbY?QQ^90JtfomAbA60gMB<?eqHIFW-^10v(<00)RGImM=9nG{@|A
zxrFC=2ZQlF{xcpOdj70LQIrk<H+^2eLDw;F+r4Yg$^F#_tzA#v@n2%oHpU3R49C`D
z8|S-lSsV!rUkV1N8Gx=;2|7C4-LhRCI(_Dx_1e8Ryv1rURTk&LVxq7}JVM_UOn-{0
z_q|7!y1VaW7k@7v;MTZbsjv6M?!K5w$@W~6Ws?a2ke@4IM`<pa_LXDr_G0PQz*NTL
zY5D}<;#vWBo-MEBM?$le6<U#N7VuluVG=kvazqr^B<yrK5DYKa3JVH018}eEfKpmX
zIL^fL6mpIPNzjo<WiS_C0wDlLIK-1_fIy&BZ~`E!1aw^wGQ)711WvZ+2!bSV;0Qq?
zmBGiT0g?U<EQ(Z9)pQuZ?AjH^Bav`zu?+?Di8P$D1&je%!@ztp1IiO5lPS2X@)shJ
z$S(lnt2zjU=Eh%*1zatMTqGP*5RNZG5;&Me9%hL{bbb-ptdVRzT*d`PM_d4US7vN!
zJ=;JjeOgiBGH<QghDJ{_249C+Xn|>J79tE|X=kZ*;Y77l7#<!>&4oiZd|rPKVT`Si
zJ&g@!O;s^F^8rOgMXaW#cD8&=xhRT)Q&qL_x9GQDqhkSAI-S1m^ZI)LfVQ-rJ+@5F
zXc`nHfymdd=|nPlRn^og0B!&T!0f+Y==FL1pI4R>1p271?x<N)H7JULiHWyqRaH+t
zeDL@sHULTp7mdY!I4GsuGP%ERU_)d8pqi!~pPZZ;WXveaWc2g>eFFjf2mSzNk}!GD
SI``%P0000<MNUMnLSTX$(`4xY
index 38d9c590b2cc18ae0c5c6af1826eea41fcca4c36..fd006f4cda7a1412c85677e0cc413107c8fd30b3
GIT binary patch
literal 862
zc$@)V1EKthP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10^3PMK~y-6jgw7CRACf`-|xG>&ei#5939P+8n7I(MT$XDxhXWU
z%)~6Hjb*zQ{SZRXriCO1Eo#xCXcJ^21QlxjR7M1ar4m$>{mke%7YFamIHS(oxpQwD
z4V8%A%~_p?_nh+{Vp$ee)X~{q2H+fkN}lJvhGBdMFbd#S+oj8+_=|{TS?K6&rvNT6
z#@Y_m9S*p1T=@hvFP%=$g~M8)xBsbI)3iGPuC`seoLUXwm+N`2x3smU`k>hH;6uT;
znNLm-3PLQl$(?ClY&v0k_x5$e_{10hTv-j^G8C~SQ^~w{?AVE{mg_HMcP_J6cnfHL
zE<?5>iw43;<?)+e=BfIf?AOo9Z9~HYBYSr5oml};04=q(bw6(Od`wl86i9VDHo;qH
zM~+<r04O#Y*-pEByYK5_O-=1AfU~O|Pym&AZg=jN=?E+HxZq|IT$v(dfnp(Pz@8zX
zC@%}4d7U|!V<Ujd^*bo$c_AMJLTEmL2_IluCZ^_=AaE3Rn*c@P5#)H0Q0n4&URe+L
zoJ=MRQREBbiL?|?EI>C*Ea_=D6cG+ZfKB2c3p8b!re+vMaQz6Qfj}T!S)3E`%|xKZ
zbVTAQC=v%|6W~-tX!8jaFz|uE^uls3)&TAf3_bH4uPUPHv>8*iI5H%P43UE*P)yIo
zF+Cea^Ii`b93Jra{ZnfI+~B})WaQNgO;y!hXBu~t_+l#R55>9gg3fEvMcpZ;xRX^y
zq_^)0rl$NP7!2-v*xmL1XjAj#pCkf6M`wGhEX&vS@2mc~A%BBYlEgw?PX&E`pZ@aY
z^DU~Xk}X?{AxaYZdi$3Q!)Wa8>ggxzeql3!)61tS1uzL<)aUb0#$vIX<>lLDhl4>7
z#T7`y8o<BQe7xy^BuS6T%eTvnF>oBk;NVb*{#Q4E?yjExWHNbVY-~IcjYcs$8!`!@
o>VG>}<)m5=`1^!VRoC_U-_24j#;&EI-~a#s07*qoM6N<$g1e)I`Tzg`
index 718b2287e9aba22863fc2205fefdb80b426172bc..2434023cee756ee0c817db38b2e59c3f09b98ca7
GIT binary patch
literal 856
zc$@)P1E>6nP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10@X=GK~y-6g_BEYTxAr;f8TfS%_N<N5}YQnnYO02N!yh>9}qDZ
zGzg+#?XDX|s0$Yr6nsG~-3VRi%0)pDqy!WNk%}oPh$uC>lGvCr(`syIhBh;EAI#%^
zFBdvvw1WTD;c(86^AyfGwrgqm{5?|2Cp^!)&pCI<IVXe=tH#)GowJMca|=Ihj~9Kw
z((-xXdEV=u=bhM7+FQtGb0U)&CQVbKI3!78cXR7TWUW2*@I#ND`7glHTrPk1;Pjzf
zy<Y1!TaBdK>-pe>?*}HA&1QFGvzco3dX%Q=k@>lWF9Bqq<ayr7iSdctdU-9nR{i~h
zIEn99Djicwjdwcj2eukp@6>A5uy9+UAf<e>pXc`t=iIo%5ht-{tvx<Jw_vxmx(2*-
z;o=v^gCGDna0>t&QR@a;wORe@)xwV#U*z99JbT)iv;#Qtj~TpsYTpa{Cu(n>`@BQD
z3qrt=c|mdXPw;!6Lc8k*{(OFz_3OJ{e*TT}Tf#ZV^4W|o%{=Al{F5YY2?8c3B*jsO
zbv>^BmU45;VvJ>M)F6{(Hh=!u4*4qZ0Wv}A-G1jItbBcvrEfY2VL3c4Ir_Lj>lT}<
zAs>APTEX3W0**a%n&6j3`NNe1`N0f~N|+o|7^4xwa^+VAZWx^6u9CtSFb1w}DvSyN
z(8d$OImc@!?$wVyea36GTI`$J&(P2iS}T0tLupO7+o4{s(`YtmHd;*2%y8k8SL}Lq
zSJnq8S4(bVqe7?CW;iqQ7eHf-LK{P`*Ch-i!YCvPLn<2^lxvd?+}~^5xwD8dhN-D3
zGMNloE3{UF3YyI(jb@e|BO}~VEDlyX08}a!eBb}y3gRdtNs__w_yAJMa=YC=I6M0w
zyGy$Xf&gPQ#%Q!Q^wJ)291}$mQ511`?J`oz+PM!Gdp>|M=DC&cSKhz$-KD)k436v;
i^&d}4dCgk;EWjUj^N(T1Yi1z;0000<MNUMnLSTYF<b@mn
index 1b4a9dff5df4cd022c6d5e8cc9c0d7693ed6f1df..5efc13676caa5331993c84b7e757f0e2ea1d7a8c
GIT binary patch
literal 924
zc$@*817rM&P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10~tv~K~y-6ZIVrFRAm%~pYOZ3ola*uQ;4Ol%ut**LF$S$iedxU
z*wm&jAStqturS8x#zfso8Urp33rviOx-djS%9bFBjg&M-)7CDewm=K5g$~pIPVd~#
zZRg(m9T!j{;G3My$;p#*-uEaGVM~42uI|%XAF(X!H4$kR5v7zG3q$jVi0N%_>m27P
zDG{OX+Ery)R*z*_pEjg-Ct|U<ibN_Xl}b2;HC(qKOUsLnG3LuR-+1fn{{fE2<5fTG
z-P0VOpP$=U&9Ar{o0~R>vhA`k9*e~)W3fms_rNKYO2^vUI)B*$XaLKyPS@Af$0sIl
zIoaIo`GQ+G;QOUo-}mc0ulV}%%JSE9bGfxdGLg_)pZV_wHh_rK2|~dwSjL!-+S@wK
z*1(8Tb-;e9j3$iI#9wG=8TotsaEr+G#{dwV{33y0WNhG6VzmD=09wDA=qay?f4Ke7
z;mV3s3IR6m-LqF`?q3;E>RgM+=jz)tnU9<5=gwWc;!)fHrQle*qIN;3{H~IQci%%z
zPg8yQG5|{*9Y{J&wzqdZbltbruiuvk=@+}Lpz0`YQG<e1y{2%YheWc0m~9hIOi(@k
zFu{CtGqQ6ht}!h3_Yc^SvXWK(d<Vn7ou==152Xw*?a{RS^$&I3FJneWpN<~Av_wT?
zBfvfl5c)2uTAwfs2*ZHsnRO5l&jVwg0f-2A-ormQ^~wIA>z%V!KA)#C(?ofBIYHp#
zojA#Mt*MGeF}d6m0FzAOcpfV^ZVc$jTw3nlonm%&mTWfrs2;F-yqkrwF*dZuY}-b1
zXo%$CAf;#&PbpT%$BQEJg$=M{M-5>ZlF4L<L?Q%%PtcIYoxDT#!bPfTYACd}BF3<}
zw#M4RJQ(xMD<aozfT^h|Y}=+H5`A<+Kp6T2M~^@{g?s)dBDZgY2<xd7KOcD2%+x&B
za|y7u)|16zaqq!{huD?gMOj(dV>5#wWV5M>LRS}#<KQ?BH*ei!c4Q=X=|b-&fE|Y6
y2g833|2Q}_xLYapjN?x@4`{8k#+diF`u_q48ihof!_dh90000<MNUMnLSTaYp0)e{
index 7a0176fd6752bf9e2587e862a815399f52bb4360..8a10dbe5de957af28003db22d53c2f371b9612fc
GIT binary patch
literal 5754
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
index aabb2b32c110a93ec93c00c2105a1b630c47f262..85910b16ee4ff1c2c0dd8b81b04a45cb1b306ee7
GIT binary patch
literal 8668
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
--- a/browser/themes/gnomestripe/browser/browser.css
+++ b/browser/themes/gnomestripe/browser/browser.css
@@ -201,38 +201,17 @@ menuitem.bookmark-item {
 
 .bookmark-item[container] {
   list-style-image: url("moz-icon://stock/gtk-directory?size=menu");
 }
 
 /* livemarks have the same layout as folder-item, but in the browser-only livemark-item.png */
 /* only the folder icon has any effect for now, item icon is unused */
 .bookmark-item[container][livemark] { 
-  list-style-image: url("chrome://browser/skin/places/livemark-folder.png");
-  -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-.bookmark-item[container][livemark][chromedir="rtl"] { 
-  list-style-image: url("chrome://browser/skin/places/livemark-folder-rtl.png");
-  -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-.bookmark-item[container][livemark][open],
-.bookmark-item[container][livemark][open][chromedir="rtl"] { 
-  -moz-image-region: rect(16px, 16px, 32px, 0px);
-}
-
-.bookmark-item[type="menu"][livemark],
-.bookmark-item[type="menu"][livemark][chromedir="rtl"] { 
-  -moz-image-region: rect(0px, 32px, 16px, 16px) !important;
-}
-
-.bookmark-item[type="menu"][livemark][open],
-.bookmark-item[type="menu"][livemark][open][chromedir="rtl"] { 
-  -moz-image-region: rect(16px, 32px, 32px, 16px) !important;
+  list-style-image: url("chrome://browser/skin/feeds/feedIcon16.png");
 }
 
 .bookmark-item[container][tagContainer] {
   list-style-image: url("chrome://mozapps/skin/places/tagContainerIcon.png");
   -moz-image-region: auto;
 }
 
 .bookmark-item[container][query] {
@@ -796,21 +775,16 @@ toolbar[iconsize="small"] #paste-button[
   -moz-user-input: disabled;
   cursor: -moz-grab;
 }
 
 #wrapper-urlbar-container #urlbar > .autocomplete-history-dropmarker {
   display: none;
 }
 
-/* Keep the URL bar LTR */
-#urlbar .autocomplete-textbox-container {
-  direction: ltr;
-}
-
 #PopupAutoComplete {
   direction: ltr !important;
 }
 
 #PopupAutoCompleteRichResult {
   direction: ltr !important;
 }
 
@@ -846,16 +820,21 @@ toolbar[iconsize="small"] #paste-button[
   cursor: default;
   -moz-image-region: rect(32px, 16px, 48px, 0px) !important;
 }
 
 /* Identity indicator */
 #identity-box {
   background-color: -moz-dialog;
   -moz-border-end: 1px solid ThreeDShadow;
+  -moz-user-focus: normal;
+}
+
+#identity-box:focus {
+  outline: 1px dotted -moz-DialogText;
 }
 
 #identity-icon-label {
   padding: 0 2px;
   margin: 0;
 }
 
 #identity-box.verifiedIdentity > hbox {
@@ -937,17 +916,16 @@ toolbar[iconsize="small"] #paste-button[
 .verifiedIdentity > #identity-popup-encryption,
 .verifiedDomain > #identity-popup-encryption {
   margin-left: -18px;
 }
 
 .verifiedIdentity > #identity-popup-encryption > * > #identity-popup-encryption-icon,
 .verifiedDomain > #identity-popup-encryption > * > #identity-popup-encryption-icon {
   list-style-image: url("chrome://browser/skin/Secure.png");
-  -moz-image-region: rect(0px, 18px, 18px, 0px);
 }
 
 /* Identity popup bounding box */
 #identity-popup-container {
   background-image: none;
   background-color: white;
   min-width: 280px;
   padding: 10px;
@@ -962,17 +940,19 @@ toolbar[iconsize="small"] #paste-button[
   background-color: #F5F6BE; /* #F7F898; */
   color: #000000;
 }
 
 #urlbar > .autocomplete-textbox-container {
   -moz-binding: url(chrome://browser/skin/browser.xml#autocomplete-security-wrapper);
 }
 
+/* keep the URL bar content LTR */
 #autocomplete-security-wrapper {
+  direction: ltr;
   -moz-box-align: center;
 }
 
 /* Feed icon */
 #feed-button,
 #feed-button > .button-box,
 #feed-button:hover:active > .button-box {
   padding: 0px;
@@ -989,26 +969,17 @@ toolbar[iconsize="small"] #paste-button[
 #feed-button {
   -moz-binding: url("chrome://global/content/bindings/button.xml#menu");
   -moz-appearance: none; 
   min-width: 0px; 
   margin-right: 1px !important;
 }
 
 #feed-button[feeds] {
-  -moz-image-region: rect(0px, 36px, 18px, 18px);
-  list-style-image: url("chrome://browser/skin/places/livemark-item.png");
-}
-
-#feed-button[feeds]:hover {
-  -moz-image-region: rect(18px, 36px, 36px, 18px);
-}
-
-#feed-button[feeds]:active {
-  -moz-image-region: rect(54px, 36px, 72px, 18px);
+  list-style-image: url("chrome://browser/skin/feeds/feedIcon16.png");
 }
 
 /* Autocomplete */
 #urlbar .autocomplete-textbox-container {
   -moz-box-align: stretch;
 }
 
 #treecolAutoCompleteImage {
@@ -1054,35 +1025,22 @@ toolbar[iconsize="small"] #paste-button[
 .autocomplete-treebody::-moz-tree-cell(suggesthint) {
   border-top: 1px solid GrayText;
 }
 
 /* Go button */
 #go-button {
   padding: 3px 2px 2px 2px;
   list-style-image: url("chrome://browser/skin/Go-arrow.png");
-  -moz-image-region: rect(0px 11px 13px 0px);
 }
 
 #go-button[chromedir="rtl"] {
   list-style-image: url("chrome://browser/skin/Go-arrow-rtl.png");
 }
 
-#go-button:hover {
-  -moz-image-region: rect(0px 22px 13px 11px);
-}
-
-#go-button:hover:active {
-  -moz-image-region: rect(0px 44px 13px 33px);
-}
-
-#go-button[disabled="true"] {
-  -moz-image-region: rect(0px 33px 13px 22px);
-}
-
 /* Star button */
 #star-button {
   padding: 1px;
   list-style-image: url("chrome://browser/skin/places/starPage.png");
 }
 
 #star-button[starred="true"] {
   list-style-image: url("chrome://browser/skin/places/pageStarred.png");
@@ -1103,31 +1061,24 @@ statusbarpanel#statusbar-display {
 
 #security-button {
   list-style-image: none;
   min-width: 20px;
   -moz-box-direction: reverse;
   display: none;
 }
 
-#security-button[level="high"] {
-  list-style-image: url("chrome://browser/skin/Secure.png");
-  -moz-image-region: rect(36px, 18px, 54px, 0px);
-  display: -moz-box;
-}
-
+#security-button[level="high"],
 #security-button[level="low"] {
   list-style-image: url("chrome://browser/skin/Secure.png");
-  -moz-image-region: rect(36px, 18px, 54px, 0px);
   display: -moz-box;
 }
 
 #security-button[level="broken"] {
   list-style-image: url("chrome://browser/skin/Security-broken.png");
-  -moz-image-region: rect(36px, 18px, 54px, 0px);
   display: -moz-box;
 }
 
 /* XXXsw prevent margins of a value-less label from shifting the image */
 #security-button > label:not([value]) {
   display: none;
 }
 
@@ -1327,8 +1278,17 @@ toolbar[mode="text"] > #window-controls 
 /* Popup blocking dialog */
 #pageReportFirstTime statusbarpanel.statusbar-resizerpanel {
   visibility: collapse;
 }
 
 #checkForUpdates[loading="true